geopandas: неоднозначность метода индексации contains()

#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. Просто протестировал его, и он отлично сработал. Большое вам спасибо!