【问题标题】:Explanding GeoPandas Multipolygon Dataframe To One Poly Per Line将 GeoPandas 多面体数据框扩展为每行一个多边形
【发布时间】:2020-01-30 01:43:10
【问题描述】:

这个问题与外面的另一个问题相似,但没有一个解决方案对我有用。注意我已经对这些解决方案和结果进行了几次尝试。如果另一个图书馆能做到这一点,我愿意接受。

我正在尝试使用 GeoPandas 扩展一个包含多个多多边形的 GeoJson 文件。

当前地理数据框(3 行)

fill    fill-opacity    stroke  stroke-opacity  stroke-width    title   geometry
0   #9bf1e2 0.3 #9bf1e2 1   1   Hail Possible   (POLYGON ((-80.69500140880155 22.2885709067316...
1   #08c1e6 0.3 #08c1e6 1   1   Severe Hail (POLYGON ((-103.4850007575523 29.2010260633722...
2   #682aba 0.3 #682aba 1   1   Damaging Hail   (POLYGON ((-104.2750007349772 32.2629245180204...`

所需的地理数据框(200 多行)

fill    fill-opacity    stroke  stroke-opacity  stroke-width    title   geometry
0   #9bf1e2 0.3 #9bf1e2 1   1   Hail Possible   (POLYGON ((-80.69500140880155 22.2885709067316...
1   #9bf1e2 0.3 #9bf1e2 1   1   Hail Possible   (POLYGON ((-102.8150007766983 28.2180513479277...
2   #9bf1e2 0.3 #9bf1e2 1   1   Hail Possible   (POLYGON ((-103.4850007575523 29.0940821135748...
3   #9bf1e2 0.3 #9bf1e2 1   1   Hail Possible   (POLYGON ((-103.5650007552662 30.9947420843694...
4   #9bf1e2 0.3 #9bf1e2 1   1   Hail Possible   (POLYGON ((-103.6150007538374 31.0173836504729...

正在使用的geojson文件示例文件:https://drive.google.com/file/d/1m6cMR4jF3QWp07e23sIdb0UF9xLD062s/view?usp=sharing

我尝试过但没有成功:

df3.set_index(['title'])['geometry'].apply(pd.Series).stack().reset_index()

(返回原始未更改的 gdf)

def cartesian(x): 
    return np.vstack(np.array([np.array(np.meshgrid(*i)).T.reshape(-1,7) for i in x.values]))
ndf = pd.DataFrame(cartesian(df3),columns=df3.columns)

(返回原始未更改的 gdf)

import geopandas as gpd
from shapely.geometry.polygon import Polygon
from shapely.geometry.multipolygon import MultiPolygon

def explode(indata):
    indf = gpd.GeoDataFrame.from_file(indata)
    outdf = gpd.GeoDataFrame(columns=indf.columns)
    for idx, row in indf.iterrows():
        if type(row.geometry) == Polygon:
            outdf = outdf.append(row,ignore_index=True)
        if type(row.geometry) == MultiPolygon:
            multdf = gpd.GeoDataFrame(columns=indf.columns)
            recs = len(row.geometry)
            multdf = multdf.append([row]*recs,ignore_index=True)
            for geom in range(recs):
                multdf.loc[geom,'geometry'] = row.geometry[geom]
            outdf = outdf.append(multdf,ignore_index=True)
    return outdf

explode(GEOJSONFILE)

(返回原始未更改的 gdf)

这是我在这里的第一个问题,所以如果需要任何其他信息或详细信息,请告诉我。

更新:发现 explode() 函数的问题是由于文件的格式问题,其中几何本质上是多面的多面,导致只有第一个多面的循环。爆炸功能有效。

【问题讨论】:

    标签: python gis geopandas


    【解决方案1】:

    您可以使用 Geopandas explode()。

    exploded = original_df.explode()
    

    从文档字符串复制:

        Explode muti-part geometries into multiple single geometries.
    
        Each row containing a multi-part geometry will be split into
        multiple rows with single geometries, thereby increasing the vertical
        size of the GeoDataFrame.
        The index of the input geodataframe is no longer unique and is
        replaced with a multi-index (original index with additional level
        indicating the multiple geometries: a new zero-based index for each
        single part geometry per multi-part geometry).
    
        Returns
        -------
        GeoDataFrame
            Exploded geodataframe with each single geometry
            as a separate entry in the geodataframe.
    

    【讨论】:

    • 感谢您的快速回复。我试过这个,但没有用。我开始怀疑这是否可能是数据问题而不是编码问题。
    • @AdamBarrett 你能比“它没用”更具体吗?你没有得到预期的结果,它有什么不同?
    • @joris 代码执行但不会展开每一​​行中的嵌套多边形。地理数据框的原始形状为 (3,7),运行 'exploded = df3.explode() exploded.shape' 后,exploded 的新形状仍为 (3,7)
    • @AdamBarrett 你能再解释一下你想做什么吗?在您的数据中,所有三个 MultiPolygons 只有一个组件,因此如果分解,您将拥有三个多边形(正确)。数据中没有任何内容可以将其分解为 200 行。
    • @Basile 尝试查看溶解功能。我过去用过这个,通过一个共同的属性组合几个多边形。 geopandas.org/aggregation_with_dissolve.html
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2021-08-02
    • 1970-01-01
    • 2022-07-22
    • 2021-04-01
    相关资源
    最近更新 更多