GeoPandas 可以接受列表作为 属性 值吗?

Can GeoPandas accept lists as property values?

GeoJSON 特征中的属性可以是列表(或 Javascript 中的“数组”)。例如,以下 GeoJSON 功能的格式正确,并且包含 values 属性 列表:

{
    type: "Feature",
    geometry: {
        type: "Point",
        coordinates: [149.043, -35.227],
    },
    properties: {
        district: "Belconnen",
        values: [0.62, 0.68, 0.74]
    }
}

但是,GeoPandas 似乎无法处理列表属性。如果我尝试将列表直接写入 GeoDataFrame,则会调用值错误:

import geopandas as gpd

# define geodata
gdf = gpd.GeoDataFrame()
gdf["district"] = ["Belconnen", "Gungahlin", "Molonglo"]
gdf["geometry"] = gpd.points_from_xy(
    [149.042, 149.131, 149.047],
    [-35.227, -35.179, -35.295]
)

# attempt to write a list into GeoDataFrame cell
gdf.at["Belconnen", "values"] = [0.62, 0.68, 0.74]

这会产生以下错误:

ValueError: Must have equal len keys and value when setting with an iterable

我尝试了另一种方法来解决这个问题:我将 Pandas Dataframe( 允许列表列转换为 GeoDataFrame,然后添加 geometry列后面。

import pandas as pd, geopandas as gpd

# define dataframe
df = pd.DataFrame()
df["district"] = ["Belconnen", "Gungahlin", "Molonglo"]
df["values"] = [
    [0.62, 0.68, 0.74],
    [0.55, 0.61, 0.67],
    [0.59, 0.66, 0.73]
]

# convert to geodataframe
gdf = gpd.GeoDataFrame(df)
gdf["geometry"] = gpd.points_from_xy(
    [149.042, 149.131, 149.047],
    [-35.227, -35.179, -35.295]
)

这似乎有效...

...直到我尝试将 GeoDataFrame 写入文件:

gdf.to_file("gdf.geojson", driver="GeoJSON")

这产生了以下错误:

ValueError: Invalid field type <class 'list'>

我可以让 GeoPandas 处理列表的列吗?

您的错误代码表明您没有保存数据框...

ValueError: Invalid field type <class 'list'>

您似乎将数据从地理框架中取出并合并到您的列表中。如果您喜欢第二种方法,请保存您的其他信息...

| 0 | Belconnen | [0.62, 0.68, 0.74] 
| 1 | Gungahlin | [0.55, 0.61, 0.67]
| 2 | Molonglo | [0.59, 0.66, 0.73]

回到您的地理数据框,然后保存到文件的地理数据框应该可以工作,因为您将保存地理框而不是列表。

GeoPandas 使用 fiona 来处理 read_file 中的大部分内容,在这种情况下 fiona 似乎无法处理列表。

但是 GeoPandas 也可以自己生成 JSON,似乎在那种情况下,它可以正常工作。

使用从 pandas:

制作的第二个 gdf
>>> print(gdf.to_json(indent=4))
{
    "type": "FeatureCollection",
    "features": [
        {
            "id": "0",
            "type": "Feature",
            "properties": {
                "district": "Belconnen",
                "values": [
                    0.62,
                    0.68,
                    0.74
                ]
            },
            "geometry": {
                "type": "Point",
                "coordinates": [
                    149.042,
                    -35.227
                ]
            }
        },
        {
            "id": "1",
            "type": "Feature",
            "properties": {
                "district": "Gungahlin",
                "values": [
                    0.55,
                    0.61,
                    0.67
                ]
            },
            "geometry": {
                "type": "Point",
                "coordinates": [
                    149.131,
                    -35.179
                ]
            }
        },
        {
            "id": "2",
            "type": "Feature",
            "properties": {
                "district": "Molonglo",
                "values": [
                    0.59,
                    0.66,
                    0.73
                ]
            },
            "geometry": {
                "type": "Point",
                "coordinates": [
                    149.047,
                    -35.295
                ]
            }
        }
    ]
}