我可以将包含数组的 GeoDataFrame 保存到 GeoPackage 文件吗?

Can I save a GeoDataFrame that contains an array to a GeoPackage file?

我有一个带有一些属性列和一个几何列的 geopandas GeoDataFrame(只是一个常规的 GDF)。通常我使用以下方法将 GDF 保存为 GeoPackage giles (.gpkg):

gdf.to_file('path_to_file.gpkg', driver='GPKG')

这很好用,除非我的 GDF 有一列的条目是数组。所以说我在几何列旁边有两列,其中一列包含每个条目的 numpy 数组。如果我随后尝试另存为 gpkg,则会出现错误:

ValueError: Invalid field type <class 'numpy.ndarray'>

所以 gpkg 似乎无法处理 table 中的数组。我想要包含的数组是简单的标志(因此值为 0 和 1)。我发现了两个工作正常但有点混乱的解决方法:

  1. 创建一个数组值的字符串。这行得通,但我更愿意将其保留为数组...
  2. 为每个数组值创建一个单独的列。这也可行,但后来我得到了一个包含很多列的 GDF,我觉得应该有更好的方法来做到这一点。

有人知道解决此问题的更好方法吗?

我相信这只是 .gpkg 格式的限制。但是,我认为最好的解决方法是将数组存储为字符串,就像您建议的那样。如果需要,可以使用 ast literal_eval().

轻松地将它们转换回 news gdf ​​中的数组
import pandas as pd
import numpy as np
import geopandas as gpd
from shapely.geometry import LineString, Point
from ast import literal_eval

gdf = gpd.GeoDataFrame({'id': [1, 2, 3], 'array_col': [np.array([0,1,2]), np.array([0,1,2]), np.array([0,1,2])]},
                       geometry=[LineString([(1, 1), (4, 4)]),
                                 LineString([(1, 4), (4, 1)]),
                                LineString([(6, 1), (6, 6)])])

gdf['array_col'] = gdf['array_col'].apply(lambda x: str(x))

gdf.to_file('path_to_file.gpkg', driver='GPKG')

gpkg = gpd.read_file('path_to_file.gpkg')

gpkg['array_col'] = gpkg['array_col'].apply(lambda x: np.array(literal_eval(x.replace(' ', ','))))

在此之后,我们可以再次访问我们的 np 数组。

print(gpkg['array_col'][0])

array([0, 1, 2])