#python #pandas #geopandas
#python #панды #геопанды
Вопрос:
У меня есть простые геоданные с точками, подобные этой :
name geometry
0 Location1 POINT (9.71852 50.56186)
1 Location2 POINT (9.72912 50.55847)
С другой стороны, у меня есть более сложный фрейм геоданных, который состоит из полигонов. Моя цель — обновить мой GDF точек некоторой информацией из другого GDF, если точка находится в области многоугольника.
Поэтому я хотел использовать метод contains(), чтобы проверить, какие полигоны содержат точку. Я тестировал с простой логической маской :
mask = polygons.contains(points.loc[0,'geometry'])
selection = polygons.loc[mask]
Очевидно, что selection возвращает полигон, который соответствует первому ряду точек GDF. Я хотел рассмотреть все строки GDF с помощью чего-то вроде :
mask = polygons.contains(points['geometry'])
Эта маска не сработала, я предполагаю, что это проблема с индексацией, но я не понимаю, как это исправить…
Ответ №1:
Теперь это действительно ожидаемое поведение. GeoSeries.contains
это операция по построкам, что означает, что если вы это сделаете polygons.contains(point)
, она сначала выровняет обе геосерии, а затем проверит, содержит ли полигон в строке 0 точку в строке 0 и т. Д.
Если вы хотите обновить точки данными из полигонов, вам следует использовать geopandas.sjoin
— https://geopandas.readthedocs.io/en/latest/docs/user_guide/mergingdata.html#spatial-joins
В вашем случае это, вероятно, будет выглядеть примерно так:
points_with_data = geopandas.sjoin(points, polygons, how='left')
Комментарии:
1. Просто протестировал его, и он отлично сработал. Большое вам спасибо!