AttributeError: у объекта 'GeoSeries' нет атрибута '_geom' - PullRequest
0 голосов
/ 01 сентября 2018

Получение этой странной ошибки при объединении двух областей с использованием shapely unary_union.

Shapely версия: 1.6.4.post2

Python 3,5

Данные

image

Полигоны (рядом)

image

Я хочу добавить Гуджранвалу 1 и Гуджранвалу 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 голосов
/ 02 сентября 2018

Ваша попытка создать унарный союз разделяет разницу между двумя способами, которые работают. То, как вы пытались выбрать два полигона (dfff["geometry"][1:2] и dfff["geometry"][2:3]), на самом деле возвращает пару GeoSeries (которая содержит некоторую последовательность shapely геометрий), поэтому вы передаете unary_union список 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 объектами. Так что более простой способ получить унарный союз:

boundary = dfff["geometry"][1:3].unary_union

Это также гораздо проще распространяется на более длинный список полигонов.

...