Come geocodificare 300.000 indirizzi al volo?

Ho un database che ha 300.000 indirizzi, che devono essere visualizzati sulla mappa. So che se codifico geograficamente tutto lindirizzo sarà troppo costoso per me. Quindi mi chiedevo se fosse possibile geo-codificare lindirizzo al volo / in tempo reale, quando un utente selezionasse un indirizzo (un indirizzo di proprietà) cercherebbe nel database e poi geo-codificherà lindirizzo e poi lo mapperà con altri attributi.

Sarebbe davvero bello se potessi condividere un codice, un concetto o qualsiasi altra cosa. A proposito, il mio backend è su mysql supportato da Joomla.

Commenti

  • Generalmente utilizzo la capacità di geocodifica ArcGIS per geocodificare un gran numero di indirizzi. Inoltre, ‘ sono davvero interessato ai processi spiegati qui, in particolare, mi piace testare lo script python per geocodificare gli indirizzi utilizzando Google, quindi confrontarli con ciò che ho ‘ ricevuto da ArcGIS. Sfortunatamente, mi sembra di ‘ non essere in grado di trovare tutti i file e gli script correlati che si trovano in posti diversi. Sarebbe così apprezzato se qualcuno mi inviasse tutti gli script in un file zip o qualsiasi istruzione passo passo. ‘ ho provato a usarlo e a ricevere un feedback, ma non ho avuto successo

Risposta

Mehul, lavoravo nel settore della verifica degli indirizzi con una società chiamata SmartyStreets. Ci sono molti servizi di geocodifica là fuori, ma solo pochi supporteranno lelaborazione in batch con il volume richiesto. (Google e altri non consentono luso in blocco della loro API o larchiviazione / memorizzazione nella cache dei risultati.)

Se vai al tuo database MySQL ed esegui unesportazione della tua tabella che contiene gli indirizzi, salvalo come Ad esempio, un file CSV. Puoi quindi elaborarlo utilizzando lo strumento di convalida degli indirizzi in blocco per gli elenchi o lo strumento della riga di comando . Come ho detto, ci sono diversi servizi là fuori, ma presumo che tu voglia qualcosa che verifichi anche lesistenza degli indirizzi (da qui il motivo della geocodifica): se lindirizzo è sbagliato o incompleto, così sono i risultati della geocodifica. Solo pochi servizi lo fanno.

LiveAddress è un servizio certificato CASS dallUSPS. Ce ne sono alcuni là fuori, quindi fai la tua ricerca, ma vuoi qualcosa “al volo” / veloce e poco costoso, quindi di nuovo ti consiglio LiveAddress. Non solo verificherà lindirizzo, ma farà ciò che desideri, ovvero fornirà informazioni su latitudine / longitudine e anche la precisione dei risultati di geocodifica. È tutto basato sul web ed elaborerà decine di milioni di record in pochissimo tempo (vedi questa domanda come riferimento ).

Se hai ulteriori bisogno di geocodificare gli indirizzi mentre gli utenti interagiscono, US Street Address ha anche una versione API che può essere collegata a qualsiasi cosa e supporta anche lelaborazione batch on-the- fly, ma viene pagato come abbonamento, non come pagamento una tantum.

Commenti

  • Non ho familiarità con SmartyStreets, sembra promettente, grazie per il avvisa.
  • LAPI LiveAddress ne farà 300.000 in circa 5-10 minuti. Il servizio LiveAddress for Lists (caricamento di un elenco per lelaborazione) richiede 15-20 minuti. Entrambi abbastanza veloci. Il servizio List non richiederà la scrittura di alcun codice.
  • SmartyStreets geocodifica solo per gli Stati Uniti?
  • Ho dati che sono per Singapore funzionerà? Se non ci sono indicazioni che potresti darmi ????
  • SmartyStreets offre ora la verifica dellindirizzo internazionale. @ user1089553

Answer

Se ti piace Python, potresti usare API GeoPy , combinata con i collegamenti GDAL Python o Fiona e crea uno script molto semplice come questo per convertire gli indirizzi in uno shapefile di punti.

Questo geolocalizzerà un file denominato “address_to_geocode”, creando uno shapefile di output denominato “my_output.shp” nella cartella my_output:

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

Il file dovrebbe contenere solo una riga per un singolo indirizzo, come ad esempio:

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

Qui sto utilizzando lAPI di Google, ma con GeoPy è molto semplice per passare a API diverse, come Yahoo !, GeoNames o MapPoint .

Commenti

  • È fantastico! Grazie uomo! Ad ogni modo, al momento (01/2016), ‘ geocoders.Google () ‘ dovrebbe essere cambiato in ‘ geocoders.GoogleV3 () ‘ come in geopy.readthedocs.org/en/1.11.0

Risposta

Unaltra opzione per risolvere il tuo problema sarebbe importare il tuo set di dati in fusion tabelle e impostare il campo dellindirizzo come posizione. Quindi geocodificherà i punti automaticamente. Una volta completato, puoi esportare i dati come KML.

Oppure … in alternativa, puoi scrivere uno script php per utilizzare il geocoder yahoo che ha un limite di 50.000 record, quindi prima o poi avrai tutti i tuoi punti geocodificati nel tuo database.

Spero che questo ti sia stato daiuto!

Commenti

  • grazie tamas ma non vorrei ottenere kml e quindi recuperare le informazioni da lì e poi in m db. Mi piace lidea della geocodifica di yahoo ma non sono troppo sicuro della precisione che ha, dato che non ho mai usato yahoo per la mappatura. Per favore fatemi sapere se avete una sceneggiatura scritta o qualcosa del genere. Questo è di grande aiuto
  • Tieni presente che lutilizzo di Yahoo (o Google, se è per questo) geocoder con query automatiche o senza mostrare una mappa violerà i TOS …
  • Finora come so, non lo è se presenti loutput su una mappa. Correggimi se sbaglio!
  • @Tamas Kind of. Vedi questo, tuttavia: developers.google.com/maps/terms#section_10_1_3

Risposta

Sto utilizzando geopy con successo che utilizza il servizio web di geocodifica di Google. Funziona perfettamente fino a 2k punti ogni 24 ore.

Rispondi

di gran lunga il migliore e più semplice geocodificatore che ho usato https://pypi.python.org/pypi/geocoder/1.8.0 bing maps, google maps, OSM ecc ..

Risposta

Forse non è la migliore risposta alla tua domanda ma puoi provare BatchGeo. La versione gratuita ti farebbe soffrire molto, ma era comunque abbastanza buona per il mio lavoro. Tuttavia, abbiamo acquistato la versione pro.

Il trucco per ottenere le coordinate dal file KML è importarlo ad ArcGIS in seguito.

Commenti

  • Grazie, puoi dirmi come faccio a fare un BatchGeo, inoltre conosceresti i nomi della versione gratuita (Stavo provando per Google Map api v3) Anche questo significa che devo memorizzare i valori Lat / Long nel mio database per mapparlo. Questo è ciò che intendevo fare in primo luogo.
  • Con BatchGeo, dovrai importare KML nel tuo database quindi estrarre le coordinate, non conosco altro modo in quanto Google vieta di fornire le coordinate. A proposito di yahoo, la mia esperienza con la Turchia non è molto brillante. La maggior parte dei paesi in via di sviluppo è esclusa dallambito di applicazione di Yahoo ‘. Anil.

Risposta

Matej, questo perché lAPI di Google consente di tirare fino a 2,5k al giorno. er quanto riguarda la soluzione Geo, batch non è ancora supportato perché “s perché dalla mia revisione del codice geo python sembra” aprire una connessione ogni volta che richiede un nuovo cordinate, 300k probabilmente rimarrà bloccato per sempre (probabilmente con errore 400).
Gioca con Poligons dovrebbe funzionare bene, ma dipende da qual è la tua area “Play ground”, se è 1 paese o n paesi.
Per 1 paese i poligoni dovrebbero funzionare abbastanza bene .
Per n paesi la soluzione non funzionerà poiché la raccolta richiederà più tempo ogni volta che aggiungi un altro paese. Il modo migliore per farlo è il caricamento lento.
=> inizia con lidea del poligono, ogni cosa in unaltra paese, crea una grande tabella di database per contenere i dati, alla fine manterrai i dati di cui hai bisogno suppongo.

Risposta

Se vuoi farlo con PHP – MySQL ecco una soluzione che wo rked for me:

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

Answer

Prova questo API di geocodifica . È gratuito per un piccolo utilizzo, ma se vuoi di più ti fanno pagare. Tuttavia è economico e potresti elaborare molto facilmente, elaboro milioni al mese attraverso di loro.

Risposta

Utilizza gli strumenti di mappatura (Puntamento mappa | Strumento di geocodifica batch ( http://www.mappointing.com/ )) In questo strumento puoi elaborare i dati utilizzando la chiave API gratuita di Google Map. Inoltre, questo strumento fornisce il calcolo della distanza & Strumento di ricerca dei luoghi.

Commenti

  • Perché ‘ questo non raggiunge lo stesso limite API OP menzionato?

Risposta

Puoi salvare i tuoi dati come file di testo (un record per riga) quindi geocodificarli in batch utilizzando questo servizio: http://geocode.xyz/batch (funziona per la maggior parte dei paesi europei)

oppure puoi scrivere il tuo codice per accedere al REST / API JSON: (è gratuito per ricerche illimitate)

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *