2012-01-07 42 views
6

Tengo una base de datos de muchas decenas de miles de eventos que ocurrieron en ubicaciones geográficas específicas dentro de los Estados Unidos. Los datos incluyen x, y coodinaciones para cada evento, codificadas utilizando el sistema de referencia NAD83. Quiero escribir o utilizar un algoritmo para obtener de manera confiable el código postal de EE. UU. Asociado con cada coordenada x, y de NAD83.algoritmo para obtener códigos postales de EE. UU. Desde las coordenadas gis x, y

Aún no tengo definiciones de código postal usando el sistema de referencia NAD83. Y nunca antes había hecho este tipo de programación. Pero parece que sería intuitivamente simple averiguar si una coordenada x, y dada se encuentra dentro de una forma geométrica de un código postal de EE. UU. Definido utilizando el mismo sistema de referencia NAD83.

¿Puede alguien ayudarme con lo siguiente:
1.) ¿Dónde puedo obtener definiciones del código postal confiables de Estados Unidos en el formato de sistema de referencia NAD83?
2.) ¿Dónde puedo encontrar el código de ejemplo para un algoritmo para encontrar el código postal dado una coordenada x, y?

Cualquier enlace que pueda enviar a artículos instructivos/tutoriales, código de ejemplo y datos de definición de límite de código postal NAD83 sería de gran ayuda. Estoy haciendo búsquedas en Google, pero pensé que las personas en este sitio podrían darme más de una guía de expertos.

I código en Java todos los días. Pero, si el código que proporciona no está escrito en Java, podría tomar el código escrito en otro idioma y adaptarlo a Java para mis propósitos. No tengo un software de base de datos instalado en mi computadora porque solo uso csv o archivos de texto como entradas en mis aplicaciones Java. Si tiene alguna base de datos que sugiera que use, necesitaría enlaces a instrucciones sobre cómo obtener los datos en un formato que pueda importar a un lenguaje de programación como java.

Finalmente, las direcciones de las calles en mi conjunto de datos no incluyen códigos postales, y las direcciones se escriben al azar, por lo que sería muy difícil tratar de limpiar los datos de la dirección lo suficiente como para tratar de obtener códigos postales del direcciones. Puedo aislar los datos en varias ciudades adyacentes, tal vez en un par de cientos de códigos postales, pero creo que las coordenadas x, y de NAD83 son mi mejor opción para obtener el código postal en el que se produjo cada evento en mi conjunto de datos. Quiero vincular mi código postal resultante por análisis de código postal con otros datos que obtengo sobre cada código postal de fuentes como el Censo de EE. UU., Etc.

Gracias de antemano a cualquiera que esté dispuesto a ayudar.

+0

Esto puede o no ser útil: http://stackoverflow.com/questions/3564852/get-zip-code-from-latitude-longitude –

+1

Dado que los límites del código postal son básicamente polígonos (aunque en una esfera), probablemente usaría un algoritmo como el que se encuentra en http://en.wikipedia.org/wiki/Point_in_polygon para determinar si se encuentra dentro de un código postal en particular, tal vez seleccionando un conjunto de códigos postales candidatos cercanos (aquellos cuyos vértices están cerca de el punto en cuestión) como una optimización. –

Respuesta

1

no sé dónde obtener el código postal, pero creo que puede buscarlo en Google, the ZIP code of each state.

ya la pregunta (2), primero necesitará la información geográfica, es decir, the boundary of each state. a continuación, enumera todos los puntos (x, y) y determina en qué polígono se encuentra.

Aquí hay un código de ejemplo, fue escrito para SGU124.

#include <map> 
#include <cstdio> 
#include <cstring> 
#include <algorithm> 

#define MAXN 10005 

using namespace std; 

struct pnt{ 
    int x,y; 
}; 
struct seg{ 
    pnt a,b; 
} s[MAXN]; 
int n; 
pnt p; 
int h[MAXN<<1]; 
int k[MAXN<<1]; 

void work(){ 
    int i,x,y,c = 0; 
    memset(h,0,sizeof(h)); 
    memset(k,0,sizeof(k)); 
    for (i=0;i<n;i++){ 
     if (s[i].a.x<=p.x && p.x<=s[i].b.x && s[i].a.y<=p.y && p.y<=s[i].b.y){ 
      printf("BORDER\n"); 
      return; 
     } 
     if (s[i].a.x==s[i].b.x){ 
      x = s[i].a.x; 
      y = p.y - p.x + x; 
      if (x<=p.x && s[i].a.y<=y && y<=s[i].b.y){ 
       h[x+MAXN] = 1; 
       if (y==s[i].a.y) k[x+MAXN] |= 1; 
        else if (y==s[i].b.y) k[x+MAXN] |= 2; 
      } 
     } 
     else{ 
      y = s[i].a.y; 
      x = p.x - p.y + y; 
      if (x<=p.x && s[i].a.x<=x && x<=s[i].b.x){ 
       //printf("%d %d %d %d\n",s[i].a.x,s[i].a.y,s[i].b.x,s[i].b.y); 
       h[x+MAXN] = 1; 
       if (x==s[i].a.x) k[x+MAXN] |= 4; 
        else if (x==s[i].b.x) k[x+MAXN] |= 8; 
      } 
     } 
    } 
    for (i=p.x;i>=-10000;i--){ 
     //if (h[i+MAXN]>0) printf("@ %d %d\n",i,k[i+MAXN]); 
     if (k[i+MAXN]!=9 && k[i+MAXN]!=6) c += h[i+MAXN]; 
    } 
    //printf("p @ %d %d ",p.x,p.y); 
    if (c%2) printf("INSIDE\n"); 
     else printf("OUTSIDE\n"); 
} 

int main(){ 
    freopen("sgu124.in","r",stdin); 
    int i; 
    while (~scanf("%d",&n)){ 
     for (i=0;i<n;i++){ 
      scanf("%d%d",&s[i].a.x,&s[i].a.y); 
      scanf("%d%d",&s[i].b.x,&s[i].b.y); 
      if (s[i].a.x>s[i].b.x || s[i].a.y>s[i].b.y) swap(s[i].a,s[i].b); 
     } 
     scanf("%d%d",&p.x,&p.y); 
     work(); 
     //break; 
    } 
    return 0; 
} 
+0

Gracias. ¿En qué idioma está escrito su código de muestra? Conocer el idioma me ayudaría a transferirlo a Java. Además, no conozco su ubicación, pero tal vez haya muchos miles de códigos postales dentro de un estado. Si alguien puede ayudarme a averiguar dónde descargar las definiciones poligonales de los códigos postales en formato NAD83, supongo que está sugiriendo que simplemente itere a través de las definiciones de los polígonos para ver dónde hay una coincidencia. Realmente no estoy conceptualizando el formato de entrada de los datos del polígono, pero podría ser más fácil si me dices en qué idioma está tu código. – CodeMed

+0

@CodeMed el código está escrito en '' 'C++' '' (aunque una gran cantidad de ' '' c''' cosas) y para cada ubicación con un código postal único, necesita el límite que se puede presentar como '' 'una lista de puntos'''. p.ej. (0,0) -> (0,1) -> (1,1) -> (1,0) simplemente describe un rectángulo. si es realmente difícil obtener algunos datos bien organizados, y usted es lo suficientemente paciente, puede dibujar el límite usted mismo. – Topro

+0

Estoy marcando esto como la respuesta porque es lo más cercano a darme las herramientas para lo que pregunté. Aquí hay un enlace a los datos de texto ascii para los códigos postales que podrían estar conectados a un algoritmo como el que sugiere: http://www.census.gov/geo/www/cob/ascii_info.html De hecho, puedo hacerlo de una manera diferente. camino. Y puedo hacer otra publicación con una pregunta más enfocada. Esta publicación fue de tipo general, y creo que ha sido respondida en el nivel en que se solicitó. Gracias por su asistencia. +1, y una marca de verificación para responderlo. – CodeMed

4

Puede usar GeoTools en java. Aquí hay un ejemplo de las búsquedas de un punto en un shapefile.

// projection/datum in SR-ORG:7169 (GCS NAD83) 
File shapeFile = new File("zt08_d00.shp"); 
FileDataStore store = FileDataStoreFinder.getDataStore(shapeFile); 
SimpleFeatureSource featureSource = store.getFeatureSource(); 
// Boulder, CO 
Filter filter = CQL.toFilter("CONTAINS(the_geom, POINT(-105.292778 40.019444))"); 
SimpleFeatureCollection features = featureSource.getFeatures(filter); 
for (SimpleFeature f : features) { 
    System.out.println(f.getAttribute('NAME')); 
} 

Me agarró un archivo de formas de la colección de la Oficina del Censo de EE.UU. de 5-Digit ZIP Code Tabulation Areas desde el Censo 2000. Acabo de usar un solo archivo para el estado de Colorado. Necesitaría unir estos en un solo FeatureSource. Ejecutando esta salida 80302 para Boulder, CO.

GeoTools también le permite convert between projections si es necesario. Afortunadamente estos shapefiles ya están en NAD83.

+0

Gracias. +1. Estaba leyendo el tutorial de GeoTools cuando escribías tu sugerencia. Y noté que tiene algunas restricciones de licencia. Actualmente, no tengo la intención de hacer un uso comercial de esta aplicación. Sin embargo, intento usar solo código que no contenga restricciones de licencia, por lo que soy libre de hacer uso comercial del software más adelante. Además, GeoTools requiere que se agreguen dependencias a mi código. He encontrado un archivo de forma con información de código postal para la región que estoy viendo. ¿Sabes cómo abrir un archivo de forma en código Java sin agregar una dependencia? – CodeMed

+0

GeoTools es LGPL, por lo que puede usarlo en un producto comercial sin liberar su código. Todas las otras bibliotecas de archivos de formas de Java con las que estoy familiarizado son comerciales. – JRideout

+0

Instalé y usé GeoTools para cargar un archivo de forma de los límites del código postal. Pero no me da datos numéricos. Necesito determinar el código postal dentro del cual cae cada coordenada x, y de mi conjunto de datos. Muestra esta respuesta gráficamente, pero no en términos de datos que puedo manipular en matrices.Necesito etiquetar cada registro en mi conjunto de datos con un código postal para poder hacer un análisis cuantitativo de lo que sucede dentro de cada código postal, usando un algoritmo como los propuestos por otras respuestas a esta publicación. Podría enmarcar esto como una publicación diferente si alguien no puede responder antes de la próxima vez que inicie sesión. – CodeMed

0

Mencionó que tiene direcciones que podría usar. En ese caso, un servicio de verificación de dirección le permitirá encontrar programáticamente los códigos postales basados ​​en la dirección y la ciudad/estado. Incluso si está mal formateado, los datos de la dirección podrían llegar al 90 o al 95% de su objetivo, dejando el resto para limpiar y reprocesar o tratar de usar las coordenadas para determinar.

SmartyStreets tomará un archivo CSV cargado con sus datos y realizará la validación de la dirección (corregir y estandarizar la dirección) y luego verificar las direcciones utilizando datos del USPS. Una característica única de SmartyStreets es que no cobran nada por direcciones incorrectas. Esto le permitiría formatear y procesar varias permutaciones de cada dirección (para intentar dar cuenta de los datos fortuitos) y solo pagará si se resuelve una coincidencia positiva.

Con el interés de la divulgación completa, soy el fundador de SmartyStreets. Proporcionamos la verificación de la dirección de la calle.

Cuestiones relacionadas