ValueError: No Shapely geometry can be created from null value

ValueError: No Shapely geometry can be created from null value

我在使用 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

Here is a link 到 polyA、polyB 和 pols 的值(在确认它们有效之后)。我的 Ubuntu 14.04 服务器上安装了以下版本:

找到问题了。不知道为什么这很重要(我已经看到了两种方式的示例),但是在将多边形直接放入 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

题目中的问题是缓冲的多边形没有放回列表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)