如何从 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()
在 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()