ValueError: геометрия Shapely не может быть создана из нулевого значения

Я получаю эту ошибку при использовании cascaded_union (я также пробовал unary_union, который выдает ту же ошибку):

ValueError: No Shapely geometry can be created from null value

Я подтвердил, что мои полигоны действительны. Изначально polyB недействителен, но он преобразуется в допустимый многоугольник с помощью buffer(0).

Любая идея о том, что я делаю неправильно? Вот мой код:

from shapely.geometry import Polygon
from shapely.ops import cascaded_union

def combineBorders(a, b):
    polyA = Polygon(a)
    polyB = Polygon(b)
    pols = [polyA, polyB]

    for p in pols:
        if p.is_valid == False:
            p = p.buffer(0)
        print(p.is_valid)
True
True
    newShape = cascaded_union(pols) # THIS IS WHERE THE ERROR KEEPS SHOWING UP
    return newShape

Вот ссылка на значения для polyA, polyB и pols (после подтверждения их правильности) . На моем сервере Ubuntu 14.04 установлены следующие версии:

  • питон-стройный 1.3.0
  • libgeos 3.4.2
  • питон 2.7

person Mark Hebert    schedule 13.07.2015    source источник


Ответы (2)


Проблема в вопросе в том, что буферизованный полигон не был возвращен в список pols, поэтому неверная геометрия была передана в cascaded_union

Вы можете сделать это намного проще и универсальнее с помощью следующего, который может принимать любое количество полигональных геометрий (не только два).

def combineBorders(*geoms):
    return cascaded_union([
        geom if geom.is_valid else geom.buffer(0) for geom in geoms
    ])

polyC = combineBorders(polyA, polyB)
person Mike T    schedule 14.07.2015

Выяснил проблему. Не уверен, почему это имеет значение (я видел примеры, показывающие обе стороны), но это работает после помещения полигонов непосредственно в cascaded_union, например: newShape = cascaded_union([polyA, polyB]). Вот полностью переработанный код, который работает:

from shapely.geometry import Polygon
from shapely.ops import cascaded_union

def combineBorders(a, b):
    polyA = Polygon(a)
    polyB = Polygon(b)
    polyBufA = polyA.buffer(0)
    polyBufB = polyB.buffer(0)
    newShape = cascaded_union([polyBufA, polyBufB])
    return newShape

Это также работает с unary_union

person Mark Hebert    schedule 13.07.2015