2つのジオメトリの和集合から新しいMultiPolygonを作成したいが、それはnil
を返す。RGeo 2つのMultyPolygonsの和集合がnilを返す
https://gist.github.com/babasbot/926ae326ff3eb4a79601d56288e82a5f
2つのジオメトリの和集合から新しいMultiPolygonを作成したいが、それはnil
を返す。RGeo 2つのMultyPolygonsの和集合がnilを返す
https://gist.github.com/babasbot/926ae326ff3eb4a79601d56288e82a5f
興味深い問題:このエラーを再現する
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
マルチポリゴンの値は、次の主旨で見つけることができます。
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
ありポリゴンの問題のポリゴンやペアも、それでは、それらを見つけるために試してみましょうかもしれません:
あなたは多くのポリゴン(全部で34)を持ってする機会を持っている、それが簡単にデバッグすることができます。労働組合がnilであれば、インデックスやチェックのすべてのcombination以上このコードを反復は:
(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
面積の差は大きくはありません交差しているポリゴンや、削除された小さなポリゴンから来る可能性があります。
鮮明な回答!それは働いた:) – babasbot
それを聞いてうれしい。あなたはバグレポートを書くことができます。私は両方のオペランドがゼロである場合にのみ、組合はゼロになることができると思います。線、フラットポリゴン、または自己交差ポリゴンは、考慮に入れるのが難しいかもしれませんが、その組合は依然としてゼロであってはなりません。 –
私はこの問題をhttps://github.com/rgeo/rgeo/issues/158で作成しました – babasbot