将GeoPandas多面数据框展开为每行一个多边形

问题描述 投票:0回答:1

这个问题类似于那里的另一个问题,但是没有一个解决方案对我有用。注意我已经尝试了这些解决方案和结果。如果另一个图书馆可以做到这一点,我愿意接受。

我正在尝试使用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)

这是我的第一个问题,因此,如果需要其他信息或详细信息,请告诉我。

python gis geopandas
1个回答
0
投票

您可以使用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.
© www.soinside.com 2019 - 2024. All rights reserved.