GeoDjango поиск расстояния - PullRequest
       17

GeoDjango поиск расстояния

3 голосов
/ 21 декабря 2009

Я хочу использовать GeoDjango для базового поиска местоположения. В частности, я хочу дать функции поиска почтовый индекс / город / округ и найти все почтовые индексы / города / графства в течение 5ми, 10ми, 20ми и т. Д. Я нашел следующий абзац в документации:

Использование географической системы координат может создать сложности для разработчика в дальнейшем. Например, PostGIS не имеет возможности выполнять расчеты расстояний между неточечными геометриями, используя географические системы координат, например, создавая запрос для поиска всех точек в пределах 5 миль от границы округа, сохраненной как WGS84. [6]

Что именно это означает, если я хочу использовать PostGIS и иметь возможность выполнять поиск, описанный выше, в США? В документах предлагается использовать проекционную систему координат, чтобы охватить только конкретный регион. Мне нужно охватить всю страну, так что я полагаю, что это не вариант.

По сути, в конце я хочу найти соседние почтовые индексы / города / округа с учетом стартового местоположения и расстояния. Мне все равно, как это делается на техническом уровне.

Также, где я могу найти базу данных, которая содержит географические границы почтовых индексов / городов / округов в США, которые я могу импортировать в модель GeoDjango?

UPDATE

Я нашел базу данных, которая содержит координаты широты и долготы всех почтовых индексов в США здесь . Мой план состоит в том, чтобы импортировать эти точки в модель GeoDjango и использовать PostGis для построения запросов, которые могут найти другие точки в пределах x миль от заданной точки. Это позволяет обойти проблему, поднятую в документации, поскольку все почтовые индексы рассматриваются как точки, а не как многоугольники. Это хорошо для моего случая использования, потому что идеальная точность - это не то, что меня волнует.

Хорошо: файл данных бесплатный

Плохо: это данные переписи 2000 года, поэтому они довольно датированы

Несколько обнадеживающие: Бюро переписей США проводит перепись каждые 10 лет, и это почти 2010

Вывод: для меня это достаточно хорошо

Ответы [ 2 ]

3 голосов
/ 28 декабря 2009

Чтобы обойти ограничение в кавычке, вы можете просто взять центр тяжести области почтового индекса, предоставленной пользователем, и затем из этой точки найти все области почтового индекса, которые пересекают круг из 5, 10 или любой мили, исходящий из этой точки. , Я не уверен, как этого добиться в геоджанго, но с postgis это определенно возможно.

Ограничение, которое вы цитировали, в основном говорит о том, что вы не можете написать запрос, который говорит: «Дайте мне все точки, которые находятся в пределах 5 миль от внутренней границы Огайо».

0 голосов
/ 22 сентября 2012
In [1]: o = Place.objects.get(pk=2463583)  # Oakland, CA

In [2]: sf = Place.objects.get(pk=2487956)  # San Francisco, CA

In [3]: o.coords.transform(3410)  # use the NSIDC EASE-Grid Global projection

In [4]: sf.coords.transform(3410)  # use the NSIDC EASE-Grid Global projection

In [5]: o.coords.distance(sf.coords)  # find the distance between Oakland and San Francisco (in meters)
Out[5]: 14401.942808571299
...