将记录为对象的多边形转换为形状多边形给出 '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