2016-12-30 18 views
5

Chcę utworzyć nowy MultiPolygon z połączenia dwóch geometrii, ale zwraca nil.RGeo Połączenie dwóch MultyPolygons powraca zero

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 

Wartości MultiPolygons odtworzyć tego błędu można znaleźć pod następującym GIST:

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

MultiPolygon "A" Map

MultiPolygon "B" Map

Odpowiedz

2

ciekawy problem.

Masz szansę na wiele wielokątów (34 w sumie), to sprawia, że ​​łatwiej debug:

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 

Nie może być problematyczne wielokąt lub parę wielokątów, więc spróbujmy je znaleźć. Ten kod iteracje nad każdym combination indeksów i sprawdza, czy Unia jest zerowa:

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

zwraca

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

1 jest niepusty wielokąt, 11 i 12 wyglądają jak linie.

Utrzymanie 1 i usunięcie 11 i 12 to za mało: połączenie wszystkich wielokątów jest wciąż zerowe.

Nie może nadal być linie lub bardzo płaskie wielokąty:

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

Teraz 9 wielokątów zostaną usunięte, to można obliczyć UNION:

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

Różnica w strefie nie jest duża i może pochodzić z przecinających się wielokątów lub (bardzo) małych wielokątów, które zostały usunięte.

+0

genialna odpowiedź! To zadziałało :) – babasbot

+0

Miło to usłyszeć. Możesz napisać raport o błędzie. Myślę, że związek może być zerowy, jeśli oba operandy są zerowe. Linie, płaskie wielokąty lub wieloboki samobrzmiące mogą być trudniejsze do wzięcia pod uwagę, ich związek wciąż nie powinien być zerowy. –

+0

Utworzyłem ten problem https://github.com/rgeo/rgeo/issues/158 – babasbot