¿Cómo geocodificar 300.000 direcciones sobre la marcha?

Tengo una base de datos que tiene 300.000 direcciones, que se mostrarán en el mapa. Sé que si codifico geográficamente todas las direcciones, será demasiado caro para mí. Así que me preguntaba si es posible geocodificar la dirección sobre la marcha / en tiempo real, cuando un usuario seleccionaba una dirección (una dirección de propiedad), buscaba en la base de datos y luego geocodificaba la dirección y luego la asignaba con otros atributos.

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

Comentarios

  • Generalmente uso la capacidad de geocodificación de ArcGIS para geocodificar una gran cantidad de direcciones. Además, ‘ estoy realmente interesado en los procesos que se explican aquí, especialmente, me gusta probar la secuencia de comandos de Python para geocodificar las direcciones usando Google, luego compararlas con lo que ‘ obtenido de ArcGIS. Desafortunadamente, me parece que ‘ no puedo encontrar todos los archivos y scripts relacionados que se encuentran en diferentes lugares. Le agradeceríamos mucho que alguien me envíe todos los scripts en un archivo zip o cualquier instrucción paso a paso. ‘ he intentado utilizarlo y obtener algunos comentarios para ti, pero no he tenido éxito

Responder

Mehul, solía trabajar en la industria de verificación de direcciones con una empresa llamada SmartyStreets. Hay muchos servicios de codificación geográfica, 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 el almacenamiento / almacenamiento en caché de los resultados).

Si va a su base de datos MySQL y realiza una exportación de su tabla que contiene las direcciones, guárdela como Por ejemplo, un archivo CSV. A continuación, puede procesarlo con la Herramienta de validación masiva de direcciones para listas o la Herramienta de línea de comandos . Como dije, existen varios servicios, pero supongo que querrás algo que verifique la existencia de direcciones también (de ahí el motivo de la codificación geográfica): si la dirección es incorrecta o está incompleta, también lo son los resultados de la codificación geográfica. Solo unos pocos servicios hacen esto.

LiveAddress es un servicio que está certificado por CASS por USPS. Hay algunos por ahí, así que investiga, pero quieres algo «sobre la marcha» / rápido y económico, así que nuevamente recomiendo LiveAddress. No solo verificará la dirección, sino que hará lo que necesite, es decir, proporcionar información lat / lon y también la precisión de los resultados de codificación geográfica. Todo basado en web y procesará decenas de millones de registros en poco tiempo (consulte esta pregunta como referencia ).

Si tiene más necesita geocodificar direcciones mientras los usuarios interactúan, US Street Address también tiene una versión de API que se puede conectar a casi cualquier cosa y también admite procesamiento por lotes en la fly, pero se paga como una suscripción, no un pago único.

Comentarios

  • No estoy familiarizado con SmartyStreets, parece prometedor, gracias por el avisos.
  • La API LiveAddress hará 300.000 en aproximadamente 5-10 minutos. El servicio LiveAddress for Lists (cargar una lista para su procesamiento) tarda entre 15 y 20 minutos. Ambos bastante rápidos. El servicio List no requerirá que escriba ningún código.
  • SmartyStreets solo geocodificaciones para los EE. UU.
  • Tengo datos que son para Singapur, ¿funcionarán? Si no tiene alguna dirección, me podría dar ????
  • SmartyStreets ahora ofrece verificación de dirección internacional. @ user1089553

Responder

Si te gusta Python, puedes usar API GeoPy , combinada con enlaces GDAL Python o Fiona , y crear un script muy básico como este para convertir las direcciones en un shapefile de puntos.

Esto geolocalizará un archivo llamado «direcciones_a_geocode», creando un archivo shape 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 .

Comentarios

  • ¡Esto es genial! ¡Gracias hombre! De todos modos, en la actualidad (01/2016), ‘ geocoders.Google () ‘ debería cambiarse a ‘ geocoders.GoogleV3 () ‘ como en geopy.readthedocs.org/en/1.11.0

Respuesta

Otra opción para resolver su problema sería importar su conjunto de datos a Fusion tablas y establezca el campo de dirección como ubicación. Luego geocodificará los puntos automáticamente. Una vez que esté completo, puede exportar los datos como KML.

O, alternativamente, puede 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 esto te haya ayudado!

Comentarios

  • gracias tamas pero No me gustaría obtener el kml y luego obtener la información de allí y luego a m db. Me gusta la idea de la codificación geográfica de Yahoo, pero no estoy muy seguro de la precisión que tiene, ya que nunca he usado Yahoo para la cartografía. Por favor, avíseme si tiene algún guión escrito o algo. Esta es una gran ayuda
  • Tenga en cuenta que usar el geocodificador de Yahoo (o Google, para el caso) con consultas automatizadas o sin mostrar un mapa violará los TOS …
  • Hasta ahora como sé, no lo es si presenta la salida en un mapa. ¡Corrígeme si me equivoco!
  • @Tamas Un poco. Sin embargo, vea esto: developers.google.com/maps/terms#section_10_1_3

Respuesta

He estado utilizando con éxito geopy que utiliza el servicio web de codificación geográfica de Google. Funciona perfectamente con hasta 2000 puntos por 24 horas.

Respuesta

, con mucho, el mejor y más fácil geocodificador que he usado https://pypi.python.org/pypi/geocoder/1.8.0 mapas de bing, mapas de Google, OSM, etc.

Respuesta

Quizás no sea la mejor respuesta a tu pregunta, pero puedes probar BatchGeo. La versión gratuita te haría sufrir mucho, pero aún así fue lo suficientemente buena para mi trabajo. Sin embargo, hemos comprado la versión pro.

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

Comentarios

  • Gracias, ¿puede decirme cómo hago un BatchGeo, también sabría los nombres de la versión gratuita? (Estaba probando para Google Map api v3). ¿Esto también significa que tengo que almacenar los valores Lat / Long en mi base de datos para mapearlo. Esto es lo que pretendía hacer en primer lugar.
  • Con BatchGeo, tendrá que importar KML a su base de datos y luego extraer las coordenadas, no conozco otra forma, ya que Google prohíbe proporcionar coordenadas. Acerca de Yahoo, mi experiencia con Turquía no es realmente brillante. La mayoría de los países en desarrollo quedan fuera del alcance de Yahoo ‘. Anil.

Respuesta

Matej, eso es porque la API de Google permite extraer hasta 2.5k por día.
Acerca de la solución Geo, el lote aún no es compatible, eso es porque, según mi revisión del código geo python, parece que se abre la conexión cada vez que solicita un nuevo cordón, 300k probablemente se bloqueará para siempre (probablemente con error 400).
Jugar con Poligons debería funcionar, pero depende de cuál sea tu área de «Playground», 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 tomará más tiempo cada vez que agregue otro país. El mejor método para hacerlo es la carga diferida.
=> comience con la idea del polígono, todo en otro país, cree una gran tabla de base de datos para contener los datos, eventualmente tendrá los datos que necesita, supongo.

Respuesta

Si desea hacerlo con PHP – MySQL aquí hay una solución que wo rked para mí:

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

Responder

Pruebe esto api de codificación geográfica . Es gratis para un uso pequeño, pero si quieres más, te hacen pagar. Sin embargo, es barato y podrías procesarlo con mucha facilidad, proceso millones al mes a través de ellos.

Respuesta

Utilice herramientas de Mappointing (Map apuntando | Herramienta de codificación geográfica por lotes ( http://www.mappointing.com/ )) En esta herramienta puede procesar los datos utilizando la clave API gratuita de mapas de Google. Y también esta herramienta proporciona cálculo de distancia & Herramienta de búsqueda de lugares.

Comentarios

  • ¿Por qué no ‘ esto alcanzaría el mismo límite de API que OP mencionado?

Respuesta

Puede guardar sus datos como un archivo de texto (un registro por línea) y luego geocodificarlos por lotes usando este servicio: http://geocode.xyz/batch (funciona para la mayoría de los países europeos)

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

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *