PostGIS에서 단면 버퍼 또는 병렬 라인을 생성 하시겠습니까?


19

PostGIS에서 소위 단면 버퍼 또는 평행선을 만드는 방법을 찾고 있습니다. 예 : 1. 버퍼, 2. 한쪽, 3. 양쪽

대체 텍스트

2009 년 메일 링리스트GEOS 에서 구현 된 정보 에 대한 토론을 찾았 지만 현재 PostGIS 상태에 대해서는 아무것도 없습니다.

기능이 아직 구현되지 않은 경우 해결 방법을 알고 있습니까? 일반 버퍼의 한쪽을 잘라낼 수 있습니까?


AutoCAD에서 "오프셋"에 해당하는 것을 찾고 계십니까?
dassouki

@dassouki : 죄송합니다. AutoCAD를 모르겠습니다. 그러나 UMN Mapserver에는 내가 원하는 것을 수행하는 "오프셋"옵션이 있다고 생각합니다.
underdark

600 줄이있는 테이블에서 단측 버퍼 또는 병렬 줄을 만드는 방법은 무엇입니까?

사이트에 오신 것을 환영합니다. 현재 답변이 문제를 해결하지 못하면 새 질문으로 열어야합니다 (이 질문이 문제에 답변하지 않는 이유를 설명하십시오). 사이트 형식 내에서 이것은 질문에 대한 답변이 아니기 때문에이 진술을 작성하기에 적절한 장소가 아닙니다.
Andy W

MULTILINESTRING 테이블에서 평행선을 만들려면 어떻게해야합니까?
Felipe Costa

답변:


13

적절한 단측 버퍼는 1.5에 착륙 해야 했지만, 스타일이 착륙하는 동안 양측이 그것을 만들지 않은 것으로 보입니다. 그러나 예상대로 단측 버퍼 를 노출 하고 수행 하는 현재 패치 세트 가 있습니다. GEOSSingleSidedBuffer이름 아래 ST_OffsetCurve; 티켓 # 413의 추가 배경을 참조하십시오 . 사용:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

안녕하세요,이 솔루션을 사용하려고하지만 postgis를 자주 사용하지 않습니다.이 쿼리를 테스트하고 출력 값을 얻었지만 어떻게 기능으로 변환합니까? 원래 테이블의 일부 또는 새 행의 끝에 줄을 원합니다. 이것은 내 쿼리입니다 : select ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = mitre mitre_limit = 5.0')) test_data_에서;
kflaw

@kflaw-이미 이것을 알아 냈을 수도 있지만 쿼리의 시작 부분에 "create newtable as"또는 뷰의 경우 "view newview as as create or replace"다음에 select 문만 추가하면됩니다.
jbalk

4

이 샘플은 선 스트링의 양쪽에 두 개의 다각형을 만듭니다. PostGIS 1.5 이상이 필요합니다. 나는 그것이 스스로 교차하는 선에 얼마나 잘 대처할 지 잘 모르겠습니다.

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

출력합니다 :

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

코드는 다음과 같은 방식으로 작동합니다.

  1. ST_Buffer를 사용하여 라인 스트링을 버퍼링하십시오. 엔드 캡을 지정하지 않기 위해 사용자 지정 엔드 캡을 지원하는 PostGIS 1.5 기능을 활용합니다. 아래 예를 참조하십시오.
  2. 위키에 문서화 된 방법을 사용하여 원래 라인을 사용하여 버퍼링 된 다각형을 2 개로 분할하십시오 .

이것은 향후 자체 교차 선에 대처하기 위해 개선 될 수 있습니다.

플랫 엔드 캡이있는 버퍼 라인 스트링


3

이 수정은 두 개의 평행 한 선 스트링을 만듭니다. PostGIS 1.5 이상이 필요합니다.

필요한 형상 또는 wkt 및 버퍼 거리


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- 결과

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

여전히 여기에 주석을 달 수 없으므로이 답변을 추가하십시오.

SCW 가 최선의 답변을 제공합니다.

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

그러나 기능 변경 http://postgis.refractions.net/docs/ST_OffsetCurve.html 처럼 보입니다
.

이제 'right'매개 변수가 필요하지 않습니다. 양수 거리를 사용하면 왼쪽이 생성되고 음수 거리가 오른쪽을 생성합니다

또한 postgis에는 패치가 필요하지 않습니다.

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.