我有一个具有一些属性列和一个几何列(只是一个普通的GeoDataFrame )的geopandas。通常,我使用以下方法将GDF保存为GeoPackage giles (.gpkg):
gdf.to_file('path_to_file.gpkg', driver='GPKG')这很好,除非我的GDF有一个列,其中的条目是数组。假设在几何学列旁边有两个列,其中一个列包含每个条目的numpy数组。如果我试图将其保存为gpkg,则会给出错误:
ValueError: Invalid field type <class 'numpy.ndarray'>因此,似乎gpkg无法处理表中的数组。我想要包含的数组是简单标志(所以值为0和1)。我找到了两个解决办法,它们可以正常工作,但有点混乱:
有谁知道这个问题有更好的解决办法吗?
发布于 2022-02-01 19:46:06
我相信这只是.gpkg格式的一个限制。但是,我认为最好的解决方法是将数组存储为字符串,就像您建议的那样。如果需要使用ast literal_eval(),可以轻松地将它们转换回新闻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])https://stackoverflow.com/questions/70943128
复制相似问题