如何填充使用 geopandas 溶解地理数据框时创建的多面体中的孔?

Posted

技术标签:

【中文标题】如何填充使用 geopandas 溶解地理数据框时创建的多面体中的孔?【英文标题】:How to fill holes in Multi-polygons created when dissolving geodataframe with geopandas? 【发布时间】:2020-11-28 17:06:39 【问题描述】:

我的目标是绘制 MSOA 集群的边界(英国的连续地理单位),为此我从 here 下载了 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

【问题讨论】:

【参考方案1】:

如果有人遇到同样的问题,我找到了一个可以上传、简化和导出形状文件的网站,名为 mapshaper,这成功地将我的边界简化为所需的形式。

【讨论】:

【参考方案2】:

这有望帮助您仅使用 geopandas 来组织您的多边形。您可以使用以下函数覆盖几何图形。额外的处理用于保留或减少 MultiPolygons。我想 MapShaper 也会发生类似的事情,但这样你就不需要做额外的处理了。

from shapely.geometry import MultiPolygon, Polygon


def remove_interiors(poly):
    """
    Close polygon holes by limitation to the exterior ring.

    Arguments
    ---------
    poly: shapely.geometry.Polygon
        Input shapely Polygon

    Returns
    ---------
    Polygon without any interior holes
    """
    if poly.interiors:
        return Polygon(list(poly.exterior.coords))
    else:
        return poly


def pop_largest(gs):
    """
    Pop the largest polygon off of a GeoSeries

    Arguments
    ---------
    gs: geopandas.GeoSeries
        Geoseries of Polygon or MultiPolygon objects

    Returns
    ---------
    Largest Polygon in a Geoseries
    """
    geoms = [g.area for g in gs]
    return geoms.pop(geoms.index(max(geoms)))


def close_holes(geom):
    """
    Remove holes in a polygon geometry

    Arguments
    ---------
    gseries: geopandas.GeoSeries
        Geoseries of Polygon or MultiPolygon objects

    Returns
    ---------
    Largest Polygon in a Geoseries
    """
    if isinstance(geom, MultiPolygon):
        ser = gpd.GeoSeries([remove_interiors(g) for g in geom])
        big = pop_largest(ser)
        outers = ser.loc[~ser.within(big)].tolist()
        if outers:
            return MultiPolygon([big] + outers)
        return Polygon(big)
    if isinstance(geom, Polygon):
        return remove_interiors(geom)

df.geometry = df.geometry.apply(lambda p: close_holes(p))

【讨论】:

以上是关于如何填充使用 geopandas 溶解地理数据框时创建的多面体中的孔?的主要内容,如果未能解决你的问题,请参考以下文章

python包介绍:GeoPandas(初识)

绘图地图不显示几何图形

GeoPandas安装保姆级教程

(数据科学学习手札82)基于geopandas的空间数据分析——geoplot篇(上)

使用 geopandas 从热图中的图例中删除 NaN

地理编码在应用于数据框时返回错误的城镇 - 在应用于文本时返回正确的城镇