PostGIS 지오메트리 주위에 버퍼를 추가하는 방법을 찾고 있지만 버퍼 크기는 지오메트리 크기에 따라 달라집니다. 즉, 각 지오메트리를 5 % 확대하기를 원합니다.
아이디어는 교차하는 기하학을 찾고 있지만, 내가 고려하고자하는 각각과 관련하여 최대 5 %의 오류가있을 수 있습니다.
누구든지 이것에 대해 가장 좋은 방법을 알고 있습니까?
데이터베이스에는 백만 개의 행이 있으므로 상당히 빠른 것이 좋습니다.
PostGIS 지오메트리 주위에 버퍼를 추가하는 방법을 찾고 있지만 버퍼 크기는 지오메트리 크기에 따라 달라집니다. 즉, 각 지오메트리를 5 % 확대하기를 원합니다.
아이디어는 교차하는 기하학을 찾고 있지만, 내가 고려하고자하는 각각과 관련하여 최대 5 %의 오류가있을 수 있습니다.
누구든지 이것에 대해 가장 좋은 방법을 알고 있습니까?
데이터베이스에는 백만 개의 행이 있으므로 상당히 빠른 것이 좋습니다.
답변:
의견에 따르면 5 %를 높은 정확도로 달성 할 필요는 없습니다. (만약 그렇다면, 그것은 걸릴 것입니다 오랜 만 폴리곤을 버퍼링하는 시간!) 우리는 따라서 호출 할 수 피자 원리 : 선형 요소에 의해 2 차원 기능을 재조정 하여 영역 크기를 조정합니다 ^ 2.
추론은 다음과 같습니다.
모양이 너무 얽 히지 않는 경우 (특히 볼록한 경우) 버퍼링은 중심점을 기준으로 모양의 크기를 조정하는 것과 비슷한 결과를 생성합니다. (버퍼링은 디스크 이외의 다른 모양에 대한 크기 조정과 동일 하지 않다는 것을 이해하는 것이 중요합니다 . 일부 오목한 모양의 경우, 크기 조정을 통해 계산 된 "버퍼"에는 실제로 원래 모양의 일부가 포함되지 않을 수 있습니다! 우리 는 모양의 진짜 버퍼를 계산할 것이지만,이 대략적인 동등성을 휴리스틱으로 만 사용하여 버퍼링 정도 를 추정 합니다 .)
버퍼링 된 영역이 5 % 더 커지면 크기 조정의 양은 sqrt (1 + 5/100) 여야하며 1.025에 가깝습니다. 즉, 모든 방향에서 모양을 2.5 % 확장해야합니다. .
마찬가지로 모양이 "직경"(일반적인 거리와 같음)을 갖는 것으로 생각하면 반경 이 2.5 % 증가해야합니다. 이는 지름의 2.5 % / 2 = 1.25 %입니다.
모양의 경계 상자에서 일반적인 직경을 추정 할 수 있습니다. 예를 들어, 상자 측면 길이의 산술 또는 기하 평균을 사용하십시오.
이는 다음과 같은 워크 플로우를 제안합니다.
도형의 경계 상자를 얻습니다.
e를 상자의 측면 길이의 평균 이라고합시다 .
e의 1.25 %만큼 형태를 완충 ; 즉, (5/100) / 4 * e 입니다.
1 단계와 2 단계는 계산이 거의 필요하지 않으므로 가장 빠른 솔루션 중 하나로 제공됩니다. 정확성을 확인하면서 버퍼링 된 모양의 영역을 계산하고 원래 영역과 비교하여 원하는 5 % 증가 정도를 확인할 수 있습니다. 때로는 버퍼링 된 영역이 5 % 이상 커지지 만,이 영역이 더 적다는 것은 드문 일이며 드물게는 불가능합니다.
점검과 삽화로서 간단한 모양을 생각해 봅시다.
반경 r 의 디스크는 길이가 2 r 인 변을 가진 경계 상자를 가지고 있습니다 . 우리의 공식은 e = (5/100) / 4 * 2 * r = r / 40을 계산합니다. 버퍼링 된 모양은 반경 r + r / 40 = 1.025 r 의 동심원 입니다. 이전 영역은 pi * r ^ 2 였고 새 영역은 pi * (1.025 r ) ^ 2 = pi * 1.0506 * r ^ 2로 5.06 % 더 큽니다.
길이 r 과 s의 좌표축에 평행 한 변을 가진 사각형 은 e = ( r + s ) / 2를 제공합니다. 사각형 버퍼링의 추가 영역 은 측면에 경계를 이루는 너비 (5/100) / 4 e = e / 80 = ( r + s ) / 160 의 네 사각형 에서 모서리 에 반경 e / 80 의 네 개의 1/4 원 이 있습니다. 다른 영역에 비해 작을 쿼터 서클을 무시하면 총 새로운 영역은
2 ( r + s ) * ( r + s ) / 160 = ( r ^ 2 + s ^ 2 + 2 r * s ) / 80.
때 R 과 S는 너무 다르지 않다, 우리는 알 수 있습니다 R ^ 2 개 + S ^ 2 개 약 2 r은 * 들 . 이 근사값 은 의도 한대로 전체 새 영역을 원래의 r * s 영역의 4 r * s / 80 = 5 %로 단순화합니다 .
ST_Scale ( http://postgis.net/docs/ST_Scale.html )과 ST_Translate ( http://postgis.net/docs/ST_Translate.html ) 의 조합을 사용하고 싶습니다 . PostGIS의 실제 사례와 8 장의 유사한 사례가 있습니다. 책이없는 경우 여기에서 해당 장의 코드를 다운로드 할 수 있습니다.
http://www.postgis.us/chapter_08
책의 스 니펫 예제 8.26을보십시오.
-- Listing 8.26 Combining Scale and Translation to maintain centroid
SELECT xfactor, yfactor,
ST_Translate(ST_Scale(hex.the_geom, xfactor, yfactor),
ST_X(ST_Centroid(the_geom))*(1 - xfactor),
ST_Y(ST_Centroid(the_geom))*(1 - yfactor) ) As scaled_geometry
FROM
( SELECT ST_GeomFromText('POLYGON((0 0,64 64,64 128,0 192,-64 128,-64 64,0 0))') As the_geom) As hex
CROSS JOIN (SELECT x*0.5 As xfactor
FROM generate_series(1,4) As x) As xf
CROSS JOIN (SELECT y*0.5 As yfactor
FROM generate_series(1,4) As y) As yf;
ST_Transscale
어떻게 든 그 일을하는 방법을 알 수 없습니다 ...