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.
genialna odpowiedź! To zadziałało :) – babasbot
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. –
Utworzyłem ten problem https://github.com/rgeo/rgeo/issues/158 – babasbot