2012-01-07 23 views
6

我有一個發生在美國境內的特定地理位置的事件的許多成千上萬的數據庫。數據包括每個事件的x,y座標,使用NAD83參考系統進行編碼。我想編寫或使用算法來可靠地獲取與每個NAD83 x,y座標關聯的美國郵政編碼。算法讓我們從GIS X郵政編碼,y座標

我還沒有使用NAD83參考系統郵政編碼定義。我從來沒有做過這種編程。但是看起來,直覺上很容易找出給定的x,y座標是否位於使用相同NAD83參考系統定義的美國郵政編碼的幾何形狀內。

誰能幫助我有以下:
1)我在哪裏在NAD83參考系統格式得到可靠的美國郵編定義?
2.)我在哪裏可以找到一個算法的示例代碼來查找給定x,y座標的郵政編碼?

,您可以發送到教學文章/教程,示例代碼,和NAD83郵政編碼邊界定義數據的所有鏈接都將是很有益的。我正在進行谷歌搜索,但我認爲這個網站上的人可能會給我更多的專家指導。

我每天都用Java編寫代碼。但是,如果您提供的代碼不是用java編寫的,我可以用另一種語言編寫代碼並根據我的目的將其調整爲java。我的計算機中沒有安裝數據庫軟件,因爲我只是使用csv或文本文件作爲我的Java應用程序的輸入。如果你有一些建議我使用的數據庫,那麼我需要鏈接指導如何將數據轉換爲我可以導入到編程語言(如java)中的格式。

最後,我的數據集中的街道地址不包含郵政編碼,而且街道地址是隨意寫入的,因此,嘗試清理地址數據足以嘗試從郵政編碼中獲取郵政編碼非常困難地址。我可以將數據隔離到幾個相鄰的城市,也許有幾百個郵政編碼,但我認爲NAD83 x,y座標是我推導出發生數據集中每個事件的郵政編碼時的最佳選擇。我想通過郵政編碼鏈接我得到的郵政編碼與我得到來自像美國污染源普查每個郵政編碼其他數據等

預先感謝您給任何人誰願意幫助分析。

+0

這可能不會有用:http://stackoverflow.com/questions/3564852/get-zip-code-from-latitude-longitude – 2012-01-07 02:40:40

+1

鑑於郵政編碼邊界基本上是多邊形(儘管在球體上),您可能會使用http://en.wikipedia.org/wiki/Point_in_polygon中的算法來確定您是否在特定的郵政編碼內,也許選擇一組接近的候選郵政編碼(其頂點接近於問題所在)作爲優化。 – 2012-01-07 02:43:16

回答

1

我不知道從哪裏得到的郵政編碼,但我想你可以在google出來,the ZIP code of each state

和問題(2),首先您需要的地理信息,即the boundary of each state。那麼您只需枚舉所有點(x,y)並確定它所在的多邊形。

這是一個示例代碼,它的編寫代碼爲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

謝謝。您的示例代碼使用什麼語言編寫?瞭解該語言將有助於我將其移植到Java。另外,我不知道你的位置,但在一個州內可能有成千上萬的郵政編碼。如果有人能夠幫助我找出在哪裏下載NAD83格式的郵政編碼的多邊形定義,我想你建議我只是遍歷多邊形定義來查看哪裏有匹配。我並沒有真正地概念化多邊形數據的輸入格式,但是如果你告訴我你的代碼是在什麼語言中,這可能會更容易。 – CodeMed 2012-01-07 03:21:29

+0

@CodeMed代碼是用'''C++'''編寫的(儘管很多' ''c'''東西),並且對於每個具有唯一郵政編碼的位置,您都需要可以呈現爲「點列表」的邊界。例如(0,0)→(0,1)→(1,1)→(1,0)只描述一個矩形。如果確實很難得到一些組織良好的數據,並且您足夠耐心,那麼您可以自己劃定邊界。 – Topro 2012-01-07 05:10:52

+0

我將此標記爲答案,因爲它最接近爲我提供的工具。這裏是一個鏈接到ascii文本數據的郵政編碼,可以連接到一個算法,如你建議:http://www.census.gov/geo/www/cob/ascii_info.html我可能實際上做一個不同的辦法。而且我可以用一個更有針對性的問題發表另一篇文章。這篇文章是一般性的,我認爲它已經在提問的層面得到了答覆。謝謝您的幫助。 +1,以及用於回答的複選標記。 – CodeMed 2012-01-08 09:15:17

4

您可以在java中使用GeoTools。這是一個在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')); 
} 

我抓住從2000年的人口普查美國人口普查局收集的5-Digit ZIP Code Tabulation Areas shape文件。我只用了一個文件來處理科羅拉多州的情況。您需要將這些合併爲一個FeatureSource。運行此輸出80302爲博爾德,CO。

如果需要,GeoTools還允許您登錄convert between projections。幸運的是這些shapefile已經在NAD83中。

+0

謝謝。 +1。當你寫你的建議時,我實際上正在閱讀GeoTools教程。我注意到它有一些許可限制。目前,我不打算商業化使用這個應用程序。不過,我嘗試只使用沒有許可限制的代碼,以便我可以隨後在商業上使用軟件。此外,GeoTools要求將依賴關係添加到我的代碼中。我找到了一個帶有我所查看區域的郵政編碼信息的形狀文件。你知道如何在不添加依賴的情況下在java代碼中打開一個形狀文件嗎? – CodeMed 2012-01-07 06:52:11

+0

GeoTools是LGPL,因此您可以在不發佈代碼的情況下將其用於商業產品。我熟悉的所有其他java shapefile庫都是商業化的。 – JRideout 2012-01-07 07:42:12

+0

我安裝並使用GeoTools加載郵政編碼邊界的形狀文件。但是它並沒有給出我需要確定數據集中每個x,y座標下降的郵政編碼的數字數據。它以圖形方式顯示了這個答案,但不能用數組來處理數據。我需要用郵政編碼標記我的數據集中的每條記錄,以便可以使用類似於此郵件的其他響應提議的算法對每個郵政編碼內發生的情況進行定量分析。如果有人在我下次登錄之前無法回答,我可能會將其設置爲另一個帖子。 – CodeMed 2012-01-07 09:59:24

0

你提到你有可能可以使用的地址。在這種情況下,地址驗證服務將允許您以編程方式根據地址和城市/州查找郵政編碼。即使格式不正確,地址數據也可能會使您達到目標的90%或95%,而剩下的部分可能需要清理和重新處理,或嘗試使用座標來確定。

SmartyStreets將帶上載的CSV文件與您的數據並執行地址驗證(正確和標準化地址),然後使用來自USPS的數據驗證地址。 SmartyStreets的一個獨特功能是,他們不收取任何壞地址的費用。這將允許您格式化和處理每個地址的各種排列(以嘗試解釋雜亂無章的數據),只有在正面匹配得到解決時才支付。

爲了充分披露,我是SmartyStreets的創始人。我們提供街道地址驗證。