首页 > 解决方案 > GDF.simplify 弄乱了几何图形

问题描述

我正在尝试在地图上绘制流域。为了减小生成的矢量图形的大小,我正在应用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)

在此处输入图像描述

如何在保持完整性的同时简化几何?

主要流域的数据集可在此处获得。

标签: geopandascartopy

解决方案


GeoSeries.simplify()由于 GEOS 使用的底层简化算法,并不总是返回有效的几何图形。而且 cartopy 很难绘制无效的几何图形。

您需要在将几何图形传递给 cartopy 之前对其进行修复。简单的技巧是调用buffer(0).

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

然后你的代码工作正常。

结果


推荐阅读