¿Cómo geocodificar 300,000 direcciones sobre la marcha?

16

Tengo una base de datos que tiene 300,000 direcciones, que se muestran en el mapa. Sé que si codifico geográficamente todas las direcciones será demasiado caro para mí. Así que me preguntaba si es posible codificar geográficamente la dirección sobre la marcha / en tiempo real, cuando un usuario seleccionara una dirección (una dirección de propiedad) buscaría a través de la base de datos y luego codificaría geográficamente la dirección y luego la mapearía con otros atributos.

Sería muy bueno si pudieras compartir un código, un concepto o cualquier cosa. Por cierto, mi backend está en mysql con el apoyo de Joomla.

    
pregunta user1089553 22.03.2012 - 07:53

11 respuestas

14

Mehul, solía trabajar en la industria de la verificación de direcciones con una empresa llamada SmartyStreets. Existen muchos servicios de geocodificación, pero solo unos pocos admitirán el procesamiento por lotes con el volumen que necesita. (Google y otros no permiten el uso masivo de su API o los resultados de almacenamiento / almacenamiento en caché).

Si va a su base de datos MySQL y realiza una exportación de su tabla que contiene las direcciones, guárdela como un archivo CSV, por ejemplo. Luego puede procesarlo utilizando la herramienta web SmartaList o herramienta de línea de comandos . Como dije, hay varios servicios por ahí, pero querrá algo, supongo, que verifique la existencia de direcciones también (de ahí el motivo de la geocodificación): si la dirección es incorrecta o está incompleta, también lo son los resultados de la geocodificación. . Solo unos pocos servicios hacen esto.

LiveAddress es un servicio que está CASS-Certified por USPS. Hay algunos por ahí, así que investiga, pero quieres algo "sobre la marcha" / rápido y barato, así que de nuevo te recomiendo LiveAddress. No solo verificará la dirección sino que luego hará lo que necesite, que es la información de lat / lon de suministro y también la precisión de los resultados de la geocodificación. Es todo basado en web y procesará decenas de millones de registros en ningún momento (consulte esta pregunta como referencia ).

Si aún necesita geocodificar las direcciones a medida que los usuarios interactúan, LiveAddress también tiene una API que se puede conectar a Casi cualquier cosa y también admite el procesamiento por lotes sobre la marcha, pero se paga como una suscripción, no un pago único.

    
respondido por el Matt 22.03.2012 - 13:10
11

Si te gusta Python, puedes usar la API de GeoPy , combinada con la GDAL Python bindings o Fiona , y crea una muy básica Secuencia de comandos como esta para convertir las direcciones en un shapefile de puntos.

Esto geolocalizará un archivo llamado 'Address_to_geocode', creando un shapefile de salida llamado 'my_output.shp' en la carpeta 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')

Se supone que el archivo solo tiene una línea para una sola dirección, como por ejemplo:

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

Aquí estoy usando la API de Google, pero con GeoPy es muy básico para cambiar a diferentes API, como Yahoo !, GeoNames o MapPoint .

    
respondido por el capooti 22.03.2012 - 16:51
1

Otra opción para resolver su problema sería importar su conjunto de datos a las tablas de fusión y establecer el campo de dirección como ubicación. Entonces geocodificará los puntos automáticamente. Una vez que se complete, puedes exportar los datos como KML.

O ... alternativamente, puede escribir un script php para utilizar el geocodificador de yahoo que tiene un límite de 50 000 registros, por lo que tarde o temprano tendrá todos sus puntos geocodificados en su base de datos.

¡Espero que esto haya ayudado!

    
respondido por el EZMapdesign 22.03.2012 - 08:55
1

de lejos, el mejor y más fácil geocodificador que he usado enlace Mapas de Bing, mapas de Google, OSM, etc.

    
respondido por el ziggy 31.03.2016 - 17:30
0

Tal vez no sea la mejor respuesta a su pregunta, pero puede intentar BatchGeo. La versión gratuita te haría sufrir mucho, pero aún así fue lo suficientemente bueno para mi trabajo. Aunque, hemos comprado la versión pro.

El truco para obtener las coordenadas del archivo KML es importarlo a ArcGIS más adelante.

    
respondido por el Anıl Çelik 22.03.2012 - 08:39
0

He estado usando con éxito Geopy que usa el servicio web de geocodificación de Google. Funciona perfectamente hasta con 2k puntos por 24 horas.

    
respondido por el Matej 30.01.2014 - 22:05
0

Matej, eso es porque la API de Google permite extraer hasta 2.5k por día.
Acerca de la solución Geo, aún no se ha encontrado soporte para los lotes, debido a que, según mi revisión del código de geo python, parece que se abre la conexión cada vez que solicita una nueva coordenada, 300k probablemente se quedarán para siempre (probablemente con el error 400). > Jugar con Poligons debería hacer el truco, pero depende de cuál sea tu área de 'Campo de juego', si es 1 país o n países.
Para 1 país, los polígonos deberían funcionar bastante bien.
Para n países, la solución no funcionará, ya que la recopilación llevará más tiempo cada vez que agregue otro país. El mejor aproch para hacerlo es la carga perezosa.
 = > Comience con la idea del polígono, cada cosa en otro país, cree una tabla de base de datos grande para guardar los datos, eventualmente tendrá los datos que necesita, supongo.

    
respondido por el Benjaminel 21.05.2015 - 15:59
0

Si quieres hacerlo con PHP, MySQL es una solución que me funcionó:

<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>
    
respondido por el pancy1 20.07.2015 - 15:30
0

Prueba esta api de geocodificación . Es gratis para uso pequeño pero si quieres más te hacen pagar. Sin embargo, es barato y usted podría procesarlo fácilmente, yo proceso millones al mes a través de ellos.

    
respondido por el John M. 14.11.2015 - 12:00
0

Puede guardar sus datos como un archivo de texto (un registro por línea) y luego codificarlos geográficamente mediante este servicio: enlace (funciona para la mayoría de los países europeos)

o, puede escribir su propio código para acceder a la API REST / JSON: enlace (Es gratis para búsquedas ilimitadas)

    
respondido por el Ervin Ruci 03.04.2016 - 06:38
0

Use las herramientas de Mappointing (Mapa señalado | Batch Geocoding Tool ( enlace )) En esta herramienta puede procesar los datos utilizando la clave API gratuita de Google map. Y también esta herramienta proporciona cálculo de distancia & Coloque la herramienta de búsqueda.

    
respondido por el Debasis Sahu 23.11.2017 - 22:27

Lea otras preguntas en las etiquetas