2016-12-30 8 views

答えて

2

興味深い問題:このエラーを再現する

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 

面積の差は大きくはありません交差しているポリゴンや、削除された小さなポリゴンから来る可能性があります。

+0

鮮明な回答!それは働いた:) – babasbot

+0

それを聞いてうれしい。あなたはバグレポートを書くことができます。私は両方のオペランドがゼロである場合にのみ、組合はゼロになることができると思います。線、フラットポリゴン、または自己交差ポリゴンは、考慮に入れるのが難しいかもしれませんが、その組合は依然としてゼロであってはなりません。 –

+0

私はこの問題をhttps://github.com/rgeo/rgeo/issues/158で作成しました – babasbot