#python #pandas #geospatial #geopandas
Вопрос:
Я использовал операцию набора различий для другой задачи, но при замене многоугольника на разницу в моем геодатафраме я получал пустой кадр или тип «Нет». Я обнаружил, что это результат наличия непересекающихся полигонов и выполнения операции набора различий. Мне было интересно, это нормальное поведение или оно все еще должно сохранять геометрию для df1? Это поведение отличается между версией 0.10 и версией 0.9.
Например:
import geopandas
polys1 = geopandas.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)])])
polys2 = geopandas.GeoSeries([Polygon([(3,3), (5,3), (5,5), (3,5)])])
df1 = geopandas.GeoDataFrame({'geometry': polys1, 'df1':[1]})
df2 = geopandas.GeoDataFrame({'geometry': polys2, 'df2':[1]})
ax = df1.plot(color='red');
df2.plot(ax=ax, color='green', alpha=0.5);
Отображение двух непересекающихся полигонов
Как вы можете видеть, эти многоугольники не пересекаются. Поэтому, когда я выполняю операцию набора различий,
res_difference = df1.overlay(df2, how='difference')
print(res_difference)
ax = res_difference.plot(cmap='tab10')
df1.plot(ax=ax, facecolor='none', edgecolor='k');
df2.plot(ax=ax, facecolor='none', edgecolor='k');
выход тогда такой,
где я ожидал бы увидеть геометрию df1 в переменной res_difference. Так вот как должна работать разница?
Причина, по которой я ожидал бы, что геометрия df1 появится в res_difference, основана на поведении в geopandas 0.9. Когда я запускаю следующий код, используя geopandas 0.9 вместо geopandas 0.10
# I use the function vs method since it seems the method isn't
# implemented in geopandas 0.9
res_difference = geopandas.overlay(df1, df2, how='difference')
print(res_difference)
ax = res_difference.plot(cmap='tab10')
df1.plot(ax=ax, facecolor='none', edgecolor='k');
df2.plot(ax=ax, facecolor='none', edgecolor='k');
Вы получаете этот вывод
Именно такое поведение я ожидал бы увидеть в geopandas 0.10, но если полигоны не пересекаются, вы получаете пустой кадр геоданных. Это должно произойти или это результат реализации пространственной индексации?
Комментарии:
1. Исходя из вашего кода, вы строите
res_difference
график, затем строите обаdf1
иdf2
. Вот почему вы получаете все на своем участке.2. Привет @swatchai, мой вопрос не в том, почему пустой df1 отображается так, как было показано на графике. Мой вопрос касается
res_difference
того, что должно быть пустым, если мы принимаем разницу между df2 и df1 в целом, поскольку df1 не будет иметь никакой разницы, поэтому я ожидал бы, что он вернет геометрию df1res_difference
. Если только это не является намерением отличия, которое, я думаю, меня смущает. Влияет ли разница только в том случае, если существует хотя бы один перекрывающийся многоугольник?
Ответ №1:
Это регрессия в выпуске 0.10. Прости меня за это! Мы постараемся исправить это в ближайшее время. А пока я бы предложил придерживаться 0,9.
Комментарии:
1. Исправление только что было выпущено в версии 0.10.1. Он доступен на PyPI сейчас и будет доступен на conda-forge к концу дня.