2012-01-07 15 views
6

Ho un database di molte decine di migliaia di eventi che si sono verificati in specifiche località geografiche all'interno degli Stati Uniti. I dati includono x, y coodinates per ogni evento, codificati utilizzando il sistema di riferimento NAD83. Voglio scrivere o utilizzare un algoritmo per ottenere in modo affidabile il codice postale statunitense associato a ciascuna coordinata x, NAD83.per ottenere codici postali statunitensi da gis x, coordinate y

Non ho ancora definizioni di codice postale utilizzando il sistema di riferimento NAD83. E non ho mai fatto questo tipo di programmazione prima d'ora. Ma sembra proprio che sarebbe intuitivamente semplice scoprire se una determinata coordinata x, y si trova all'interno di una forma geometrica di un codice postale statunitense definito utilizzando lo stesso sistema di riferimento NAD83.

Qualcuno mi può aiutare con il seguente:
1.) Dove posso trovare affidabili le definizioni di codice di avviamento postale degli Stati Uniti nel formato sistema di riferimento NAD83?
2.) Dove posso trovare un codice di esempio per un algoritmo per trovare il codice postale dato una coordinata x, y?

Qualsiasi collegamento che è possibile inviare a articoli didattici/esercitazioni, codice di esempio e dati di definizione del limite del codice di avviamento postale NAD83 sarebbe davvero utile. Sto facendo ricerche su google, ma ho pensato che le persone su questo sito potrebbero essere in grado di darmi più di una guida per esperti.

I codice in Java ogni giorno. Ma se il codice che fornisci non è scritto in java, potrei prendere il codice scritto in un'altra lingua e adattarlo a java per i miei scopi. Non ho installato un software di database nel mio computer perché uso solo file CSV o di testo come input nelle mie applicazioni java. Se si dispone di un database che si suggerisce di utilizzare, è necessario disporre di collegamenti a istruzioni su come ottenere i dati in un formato che è possibile importare in un linguaggio di programmazione come java.

Infine, gli indirizzi stradali nel mio set di dati non includono i codici postali e gli indirizzi sono scritti a caso, quindi sarebbe molto difficile provare a pulire i dati dell'indirizzo in modo sufficiente per cercare di ottenere i codici di avviamento postale dal indirizzi. Posso isolare i dati in diverse città adiacenti, forse un paio di centinaia di codici postali, ma penso che le coordinate x, NAD83 siano la soluzione migliore per ricavare il codice postale in cui si sono verificati tutti gli eventi nel mio set di dati. Voglio collegare il mio codice postale risultante per analisi del codice postale con altri dati che ottengo su ogni codice di avviamento postale da fonti come il censimento degli Stati Uniti, ecc.

Grazie in anticipo a chiunque sia disposto ad aiutare.

+0

Questo può o non può essere utile: http://stackoverflow.com/questions/3564852/get-zip-code-from-latitude-longitude –

+1

Dato che i limiti del codice postale sono fondamentalmente poligoni (anche se su una sfera), probabilmente useresti un algoritmo come quello su http://en.wikipedia.org/wiki/Point_in_polygon per determinare se ti trovi all'interno di un particolare codice postale, magari selezionando un insieme di codici postali candidati vicini (quelli i cui vertici sono vicini a il punto in questione) come un'ottimizzazione. –

risposta

1

non so dove ottenere il codice di avviamento postale, ma penso che si può google, the ZIP code of each state.

e alla domanda (2), in primo luogo è necessario l'informazione geografica, ad esempio the boundary of each state. quindi basta enumerare tutti i punti (x, y) e determinare il poligono in cui si trova.

Ecco un esempio di codice, è stato scritto per 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

Grazie. In che lingua è scritto il codice di esempio? Conoscere la lingua mi aiuterebbe a portarlo su Java. Inoltre, non conosco la tua posizione, ma ci sono forse molte migliaia di codici postali all'interno di uno stato. Se qualcuno può aiutarmi a capire dove scaricare le definizioni poligonali dei codici di avviamento postale nel formato NAD83, suppongo tu stia suggerendo che semplicemente faccio scorrere le definizioni dei poligoni per vedere dove c'è una corrispondenza. Non sto davvero concettualizzando il formato di input dei dati del poligono, ma potrebbe essere più semplice se mi dici in che lingua è il tuo codice. – CodeMed

+0

@CodeMed il codice è scritto in '' 'C++' '' (anche se un sacco di ' '' c''' roba) e per ogni posizione con un codice ZIP univoco, è necessario il confine che può essere presentato come '' 'una lista di punti'''. per esempio. (0,0) -> (0,1) -> (1,1) -> (1,0) descrive semplicemente un rettangolo. se è davvero difficile ottenere dati ben organizzati e tu sei abbastanza paziente, puoi tracciare il confine da solo. – Topro

+0

Segnalo come la risposta perché è il più vicino a darmi gli strumenti per quello che ho chiesto. Ecco un link ai dati di testo ascii per i codici postali che potrebbero essere collegati ad un algoritmo come suggerito: http://www.census.gov/geo/www/cob/ascii_info.html Potrei farlo in un altro modo. E potrei fare un altro post con una domanda più focalizzata. Questo post è stato generale, e penso che sia stata data una risposta al livello a cui è stato chiesto. Grazie per il vostro aiuto. +1 e un segno di spunta per rispondervi. – CodeMed

4

È possibile utilizzare GeoTools in java. Ecco un esempio di ricerca di un punto in uno 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')); 
} 

ho afferrato uno shapefile dalla collezione del Census Bureau degli Stati Uniti del 5-Digit ZIP Code Tabulation Areas dal censimento del 2000. Ho appena usato un singolo file per lo stato del colorado. È necessario unire questi in un singolo FeatureSource. Esecuzione di queste uscite 80302 per Boulder, CO.

GeoTools consente inoltre di convert between projections se necessario. Fortunatamente questi shapefile sono già in NAD83.

+0

Grazie. +1. Stavo davvero leggendo il tutorial di GeoTools mentre stavi scrivendo il tuo suggerimento. E ho notato che ha alcune restrizioni di licenza. Attualmente, non intendo fare uso commerciale di questa applicazione. Tuttavia, cerco di utilizzare solo il codice che viene fornito senza limitazioni di licenza, in modo che io sia libero di fare un uso commerciale del software in un secondo momento. Inoltre, GeoTools richiede che le dipendenze vengano aggiunte al mio codice. Ho trovato un file di forma con informazioni sul codice postale per la regione che sto guardando. Sai come aprire un file di forma nel codice java senza aggiungere una dipendenza? – CodeMed

+0

GeoTools è LGPL, quindi puoi usarlo in un prodotto commerciale senza rilasciare il tuo codice. Tutte le altre librerie di file shape di java con cui ho familiarità sono commerciali. – JRideout

+0

Ho installato e utilizzato GeoTools per caricare un file di forma dei limiti del codice postale. Ma non mi dà i dati numerici che ho bisogno di determinare il codice postale all'interno del quale cade ogni coordinata x, y nel mio set di dati. Mostra questa risposta graficamente, ma non in termini di dati che posso manipolare negli array.Ho bisogno di taggare ogni record nel mio set di dati con un codice di avviamento postale in modo da poter eseguire un'analisi quantitativa di ciò che accade all'interno di ciascun codice di avviamento postale, utilizzando un algoritmo come quelli proposti da altre risposte a questo post. Potrei inquadrare questo come un altro post se qualcuno non è in grado di rispondere prima del prossimo accesso. – CodeMed

0

Hai accennato al fatto che disponi di indirizzi che potresti essere in grado di utilizzare. In tal caso, un servizio di verifica degli indirizzi ti consentirà di trovare i codici postali in modo programmatico in base all'indirizzo e alla città/stato. Anche se formattato male, i dati dell'indirizzo potrebbero probabilmente portarti al 90 o al 95% del tuo obiettivo, lasciando il resto a ripulire e rielaborare o provare a utilizzare le coordinate per determinare.

SmartyStreets acquisirà un file CSV caricato con i propri dati ed eseguirà la convalida dell'indirizzo (correggere e standardizzare l'indirizzo) e quindi verificare gli indirizzi utilizzando i dati di USPS. Una caratteristica unica di SmartyStreets è che non fanno pagare nulla per indirizzi sbagliati. Ciò consentirebbe di formattare ed elaborare varie permutazioni di ciascun indirizzo (per tentare di rendere conto dei dati casuali) e di pagarlo solo se viene risolta una corrispondenza positiva.

Nell'interesse della completa divulgazione, sono il fondatore di SmartyStreets. Forniamo la verifica dell'indirizzo stradale.