2016-12-30 7 views
5

두 형상의 합집합에서 새 MultiPolygon을 만들고 싶지만 nil을 반환합니다. 이 오류를 재현RGeo 두 개의 MultyPolygons의 결합이 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 

다중 다각형 값은 다음의 요지에서 찾을 수있다 :

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

MultiPolygon "A" Map

MultiPolygon "B" Map

답변

2

흥미 문제.

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 선을 추천 모습이 아닌 빈 다각형이다.

1을 유지하고 11과 12를 제거하는 것으로는 충분하지 않습니다. 모든 다각형의 결합은 여전히 ​​없습니다.

여전히 선 또는 매우 평평 다각형이있을 수 있습니다 :

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

이 영역의 차이가 큰되지 않습니다 : 이제 9 다각형이 사라 것을

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

, 그것은 노동 조합을 계산하는 것이 가능 , 삭제 된 교차 폴리곤 또는 (아주) 작은 폴리곤에서 나올 수 있습니다.

+0

화려한 답변! 그것은 일했다 :) – babasbot

+0

그것을 듣기 좋게. 버그 보고서를 작성할 수 있습니다. 두 피연산자 모두 nil 경우 유니온 경우에만 nil 수 있습니다 생각합니다. 선, 편평한 다각형 또는 자체 교차 다각형은 고려하기가 어려울 수 있지만 조합은 여전히 ​​유효하지 않습니다. –

+0

이 문제는 https://github.com/rgeo/rgeo/issues/158에서 만들었습니다. – babasbot