21 votos

¿Cómo geocodificar 300.000 direcciones sobre la marcha?

Tengo una base de datos con 300.000 direcciones que deben aparecer en un mapa. Sé que si geocodifico todas las direcciones me resultará demasiado caro. Así que me preguntaba si es posible geo-codificar la dirección sobre la marcha / en tiempo real, cuando un usuario seleccionaría una dirección (una dirección de la propiedad) que buscaría a través de la base de datos y luego geo-codificar la dirección y luego asignarlo con otros atributos.

Estaría muy bien si pudieras compartir un código, concepto o lo que sea. Por cierto mi backend está en mysql apoyado por Joomla.

17voto

Anthony Puntos 2537

Mehul, yo trabajaba en el sector de la verificación de direcciones con una empresa llamada SmartyStreets. Hay muchos servicios de geocodificación, pero sólo unos pocos admiten el procesamiento por lotes con el volumen que tú necesitas. (Google y otros no permiten el uso masivo de su API ni el almacenamiento en caché de los resultados).

Si vas a tu base de datos MySQL y realizas una exportación de tu tabla que contiene las direcciones, guárdala como un archivo CSV por ejemplo. A continuación, puede procesarlo utilizando la función Herramienta de validación masiva de direcciones para listas o Herramienta de línea de comandos . Como ya he dicho, existen varios servicios, pero supongo que querrá algo que verifique también la existencia de las direcciones (de ahí la razón de la geocodificación): si la dirección es incorrecta o incompleta, también lo serán los resultados de la geocodificación. Sólo unos pocos servicios lo hacen.

LiveAddress es un servicio Certificado CASS por el USPS. Hay algunos por ahí así que haga su investigación, pero usted quiere algo "sobre la marcha"/rápido y barato así que de nuevo recomiendo LiveAddress. No sólo va a verificar la dirección, pero luego hacer lo que usted requiere, que es el suministro de información lat / lon y también la precisión de los resultados de geocodificación. Es todo a través de Internet y procesará decenas de millones de registros en un abrir y cerrar de ojos (véase esta pregunta como referencia ).

Si además necesita geocodificar direcciones a medida que los usuarios interactúan, US Street Address también dispone de una función API que puede conectarse a casi cualquier cosa y también admite el procesamiento por lotes sobre la marcha, pero se paga como suscripción, no como pago único.

13voto

Daniel Auger Puntos 8459

Si te gusta Python, puedes utilizar la función API GeoPy combinado con el Vinculación de GDAL con Python o Fiona y crear un script muy básico como éste para convertir las direcciones en un shapefile de puntos.

Esto geolocalizará un archivo llamado 'addresses_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 sólo tiene una línea para una única dirección, como por ejemplo:

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

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

2voto

Travis Christian Puntos 183

He estado utilizando con éxito geopy que utiliza el servicio web de geocodificación de Google. Funciona perfectamente para un máximo de 2k puntos por 24 horas.

2voto

Saad Puntos 57

Con diferencia, el mejor y más sencillo geocodificador que he utilizado https://pypi.python.org/pypi/geocoder/1.8.0 bing maps, google maps, OSM etc..

2voto

Kearns Puntos 614

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 se geocodificarán los puntos automáticamente. Una vez hecho esto, puedes exportar los datos como KML.

O..alternativamente, puedes escribir un script php para hacer uso del geocodificador de yahoo que tiene un límite de 50 000 registros, así que tarde o temprano tendrás todos tus puntos geocodificados en tu base de datos.

Espero que te haya ayudado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X