Hvordan geokode 300 000 adresser på farten?

Jeg har en database som har 300 000 adresse, som skal vises på kartet. Jeg vet at hvis jeg geokoder hele adressen, blir det for dyrt for meg. Så jeg lurte på om det er mulig å geokode adressen i farta / sanntid, når en bruker ville velge en adresse (en eiendomsadresse), ville den søke gjennom databasen og deretter geokode adressen og deretter kartlegge den med andre attributter.

Det ville vært veldig hyggelig hvis du kunne dele en kode, et konsept eller noe. For øvrig er backend på mysql støttet av Joomla.

Kommentarer

  • Jeg bruker generelt ArcGIS-geokodingsfunksjonen til å geokode stort antall adresser. Også ‘ er veldig interessert i prosessene som er forklart her, spesielt som å teste python-skriptet for å geokode adressene ved hjelp av Google, og deretter sammenligne dem med det jeg ‘ har fått fra ArcGIS. Dessverre ser det ut til at jeg ‘ ikke klarer å finne alle relaterte filer og skript som er forskjellige steder. Det ville være så verdsatt hvis noen kan sende meg alle manusene i en zip-fil eller en trinnvis instruksjon. Jeg ‘ har prøvd å bruke den og få tilbakemelding til deg, men jeg lyktes ikke

Svar

Mehul, jeg pleide å jobbe i adressebekreftelsesbransjen med et firma som heter SmartyStreets. Det er mange geokodingstjenester der ute, men bare få støtter batchbehandling med det volumet du trenger. (Google og andre tillater ikke massebruk av API-en eller lagrer / bufreresultater.)

Hvis du går til MySQL-databasen din og utfører en eksport av tabellen din som inneholder adressene, lagrer du den som en CSV-fil, for eksempel. Du kan deretter behandle den ved hjelp av Valideringsverktøy for masseadresse for lister eller Kommandolinjeverktøy . Som sagt, det er flere tjenester der ute, men du vil ha noe, antar jeg, som verifiserer eksistensen av adresser også (derav årsaken til geokoding) – hvis adressen er feil eller ufullstendig, det er også geokodingsresultatene. Bare noen få tjenester gjør dette.

LiveAddress er en tjeneste som er CASS-sertifisert av USPS. Det er noen der ute, så gjør din forskning, men du vil ha noe «on-the-fly» / raskt og billig, så igjen anbefaler jeg LiveAddress. Det vil ikke bare bekrefte adressen, men gjør så som du trenger, som er informasjon om lat / lon og også presisjonen til geokodingsresultatene. Det er alt nettbasert og vil behandle titalls millioner poster på kort tid (se dette spørsmålet som referanse ).

Hvis du har ytterligere informasjon trenger å geokode adresser når brukerne samhandler, US Street Address har også en API -versjon som kan plugges inn i omtrent hva som helst, og den støtter også batchbehandling på-the- fly, men betales som et abonnement, ikke en engangsbetaling.

Kommentarer

  • Ikke kjent med SmartyStreets, ser lovende ut, takk for head up.
  • LiveAddress API vil gjøre 300 000 på omtrent 5-10 minutter. LiveAddress for Lists-tjenesten (last opp en liste for behandling) tar 15-20 minutter. Begge ganske raske. Listetjenesten krever ikke at du skriver noen kode.
  • SmartyStreets bare geokoder for USA?
  • Jeg har data som er for Singapore, vil de fungere? Hvis ikke noen anvisninger du kan gi meg ????
  • SmartyStreets tilbyr internasjonal adressebekreftelse nå. @ user1089553

Svar

Hvis du liker Python, kan du bruke GeoPy API , kombinert med GDAL Python-bindinger eller Fiona , og lag et veldig grunnleggende skript som dette for å konvertere adressene til en punktformfil.

Dette vil geolokalisere en fil som heter «adresser_til_geokode», og skape en utgangsformfil med navnet «my_output.shp» i mappen min_utdata:

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") 

Filen skal bare ha en linje for en enkelt adresse, som for eksempel:

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

Her bruker jeg Google API, men med GeoPy er veldig grunnleggende for å bytte til forskjellige API, som Yahoo!, GeoNames eller MapPoint .

Kommentarer

  • Dette er flott! Takk, mann! Uansett, for øyeblikket (01/2016), ‘ geokodere.Google () ‘ bør endres til ‘ geocoders.GoogleV3 () ‘ som i geopy.readthedocs.org/en/1.11.0

Svar

Et annet alternativ for å løse problemet ditt er å importere datasettet til fusjon og angi adressefeltet som plassering. Da vil det automatisk geokode punktene. Når det er fullført, kan du eksportere dataene som KML.

Eller … alternativt kan du skrive et php-skript for å bruke yahoo geocoder som har en grense på 50000 poster, så før eller senere du vil ha alle poengene dine geokodet i databasen din.

Jeg håper dette hjalp!

Kommentarer

  • takk tamas men Jeg vil ikke hente kml og deretter hente informasjonen derfra og deretter til m db. Jeg liker ideen om yahoo geokoding, men jeg er ikke så sikker på nøyaktigheten den har, da jeg aldri har brukt yahoo til kartlegging. Gi meg beskjed hvis du har skrevet noe manus eller noe. Dette er en god hjelp
  • Husk at bruk av Yahoo (eller Google for den saks skyld) geokoder med automatiserte spørsmål eller uten å vise et kart vil bryte med TOS …
  • Så langt som jeg vet, er det ikke hvis du presenterer utdataene på et kart. Rett meg hvis jeg tar feil!
  • @Tamas slags. Se imidlertid dette: developers.google.com/maps/terms#section_10_1_3

Svar

Jeg har lykkes med å bruke geopy som bruker Googles geokodingnettjeneste. Den fungerer perfekt i opptil 2 000 poeng per døgn.

Svar

den klart beste og enkleste geokoderen jeg har brukt https://pypi.python.org/pypi/geocoder/1.8.0 bing maps, google maps, OSM etc ..

Svar

Kanskje ikke det beste svaret på spørsmålet ditt, men du kan prøve BatchGeo. Gratis versjon vil få deg til å lide mye, men var likevel god nok for mitt arbeid. Skjønt, vi har kjøpt pro-versjonen.

Knep for å få koordinater fra KML-filen er å importere den til ArcGIS senere.

Kommentarer

  • Takk, kan du fortelle meg hvordan gjør jeg en BatchGeo, vil du også vite navnene på gratisversjonen (Jeg prøvde Google Map api v3). Betyr dette også at jeg må lagre Lat / Long-verdiene i databasen min for å kunne kartlegge den. Dette var det jeg tenkte å gjøre i utgangspunktet.
  • Med BatchGeo må du importere KML til databasen din og deretter trekke ut koordinatene, jeg vet ingen annen måte, ettersom Google forbyr å gi koordinater. Om yahoo, min erfaring med Tyrkia er ikke veldig lys. De fleste utviklingsland er utelatt fra Yahoo ‘ s virkeområde. Anil.

Svar

Matej, det er fordi Google API tillater å trekke opptil 2,5 000 per dag.
Om Geo-løsningen, er batch ennå ikke funnet å være støttet, fordi det fra min gjennomgang av geo-python-koden ser ut til å åpne forbindelse hver gang han ber om en ny kardinal, vil 300k sannsynligvis sitte fast for alltid (sannsynligvis med feil 400).
Spill med poligoner bør gjøre susen, men det avhenger av hva som er ditt «lekeplass» -område, hvis det er 1 land eller n land.
For 1 land skal polygonene fungere ganske fine .
For n land fungerer ikke løsningen siden samlingen vil ta lengre tid når du legger til et annet land. Det beste problemet å gjøre det er lat belastning.
=> start med polygonideen, alle ting i en annen land, lag en stor databasetabell for å holde dataene, til slutt vil du holde dataene du trenger antar jeg.

Svar

Hvis du vil gjøre det med PHP – MySQL her er en løsning som er vanskelig takket være meg:

<script type="text/javascript" charset="utf-8"> var customIcons = { restaurant: { icon: "http://labs.google.com/ridefinder/images/mm_20_blue.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" }, bar: { icon: "http://labs.google.com/ridefinder/images/mm_20_red.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" }, club: { icon: "http://labs.google.com/ridefinder/images/mm_20_yellow.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" }, church: { icon: "http://labs.google.com/ridefinder/images/mm_20_green.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" } }; function initialize() { var mapOptions = { center: new google.maps.LatLng(37.976178, 23.735881), zoom: 7, mapTypeId: google.maps.MapTypeId.roadmap }; var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); <?php header("content-type: text/html;charset=utf-8"); $getpoints = "SELECT lat, lng, name, address, type FROM markers"; $getpoints .= $filter; if(!$result = $con->query($getpoints)){ die("There was an error running the query [" . $con->error . "]"); } else { while ($row = $result->fetch_assoc()) { $thematic = ""$row[type]""; $name = ""$row[name]""; $map_address = "$row[address]"; $url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=".urlencode($map_address); $lat_long = get_object_vars(json_decode(file_get_contents($url))); // pick out what we need (lat,lng) $lat_long = $lat_long["results"][0]->geometry->location->lat . "," . $lat_long["results"][0]->geometry->location->lng; echo "var myLatlng1 = new google.maps.LatLng($lat_long); var icon = customIcons[$thematic] || {}; var marker1 = new google.maps.Marker({ position: myLatlng1, map: map, icon: icon.icon, title: "$map_address" });"; } } ?> } google.maps.event.addDomListener(window, "load", initialize); </script> 

Svar

Prøv dette geokoding api . Det er gratis for lite bruk, men hvis du vil ha mer, får de deg til å betale. Det er imidlertid billig, og du kan behandle så mye enkelt, jeg behandler millioner i måneden gjennom dem.

Svar

Bruk Mappointing-verktøy (Map pointing | Batch Geocoding Tool ( http://www.mappointing.com/ )) I dette verktøyet kan du behandle dataene ved hjelp av Google map gratis API-nøkkel. Og dette verktøyet gir avstandsberegning & Plasser søkeverktøy.

Kommentarer

  • Hvorfor ville ikke ‘ t dette traff den samme API-grensen OP nevnt?

Svar

Du kan lagre dataene dine som en tekstfil (en post per linje), og deretter batchkode dem ved hjelp av denne tjenesten: http://geocode.xyz/batch (fungerer for de fleste europeiske land)

eller du kan skrive din egen kode for å få tilgang til REST / JSON API: (det er gratis for ubegrensede oppslag)

Kommentarer

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *