繁体   English   中英

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

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

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

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

这很好用,除非我的 GDF 有一列条目是 arrays。 假设我在几何列旁边有两列,其中一列包含每个条目的 numpy 数组。 如果我然后尝试另存为 gpkg 它会给我错误:

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

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

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

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

我相信这只是 .gpkg 格式的一个限制。 但是,我认为最好的解决方法是将 arrays 存储为字符串,就像您建议的那样。 如果您需要使用 ast literal_eval(),您可以轻松地将它们转换回新闻 gdf 中的 arrays。

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 arrays。

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

array([0, 1, 2])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM