Geopandas затрагивает метод геосерий не работает, как я ожидаю - PullRequest
0 голосов
/ 28 августа 2018

У меня есть две геосерии в одном и том же crs. Я хочу извлечь из geoseries_1 все полигоны, которые касаются любого полигона geoseries_2. В документации говорится, что геосерии проверяются поэлементно, поэтому я делаю:

geoseries_1.touches(geoseries_2)

но вывод

0      False
1      False
2      False
      ...
569    False
597    False
598    False
Length: 599, dtype: bool

но я знаю, что некоторые из полигонов geoseries_1 на самом деле касаются некоторых полигонов в geoseries_2, и если я это сделаю, например:

geoseries_1.touches (geoseries_2.geometry.iloc [0])), результат:

0      True
1      True
2      False
      ...
569    False
597    True
598    False
Length: 599, dtype: bool

Это ожидаемый результат? Я неправильно истолковываю документацию? Заранее спасибо!

1 Ответ

0 голосов
/ 28 августа 2018

Да, это ожидаемое (но иногда удивительное) поведение: если вы передаете другой GeoSeries в качестве аргумента, операция «прикосновения» выполняется поэлементно (поэтому сначала geoseries_1 с первым из geoseries_2, вторым из geoseries_1 со вторым из geoseries_2, ...).

Таким образом, это не поведение "для всех элементов в geoseries_1, проверьте каждый элемент geoseries_1". Это больше похоже на пространственное соединение. Но, к сожалению, GeoPandas не поддерживает пространственные отношения «касания» в его sjoin функции

Так в чем же решение? Это зависит от желаемого результата: хотите ли вы повторить строки, которые имеют несколько совпадений? Или вы просто хотите иметь список трогательных полигонов?


Кстати: я недавно открыл проблему на github, чтобы предложить отключить это автоматическое выравнивание (поэтому, по крайней мере, вышеприведенное выдаст ошибку, если geoseries_1 и geoseries_2 не имеют одинаковую длину и индекс): https://github.com/geopandas/geopandas/issues/750

...