如何从 geopandas 数据框中删除在重新投影时导致问题的形状?

How to remove shapes that cause a problem upon reprojection from a geopandas dataframe?

this geopandas 示例中,南极大陆在重新投影到墨卡托投影之前从 GeoDataFrame 中删除,以防止包含极点的形状出现问题(会变得无限大)。

我在想,是否可以找到一种更健壮的重投影方法,使得数据帧不需要手动调整。特别是因为我正在处理一个没有单独的南极洲行的数据集:

我有两个想法:

1。使用有关目的地的信息 crs

例如epsg website,显示'Area of use':

我们可以在重新投影之前使用它来准备数据:删除任何向南延伸超过 -80 度的形状,或者将其与描述目标 crs 使用区域的 shapely Polygon 相交, 就源 crs 而言 - 在这种情况下标准 epsg:4326 所以 Polygon([(-180,-80), (-180,84), ...]).

这种方法的问题:我不确定,如果任何 crs,例如来自 GeoDataFrame 对象。

2。修复 post

照做,以后再挑出重放错误的部分。例如,在我目前的情况下,重新投影的地理数据框 gdf_merc = gdf.to_crs(epsg=3395) 确实有错误...

...但是通过在几何的字符串表示中搜索 inf 单词,我可以在 MultiPolygon...[=29 中找到有问题的 Polygon =]

In [360]: for i, polygon in enumerate(gdf_merc.geometry[0]):
   ...:     if 'inf' in str(polygon): 
   ...:         print(i)
  
0

...然后删除它:

这种方法的问题:看起来很复杂,我希望首先防止出现任何问题。

关于如何解决这两种方法中的任何一种,或者有第三种方法吗?

一句话:我对一般情况感兴趣,其中 any crs 可以重新投影到,所以我不想先发制人地移除南极洲(“以防万一"),因为其他投影可能完全没问题,更重要的是,它们可能有其他问题区域。

非常感谢!

选项 1 可能是这里的最佳镜头。最新的 GeoPandas 使用 pyproj.CRS 存储 CRS 数据,您可以从中轻松提取投影的边界。

从 df 中提取它:

import geopandas as gpd
df = gpd.read_file(gpd.datasets.get_path('nybb'))
df.crs.area_of_use.bounds

直接使用pyproj从目标CRS获取:

import pyproj
crs = pyproj.CRS.from_epsg(3395)
crs.area_of_use.bounds

然后你可以使用内置的 geopandas.clip 来剪辑你的数据。

from shapely.geometry import box

df = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
crs = pyproj.CRS.from_epsg(3395)
bounds = crs.area_of_use.bounds
clipped = gpd.clip(df, box(*bounds))
clipped.to_crs(crs).plot()