【问题标题】:calculate overlapping areas计算重叠区域
【发布时间】:2020-04-04 02:54:31
【问题描述】:

我遵循示例here 并成功创建了凸包。但是我有一个关于如何计算下图中每个凸包之间的共享区域的问题:

谢谢!

【问题讨论】:

    标签: area geopandas convex-hull


    【解决方案1】:

    这是获取曼哈顿和布朗克斯交叉口的示例。如果要合并行政区,可以在 .overlay() 之前使用 pd.concat()。

    import geopandas as gpd
    nybb_path = gpd.datasets.get_path('nybb')
    
    boros = gpd.read_file(nybb_path)
    boros.set_index('BoroCode', inplace=True)
    boros.sort_index(inplace=True)
    
    boros['geometry'] = boros['geometry'].convex_hull
    
    print(boros)
        BoroName    Shape_Leng  Shape_Area  geometry
    BoroCode                
    1   Manhattan   359299.096471   6.364715e+08    POLYGON ((977855.445 188082.322, 971830.134 19...
    2   Bronx   464392.991824   1.186925e+09    POLYGON ((1017949.978 225426.885, 1015563.562 ...
    3   Brooklyn    741080.523166   1.937479e+09    POLYGON ((988872.821 146772.032, 983670.606 14...
    4   Queens  896344.047763   3.045213e+09    POLYGON ((1000721.532 136681.776, 994611.996 2...
    5   Staten Island   330470.010332   1.623820e+09    POLYGON ((915517.688 120121.881, 915467.035 12...
    
    manhattan_gdf = boros.iloc[0:1, :]
    bronx_gdf = boros.iloc[1:2, :]
    
    manhattan_bronx_intersecetion_polygon = gpd.overlay(manhattan_gdf, bronx_gdf, 
    how='intersection')
    
    #SPCS83 New York Long Island zone (US Survey feet)
    print(manhattan_bronx_intersecetion_polygon.geometry[0].area)
    164559574.89341027
    
    ax = manhattan_bronx_intersecetion_polygon.plot(figsize=(6,6))
    boros.plot(ax=ax, facecolor='none', edgecolor='k');
    

    这是您在评论中要求的循环解决方案。

    import geopandas as gpd
    nybb_path = gpd.datasets.get_path('nybb')
    
    boros = gpd.read_file(nybb_path)
    boros.set_index('BoroCode', inplace=True)
    boros.sort_index(inplace=True)
    
    boros['geometry'] = boros['geometry'].convex_hull
    
    intersection_polygons_list = []
    
    for idx, row in boros.iterrows():
    
        main_boro_gdf = boros.iloc[idx-1:idx, :]
    
        print('\n' + 'main boro:', main_boro_gdf['BoroName'].values.tolist()[:])
    
        other_boro_list = boros.index.tolist()
    
        other_boro_list.remove(idx)
    
        other_boro_gdf = boros[boros.index.isin(other_boro_list)]
    
        print('other boros:',other_boro_gdf['BoroName'].values.tolist()[:])
    
        intersection_polygons = gpd.overlay(main_boro_gdf, other_boro_gdf, how='intersection')
    
        intersection_polygons['intersection_area'] = intersection_polygons.geometry.area
    
        print('intersecton area sum:', intersection_polygons['intersection_area'].sum())
    
        intersection_polygons_list.append(intersection_polygons)
    

    输出:

    main boro: ['Manhattan']
    other boros: ['Bronx', 'Brooklyn', 'Queens', 'Staten Island']
    intersecton area sum: 279710750.6116526
    
    main boro: ['Bronx']
    other boros: ['Manhattan', 'Brooklyn', 'Queens', 'Staten Island']
    intersecton area sum: 216638786.2669542
    
    main boro: ['Brooklyn']
    other boros: ['Manhattan', 'Bronx', 'Queens', 'Staten Island']
    intersecton area sum: 1506573115.3550038
    
    main boro: ['Queens']
    other boros: ['Manhattan', 'Bronx', 'Brooklyn', 'Staten Island']
    intersecton area sum: 1560297426.3563197
    
    main boro: ['Staten Island']
    other boros: ['Manhattan', 'Bronx', 'Brooklyn', 'Queens']
    intersecton area sum: 0.0
    

    您可以使用intersection_polygons_list 索引值进行绘图。例如,这里是布朗克斯的重叠区域:

    intersection_polygons_list[1].plot()
    

    【讨论】:

    • 非常感谢,这非常有效。在五个凸包共享一些公共区域的情况下,如何创建一个循环来计算五个凸包之间的所有共享区域?
    • 当然,它工作得很好。谢谢。我不熟悉 Python 中的循环,所以我需要一段时间才能弄清楚每个步骤到底在做什么。我试图使用df = pd.DataFrame(intersection_polygons_list) 将列表转换为pandas DataFrame,但结果不是我想要的。你能帮我弄清楚如何正确地将列表转换为熊猫数据框,比如将它包含在循环中。非常感谢!
    • 您可以使用 0-4 的列表索引值执行 df = (intersection_polygons_list[0])。
    • 是的,我通过将每个元素转换为五个 DF,然后附加它们来做到这一点。但是如果列表有更多元素呢?循环执行此操作更有效,例如从 0 循环到 len(intersection_polygons_list)。同样,我是 Python 循环的新手,我还没有弄清楚如何在循环中执行此操作。
    • 使用 pd.concat() 如果你想要一个大的所有交叉点的 df concat_df = pd.concat(intersection_polygons_list)。
    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多