2009-02-05 11 views
24

Estoy buscando una buena herramienta que pueda tomar una dirección de correo completa, formateada para mostrar o usar con una etiqueta de envío y convertirla en un objeto estructurado.Dónde está un buen analizador de direcciones

Así, por ejemplo:

// Start with a formatted address in a single string 
string f = "18698 E. Main Street\r\nBig Town, AZ, 86011"; 

// Parse into address 
Address addr = new Address(f); 

addr.Street; // 18698 E. Main Street 
addr.Locality; // Big Town 
addr.Region; // AZ 
addr.PostalCode; // 86011 

ahora podía hacerlo usando expresiones regulares. ¡Pero la parte difícil es mantenerlo lo suficientemente general como para manejar cualquier dirección en el mundo!

Estoy seguro de que tiene que haber algo que pueda hacerlo.

Si alguien lo notó, este es en realidad el formato del objeto opensocial.address.

+1

Este es un problema difícil cuando traes direcciones internacionales a la mezcla. Sé que [direcciones japonesas] (http://www.japan-guide.com/e/e2224.html) no siguen el modelo street1/street2/city/state/zip que presentaste. Bajan a la calle, bloquean y construyen de una manera diferente a las direcciones típicas de los EE. UU. Otras direcciones en Europa son diferentes también. Esa expresión regular debería ser mejor Unicode, porque nuestro alfabeto no será suficiente. No es un problema fácil, IMO. – duffymo

+0

Duplicar esto: http://stackoverflow.com/questions/16413/parse-usable-street-address-city-state-zip-from-a-string Supongo que te refieres a direcciones de EE. UU. – danieltalsky

Respuesta

3

Como no hay una solución trivial como dijo @duffymo, lo mejor sería reconsiderar el diseño. Si se trata de un formulario de usuario, haga un compromiso y permita que el usuario lo complete. Si está analizando datos de manera retroactiva, utilice una expresión regular muy estricta para analizar las direcciones según algunos criterios (el país es EE. UU.). Luego haz un segundo pase a los que sobran, y así sucesivamente. He adoptado este enfoque y es el único enfoque confiable.

Otro problema de diseño al tomar un enfoque genérico de expresiones regulares es que generará un falso positivo para las direcciones incorrectas. Si está enviando correo postal a estas personas, terminará rebotando y tendrá más trabajo en sus manos tratando de determinar cuáles regresaron o continuar enviando correos a direcciones erróneas.

24

La API de Googlemaps funciona bastante bien para esto. Por ejemplo, supongamos que le dan la cuerda "120 w 45 st nyc". Pasarlo a la API Googlemaps así: http://maps.google.com/maps/geo?q=120+w+45+st+nyc y se obtiene esta respuesta:

{ 
    "name": "120 w 45 st nyc", 
    "Status": { 
    "code": 200, 
    "request": "geocode" 
    }, 
    "Placemark": [ { 
    "id": "p1", 
    "address": "120 W 45th St, New York, NY 10036, USA", 
    "AddressDetails": {"Country": {"CountryNameCode": "US","CountryName": "USA","AdministrativeArea": {"AdministrativeAreaName": "NY","Locality": {"LocalityName": "New York","Thoroughfare":{"ThoroughfareName": "120 W 45th St"},"PostalCode": {"PostalCodeNumber": "10036"}}}},"Accuracy": 8}, 
    "ExtendedData": { 
     "LatLonBox": { 
     "north": 40.7603883, 
     "south": 40.7540931, 
     "east": -73.9807141, 
     "west": -73.9870093 
     } 
    }, 
    "Point": { 
     "coordinates": [ -73.9838617, 40.7572407, 0 ] 
    } 
    } ] 
} 
+9

Supongo que me gustaría saber cómo lo hace Google. –

+0

solo ten en cuenta que puedes recuperar más de un resultado. si lo hace con fines de "normalización", deberá fallar el resultado. muy sorprendido de lo rápido que funciona aunque –

+3

tiene un límite de alrededor de 15,000 solicitudes por día. Así que sea respetuoso y cuidadoso y compruebe los términos de uso http://econym.org.uk/gmap/geomulti.htm –

0

Para obtener las direcciones canadienses, he utilizado uno llamado Street Perfect. Tuvimos que ajustar el código c++ en algunos .net para hacerlo reutilizable para nuestro propósito, pero eso fue bastante fácil.

3

Como se ha mencionado, este no es un problema trivial. Uno de los mayores problemas, aparte de las direcciones internacionales, es que no existe un formato estándar para las direcciones y el hecho de que una dirección no puede decirle si está bien formado, es decir, no se autovalida como un número de tarjeta de crédito. .

Debido a esto, debe confiar en una fuente externa de verdad para garantizar que la dirección sea real. Aquí es donde un servicio de verificación de direcciones entra en la mezcla. Dependiendo de las necesidades de su negocio y los requisitos de la aplicación, es posible que esté mirando un fregado de "una sola vez" por lotes de su lista de direcciones, o quizás un servicio de validación de direcciones en tiempo real/en vivo. Hay una serie de buenos proveedores (que varían en costo) que pueden resolver fácilmente este problema.

Debo mencionar que soy el fundador de SmartyStreets. Hacemos CASS-certified address verification. Tomaremos sus direcciones sin formato/sin formato y las convertiremos en direcciones que se hayan limpiado, estandarizado y verificado/confirmado. Dependiendo del tamaño de su lista, el costo generalmente es de unos pocos dólares y el tiempo de respuesta es casi instantáneo, generalmente de unos minutos.

6

Si usted está buscando un programa de análisis de direcciones con una solución sencilla, intente esto:

http://usaddress.codeplex.com/

bueno: 1. No se base de datos necesaria 2. No se requiere de búsqueda de Internet 3. Bastante precisa

malo: 1. no puede confirmar si se trata de una dirección real 2. Sólo funciona para nosotros tratamos 3. en C#, utilice .NET 3.5 o superior

+0

palabra de advertencia rápida: parece exactamente querer lo que quería ... excepto la parte GPL. No distribuimos nuestro código, todavía. – viggity

Cuestiones relacionadas