GDF.упрощение искажает геометрию

#geopandas #cartopy

Вопрос:

Я пытаюсь нанести речные бассейны на карту. Для того, чтобы уменьшить размер результирующей векторной графики, я подаю заявку GeoSeries.simplify() .

 import cartopy
import cartopy.crs as ccrs

import matplotlib.pyplot as plt
import geopandas as gpd

# %%% Earth
fig = plt.figure()

latlon_proj = ccrs.PlateCarree()
axis_proj = ccrs.Orthographic()

ax = plt.axes(
    projection=axis_proj
    )

# %%% Major River Basins

mrb_basins = gpd.read_file('mrb_basins.json') # 520 entries

mrb_basins['geometry'] = mrb_basins['geometry'].simplify(0.1)

for shape in mrb_basins['geometry']:

    feat = cartopy.feature.ShapelyFeature(
        [shape],
        latlon_proj,
        facecolor='red',
        )

    ax.add_feature(feat)

mrb_basins.plot()
 

Проблема в том, что полученная карта земли полностью покрыта красной фигурой.

введите описание изображения здесь

Это не тот случай, если я удалю строку mrb_basins['geometry'] = mrb_basins['geometry'].simplify(0.1) .

введите описание изображения здесь

Как я могу упростить геометрию, сохраняя при этом ее целостность?

Набор данных по основным речным бассейнам доступен здесь.

Ответ №1:

GeoSeries.simplify() не всегда возвращает допустимые геометрии из-за базового алгоритма упрощения, используемого GEOS. И у картографии есть проблемы с построением недопустимых геометрий.

Вам нужно исправить свои геометрии, прежде чем передавать их в картопию. Самый простой трюк — позвонить buffer(0) .

 mrb_basins['geometry'] = mrb_basins['geometry'].simplify(0.1).buffer(0)
 

Тогда ваш код работает нормально.

Результат