PostGIS에서 소위 단면 버퍼 또는 평행선을 만드는 방법을 찾고 있습니다. 예 : 1. 버퍼, 2. 한쪽, 3. 양쪽
2009 년 메일 링리스트 와 GEOS 에서 구현 된 정보 에 대한 토론을 찾았 지만 현재 PostGIS 상태에 대해서는 아무것도 없습니다.
기능이 아직 구현되지 않은 경우 해결 방법을 알고 있습니까? 일반 버퍼의 한쪽을 잘라낼 수 있습니까?
답변
적절한 단측 버퍼는 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 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)
코드는 다음과 같은 방식으로 작동합니다.
- ST_Buffer를 사용하여 라인 스트링을 버퍼링하십시오. 엔드 캡을 지정하지 않기 위해 사용자 지정 엔드 캡을 지원하는 PostGIS 1.5 기능을 활용합니다. 아래 예를 참조하십시오.
- 위키에 문서화 된 방법을 사용하여 원래 라인을 사용하여 버퍼링 된 다각형을 2 개로 분할하십시오 .
이것은 향후 자체 교차 선에 대처하기 위해 개선 될 수 있습니다.
답변
이 수정은 두 개의 평행 한 선 스트링을 만듭니다. 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)"
답변
여전히 여기에 주석을 달 수 없으므로이 답변을 추가하십시오.
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"