在 Python/GeoPandas 中组合 shapefile
Combining shapefiles in Python / GeoPandas
我有三个相互重叠的多边形形状文件。我们称他们为:
- file_one.shp(多边形名称为 1)
- file_two.shp(多边形名称为 2)
- file_three.shp(多边形名称为 3)
我想合并它们并保持这样的值。
请问如何才能达到Python中的效果(如图)?
谢谢!
如果您只想从您提到的文件创建一个 shapefile,您可以尝试使用以下代码(我假设 shapefile 具有相同的列)。
import pandas as pd
import geopandas as gpd
gdf1 = gpd.read_file('file_one.shp')
gdf2 = gpd.read_file('file_two.shp')
gdf3 = gpd.read_file('file_three.shp')
gdf = gpd.GeoDataFrame(pd.concat([gdf1, gdf2, gdf3]))
首先,让我们生成一些数据进行演示:
import geopandas as gpd
from shapely.geometry import Point
shp1 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(3)], 'name': ['Shape 1']})
shp2 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(2)], 'name': ['Shape 2']})
shp3 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(1)], 'name': ['Shape 3']})
现在对所有形状取对称差,但最小的形状可以保留原样:
diffs = []
gdfs = [shp1, shp2, shp3]
for idx, gdf in enumerate(gdfs):
if idx < 2:
diffs.append(gdf.symmetric_difference(gdfs[idx+1]).iloc[0])
diffs.append(shp3.iloc[0].geometry)
好了,现在你有了所需的形状作为差异列表。如果你想将它们合并为一个 GeoDataFrame,只需按照以下步骤操作:
all_shapes = gpd.GeoDataFrame(geometry=diffs)
我有三个相互重叠的多边形形状文件。我们称他们为:
- file_one.shp(多边形名称为 1)
- file_two.shp(多边形名称为 2)
- file_three.shp(多边形名称为 3)
我想合并它们并保持这样的值。
请问如何才能达到Python中的效果(如图)?
谢谢!
如果您只想从您提到的文件创建一个 shapefile,您可以尝试使用以下代码(我假设 shapefile 具有相同的列)。
import pandas as pd
import geopandas as gpd
gdf1 = gpd.read_file('file_one.shp')
gdf2 = gpd.read_file('file_two.shp')
gdf3 = gpd.read_file('file_three.shp')
gdf = gpd.GeoDataFrame(pd.concat([gdf1, gdf2, gdf3]))
首先,让我们生成一些数据进行演示:
import geopandas as gpd
from shapely.geometry import Point
shp1 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(3)], 'name': ['Shape 1']})
shp2 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(2)], 'name': ['Shape 2']})
shp3 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(1)], 'name': ['Shape 3']})
现在对所有形状取对称差,但最小的形状可以保留原样:
diffs = []
gdfs = [shp1, shp2, shp3]
for idx, gdf in enumerate(gdfs):
if idx < 2:
diffs.append(gdf.symmetric_difference(gdfs[idx+1]).iloc[0])
diffs.append(shp3.iloc[0].geometry)
好了,现在你有了所需的形状作为差异列表。如果你想将它们合并为一个 GeoDataFrame,只需按照以下步骤操作:
all_shapes = gpd.GeoDataFrame(geometry=diffs)