백분율로 PostGIS 지오메트리 증가


10

PostGIS 지오메트리 주위에 버퍼를 추가하는 방법을 찾고 있지만 버퍼 크기는 지오메트리 크기에 따라 달라집니다. 즉, 각 지오메트리를 5 % 확대하기를 원합니다.

아이디어는 교차하는 기하학을 찾고 있지만, 내가 고려하고자하는 각각과 관련하여 최대 5 %의 오류가있을 수 있습니다.

누구든지 이것에 대해 가장 좋은 방법을 알고 있습니까?

데이터베이스에는 백만 개의 행이 있으므로 상당히 빠른 것이 좋습니다.


2
무엇의 5 %? 다각형을 사용한다고 가정하면 가장 큰 너비, 가장 좁은 너비, 경계 상자, 중심으로부터 정점의 거리의 5 %입니까? 점이나 선에 대해 이야기하고 있다면 말이 안됩니다!
MerseyViking

나는 정점 중심 거리를 생각합니다-또는 아마도 면적의 5 % 증가도 괜찮을 것입니다. 지오메트리의 크기가 조정되어 해당 경계 상자를 채우는 경우 경계 상자를 늘리는 것이 좋습니다. 모든 지오메트리는 닫힌 다각형 (대부분 사변형)입니다.
제임스 베이커

답변:


8

의견에 따르면 5 %를 높은 정확도로 달성 할 필요는 없습니다. (만약 그렇다면, 그것은 걸릴 것입니다 오랜 만 폴리곤을 버퍼링하는 시간!) 우리는 따라서 호출 할 수 피자 원리 : 선형 요소에 의해 2 차원 기능을 재조정 하여 영역 크기를 조정합니다 ^ 2.

추론은 다음과 같습니다.

  • 모양이 너무 얽 히지 않는 경우 (특히 볼록한 경우) 버퍼링은 중심점을 기준으로 모양의 크기를 조정하는 것과 비슷한 결과를 생성합니다. (버퍼링은 디스크 이외의 다른 모양에 대한 크기 조정과 동일 하지 않다는 것을 이해하는 것이 중요합니다 . 일부 오목한 모양의 경우, 크기 조정을 통해 계산 된 "버퍼"에는 실제로 원래 모양의 일부가 포함되지 않을 수 있습니다! 우리 모양의 진짜 버퍼를 계산할 것이지만,이 대략적인 동등성을 휴리스틱으로 만 사용하여 버퍼링 정도 를 추정 합니다 .)

  • 버퍼링 된 영역이 5 % 더 커지면 크기 조정의 양은 sqrt (1 + 5/100) 여야하며 1.025에 가깝습니다. 즉, 모든 방향에서 모양을 2.5 % 확장해야합니다. .

  • 마찬가지로 모양이 "직경"(일반적인 거리와 같음)을 갖는 것으로 생각하면 반경 이 2.5 % 증가해야합니다. 이는 지름의 2.5 % / 2 = 1.25 %입니다.

  • 모양의 경계 상자에서 일반적인 직경을 추정 할 수 있습니다. 예를 들어, 상자 측면 길이의 산술 또는 기하 평균을 사용하십시오.

이는 다음과 같은 워크 플로우를 제안합니다.

  1. 도형의 경계 상자를 얻습니다.

  2. e를 상자의 측면 길이의 평균 이라고합시다 .

  3. e의 1.25 %만큼 형태를 완충 ; 즉, (5/100) / 4 * e 입니다.

1 단계와 2 단계는 계산이 거의 필요하지 않으므로 가장 빠른 솔루션 중 하나로 제공됩니다. 정확성을 확인하면서 버퍼링 된 모양의 영역을 계산하고 원래 영역과 비교하여 원하는 5 % 증가 정도를 확인할 수 있습니다. 때로는 버퍼링 된 영역이 5 % 이상 커지지 만,이 영역이 더 적다는 것은 드문 일이며 드물게는 불가능합니다.

점검과 삽화로서 간단한 모양을 생각해 봅시다.

  1. 반경 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 % 더 큽니다.

  2. 길이 rs의 좌표축에 평행 한 변을 가진 사각형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.

    RS는 너무 다르지 않다, 우리는 알 수 있습니다 R ^ 2 개 + S ^ 2 개 약 2 r은 * . 이 근사값 은 의도 한대로 전체 새 영역을 원래의 r * s 영역의 4 r * s / 80 = 5 %로 단순화합니다 .


4

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어떻게 든 그 일을하는 방법을 알 수 없습니다 ...
n1000

0

이것은 파티에 매우 늦었지만 최근 에이 작업을 수행하고 필요한 경우 축소하는 사용자 정의 PostGIS 기능을 개발했습니다.

ST_ 확장

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.