Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby RGeo两个多面手的联盟将返回零_Ruby_Rgeo - Fatal编程技术网

Ruby RGeo两个多面手的联盟将返回零

Ruby RGeo两个多面手的联盟将返回零,ruby,rgeo,Ruby,Rgeo,我想从两个几何体的并集创建一个新的多边形,但它返回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 可在以下要点中找到重现此错误的Mult

我想从两个几何体的并集创建一个新的多边形,但它返回
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值:

有趣的问题

您有机会拥有多个多边形(总共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
可能有一个有问题的多边形或一对多边形,所以让我们试着找到它们。此代码迭代每个索引并检查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

面积差异不大,可能是由于相交多边形或(非常)小的多边形被删除。

很高兴听到这个消息。你可以写一个bug报告。我认为只有当两个操作数都为零时,并集才能为零。直线、平面多边形或自交多边形可能更难考虑,它们的并集仍然不应为零。
sum = polygons.inject(&:union)
p sum.area - multi_poly_1.area - multi_poly_2.area
#=> -5.800481622797449e-18