Удаление внутренних линий многоугольников после растворения в геопандах - PullRequest
0 голосов
/ 18 января 2020

Я работаю с геоданными в городе, где каждая единица представляет собой район (административное деление). Его график выглядит следующим образом:

import geopandas as gpd
df = gpd.read_file('districts_lima.geojson')
df.plot()

districts

Затем я объединяю некоторые географические единицы c в большие группы, используя переменную с именем zone. В результате получается:

df2 = df.dissolve(by='zone', aggfunc='sum')
df2.plot(column='population', legend=True, cmap='Blues')

population by zones

Моя единственная проблема заключается в том, что при воспроизведении того же графика с более темными границами становится очевидным, что некоторые из объединенные полигоны (зоны) имеют внутренние линии, которые являются внутренними границами районов от исходного геодатафрейма. Это ясно показано на этом графике:

df2.plot(column='population', legend=True, cmap='Blues', edgecolor='black')

population by zones with borders

Есть ли способ использовать geo pandas для удаления внутренних линий многоугольников чтобы они не появлялись на последнем графике?

Мои данные можно найти здесь .

Ответы [ 2 ]

1 голос
/ 18 января 2020

Используйте оси (ax1), чтобы включить отображение нескольких слоев на общих осях. Также используйте zorder, чтобы расположить слои, более высокие значения поместите слой над слоями с более низкими значениями.

fig, ax1 = plt.subplots(1, 1)
...
# bottom layer (has thick black lines)
df2.plot(column='population', legend=True, cmap='Blues', edgecolor='black', ax=ax1, zorder=5, lw=6)
# top layers (thin boundary lines)
df2.plot(column='population', legend=True, cmap='Blues', ax=ax1, zorder=6)

Надеемся, что верхний слой скроет почти весь нижний слой, но частично внешние линии границы.

0 голосов
/ 04 февраля 2020

Я действительно нашел хорошее решение, которое относится именно к тому факту, что моя проблема создается после применения свойства dissolve() geopandas. По-видимому, проблема была вызвана незаметными различиями в границах смежных внутренних блоков, которые препятствовали свертыванию удалять внутренние линии получающихся многоугольников.

Это решается добавлением небольшого буфера для расширения линий многоугольника, так что эти незаметные различия удаляются, и каждая внутренняя линия исходных многоугольников фактически перекрывается. В частности, мне нужно было добавить:

df2['geometry'] = df2['geometry'].buffer(0.0001)

до

df2 = df.dissolve(by='zone', aggfunc='sum')

Итак, теперь команда сюжета

df2.plot(column='population', legend=True, cmap='Blues', edgecolor='Black')

выход:

the result I was looking for

...