Hoe 300.000 adressen on-the-fly geocoderen?

Ik heb een database met 300.000 adressen die op de kaart moeten worden weergegeven. Ik weet dat als ik al het adres geocodeer, het te duur voor me zal zijn. Dus ik vroeg me af of het mogelijk is om het adres on the fly / realtime te geocoderen, wanneer een gebruiker een adres (een eigendomsadres) zou selecteren, zou het door de database zoeken en vervolgens het adres geocoderen en het vervolgens in kaart brengen met andere attributen.

Het zou heel leuk zijn als je een code, concept of iets anders zou kunnen delen. Trouwens, mijn backend is op mysql ondersteund door Joomla.

Opmerkingen

  • Ik gebruik over het algemeen de ArcGIS-geocoderingsmogelijkheid om een groot aantal adressen te geocoderen. Ook ben ik ' erg geïnteresseerd in de processen die hier worden uitgelegd, in het bijzonder graag het python-script testen om de adressen te geocoderen met Google, en ze vervolgens vergelijken met wat ik ' zijn afkomstig van ArcGIS. Helaas lijkt het mij dat ik ' niet alle gerelateerde bestanden en scripts kan vinden die zich op verschillende plaatsen bevinden. Het zou zo gewaardeerd worden als iemand mij alstublieft alle scripts in één zip-bestand of een stapsgewijze instructie zou sturen. Ik ' heb geprobeerd het te gebruiken en wat feedback voor u te krijgen, maar het lukte niet

Antwoord

Mehul, ik werkte vroeger in de adresverificatie-industrie met een bedrijf genaamd SmartyStreets. Er zijn veel geocoderingsservices beschikbaar, maar er zijn er maar weinig die batchverwerking ondersteunen met het volume dat u nodig hebt. (Google en anderen staan geen bulkgebruik van hun API toe of het opslaan / cachen van resultaten.)

Als u naar uw MySQL-database gaat en een export uitvoert van uw tabel die de adressen bevat, slaat u deze op als een CSV-bestand. U kunt het vervolgens verwerken met het Hulpprogramma voor bulkadresvalidatie voor lijsten of Command Line Tool . Zoals ik al zei, zijn er verschillende services, maar ik neem aan dat je iets wilt dat ook het bestaan van adressen verifieert (vandaar de reden voor geocodering) – als het adres onjuist of onvolledig is, dat geldt ook voor de geocoderingsresultaten. Slechts een paar services doen dit.

LiveAddress is een service die CASS-gecertificeerd is door de USPS. Er zijn er een paar, dus doe je onderzoek, maar je wilt iets “on-the-fly” / snel en goedkoop, dus nogmaals, ik raad LiveAddress aan. Het “verifieert niet alleen het adres, maar doet vervolgens wat je nodig hebt, namelijk het verstrekken van lat / lon-informatie en ook de nauwkeurigheid van de geocoderingsresultaten. Het is allemaal webgebaseerd en zal in een mum van tijd tientallen miljoenen records verwerken (zie deze vraag als referentie ).

Als je meer hebt adressen moeten geocoderen terwijl gebruikers communiceren, US Street Address heeft ook een API -versie die op vrijwel alles kan worden aangesloten en het ondersteunt ook batchverwerking on-the- vliegen, maar wordt betaald als een abonnement, niet als een eenmalige betaling.

Opmerkingen

  • Niet bekend met SmartyStreets, ziet er veelbelovend uit, bedankt voor de heads-up.
  • De LiveAddress API zal 300.000 halen in ongeveer 5-10 minuten. De LiveAddress for Lists-service (upload een lijst voor verwerking) duurt 15-20 minuten. Beiden behoorlijk snel. Voor de List-service hoeft u geen code te schrijven.
  • SmartyStreets alleen geocodes voor de VS?
  • Ik heb gegevens die voor Singapore zijn, zal deze werken? Als je me geen aanwijzingen zou kunnen geven ????
  • SmartyStreets biedt nu internationale adresverificatie aan. @ user1089553

Antwoord

Als je Python leuk vindt, kun je de GeoPy API , gecombineerd met de GDAL Python-bindingen of Fiona , en maak een zeer eenvoudig script zoals dit voor het converteren van de adressen naar een punt-shapefile.

Dit zal een bestand met de naam “adressen_to_geocode” geolokaliseren, waardoor een output-shapefile met de naam “my_output.shp” in de map my_output wordt gemaakt:

import os from geopy import geocoders from osgeo import ogr, osr def geocode(address): g = geocoders.GoogleV3() place, (lat, lng) = g.geocode(address) print "%s: %.5f, %.5f" % (place, lat, lng) return place, lat, lng def parse_file(filepath, output_shape): # create the shapefile drv = ogr.GetDriverByName("ESRI Shapefile") if os.path.exists(output_shape): drv.DeleteDataSource(output_shape) ds = drv.CreateDataSource(output_shape) # spatial reference sr = osr.SpatialReference() sr.ImportFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") lyr = ds.CreateLayer(output_shape, sr, ogr.wkbPoint) # fields featDefn = lyr.GetLayerDefn() fld_id = ogr.FieldDefn("id", ogr.OFTInteger) fld_address = ogr.FieldDefn("ADDRESS", ogr.OFTString) fld_address.SetWidth(255) lyr.CreateField(fld_id) lyr.CreateField(fld_address) print "Shapefile %s created..." % ds.name # read text addresses file i = 0 f = open(filepath, "r") for address in f: try: print "Geocoding %s" % address place, lat, lng = geocode(address) point = ogr.Geometry(ogr.wkbPoint) point.SetPoint(0, lng, lat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(point) feat.SetField("id", i) feat.SetField("ADDRESS", address) lyr.CreateFeature(feat) feat.Destroy() i = i + 1 except: print "Error, skipping address..." parse_file("addresses_to_geocode", "my_output") 

Het bestand zou slechts een regel moeten hebben voor een enkel adres, zoals bijvoorbeeld:

Via Benedetto Croce 112, Rome, Italy Via Aristide Leonori 46, Rome, Italy Viale Marconi 197, Rome, Italy 

Hier gebruik ik de Google API, maar met is GeoPy erg eenvoudig om over te schakelen naar verschillende APIs, zoals Yahoo !, GeoNames of MapPoint .

Reacties

  • Dit is geweldig! Bedankt man! Hoe dan ook, op dit moment (01/2016) moet ' geocoders.Google () ' worden gewijzigd in ' geocoders.GoogleV3 () ' zoals in geopy.readthedocs.org/en/1.11.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *