我的目标是绘制 MSOA(英国的连续地理单位)集群的边界,为此我从 此处 下载了 MSOA 边界的 shapefile。然后,我添加一列簇标签并使用 geopandas 进行溶解。
df.dissolve(by='label', aggfunc='sum')
当我使用 Folium 绘制时,有多个内孔,如附图所示。我该如何删除这些?
#creates map
m = folium.Map([54.5,-3],zoom_start=6.8,tiles='cartodbpositron')
#makes boundaries plot
Boundaries = folium.GeoJson(
df,
name='Boundaries',
style_function = lambda x: {
'color': 'black',
'weight': 3,
'fillOpacity': 0
}).add_to(m)
m
当使用
geopandas.dissolve
聚合相邻的多边形时,会在生成的多边形中出现孔,这是因为数据或地理处理操作中的不规则之处。出现这种情况的原因可能有以下几种:
- 原始 MSOA 多边形中的拓扑错误: 原始 shapefile 中可能存在微小的间隙或重叠,在溶解操作后会变得更加明显。
-
属性值差异:
即使在视觉上看起来是连续的,如果用于溶解的列 (
'label'
在的例子中) 在本应合并的多边形中存在细微差异,也可能会导致孔洞。
以下是如何填充这些孔洞并将多边形创建为单一实体的方法:
1. 使用
shapely
简化几何形状:
-
geopandas
建立在shapely
库之上,该库提供了用于操作几何对象的函数。simplify()
函数可以帮助平滑多边形并消除小孔,而不会显著改变整体形状。
```python import geopandas as gpd
# 假设 df 是的 geopandas 地理数据框
# 在溶解之前,简化几何图形 df.geometry = df.geometry.simplify(tolerance=0.001)
# 现在执行溶解操作 df_dissolved = df.dissolve(by='label', aggfunc='sum') ```
-
通过试验
tolerance
参数找到适合数据的最佳值。值越高,简化程度越高,这可能会导致丢失一些细节。
2. 使用
unary_union
创建单一多边形:
-
溶解后,可以使用
shapely.ops.unary_union
强制将所有几何图形组合成一个单一的多边形。这将消除任何剩余的内部边界。
```python from shapely.ops import unary_union
# ...(溶解代码如上)...
# 创建一个单一的多边形 df_dissolved['geometry'] = unary_union(df_dissolved.geometry)
# 如果希望数据框中的每个集群/标签都有一个多边形: df_dissolved = gpd.GeoDataFrame(geometry=[unary_union(df_dissolved.geometry)]) ```
3. 检查和修复原始数据的拓扑错误:
-
对于更持久和准确的解决方案,请考虑在溶解之前使用
geopandas
或其他 GIS 工具(如 QGIS)检查和修复原始 MSOA shapefile 中的任何拓扑错误。
以下是一些在
geopandas
中执行此操作的方法:
-
识别并处理无效几何图形:
python df = df[df.geometry.is_valid]
-
使用
buffer(0)
解决微小的重叠/间隙:python df.geometry = df.geometry.buffer(0)
在应用这些方法后,的溶解地理数据框应该不再具有孔洞,并且可以使用 Folium 正确显示。请记住,最佳方法可能取决于的特定数据集和孔洞的原因。
标签:python,polygon,geopandas,folium,shapely From: 63317410