2012-01-07 44 views
6

Tôi có một cơ sở dữ liệu gồm hàng chục nghìn sự kiện đã xảy ra tại các vị trí địa lý cụ thể ở Hoa Kỳ. Dữ liệu bao gồm x, y coodinates cho mỗi sự kiện, được mã hóa bằng cách sử dụng hệ thống tham chiếu NAD83. Tôi muốn viết hoặc sử dụng thuật toán để nhận mã zip của Hoa Kỳ được liên kết với mỗi tọa độ NAD83 x, y một cách đáng tin cậy.để nhận mã zip của Hoa Kỳ từ gis x, y tọa độ

Tôi chưa có định nghĩa mã zip sử dụng hệ thống tham chiếu NAD83. Và tôi chưa bao giờ thực hiện loại lập trình này trước đây. Nhưng nó chỉ có vẻ như nó sẽ được trực quan đơn giản để tìm hiểu xem một x, y tọa độ nằm trong một hình dạng hình học của một mã zip Hoa Kỳ được xác định bằng cách sử dụng cùng một hệ thống tham chiếu NAD83.

thể bất cứ ai giúp tôi với những điều sau đây:
1.) Tôi có thể lấy định nghĩa Zip Code đáng tin cậy của Mỹ trong các định dạng hệ thống tham chiếu NAD83?
2.) Tôi có thể tìm mã ví dụ cho thuật toán để tìm mã zip cho toạ độ x, y ở đâu?

Bất kỳ liên kết nào bạn có thể gửi cho bài viết/hướng dẫn, mã ví dụ và dữ liệu định nghĩa ranh giới mã zip NAD83 sẽ thực sự hữu ích. Tôi đang thực hiện tìm kiếm trên google, nhưng tôi nhận thấy rằng những người trên trang web này có thể cung cấp cho tôi thêm hướng dẫn của chuyên gia.

Tôi viết mã Java mỗi ngày. Nhưng, nếu mã bạn cung cấp không được viết bằng java, tôi có thể lấy mã được viết bằng ngôn ngữ khác và thích ứng nó với java cho mục đích của tôi. Tôi không có phần mềm cơ sở dữ liệu được cài đặt trong máy tính của mình vì tôi chỉ sử dụng csv hoặc tệp văn bản làm đầu vào vào các ứng dụng java của mình. Nếu bạn có một số cơ sở dữ liệu mà bạn đề xuất tôi sử dụng, tôi sẽ cần các liên kết đến các hướng dẫn về cách lấy dữ liệu vào một định dạng mà tôi có thể nhập vào một ngôn ngữ lập trình như java.

Cuối cùng, địa chỉ đường phố trong tập dữ liệu của tôi không bao gồm mã zip và địa chỉ đường phố được viết lúng túng, do đó sẽ rất khó để cố gắng làm sạch dữ liệu địa chỉ đủ để cố lấy mã zip từ địa chỉ. Tôi có thể cách ly dữ liệu với một số thành phố lân cận, có lẽ là vài trăm mã zip, nhưng tôi nghĩ rằng tọa độ NAD83 x, y là ảnh tốt nhất của tôi khi phát sinh mã zip trong đó mỗi sự kiện trong tập dữ liệu của tôi đã xảy ra. Tôi muốn liên kết mã zip kết quả của mình bằng cách phân tích mã zip với dữ liệu khác mà tôi nhận được về từng mã zip từ các nguồn như Điều tra dân số Hoa Kỳ, v.v.

Cảm ơn trước bất kỳ ai sẵn sàng trợ giúp.

+0

Điều này có thể hoặc không hữu ích: http://stackoverflow.com/questions/3564852/get-zip-code-from-latitude-longitude –

+1

Cho rằng ranh giới mã zip về cơ bản là đa giác (mặc dù trên hình cầu), bạn có thể sử dụng thuật toán như thuật toán tại http://en.wikipedia.org/wiki/Point_in_polygon để xác định xem bạn có nằm trong một mã zip cụ thể hay không, có lẽ chọn một tập hợp các mã zip ứng cử viên gần (những người có đỉnh gần điểm được đề cập) làm tối ưu hóa. –

Trả lời

1

tôi không biết nơi để lấy mã ZIP, nhưng tôi nghĩ bạn có thể google nó ra, the ZIP code of each state.

và đặt câu hỏi (2), trước tiên bạn sẽ cần thông tin địa lý, tức là the boundary of each state. sau đó bạn chỉ liệt kê tất cả các điểm (x, y) và xác định đa giác nào trong đó.

Đây là mã mẫu, nó được viết cho 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

Cảm ơn bạn. Mã mẫu của bạn được viết bằng ngôn ngữ nào? Biết ngôn ngữ sẽ giúp tôi chuyển nó sang Java. Ngoài ra, tôi không biết vị trí của bạn, nhưng có lẽ có hàng ngàn mã zip trong một tiểu bang. Nếu ai đó có thể giúp tôi tìm ra nơi để tải xuống các định nghĩa đa giác của mã zip ở định dạng NAD83, tôi đoán bạn đang gợi ý rằng tôi chỉ cần lặp qua các định nghĩa đa giác để xem vị trí khớp. Tôi không thực sự khái niệm định dạng đầu vào của dữ liệu đa giác, nhưng điều đó có thể dễ dàng hơn nếu bạn cho tôi biết mã của bạn là ngôn ngữ nào. – CodeMed

+0

@CodeMed mã được viết bằng '' 'C++' '' (mặc dù rất nhiều ' '' c''' stuff) và đối với mỗi vị trí có mã ZIP duy nhất, bạn cần đường biên có thể được trình bày dưới dạng '' 'một danh sách các điểm'''. ví dụ. (0,0) -> (0,1) -> (1,1) -> (1,0) chỉ mô tả một hình chữ nhật. nếu thật khó để có được một số dữ liệu được tổ chức tốt và bạn đủ kiên nhẫn, bạn có thể tự vẽ đường biên. – Topro

+0

Tôi đánh dấu đây là câu trả lời vì nó là gần nhất để cho tôi những công cụ cho những gì tôi hỏi. Đây là một liên kết đến dữ liệu văn bản ascii cho mã zip có thể được kết nối với một thuật toán như bạn đề nghị: http://www.census.gov/geo/www/cob/ascii_info.html Tôi thực sự có thể làm điều đó trong một đường. Và tôi có thể đăng một bài đăng khác bằng một câu hỏi tập trung hơn. Bài đăng này là kiểu tổng quát, và tôi nghĩ nó đã được trả lời ở cấp độ mà nó được hỏi. Cám ơn sự giúp đỡ của bạn. 1 và dấu kiểm để trả lời. – CodeMed

4

Bạn có thể sử dụng GeoTools trong java. Đây là một ví dụ về tìm kiếm một điểm trong một 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')); 
} 

Tôi đã lấy một shapefile từ bộ sưu tập của Cục điều tra dân số Hoa Kỳ 5-Digit ZIP Code Tabulation Areas từ Tổng điều tra dân số năm 2000. Tôi chỉ sử dụng một tập tin cho trạng thái colorado. Bạn sẽ cần hợp nhất chúng thành một FeatureSource. Chạy kết quả đầu ra 80302 cho Boulder, CO.

GeoTools cũng cho phép bạn convert between projections nếu cần. May mắn thay những shapefiles đã có trong NAD83.

+0

Cảm ơn bạn. +1. Tôi đã thực sự đọc hướng dẫn GeoTools khi bạn viết đề xuất của mình. Và tôi nhận thấy rằng nó có một số hạn chế cấp phép. Hiện tại, tôi không có ý định sử dụng thương mại ứng dụng này. Tuy nhiên, tôi cố gắng chỉ sử dụng mã mà không có hạn chế cấp phép, do đó tôi được phép sử dụng phần mềm thương mại sau này. Ngoài ra, GeoTools yêu cầu phụ thuộc phải được thêm vào mã của tôi. Tôi đã tìm thấy tệp hình dạng có thông tin mã zip cho khu vực tôi đang xem. Bạn có biết làm thế nào để mở một tập tin hình dạng trong mã java mà không cần thêm một phụ thuộc? – CodeMed

+0

GeoTools là LGPL, vì vậy bạn có thể sử dụng nó trong một sản phẩm thương mại mà không cần tiết lộ mã của bạn. Tất cả các thư viện java shapefile khác mà tôi quen thuộc là thương mại. – JRideout

+0

Tôi đã cài đặt và sử dụng GeoTools để tải một tệp hình dạng của các ranh giới mã zip. Nhưng nó không cung cấp cho tôi dữ liệu số mà tôi cần để xác định mã zip trong đó mỗi toạ độ x, y trong tập dữ liệu của tôi giảm. Nó cho thấy câu trả lời này đồ họa, nhưng không phải về mặt dữ liệu tôi có thể thao tác trong mảng.Tôi cần gắn thẻ mỗi bản ghi trong tập dữ liệu của mình với mã zip để tôi có thể phân tích định lượng những gì xảy ra trong mỗi mã zip, sử dụng thuật toán như thuật toán được đề xuất bởi các phản hồi khác cho bài đăng này. Tôi có thể khung này như là một bài viết khác nhau nếu ai đó không thể trả lời trước khi tôi đăng nhập tiếp theo. – CodeMed

0

Bạn đã đề cập rằng bạn có địa chỉ mà bạn có thể sử dụng. Trong trường hợp đó, dịch vụ xác minh địa chỉ sẽ cho phép bạn lập trình tìm mã ZIP dựa trên địa chỉ và thành phố/tiểu bang. Ngay cả khi được định dạng kém, dữ liệu địa chỉ có thể giúp bạn đạt được 90 hoặc 95% mục tiêu của mình, để phần còn lại để dọn dẹp và xử lý lại hoặc cố gắng sử dụng tọa độ để xác định.

SmartyStreets sẽ lấy tệp CSV đã tải lên cùng với dữ liệu của bạn và thực hiện xác thực địa chỉ (chính xác và chuẩn hóa địa chỉ) và sau đó xác minh địa chỉ bằng cách sử dụng dữ liệu từ USPS. Một tính năng độc đáo của SmartyStreets là chúng không tính phí bất cứ thứ gì cho các địa chỉ xấu. Điều này sẽ cho phép bạn định dạng và xử lý các hoán vị khác nhau của từng địa chỉ (để cố gắng tính toán dữ liệu ngẫu nhiên) và chỉ trả tiền cho nó nếu một kết quả trùng khớp được giải quyết.

Vì lợi ích của việc tiết lộ đầy đủ, tôi là người sáng lập của SmartyStreets. Chúng tôi cung cấp xác minh địa chỉ đường phố.

Các vấn đề liên quan