RGeo 两个 MultyPolygons 的并集返回 nil
RGeo The union of two MultyPolygons is returning nil
我想从两个几何体的并集创建一个新的多边形,但是 returns 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
有趣的问题。
你有机会拥有很多多边形(总共 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
它returns
# [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
面积差异不大,可能来自相交的多边形或已删除的(非常)小的多边形。
我想从两个几何体的并集创建一个新的多边形,但是 returns 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
有趣的问题。
你有机会拥有很多多边形(总共 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
它returns
# [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
面积差异不大,可能来自相交的多边形或已删除的(非常)小的多边形。