在 geopandas 中使用多边形 shapefile 剪切 shapefile
Clipping shapefile with multi-polygon shapefile in geopandas
我有一个 shapefile(以下称为源文件),我需要用多边形 shapefile 对其进行裁剪,这样我就可以为每个多边形创建一个裁剪的 shapefile。我尝试了 geopandas,尽管我可以通过从多多边形 shapefile 中单独选择多边形来单独剪辑它来剪辑源文件,但是当我尝试遍历多边形以自动执行剪辑过程时,我得到以下信息错误:
错误:
类型错误:'mask' 应该是 GeoDataFrame、GeoSeries 或(多)多边形,得到了
代码:
import geopandas as gpd
source = ('source-shapefile.shp')
mask = ('mask_shapefile.shp')
sourcefile = gpd.read_file(source)
maskfile = gpd.read_file(mask)
for row in maskfile.iterrows():
gpd.clip(sourcefile, row)
两分
- https://geopandas.org/en/stable/docs/reference/api/geopandas.clip.html mask 可以是 GeoDataFrame 因此不需要循环
- https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iterrows.html 产生索引值的 元组 和行的命名元组。因此,您的错误是您将此 tuple 传递给
clip()
已经构建了一个例子。使用 GeoDataFrame 作为蒙版进行剪辑要简单得多。
import geopandas as gpd
import pandas as pd
# lets build a mask for use in clip, multipolygons and polygons
maskfile = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
maskfile = maskfile.loc[maskfile["continent"].eq("Europe") & maskfile["name"].ne("Russia")].pipe(
lambda d: d.assign(gdp_grp=pd.cut(d["gdp_md_est"], bins=4, labels=list("abcd")))
).dissolve("gdp_grp").reset_index()
sourcefile = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
# now clip, no looping needed
gpd.clip(sourcefile, maskfile)
最后,经过 5 个小时的研究,我现在可以通过 multi-polygon shapefile 裁剪 shapefile 并分别保存裁剪的多边形及其各自的名称。以下代码可能很脏
但它有效。
代码:
import geopandas as gpd
import pandas as pd
import os, sys
source = ('source-shapefile.shp')
mask = ('mask_shapefile.shp')
outpath = ('/outpath')
sourcefile = gpd.read_file(source)
maskfile = gpd.read_file(mask)
clipshape = maskfile.explode()
clipshape.set_index('CATCH_NAME', inplace=True) # CATCH_NAME is attribute column name
for index, row in clipshape['geometry'].iteritems():
clipped = gpd.clip(sourcefile, row)
clipped.to_file(os.path.join(outpath, f'{index}.shp'))
我有一个 shapefile(以下称为源文件),我需要用多边形 shapefile 对其进行裁剪,这样我就可以为每个多边形创建一个裁剪的 shapefile。我尝试了 geopandas,尽管我可以通过从多多边形 shapefile 中单独选择多边形来单独剪辑它来剪辑源文件,但是当我尝试遍历多边形以自动执行剪辑过程时,我得到以下信息错误:
错误:
类型错误:'mask' 应该是 GeoDataFrame、GeoSeries 或(多)多边形,得到了
代码:
import geopandas as gpd
source = ('source-shapefile.shp')
mask = ('mask_shapefile.shp')
sourcefile = gpd.read_file(source)
maskfile = gpd.read_file(mask)
for row in maskfile.iterrows():
gpd.clip(sourcefile, row)
两分
- https://geopandas.org/en/stable/docs/reference/api/geopandas.clip.html mask 可以是 GeoDataFrame 因此不需要循环
- https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iterrows.html 产生索引值的 元组 和行的命名元组。因此,您的错误是您将此 tuple 传递给
clip()
已经构建了一个例子。使用 GeoDataFrame 作为蒙版进行剪辑要简单得多。
import geopandas as gpd
import pandas as pd
# lets build a mask for use in clip, multipolygons and polygons
maskfile = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
maskfile = maskfile.loc[maskfile["continent"].eq("Europe") & maskfile["name"].ne("Russia")].pipe(
lambda d: d.assign(gdp_grp=pd.cut(d["gdp_md_est"], bins=4, labels=list("abcd")))
).dissolve("gdp_grp").reset_index()
sourcefile = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
# now clip, no looping needed
gpd.clip(sourcefile, maskfile)
最后,经过 5 个小时的研究,我现在可以通过 multi-polygon shapefile 裁剪 shapefile 并分别保存裁剪的多边形及其各自的名称。以下代码可能很脏 但它有效。 代码:
import geopandas as gpd
import pandas as pd
import os, sys
source = ('source-shapefile.shp')
mask = ('mask_shapefile.shp')
outpath = ('/outpath')
sourcefile = gpd.read_file(source)
maskfile = gpd.read_file(mask)
clipshape = maskfile.explode()
clipshape.set_index('CATCH_NAME', inplace=True) # CATCH_NAME is attribute column name
for index, row in clipshape['geometry'].iteritems():
clipped = gpd.clip(sourcefile, row)
clipped.to_file(os.path.join(outpath, f'{index}.shp'))