如何将具有许多几何列(多边形、点和线串)的 GeoDataFrame 保存到 geojson 文件(或 csv 文件)?

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

我正在尝试使用

df.to_file('result.geojson', driver="GeoJSON")
将以下包含列(几何、面积、质心和边界)的 GeoDataFrame 保存到 json 文件:

geodataframe

但是,我收到以下错误,因为我有质心和边界列。

TypeError: Cannot interpret '<geopandas.array.GeometryDtype object at 0x7fb7fff86940>'
作为数据类型。 当只有几何列和面积列时,这非常有效。

此外,当我尝试将其保存为 csv 文件,然后将其读回为 geopandas 文件时,我只能将几何图形转换为数据类型几何图形。但是,质心和边界显示为对象数据类型。如何将它们转换为几何数据类型?

python geopandas
1个回答
0
投票
  • 根据评论,geopandasgeojson每个功能仅支持一种几何图形
  • 因此您的数据框是多边形作为几何图形,其他列是一系列对象(shapely对象)
  • 有模拟数据集。这清楚地表明您的数据结构没有标准化。 边界、质心面积是计算列。因此在关系理论中没有标准化
  • 这可以保存为 CSV shapely 对象将被编码为 WKT
  • 然后可以简单地加载它,第二步将 WKT 解码回 shapely 对象
  • 通过绘制从 CSV 加载的几何图形来演示这项工作
import geopandas as gpd
import pandas as pd
import shapely.geometry
from pathlib import Path

gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))

# derive columns in question...
gdf["boundary"] = gdf["geometry"].apply(lambda p: p.boundary )
gdf["centroid"] = gdf["geometry"].apply(lambda p: p.centroid )
gdf["area"] = gdf["geometry"].apply(lambda p: p.area )

# save as CSV shapely.wkt.dumps will be implicitly used
gdf.to_csv(Path.cwd().joinpath("SO_geom.csv"), index=False)

# load encoded dataframe
df = pd.read_csv(Path.cwd().joinpath("SO_geom.csv"))
# decode geometry columns as strings back into shapely objects
for c in ["geometry","boundary","centroid"]:
    df[c] = df[c].apply(shapely.wkt.loads)

# finally reconstruct geodataframe
gdf = gpd.GeoDataFrame(df)
# show it has worked
gdf.plot()
gpd.GeoSeries(gdf["boundary"]).plot()
gpd.GeoSeries(gdf["centroid"]).plot()

© www.soinside.com 2019 - 2024. All rights reserved.