RGeo两个MultyPolygons的并集返回nil

时间:2016-12-30 19:29:03

标签: ruby rgeo

我想从两个几何的并集创建一个新的MultiPolygon,但它返回nil

multipolygon_1 = RGeo::Geos.factory(srid: 4326).parse_wkt("MULTIPOLYGON ...")
multipolygon_2 = RGeo::Geos.factory(srid: 4326).parse_wkt("MULTIPOLYGON ...")

multipolygon_1 + multipolygon_2 # => nil

可以在以下要点中找到重现此错误的MultiPolygons值:

https://gist.github.com/babasbot/926ae326ff3eb4a79601d56288e82a5f

MultiPolygon "A" Map

MultiPolygon "B" Map

1 个答案:

答案 0 :(得分:3)

有趣的问题。

您有机会拥有多个多边形(总共34个),这样可以更容易调试:

multi_poly_1 = RGeo::Geos.factory(srid: 4326).parse_wkt(wkt_1)
multi_poly_2 = RGeo::Geos.factory(srid: 4326).parse_wkt(wkt_2)

polygons = multi_poly_1.each.to_a + multi_poly_2.each.to_a

可能存在有问题的多边形或多边形对,所以让我们尝试找到它们。此代码遍历每个combination索引,并检查union是否为nil:

(0...polygons.size).to_a.combination(2).each do |i1, i2|
  if polygons[i1] + polygons[i2] == nil then
    p [i1, i2]
  end
end

返回

# [1, 11]
# [1, 12]

1是非空多边形,11和12看起来像线。

保持1并删除11和12是不够的:所有多边形的并集仍为零。

可能仍有线条或非常扁平的多边形:

polygons.reject!{|poly| poly.area < 1E-20}
p polygons.size
# 25

现在9个多边形消失了,可以计算联合:

sum = polygons.inject(&:union)
p sum.area - multi_poly_1.area - multi_poly_2.area
#=> -5.800481622797449e-18

区域的差异并不大,可能来自相交的多边形或已删除的(非常)小多边形。