У меня есть 2 геоданных:
import geopandas as gpd
from shapely.geometry import Point
gpd1 = gpd.GeoDataFrame([['John',1,Point(1,1)],['Smith',1,Point(2,2)],['Soap',1,Point(0,2)]],columns=['Name','ID','geometry'])
gpd2 = gpd.GeoDataFrame([['Work',Point(0,1.1)],['Shops',Point(2.5,2)],['Home',Point(1,1.1)]],columns=['Place','geometry'])
и я хочу найти имя ближайшей точки в gpd2 для каждой строки в gpd1:
desired_output =
Name ID geometry Nearest
0 John 1 POINT (1 1) Home
1 Smith 1 POINT (2 2) Shops
2 Soap 1 POINT (0 2) Work
Я пытался заставить это работать с помощью лямбда-функции:
gpd1['Nearest'] = gpd1.apply(lambda row: min_dist(row.geometry,gpd2)['Place'] , axis=1)
с
def min_dist(point, gpd2):
geoseries = some_function()
return geoseries
Ответы:
Вы можете напрямую использовать функцию Shapely Ближайшие точки (геометрия GeoSeries - это геометрия Shapely):
экспликация
источник
sample_point = gpd2.geometry.unary_union[400] /
sample_point in gpd2.geometry
это возвращает True.gpd2.geometry == sample_point
Это выходит все ложным.gpd2.geometry.geom_equals(sample_point)
работает.Если у вас большие фреймы данных, я обнаружил, что
scipy
метод пространственного индекса cKDTree.query
очень быстро возвращает результаты поиска ближайших соседей. Так как он использует пространственный индекс, он на несколько порядков быстрее, чем зацикливание на кадре данных, а затем находит минимум всех расстояний. Это также быстрее, чем использование shapelynearest_points
с RTree (метод пространственного индекса, доступный через геопанды), потому что cKDTree позволяет векторизовать поиск, тогда как другой метод этого не делает.Вот вспомогательная функция, которая будет возвращать расстояние и «Имя» ближайшего соседа
gpd2
из каждой точки вgpd1
. Предполагается, что оба файла gdf имеютgeometry
столбец (точек).И если вы хотите найти ближайшую точку к LineString, вот полный рабочий пример:
источник
Догадаться:
Конечно, некоторая критика приветствуется. Я не фанат пересчета gpd2 ['Dist'] для каждой строки gpd1 ...
источник
Ответ Джина не сработал для меня. Наконец, я обнаружил, что gpd2.geometry.unary_union привел к геометрии, которая содержала только около 30 000 из моих общих примерно 150 000 точек. Для тех, кто сталкивается с той же проблемой, вот как я решил ее:
источник
Для тех, у кого были ошибки индексации с их собственными данными при использовании превосходного ответа от @ JHuw , моя проблема заключалась в том, что мои индексы не выравнивались. Сброс индексов gdfA и gdfB решил мои проблемы, может быть, это также поможет вам @ Shakedk .
источник