#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)
Тогда ваш код работает нормально.