将记录为对象的多边形转换为形状多边形给出 'str' object has no attribute '__array_interface__'
convert polygon recorded as object to shapely polygon gives 'str' object has no attribute '__array_interface__'
最初,我有 2 个数据集。一个是在 Excel 中定义了 45 个多边形的数据集,另一个是点的几何坐标。我需要知道每个几何点位于 45 个多边形中的哪个。
对于包含多边形的文件,我有一个将 POLYGON(......) 记录为对象的 csv 文件。我想稍后检查多边形是否包含有形状的点。我认为它已经是多边形类型,但是当我从 csv 导入它时,它只是作为一个字符串导入。我试图将此数据转换为 Polygon()
df 中的每个 raw 看起来都很像(故意缩短)
POLYGON ((37.667289733886719 55.700740814208984,37.670955657958984 55.70050048828125)
按照建议,我还打印了该数据集的前 5 个原始数据:
print(io.head(5))
WKT IO_ID Unnamed: 2
0 POLYGON ((37.667289733886719 55.70074081420898... 28 NaN
1 POLYGON ((37.671272277832031 55.62009048461914... 29 NaN
2 POLYGON ((37.713523864746094 55.77525711059570... 24 NaN
3 POLYGON ((37.700267791748047 55.72071075439453... 25 NaN
4 POLYGON ((37.783447265625 55.648544311523438,3... 26 NaN
如果我检查带有多边形的列的数据类型 - 它是一种对象格式
df.dtype
WKT object
IO_ID int64
Unnamed: 2 float64
dtype: object
for polygon in df.WKT:
polygon = Polygon(polygon)
它给我错误:'str' object has no attribute 'array_interface'
我不明白为什么会发生这种情况以及可以做什么(我承认我对地理数据完全陌生)。我的理解是我需要多边形格式的数据而不是对象格式,但不知何故我无法将其更改为它。
要使用 geopandas 的空间特征,您的形状必须是几何类型,而不是字符串。您可以使用 dtype
属性查看对象的类型 - 您应该看到如下内容:
In [6]: df.geometry.dtype
Out[6]: <geopandas.array.GeometryDtype at 0x17a0934c0>
如果输出显示类似 dtype('O')
的内容,那么您只有字符串并且需要将它们转换为 GeometryArray。
看起来你的形状在 "well known text" (aka wkt) format. You can convert a wkt column to a geometry column with geopandas.GeoSeries.from_wkt
:
# replace string geometry representations with shapely geometries
df['geometry'] = gpd.GeoSeries.from_wkt(df['WKT'])
# initialize GeoDataFrame with the result
# ('geometry' is the default geometry column name)
gdf = gpd.GeoDataFrame(df)
此时,您的 GeoDataFrame gdf 应该具有 geopandas 的所有空间特征,并且可以用于连接到点的 GeometryArray,例如使用 geopandas.sjoin
. Note that a regular DataFrame of points will need to first be converted into a GeoDataFrame using geopandas.points_from_xy
- see e.g. this question。
最初,我有 2 个数据集。一个是在 Excel 中定义了 45 个多边形的数据集,另一个是点的几何坐标。我需要知道每个几何点位于 45 个多边形中的哪个。
对于包含多边形的文件,我有一个将 POLYGON(......) 记录为对象的 csv 文件。我想稍后检查多边形是否包含有形状的点。我认为它已经是多边形类型,但是当我从 csv 导入它时,它只是作为一个字符串导入。我试图将此数据转换为 Polygon()
df 中的每个 raw 看起来都很像(故意缩短)
POLYGON ((37.667289733886719 55.700740814208984,37.670955657958984 55.70050048828125)
按照建议,我还打印了该数据集的前 5 个原始数据:
print(io.head(5))
WKT IO_ID Unnamed: 2
0 POLYGON ((37.667289733886719 55.70074081420898... 28 NaN
1 POLYGON ((37.671272277832031 55.62009048461914... 29 NaN
2 POLYGON ((37.713523864746094 55.77525711059570... 24 NaN
3 POLYGON ((37.700267791748047 55.72071075439453... 25 NaN
4 POLYGON ((37.783447265625 55.648544311523438,3... 26 NaN
如果我检查带有多边形的列的数据类型 - 它是一种对象格式
df.dtype
WKT object
IO_ID int64
Unnamed: 2 float64
dtype: object
for polygon in df.WKT:
polygon = Polygon(polygon)
它给我错误:'str' object has no attribute 'array_interface'
我不明白为什么会发生这种情况以及可以做什么(我承认我对地理数据完全陌生)。我的理解是我需要多边形格式的数据而不是对象格式,但不知何故我无法将其更改为它。
要使用 geopandas 的空间特征,您的形状必须是几何类型,而不是字符串。您可以使用 dtype
属性查看对象的类型 - 您应该看到如下内容:
In [6]: df.geometry.dtype
Out[6]: <geopandas.array.GeometryDtype at 0x17a0934c0>
如果输出显示类似 dtype('O')
的内容,那么您只有字符串并且需要将它们转换为 GeometryArray。
看起来你的形状在 "well known text" (aka wkt) format. You can convert a wkt column to a geometry column with geopandas.GeoSeries.from_wkt
:
# replace string geometry representations with shapely geometries
df['geometry'] = gpd.GeoSeries.from_wkt(df['WKT'])
# initialize GeoDataFrame with the result
# ('geometry' is the default geometry column name)
gdf = gpd.GeoDataFrame(df)
此时,您的 GeoDataFrame gdf 应该具有 geopandas 的所有空间特征,并且可以用于连接到点的 GeometryArray,例如使用 geopandas.sjoin
. Note that a regular DataFrame of points will need to first be converted into a GeoDataFrame using geopandas.points_from_xy
- see e.g. this question。