Подтвердить что ты не робот

Точка в многоугольнике с geoJSON в Python

У меня есть база данных geoJSON с большим количеством полигонов (специально для переписей), и у меня много длинных, лат-точек.

Я надеюсь, что существует эффективный код Python для определения того, какой переписной участок имеет заданную координату, однако до сих пор мой googling ничего не показал.

Спасибо!

4b9b3361

Ответ 1

Я нашел интересную статью в которой описывается, как делать именно то, что вы ищете.

TL; DR: используйте Shapely

Вы найдете этот код в конце статьи:

import json
from shapely.geometry import shape, Point
# depending on your version, use: from shapely.geometry import shape, Point

# load GeoJSON file containing sectors
with open('sectors.json') as f:
    js = json.load(f)

# construct point based on lon/lat returned by geocoder
point = Point(-122.7924463, 45.4519896)

# check each polygon to see if it contains the point
for feature in js['features']:
    polygon = shape(feature['geometry'])
    if polygon.contains(point):
        print 'Found containing polygon:', feature

Ответ 2

Отличным вариантом для работы с этими типами данных является PostGIS, расширитель пространственной базы данных для PostgreSQL. Я лично сохраняю все свои геоданные в базе данных PostGIS, а затем ссылаюсь на нее на python, используя psycopg2. Я знаю, что это не чистый питон, но он получил невероятные преимущества в производительности (см. Ниже) поверх чистого python.

PostGIS имеет встроенные функции, чтобы определить, находится ли точка или форма в другой форме. Хорошая документация по ST_Within расширяет этот простой пример:

SELECT
ST_WITHIN({YOUR_POINT},boundary)
FROM census;
-- returns true or false for each of your tracts

Благосклонность, которую вы получите от PostGIS, чего вы, скорее всего, не достигнете в другом месте, - это индексирование, которое может улучшить вашу скорость 1,000x [1], что делает ее лучше, чем даже самая лучшая написанная программа на C (кроме случаев, когда программа C также создает индекс для ваших данных). База данных при правильной настройке будет кэшировать информацию о ваших трактах, и когда вы спросите, находится ли точка внутри тракта, ей не придется искать все... он может воспользоваться этим индексом.

Получение данных в PostGRES и из них довольно просто. Большой учебник, в котором вы познакомитесь с основами PostGIS с образцами наборов данных, не слишком отличающимися от ваших, можно найти здесь. Это достаточно долго, но если вы новичок в PostGIS (как и я), вы будете очень развлекаться и волноваться все время:

http://workshops.boundlessgeo.com/postgis-intro/

[1] Индексация уменьшила поиск ближайшего соседа в одной из моих огромных баз данных (20 м с 53 секунд до 8,2 миллисекунды.

Ответ 3

Нельзя иметь очень быстрый геометрический код в Python. Вместо этого обычный подход заключается в использовании быстрой библиотеки C/С++ с оболочками Python.

Например, вы можете начать с CGAL - очень сложной геометрической библиотеки С++. Он имеет привязки Python для большинства своих подпрограмм, см. Ссылку http://code.google.com/p/cgal-bindings/.