алгоритм получения почтовых индексов США по координатам gis x, y - PullRequest
6 голосов
/ 07 января 2012

У меня есть база данных многих десятков тысяч событий, которые произошли в определенных географических точках в Соединенных Штатах.Данные включают x, y coodinates для каждого события, закодированные с использованием системы отсчета NAD83.Я хочу написать или использовать алгоритм для надежного получения почтового индекса США, связанного с каждой координатой NAD83 x, y.

У меня пока нет определений почтового индекса, использующих систему ссылок NAD83.И я никогда не делал такого рода программирования раньше.Но просто кажется, что было бы интуитивно просто определить, находится ли данная координата x, y в геометрической форме почтового индекса США, определенного с использованием той же системы ссылок NAD83.

Может ли кто-нибудь помочь мне со следующим:
1.) Где я могу получить надежные определения почтового индекса США в формате справочной системы NAD83?
2.) Где я могу найти пример кода дляалгоритм для нахождения почтового индекса по координате x, y?

Любые ссылки, которые вы можете отправить на учебные статьи / учебные пособия, пример кода и данные определения границ почтового индекса NAD83, были бы очень полезны.Я выполняю поиск в Google, но я подумал, что люди на этом сайте могут дать мне больше справок эксперта.

Я пишу код на Java каждый день.Но если код, который вы предоставляете, написан не на языке Java, я мог бы взять код, написанный на другом языке, и адаптировать его для Java в своих целях.У меня не установлено программное обеспечение базы данных на моем компьютере, потому что я просто использую CSV или текстовые файлы в качестве входных данных для моих Java-приложений.Если у вас есть база данных, которую вы предлагаете мне использовать, мне понадобятся ссылки на инструкции о том, как получить данные в формате, который я могу импортировать в язык программирования, например java.

Наконец, адреса улиц вмой набор данных не включает почтовые индексы, а уличные адреса пишутся бессистемно, так что было бы очень трудно попытаться очистить адресные данные достаточно, чтобы попытаться получить почтовые индексы из адресов.Я могу изолировать данные в нескольких соседних городах, возможно, в паре сотен почтовых индексов, но я думаю, что координаты NAD83 x, y - мой лучший способ получить почтовый индекс, в котором происходило каждое событие в моем наборе данных.Я хочу связать свой полученный почтовый индекс с помощью анализа почтового индекса с другими данными, которые я получаю о каждом почтовом индексе из таких источников, как перепись населения США и т. Д.

Заранее благодарю всех, кто готов помочь.

Ответы [ 3 ]

4 голосов
/ 07 января 2012

Вы можете использовать GeoTools в Java. Вот пример поиска точки в шейп-файле.

// 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'));
}

Я взял шейп-файл из коллекции Бюро переписей США 5-значных областей табуляции почтовых индексов из переписи 2000 года. Я просто использовал один файл для штата Колорадо. Вам нужно объединить их в один FeatureSource. Запуск этого выводит 80302 для Boulder, CO.

GeoTools также позволяет конвертировать между проекциями при необходимости. К счастью, эти шейп-файлы уже есть в NAD83.

1 голос
/ 07 января 2012

Я не знаю, где взять почтовый индекс, но я думаю, что вы можете погуглить его, 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 голосов
/ 18 января 2012

Вы упомянули, что у вас есть адреса, которые вы могли бы использовать. В этом случае служба проверки адреса позволит вам программно найти почтовые индексы на основе адреса и города / штата. Даже если они плохо отформатированы, адресные данные могут привести к достижению 90 или 95% вашей цели, оставляя остаток для очистки или повторной обработки или для попытки использовать координаты для определения.

SmartyStreets примет загруженный CSV-файл с вашими данными и выполнит проверку адреса (исправит и стандартизирует адрес), а затем проверит адреса, используя данные из USPS. Уникальной особенностью SmartyStreets является то, что они ничего не берут за плохие адреса. Это позволит вам форматировать и обрабатывать различные перестановки каждого адреса (чтобы попытаться учесть случайные данные) и оплачивать их только в случае разрешения положительного совпадения.

В целях полного раскрытия информации я являюсь учредителем SmartyStreets . Мы предоставляем проверку адреса улицы.

...