Come geocodificare 300.000 indirizzi al volo?


18

Ho un database che ha 300.000 indirizzi, che devono essere mostrati sulla mappa. So che se geo-codifico tutto l'indirizzo sarà troppo costoso per me. Quindi mi chiedevo se fosse possibile geo-codificare l'indirizzo al volo / in tempo reale, quando un utente selezionava un indirizzo (un indirizzo di proprietà) avrebbe cercato nel database e quindi geo-codificato l'indirizzo e quindi mapparlo con altri attributi.

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


In genere utilizzo la funzionalità di geocodifica ArcGIS per geocodificare un gran numero di indirizzi. Inoltre, sono davvero interessato ai processi spiegati qui, in particolare, come testare lo script Python per geocodificare gli indirizzi utilizzando Google, quindi confrontarli con quello che ho ottenuto da ArcGIS. Sfortunatamente, mi sembra di non riuscire a trovare tutti i file e gli script correlati che si trovano in luoghi diversi. Sarebbe così apprezzato se qualcuno per favore mi mandi tutti gli script in un file zip o qualsiasi istruzione passo-passo. Ho provato ad usarlo e ad avere un feedback, ma non sono stato fortunato
Housh

Risposte:


15

Mehul, lavoravo nel settore della verifica degli indirizzi con una società chiamata SmartyStreets. Esistono molti servizi di geocodifica, ma solo pochi supporteranno l'elaborazione batch con il volume richiesto. (Google e altri non consentono l'uso in blocco delle loro API o i risultati di archiviazione / memorizzazione nella cache.)

Se vai al tuo database MySQL ed esegui un'esportazione della tua tabella che contiene gli indirizzi, salvalo ad esempio come file CSV. È quindi possibile elaborarlo utilizzando lo strumento Web SmartyList o lo strumento da riga di comando . Come ho detto, ci sono diversi servizi là fuori, ma vorrai qualcosa, presumo, che verifichi anche l'esistenza di indirizzi (da qui il motivo del geocodifica) - se l'indirizzo è sbagliato o incompleto, lo sono anche i risultati del geocodifica . Solo pochi servizi lo fanno.

LiveAddress è un servizio certificato CASS dall'USPS . Ce ne sono alcuni là fuori così fai la tua ricerca, ma vuoi qualcosa di "al volo" / veloce ed economico, quindi ti consiglio di nuovo LiveAddress. Non solo verificherà l'indirizzo ma poi farà come richiesto, ovvero fornire informazioni lat / lon e anche la precisione dei risultati di geocodifica. È tutto basato sul Web e elaborerà decine di milioni di record in pochissimo tempo (vedi questa domanda come riferimento ).

Se hai ancora bisogno di geocodificare gli indirizzi mentre gli utenti interagiscono, LiveAddress ha anche una versione API che può essere collegata a qualsiasi cosa e supporta anche l'elaborazione batch al volo, ma viene pagata come abbonamento, non una tantum pagamento.


Non ha familiarità con SmartyStreets, sembra promettente, grazie per l'heads up.
Derek Swingley,

L'API di LiveAddress eseguirà 300.000 in circa 5-10 minuti. Il servizio LiveAddress for Lists (carica un elenco per l'elaborazione) richiede 15-20 minuti. Entrambi abbastanza veloci. Il servizio Elenco non richiederà di scrivere alcun codice.
Jeffrey,

2
SmartyStreets solo geocodici per gli Stati Uniti?
Mapperz

Ho dei dati per Singapore che funzioneranno? Se non ci fossero indicazioni che potresti darmi ????
user1089553

Esistono molte regole sul copyright con Google Bing e altri fornitori. Non esportare dati!

11

Se ti piace Python, puoi utilizzare l' API GeoPy , combinata con i collegamenti GDAL Python o Fiona , e creare uno script molto semplice come questo per convertire gli indirizzi in un file di forma punto.

Questo geolocalizzerà un file chiamato 'address_to_geocode', creando uno shapefile di output chiamato '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 avere 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 usando l'API di Google, ma con GeoPy è molto semplice passare a API diverse, come Yahoo !, GeoNames o MapPoint .


Questo è fantastico! Grazie uomo! Comunque, allo stato attuale (01/2016), 'geocoders.Google ()' dovrebbe essere cambiato in 'geocoders.GoogleV3 ()' come in geopy.readthedocs.org/en/1.11.0
umbe1987,

1

Un'altra opzione per risolvere il tuo problema sarebbe quella di importare il tuo set di dati in tabelle di fusione e impostare il campo dell'indirizzo 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 abbia aiutato!


grazie tamas ma non vorrei ottenere il kml e quindi recuperare le informazioni da lì e poi su m db. Mi piace pensare al geocodifica di Yahoo ma non sono troppo sicuro dell'accuratezza che ha, dato che non ho mai usato Yahoo per la mappatura. Per favore fatemi sapere se avete qualche sceneggiatura scritta o qualcosa del genere. Questo è di grande aiuto
user1089553

Tieni presente che l'utilizzo del geocoder Yahoo (o Google, per quella materia) con query automatizzate o senza mostrare una mappa violerà TOS ...
Matt

Per quanto ne so, non è se si presenta l'output su una mappa. Correggimi se sbaglio!
EZMapdesign,

@Tamas Kind of. Vedi questo, tuttavia: developers.google.com/maps/terms#section_10_1_3
Matt


0

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

Il trucco per ottenere le coordinate dal file KML è importarlo in ArcGIS in un secondo momento.


Grazie, puoi dirmi come posso fare un BatchGeo, sapresti anche i nomi della versione gratuita (stavo provando per Google Map api v3). Questo significa anche che devo archiviare i valori Lat / Long nel mio database per mapparlo. Questo è quello che intendevo fare in primo luogo.
user1089553

Con BatchGeo, dovrai importare KML nel tuo database, quindi estrarre le coordinate, non conosco nessun altro modo in cui 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 sono esclusi dal campo di applicazione di Yahoo. Anil.
Anıl Çelik

0

Ho usato con successo la geopia che utilizza il servizio web di geocodifica di Google. Funziona perfettamente fino a 2k punti ogni 24 ore.


0

Matej, questo perché l'API di Google consente di recuperare fino a 2,5k al giorno.
Per quanto riguarda la soluzione Geo, il batch non è ancora stato trovato supportato perché dalla mia recensione del codice geo python sembra che si apra la connessione ogni volta che richiede un nuovo coordinato, probabilmente 300k rimarrà bloccato per sempre (probabilmente con errore 400).
Gioca con Poligons dovrebbe fare il trucco, ma dipende da quale sia l'area del tuo "campo di gioco", 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 miglior aproch per farlo è il carico pigro.
=> inizia con l'idea del poligono, ogni cosa in un altro paese, crea una grande tabella di database per contenere i dati, alla fine manterrai i dati di cui hai bisogno suppongo.


0

Se vuoi farlo con PHP - MySQL ecco una soluzione che ha funzionato per 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>

0

Prova questo geocoding api . È gratuito per un piccolo utilizzo ma se vuoi di più ti fanno pagare. È comunque economico e potresti elaborarlo molto facilmente, li elaboro milioni al mese.


0

È possibile salvare i dati come file di testo (un record per riga), quindi geocodificare 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 all'API REST / JSON: http://geocode.xyz/api (è gratuito per ricerche illimitate)


0

Utilizzare gli strumenti di mappatura (Strumento di geocodifica batch di puntamento della mappa ( http://www.mappointing.com/ )) In questo strumento è possibile elaborare i dati utilizzando la chiave API gratuita di Google map. E anche questo strumento fornisce il calcolo della distanza e lo strumento di ricerca dei luoghi.


Perché questo non dovrebbe colpire lo stesso OP limite API menzionato?
lynxlynxlynx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.