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
]
}
}
]
}
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
]
}
}
]
}