AttributeError:“ GeoSeries”对象没有属性“ _geom”

时间:2018-09-01 19:35:27

标签: python gis shapely geopandas

在使用shapely的unary_union合并两个区域时遇到奇怪的错误。

完整版本:1.6.4.post2

Python 3.5

数据

多边形(并排)

我想添加Gujranwala 1和Gujranwala 2使其成为一个多边形。

代码

from shapely.ops import unary_union
polygons = [dfff['geometry'][1:2], dfff['geometry'][2:3]]
boundary = unary_union(polygons)

输出

    ---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-41-ee1f09532724> in <module>()
      1 from shapely.ops import unary_union
      2 polygons = [dfff['geometry'][1:2], dfff['geometry'][2:3]]
----> 3 boundary = unary_union(polygons)

~/.local/lib/python3.5/site-packages/shapely/ops.py in unary_union(self, geoms)
    145         subs = (c_void_p * L)()
    146         for i, g in enumerate(geoms):
--> 147             subs[i] = g._geom
    148         collection = lgeos.GEOSGeom_createCollection(6, subs, L)
    149         return geom_factory(lgeos.methods['unary_union'](collection))

~/.local/lib/python3.5/site-packages/pandas/core/generic.py in __getattr__(self, name)
   4374             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   4375                 return self[name]
-> 4376             return object.__getattribute__(self, name)
   4377 
   4378     def __setattr__(self, name, value):

AttributeError: 'GeoSeries' object has no attribute '_geom'

1 个答案:

答案 0 :(得分:2)

您尝试创建一元联合会的方式将两种工作方式之间的差异分开。您尝试选择两个多边形(dfff["geometry"][1:2]dfff["geometry"][2:3])的方式实际上返回一对GeoSeries(其中包含shapely几何序列),因此您正在传递unary_union的{​​{1}}列表,而GeoSeries中的unary_union函数期望的是shapely几何列表。您可以这样做:

shapely

也就是说,polygons = [dfff.iloc[1, "geometry"], dfff.iloc[2, "geometry"]] boundary = unary_union(polygons) 提供了自己的GeoSeries方法,该方法仅调用unary_union,但对shapely.ops.unary_union对象进行了调用。因此,更容易获得一元联盟的方法是:

GeoSeries

这也更容易扩展到更长的多边形列表。