Предполагается ли, что наложение как= «разница» будет работать иначе, чем геопанды 0,9 против 0,10?

#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');
 

Вы получаете этот вывод

построение res_difference в геопандах 0.9

Именно такое поведение я ожидал бы увидеть в geopandas 0.10, но если полигоны не пересекаются, вы получаете пустой кадр геоданных. Это должно произойти или это результат реализации пространственной индексации?

Комментарии:

1. Исходя из вашего кода, вы строите res_difference график, затем строите оба df1 и df2 . Вот почему вы получаете все на своем участке.

2. Привет @swatchai, мой вопрос не в том, почему пустой df1 отображается так, как было показано на графике. Мой вопрос касается res_difference того, что должно быть пустым, если мы принимаем разницу между df2 и df1 в целом, поскольку df1 не будет иметь никакой разницы, поэтому я ожидал бы, что он вернет геометрию df1 res_difference . Если только это не является намерением отличия, которое, я думаю, меня смущает. Влияет ли разница только в том случае, если существует хотя бы один перекрывающийся многоугольник?

Ответ №1:

Это регрессия в выпуске 0.10. Прости меня за это! Мы постараемся исправить это в ближайшее время. А пока я бы предложил придерживаться 0,9.

Комментарии:

1. Исправление только что было выпущено в версии 0.10.1. Он доступен на PyPI сейчас и будет доступен на conda-forge к концу дня.