Использование пространственного индекса для увеличения запроса расстояния от точки до многоугольника - PullRequest
1 голос
/ 28 мая 2020

Здесь представляет, как усилить запросы пространственного пересечения с помощью R-Tree. Здесь @ JHuw предоставляет способы использования R-Tree для вычисления ближайшего расстояния от точки до точки и линии соответственно. Тем не менее, я не нашел решения для увеличения запроса расстояния от точки до многоугольника с помощью R-Tree. Я последовал этим примерам, упомянутым выше, и до сих пор не понял, как реализовать R-Tree в запросе на ближайшее расстояние от точки к многоугольнику. Может ли кто-нибудь помочь мне разобраться в этом? Очень признателен. В качестве примера я использую Южную Америку и подмножество городов из Geo Pandas:

# Import libraries
import geopandas as gpd
import matplotlib.pyplot as plt

# Load data from GeoPandas
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))

south_america = world[world.continent == 'South America']
city_sub = cities[cities.index < 20]

# Plot
ax= south_america.boundary.plot()
city_sub.plot(ax=ax)

# Nearest distance from point (city_sub) to polygon (south_america) using R-Tree
# "To be finished..."

1 Ответ

0 голосов
/ 02 июня 2020

Вот более подробный обзор точек привязки к линии с использованием пространственного индекса (RTree) в geo pandas, который может помочь в этом случае: https://medium.com/@brendan_ward / how-to-leverage-geo pandas -for-Fast-snapping-of-points-to-lines-6113c94e59aa

Он использует подход на основе допуска, поэтому он выбирает только те элементы, элементы которых являются ближайшими в пределах этого допуска. В этом подходе можно использовать больший допуск, но он может значительно увеличить время обработки. Он использует ограничивающую рамку, основанную на этом допуске, для запроса функций в RTree; чем больше ограничивающая рамка, тем менее эффективен запрос к дереву.

С многоугольниками у вас есть больше случаев, которые следует учитывать: точка, которая находится внутри многоугольника, имеет расстояние 0.

Вы можете справиться с этим за 2 прохода: сначала используйте пространственное соединение в geo pandas, чтобы найти все случаи, когда точки находятся внутри полигонов. Затем возьмите все те, которые не находятся внутри многоугольников, и попытайтесь найти ближайший многоугольник для каждой точки. Использование ограничивающего прямоугольника на основе допуска для запроса RTree дает вам список полигонов-кандидатов, затем вычисляет расстояние между точкой и ее полигонами-кандидатами и выбирает тот, у которого расстояние наименьшее. что делать, когда заданная точка попадает в несколько полигонов: какой из них в этом случае «ближайший»? Один из подходов - выбрать перекрывающийся многоугольник, центроид которого ближе всего к вашей точке, но это действительно зависит от ваших целей.

...