Geocodificación masiva 20 millones de direcciones de EE. UU.

34

¿Existen bases de datos gratuitas o con precios razonables para los EE. UU. Que puedan buscarse y devolver información de latitud y longitud?

Chris Muench
fuente
Rápido está muy bien, pero la precisión es todo. - Wyatt Earp Cuando se trata de un geocodificador, hay algunos (como uno al que se hace referencia en este hilo) que ofrecen un precio bajo para geocodificar muchas direcciones, pero si está buscando una precisión muy fina en muchas áreas diferentes, debe ir con Un geocodificador premium. Los resultados serán más consistentes y extraordinariamente precisos, especialmente cuando no se produce la correspondencia postal. No hay mucho contra lo que pueda competir cuando se trata de la geocodificación más precisa, de lo contrario, sus cálculos no estarán a la altura de otras tecnologías que ofrecen a los usuarios t
2
Ofrece su opinión sobre la necesidad de alta calidad, pero no ofrece sugerencias. Proporcione algunas de sus sugerencias, de lo contrario no ayudará a responder la pregunta de los usuarios.
RyanDalton

Respuestas:

30

Para tantos registros, ni siquiera considere un servicio web. Lo estrangularán o lo interrumpirán antes de que pueda terminar su tarea.

Entonces, su opción se convierte en ejecutarlo localmente, y para eso tiene varias opciones comerciales o gratuitas.

Las opciones gratuitas utilizarán el conjunto de datos del censo TIGER que deberá cargar en una base de datos espacial. Puede encontrar bibliotecas que geocodifiquen contra TIGER para PostGIS o incluso sqlite . Diablos, incluso puedes usar ArcGIS para geocodificar contra TIGRE. Por supuesto, ArcGIS no es gratuito, lo que me lleva a las siguientes opciones comerciales. Si tiene una licencia de ArcGIS, es probable que tenga un DVD de StreetMap con un conjunto de datos TeleAtlas ( me refiero a Tom Tom ) o Navteq. Eso depende si tienes StreetMap Premium incluido. Cualquiera de esos dos conjuntos de datos probablemente le dará resultados más consistentes que TIGER.

Hágase un favor y haga varias copias de la base de datos de la calle una vez que sus datos estén cargados y ejecute el proceso de geocodificación en varias máquinas con un subconjunto de los datos de entrada. No intente ejecutarlo en una sola máquina o esperará días a que termine, sin mencionar que lo más probable es que cualquier proceso que ejecute probablemente pierda memoria y se bloquee varias veces antes de que finalice. Esto significa que desea tener diferentes puntos de control para su proceso.

Ragi Yaser Burhum
fuente
2
He encontrado beneficioso dividir los datos de entrada y dirección en porciones más pequeñas (como los estados). Esto hace que los localizadores sean más rápidos de usar y que los procesos sean menos propensos a bloquearse después de ejecutarse durante demasiado tiempo. Por lo general, no es demasiado difícil crear un bucle basado en estado para realizar la creación del localizador y la geocodificación de una sola vez.
Nathanus
26

Trabajo en SmartyStreets (una compañía de verificación de direcciones). Nuestro servicio es gratuito para todos (hasta el nivel básico). Las startups también pueden solicitar el uso de nuestro servicio completamente gratis durante el primer año. Entonces, si cumple con esa clasificación, no hay cargo por nuestro servicio ilimitado por un año.

Ragi recomienda contra un servicio web, sin embargo, nuestra API puede limpiar, estandarizar y geocodificar fácilmente 20 millones de direcciones en aproximadamente 5 horas (aproximadamente 1000 por segundo). Parte de ese tiempo dependerá de la velocidad de su máquina (cuántos núcleos tiene) y su conexión de red (no lo intente a través de 3G, pero una conexión de banda ancha estándar funcionará bien).

Solo quería señalar que ciertamente es posible con un servicio web.

Actualización: A partir del 1 de agosto de 2017, probé de forma remota nuestro servicio web y obtuve 70,000 búsquedas por segundo sostenidas utilizando solo un MacBook pro 2015 en una red inalámbrica. Sí, es bastante rápido. Eso significa que una lista pequeña como 20 millones de direcciones solo tomaría unos 5 minutos.

Jeffrey
fuente
2
Bueno, si va a dejar que geocodifique 20 millones de registros sin cobrarle un centavo y pueda hacer 1000 / solicitudes por segundo (extremadamente impresionante), entonces, por supuesto, esta es una mejor solución que construir su propia pila desde cero.
Ragi Yaser Burhum
1
Absolutamente. 1000 / segundo no el máx. Es solo un buen estándar. Los subprocesos múltiples, los núcleos múltiples y las conexiones de red más rápidas podrían incluso aumentar ese rendimiento. Tenemos un cliente reciente sin fines de lucro que acaba de usar nuestro servicio para procesar 180 millones de direcciones. Con la llegada de las elecciones nacionales, muchos grupos están tratando de limpiar y geocodificar sus direcciones.
Jeffrey
1
@RagiYaserBurhum Tenga en cuenta que Chris también está buscando soluciones a "precios razonables". Claro, construir su propia pila desde cero puede ser "gratis", pero ¿es realmente, si considera su costo de oportunidad? El beneficio que obtiene al hacerlo todo usted mismo: potencialmente sin costos ("gratis"). El beneficio de usar un servicio existente: ahorrar muchas horas y horas de tiempo. Además, mil solicitudes / segundo son probablemente rutinarias en estos días con arquitecturas web modernas (paralelización) para lidiar con cargas de tráfico constantes. Al final, creo que para este asunto, "gratis" y "a un precio razonable" es una cuestión de preferencia.
Matt
1
@Matt Hands down "gratis" no siempre es gratis. No discutiré en contra de eso (su tiempo vale dinero). Soy consciente de que el costo de la mayoría de las soluciones de código abierto es en realidad un cambio en el modelo de costos de las licencias de uso a los servicios de soporte. No estaba tratando de ser irónico, creo que si Jeffey puede ofrecer la solución de forma gratuita (o incluso a un precio razonable), esta es la mejor solución. En el mejor listado de precios desde SmartyStreets, puntos 20m costaría $ 100.000. Estoy seguro de que incluso para casos de uso comercial pueden hacer una fracción del costo.
Ragi Yaser Burhum
1
También 1000 / req por segundo, que es muy factible en arquitecturas contemporáneas, aún requeriría una ingeniería increíble para la geocodificación . Están recibiendo mis accesorios para hacerlo :)
Ragi Yaser Burhum
8

Utilicé este tutorial que describe cómo construir un geocodificador postgis utilizando los datos de TigerLine 2010. Lo estoy ejecutando en este momento, no es rápido, ya que tomará 3 semanas geocodificar 2 millones de direcciones.

Sin embargo, es gratis, sin estrangulamiento, y a alguien con habilidades mínimas de codificación y postgres en menos de 2 días para configurar y cargar con los datos de un estado (grande) para comenzar a geocodificar. Tampoco he realizado ningún ajuste de postgres para el sistema y se está ejecutando sobre monturas NFS, por lo que sospecho que hay un aumento de rendimiento de uno o dos órdenes de magnitud que podría obtener si lo necesitara.

En lugar de usar servicios web, cargué todas mis direcciones en la base de datos de postgres, y luego ejecuto un script perl rápido y sucio para geocodificarlos uno a la vez:

perl -e for ($i=1; $i<[max_key_value]; $i+=1) 
   {printf "UPDATE source_addresses
               SET (rating, new_address, lon, lat) 
                     = (g.rating, pprint_addy(g.addy), 
                       ST_X(g.geomout), ST_Y(g.geomout) ) 
              FROM (SELECT DISTINCT ON (address_id) address_id, (g1.geo).* 
                      FROM (SELECT address_id, (geocode(address)) As geo 
                              FROM source_addresses As ag 
                             WHERE ag.rating IS NULL and address_id = $i 
                           ) As g1 
                     ORDER BY address_id, rating LIMIT 1
                   ) As g WHERE g.address_id = source_addresses.address_id;\n"
  } | psql -d geocoder 

(saltos de línea únicamente para facilitar la lectura)

De modo que genera una instrucción de actualización "geocodificar la dirección con este valor de ID y usar la mejor coincidencia", y la canaliza a psql para hacerlo. Solo intenta geocodificar la dirección sin calificación, es decir, las que aún no están geocodificadas. Por lo tanto, es reiniciable, y cada uno se realiza de forma independiente.

Adam Musch
fuente
¿Encontró que los datos de TigerLine de 2010 eran inexactos para algunas direcciones?
Chris Muench
No son datos perfectos de ninguna manera; sin embargo, los datos de la dirección que tengo son sépticos desde una perspectiva de calidad. El geocodificador tal como está escrito proporciona un campo de "calificación", donde menor es mejor. Agregaré un ejemplo a mi respuesta.
Adam Musch
@ChrisMuench: Si me das una o dos direcciones de California, me alegraría dispararlas a través de mi geocodificador para mostrarte, de esa manera no las elegiré.
Adam Musch
Bueno, probé el geocodificador postgis para alguna dirección en Nueva York, y podrían estar a 500 pies a 1 milla
Chris Muench
Esto es demasiado poco y demasiado tarde para ti, pero a otra persona puede resultarle útil ... Asegúrate de que tu dirección se analice bien. Me di cuenta de que mi simple concatenado "123 Oak St. Anytown ST 12345" se aceleró en 550x cuando agregué comas: "123 Oak St., Anytown, ST, 12345"
aaryno
3

¿Supongo que quieres geocodificar pero no pagar nada por ello? Hay muchos servicios en los que puede geocodificar 20 millones de registros, pero le costará. Esri, Pitney Bowes y otros ofrecen estos servicios mediante suscripción o con un costo por x códigos geográficos. 20 millones no es trivial, pero supongo que hay un caso de negocios para esto.

James Fee
fuente
3

Esta publicación probablemente sea demasiado tarde para ayudar al póster original. Sin embargo, para otros que buscan georreferenciar grandes cantidades de datos de forma gratuita, pueden consultar mi software llamado "Easy Georeferencer", que se crea de forma independiente, fácil de usar y potente (vea la captura de pantalla al final de la publicación).

El programa es simple y directo de usar, y se ejecuta directamente desde un archivo exe que no requiere instalación. Puede elegir geocodificar entre la fuente de datos GNS o GeoNames, y puede hacer lo que ningún otro geocodificador puede hacer hasta ahora, geocodificar provincias basadas en la base de datos de unidades administrativas de GADM, así como geocodificar fronteras históricas de países desde el conjunto de datos CShapes. La única advertencia es que no geocodifica datos de dirección. Todas las salidas vienen en forma de archivos listos para visualización / análisis inmediato en un SIG.

En cuanto a la eficiencia y el manejo de grandes datos, el programa ha sido probado para geocodificar 100,000 registros en solo 3 horas. Para conjuntos de datos más grandes, el aumento esperado en el tiempo de procesamiento debería caer curvilíneamente porque gran parte del tiempo de procesamiento va solo a la fase inicial cuando se cargan los conjuntos de datos de referencia del país, pero se recupera después. Además, uno no tiene que preocuparse por los cuellos de botella de Internet o los problemas de conectividad al geocodificar grandes conjuntos de datos porque el software, los conjuntos de datos de referencia y el procesamiento se basan en la computadora local. Las tasas de coincidencia pueden llegar hasta 80-90 por ciento porque se basa en la contabilidad de coincidencia de nombres difusos para las diferencias ortográficas.

En el paquete de descarga se incluyen más detalles, incluido un documento introductorio y una guía para principiantes. No necesita dudar en probarlo, el programa es solo un archivo simple que puede colocar y ejecutar en su escritorio sin ningún compromiso o desorden en su computadora.

El software se puede descargar desde: http://geocodeanything.wordpress.com/

Espero que ayude.

ingrese la descripción de la imagen aquí

Karim Bahgat
fuente
Siempre debe revelar que son el autor / desarrollador y / o trabajan para la compañía que produce un producto de software.
RyanDalton
@RyanDalton Revelé que yo era el autor cuando escribí "software que creé", aunque puedo ver cómo pudo pasar desapercibido porque no se le dio mucho énfasis en la oración. He cambiado mi redacción para, con suerte, aclarar que estoy tolerando mi propio software.
Karim Bahgat
2

Como va a geocodificar direcciones de EE. UU., Creo que la herramienta Dirección de calle para coordenadas del Data Science Toolkit debería funcionar bien para usted.

This API takes either a single string representing a postal address, or a JSON-encoded  
array of addresses, and returns a JSON object with a key for every address. The value 
for each key is either null if no information was found for the address, or an object 
containing location information, including country, region, city and latitude/longitude 
coordinates.

Sin embargo, es posible que desee descargar la máquina virtual y ejecutarla desde su propio hardware. De esa manera, no tiene que preocuparse por los límites de la API y también lo controla. Ah, ¿y dije que es gratis? ;-)

RK
fuente
¡Eso es asombroso! Me sorprende que nunca haya oído hablar de eso antes. Además, es genial que pueda descargar la VM y tenerla lista para ejecutarse en su propio sistema.
RyanDalton
También es de código abierto. :) github.com/petewarden/dstk
RK
2

No he visto ninguna referencia al nivel de precisión que necesita, pero supongo que desea un techo largo o cercano a eso. La calidad de la dirección de entrada también puede ser un factor. Una lista de direcciones bien limpiada codificará mejor y más rápido que una lista de direcciones incompletas o incorrectas. Además, ¿es aceptable una tasa de éxito del 90% o necesita los 20 millones de direcciones codificadas? No tengo una solución gratuita, pero hay una relativamente económica que conozco y utilizo. ZP4 de Semaphore Corp, http://www.semaphorecorp.com/ofrece un depurador de direcciones / geocodificador y complementos que procesarán las direcciones y devolverán una dirección limpia, una bandera que indica si la dirección es entregable por USPS y el lat largo para el ZIP + 4. La precisión ZIP + 4 generalmente está cerca de la precisión de la azotea en áreas urbanizadas (lado correcto de la calle y en el bloque correcto) y no está cerca en áreas rurales. El costo de una licencia de 30 días es de $ 120. Después de ese tiempo, el depurador de direcciones seguirá funcionando, pero la Validación de punto de entrega (DPV) y las devoluciones geográficas no funcionarán. Con una computadora relativamente rápida, construida en los últimos dos años, y todos los datos almacenados y accedidos localmente, los 20 millones de registros deberían realizarse en aproximadamente 10 días. He estado geocodificando direcciones durante los últimos 15 años y he estado usando ZP4 durante la mayor parte de ese tiempo. Antes de que ofrecieran long-lat o DPV,

ktreiche
fuente
2

Ahora estoy geocodificando 18 millones de direcciones, así que quiero compartir mi configuración.

Básicamente, utilicé un libro de jugadas ansible para configurar la instancia de Amazon EC2 como un servidor PostGIS Tiger Geocoder, luego utilicé el script para agrupar las direcciones de geocodificación, asignarlas al bloque del censo.

El costo de Amazon EC2: el requisito mínimo de 180G SSD cuesta alrededor de $ 18 / mes. Mi instancia t2.large cuesta alrededor de $ 90 / mes en total.

Si tiene una caja de Linux con SSD> 180G, también puede usarla básicamente gratis.

Mi rendimiento promedio es de aproximadamente 170 ~ 300 ms / dirección de buena calidad, 400 ~ 600 ms / dirección de mala calidad. Por mala calidad me refiero a que muchos de ellos tienen una ciudad o código postal faltante o incorrecto, o incluso una dirección incorrecta. Este tipo de dirección tarda mucho más tiempo en geocodificar, por lo que su rendimiento depende de la calidad de la entrada. La instancia de Amazon EC2 que utilicé puede geocodificar alrededor de 4 millones de direcciones formateadas realmente malas en un mes.

Para obtener más detalles, consulte la publicación de mi blog sobre la configuración del sistema y las secuencias de comandos

dracodoc
fuente
1

Si su flujo de trabajo está en Python, geopy es una gran solución. Puede escribir su lógica de geocodificación básica de forma abstracta y luego elegir entre uno de los muchos proveedores (ArcGIS, Baidu, Bing, DataBC, GeocodeFarm, GoecoderDotUS, GeoNames, Google, IGN France, LiveAddress, NaviData, Nominatim (OSM), OpenCage, OpenMapQuest, Yahoo! BOSS Place Finder, What3Words, Yandex ... phew). Incluso podría usarlos todos y, en última instancia, elegir el punto que tenga la mayor confianza de ser correcto a través de la validación por múltiples servicios de geocodificación. Muchos de estos servicios requieren registro (pero no todos). Puede que no sean igualmente adecuados para su uso en los EE. UU., Pero el beneficio de hacerlo con una función de Python ordenada es que debería poder controlar eso.

Aquí hay un pequeño ejemplo:

from geopy.geocoders import Nominatim
geolocator = Nominatim(country_bias='New Zealand', timeout=4)
geocoded = geolocator.geocode('Raglan, Waikato', exactly_one=True)
if geocoded is not None:
    # success
    lat = geocoded.latitude
    lon = geocoded.longitude

https://geopy.readthedocs.org/en/1.10.0/

Realmente, la única parte difícil es asegurarse de que sus direcciones no estén mal formadas. Sin embargo, probablemente aún llevará un tiempo considerable geocodificar 20 millones de ubicaciones ... y ese tipo de carga probablemente violará los términos de servicio de alguien. Aunque espero que esto ayude a alguien.

alphabetasoup
fuente
¿Puedo usar un CSV con esto?
Salman
Claro, si lo lees con Python.
alphabetasoup
0

Si su solicitud de geocodificación no supera los 2.500 por día, puede utilizar la API de geocodificación de Google . deberías echar un vistazo a api, puede volver a resultados como json o xml.

Límite de uso:

El uso de la API de geocodificación de Google está sujeto a un límite de consulta de 2.500 solicitudes de geolocalización por día. (El usuario de la API de Google Maps para empresas puede realizar hasta 100,000 solicitudes por día).

Ejemplo:

http://maps.google.com/maps/geo?key=yourkeyhere&output=json&q=520+3rd+Street+San+Francisco+CA

Resultado de ejemplo:

{
  "name": "520 3rd Street San Francisco CA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [ {
    "id": "p1",
    "address": "520 3rd St, San Francisco, Kaliforniya 94107, Amerika Birleşik Devletleri",
    "AddressDetails": {
   "Accuracy" : 8,
   "Country" : {
      "AdministrativeArea" : {
         "AdministrativeAreaName" : "CA",
         "SubAdministrativeArea" : {
            "Locality" : {
               "LocalityName" : "San Francisco",
               "PostalCode" : {
                  "PostalCodeNumber" : "94107"
               },
               "Thoroughfare" : {
                  "ThoroughfareName" : "520 3rd St"
               }
            },
            "SubAdministrativeAreaName" : "San Francisco"
         }
      },
      "CountryName" : "USA",
      "CountryNameCode" : "US"
   }
},
    "ExtendedData": {
      "LatLonBox": {
        "north": 37.7826364,
        "south": 37.7799384,
        "east": -122.3942267,
        "west": -122.3969247
      }
    },
    "Point": {
      "coordinates": [ -122.3955757, 37.7812874, 0 ]
    }
  } ]
}

y puedes consultar algún enlace de ejemplo para geocodificar desde google:

1. Código único

2. GeoCoding inverso

3. Comenzando con Google GeoCoding

espero que te ayude

Aragón
fuente
15
Eso solo tomaría unos 22 años (8,000 días) para geocodificar 20 millones de ubicaciones. Solución totalmente razonable.
Andy W
Lo sé y he expresado que si su solicitud de geocodificación no excede los 2.500 por día, puede usarla ... esta es una opción si no puede encontrar ninguna solución
Aragon
44
Esto viola los términos del servicio. Es ilegal a menos que muestre los resultados en un mapa de Google. Incluso si lo hace, ¡encuentro el "argumento de almacenamiento en caché" que algunas personas usan un poco extendido para 20 millones de funciones!
Ragi Yaser Burhum