Python ValueError:无法从空值创建任何形状几何体

Python ValueError:无法从空值创建任何形状几何体,python,shapely,Python,Shapely,我在使用cascaded\u union时出现此错误(我还尝试了uniary\u union,这会产生相同的错误): ValueError:无法从空值创建任何形状几何体 我已验证我的多边形是否有效。最初,polyB无效,但使用buffer(0)将其转换为有效多边形 知道我做错了什么吗?这是我的密码: from shapely.geometry import Polygon from shapely.ops import cascaded_union def combineBorders(a,

我在使用
cascaded\u union
时出现此错误(我还尝试了
uniary\u union
,这会产生相同的错误):

ValueError:无法从空值创建任何形状几何体
我已验证我的多边形是否有效。最初,
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
真的
polyA、polyB和pols的值(确认有效后)。我的Ubuntu 14.04服务器上安装了以下版本:

  • python shapely 1.3.0
  • libgeos 3.4.2
  • python 2.7

    • 发现了问题。不知道为什么这很重要(我已经看到了两种方式的例子),但它在将多边形直接放入级联的联合体后起作用,就像这样:
      newShape=cascaded的联合体([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
      

      这也适用于
      一元联合

      问题在于缓冲多边形没有放回列表
      pols
      ,因此无效几何体被传递到
      级联联合

      您可以通过以下操作使其更简单、更通用,这些操作可以采用任意数量的多边形几何体(而不仅仅是两个)

      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
      
      def combineBorders(*geoms):
          return cascaded_union([
              geom if geom.is_valid else geom.buffer(0) for geom in geoms
          ])
      
      polyC = combineBorders(polyA, polyB)