2012-01-07 5 views
6

私は、米国内の特定の地理的な場所で発生した数万のイベントのデータベースを持っています。データには、各イベントのx、yコーディネイトが含まれ、NAD83参照システムを使用してエンコードされます。私は、各NAD83のx、y座標に関連付けられた米国の郵便番号を確実に取得するためのアルゴリズムを書いたり使用したりしたいと考えています。gis x、y座標から米国の郵便番号を取得するアルゴリズム

NAD83リファレンスシステムを使用した郵便番号の定義はまだありません。そして私はこの種のプログラミングをこれまでにやったことがありません。しかし、与えられたx、y座標が、同じNAD83参照システムを使って定義された米国の郵便番号の幾何学的形状内に位置するかどうかを直観的に簡単に見つけることができるように思える。

は、誰もが、次で私を助けることができます:
1)どこで私はNAD83基準システムの形式で信頼性の高い米国の郵便番号の定義を得るのですか?
)x、y座標の郵便番号を見つけるアルゴリズムのサンプルコードはどこにありますか?

教材/チュートリアル、サンプルコード、NAD83郵便番号境界定義データに送ることができるリンクは、本当に役立ちます。私はGoogleの検索をしていますが、私はこのサイトの人々が私に専門家のガイドをもっと与えることができると考えました。

Javaで毎日Iコードします。しかし、あなたが提供するコードがJavaで書かれていない場合、私は別の言語で書かれたコードを自分の目的のためにJavaに適合させることができます。私は自分のコンピュータにデータベースソフトウェアをインストールしていない。なぜなら私のJavaアプリケーションに入力としてCSVファイルやテキストファイルを使用するだけだからだ。私が使用することを示唆しているデータベースがある場合は、データをjavaなどのプログラミング言語にインポートできる形式にするための手順へのリンクが必要です。

最後に、私のデータセットの番地には郵便番号が含まれておらず、番地は偶発的に書かれていますので、郵便番号を取得しようとするほどアドレスデータをきれいにすることは非常に困難です。アドレス。私はいくつかの隣接都市、おそらく数百の郵便番号にデータを分離することができますが、NAD83のx、y座標が私のデータセットの各イベントが発生した郵便番号を導出する際のベストショットです。私は郵便番号と郵便番号を米国国勢調査な​​どの情報源から得た他のデータと結びつけたいと思っています。

私は助けてくれると幸いです。

+0

これは役に立つかもしれないし、有用でないかもしれない:http://stackoverflow.com/questions/3564852/get-zip-code-from-latitude-longitude –

+1

郵便番号の境界が基本的にポリゴン(球ではあるが)であるとすれば、 http://en.wikipedia.org/wiki/Point_in_polygonのようなアルゴリズムを使用して、特定の郵便番号内にいるかどうかを判断します。おそらく、近い候補の郵便番号のセットを選択します(頂点が近くにあるもの問題のポイント)を最適化します。 –

答えて

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

+0

@CodeMedコードは '' 'C++' ''で書かれています(しかし 'ユニークなZIPコードを持つ各場所には、 '' ''ポイントのリスト ''として表示できる境界が必要です。例えば(0,0) - >(0,1) - >(1,1) - >(1,0)は矩形を記述するだけです。よく組織化されたデータを取得することが本当に難しい場合は、十分に患者がいる場合は、境界線を自分で描くことができます。 – Topro

+0

私は答えとしてマークしています。なぜなら、これは私に尋ねたことのためのツールを与えることに最も近いからです。ここでは、あなたのようなアルゴリズムに接続できる郵便番号のASCIIテキストデータへのリンクがあります:http://www.census.gov/geo/www/cob/ascii_info.html私は実際には別の方法。そして、私はもっと集中的な質問をして別の投稿をするかもしれません。この投稿は一般的なものであり、質問されたレベルで回答されたと思います。ご協力いただきありがとうございます。 +1、それに答えるためのチェックマークが付いています。 – CodeMed

4

javaでGeoToolsを使用できます。ここでは、シェイプファイル内のポイントを検索する例を示します。

// 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の米国国勢調査局のコレクションからシェープファイルをつかみました。私はちょうどcoloradoの状態のために単一のファイルを使用しました。これらを1つのFeatureSourceにマージする必要があります。これを実行すると、コロラド州ボルダーの80302が出力されます。

GeoToolsでは、必要に応じてconvert between projectionsも可能です。幸いなことに、これらのシェイプファイルはすでにNAD83にあります。

+0

ありがとうございます。 +1。あなたがあなたの提案を書いていたとき、GeoToolsチュートリアルを実際に読んでいました。そして私はそれにいくつかのライセンス制限があることに気づいた。現在、私はこのアプリケーションの商用利用を意図していません。しかし、私は、ライセンス制限なしで提供されるコードだけを使用しようとしているので、後でソフトウェアを商用利用することは自由です。また、GeoToolsでは、依存関係を自分のコードに追加する必要があります。私が見ている地域の郵便番号情報を持つ形状ファイルが見つかりました。依存関係を追加せずにJavaコードでシェイプファイルを開く方法を知っていますか? – CodeMed

+0

GeoToolsはLGPLであるため、コードを公開することなく市販の製品で使用することができます。私がよく知っている他のすべてのjavaシェイプファイルライブラリは商用です。 – JRideout

+0

GeoToolsをインストールして使用して、郵便番号の境界線のシェイプファイルをロードしました。しかし、データセット内の各x、y座標が崩壊する郵便番号を決定するために必要な数値データは私にはありません。この回答はグラフィカルに表示されますが、データの観点からは配列で操作することはできません。私は私のデータセットの各レコードに郵便番号を付ける必要があり、この郵便に対する他の回答によって提案されたアルゴリズムのようなアルゴリズムを使用して、各郵便番号内で何が起こるのかを定量的に分析することができます。私は次のログインの前に誰かが答えることができない場合、これを別の投稿とみなしているかもしれません。 – CodeMed

0

あなたはあなたが使用できるかもしれないアドレスを持っていると述べました。その場合、アドレス検証サービスでは、アドレスと都市/州に基づいてプログラムで郵便番号を見つけることができます。フォーマットが不適切であっても、アドレスデータは目標の90%または95%に達する可能性があり、残りの部分をクリーンアップして再処理するか、または座標を使用して決定しようとします。

SmartyStreetsは、アップロードされたCSVファイルにデータを取り込み、アドレス検証(アドレスの修正と標準化)を行い、USPSからのデータを使用してアドレスを確認します。 SmartyStreetsのユニークな機能の1つは、悪いアドレスに対して何も請求しないことです。これにより、各アドレスのさまざまな順列をフォーマットして処理することができます(無意味なデータを考慮する)。正の一致が解決された場合にのみ支払いを行います。

私は完全開示のため、SmartyStreetsの創設者です。住所の確認ができます。

関連する問題