ST_BUFFER
ST_BUFFER
ST_BUFFER 함수는 입력 GEOMETRY 객체에서 지정된 거리 내에 있는 점을 포함하는 MultiPolygon을 나타내는 GEOMETRY 객체를 반환해요. 반환된 객체는 효과적으로 입력 객체 주위의 "버퍼(buffer)"를 나타내요.
출처: ST_BUFFER
본문
ST_BUFFER 함수는 입력 GEOMETRY 객체에서 지정된 거리 내에 있는 점을 포함하는 MultiPolygon을 나타내는 GEOMETRY 객체를 반환해요. 반환된 객체는 효과적으로 입력 객체 주위의 "버퍼"를 나타내요.
distance에 음수 값을 지정해 입력 객체를 "축소(shrink)"할 수도 있어요.
구문 (Syntax)
ST_BUFFER( <geometry_expression> , <distance> )
인자 (Arguments)
- geometry_expression — 인자는
GEOMETRY타입의 표현식이어야 해요. - distance —
GEOMETRY객체로부터의 거리예요. 객체를 "축소"하려면distance에 음수 값을 지정할 수 있어요. 단위는GEOMETRY객체의 공간 참조 시스템 식별자(SRID)에 따라 달라져요. 예를 들어 EPSG:4326의 단위는 도(degrees)이고, EPSG:25833의 단위는 미터(meters)예요.
반환 (Returns)
GEOMETRY 객체를 반환해요.
사용 메모 (Usage notes)
- SRID는 EPSG 표준(v10.082)을 기반으로 해요. 예를 들어 SRID 4326은 코드 4326의 EPSG 권한에 해당해요.
ST_BUFFER는 8개의 세그먼트를 사용해 사분원(quarter circle)을 근사해요.distance가 음수 값이면 반환된 객체는 입력 객체보다 작아요. 이를 사용해 도형에서 작은 불규칙성을 제거할 수 있어요.- LineString의 경우 endcap과 join 스타일은 항상 라운드(round)예요.
- LineString은 항상 양쪽 모두 버퍼링돼요.
예제 (Examples)
예제를 실행하기 전에 GEOMETRY_OUTPUT_FORMAT 매개변수를 WKT로 설정해요:
ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='WKT';
Point 버퍼링
Point를 버퍼링하면 Point 주위의 원을 근사하는 MultiPolygon이 반환돼요. ST_BUFFER는 각 사분원을 근사하는 데 8개의 세그먼트를 사용하므로 원은 32개의 직선 세그먼트(링이 시작점을 반복하므로 33개 점)로 그려져요. 따라서 면적은 실제 원의 면적(PI() * 1 * 1, 즉 약 3.1416)보다 약간 작아요.
다음 예제는 Point를 거리 1로 버퍼링하고 결과의 점 수와 면적을 보고해요:
SELECT ST_NPOINTS(buffer) AS num_points,
ST_AREA(buffer) AS area
FROM (SELECT ST_BUFFER(TO_GEOMETRY('POINT(0 0)'), 1) AS buffer);
+------------+-------------------+
| NUM_POINTS | AREA |
|------------+-------------------|
| 33 | 3.121445152258052 |
+------------+-------------------+
LineString 버퍼링
ST_BUFFER는 LineString을 양쪽 모두 버퍼링하고 라운드 endcap을 사용하므로 결과는 캡슐 모양의 MultiPolygon이에요. 다음 예제는 길이 10 단위의 선을 거리 2로 버퍼링해요:
SELECT ST_NPOINTS(buffer) AS num_points,
ST_AREA(buffer) AS area
FROM (SELECT ST_BUFFER(TO_GEOMETRY('LINESTRING(0 0, 10 0)'), 2) AS buffer);
+------------+--------------------+
| NUM_POINTS | AREA |
|------------+--------------------|
| 36 | 52.485780609032204 |
+------------+--------------------+
면적은 선을 따른 직사각형(길이 10, 폭 4 = 40 제곱 단위)과 두 개의 둥근 끝(함께 반지름 2의 원을 근사)의 합이에요.
거리를 미터로 지정
거리의 단위는 입력 객체의 SRID에 따라 달라져요. 다음 예제는 SRID 32633(미터를 사용하는 UTM zone 33N)의 Point를 100미터로 버퍼링해요. 결과 면적은 반지름 100미터의 원 면적(PI() * 100 * 100, 즉 약 31416 제곱미터)에 가까워요:
SELECT ST_AREA(buffer) AS area_sq_meters
FROM (SELECT ST_BUFFER(TO_GEOMETRY('SRID=32633;POINT(0 0)'), 100) AS buffer);
+--------------------+
| AREA_SQ_METERS |
|--------------------|
| 31214.45152258053 |
+--------------------+
음수 거리로 도형 축소
다음 예제는 distance에 음수 값을 사용해 도형에서 작은 불규칙성(예: 스파이크)을 제거해요. TO_GEOMETRY 호출은 두 번째 인자로 TRUE를 전달하며, 이는 잘못된 도형에 대한 GEOMETRY 객체 생성을 허용해요:
SELECT ST_BUFFER(TO_GEOMETRY('SRID=2261;POLYGON((
1540792.21541900 290472.63529214, 1547018.61770388 302537.02285369,
1546965.96550151 302752.51514772, 1547018.61770388 302537.02285369,
1549532.42729914 301257.07398027, 1543327.42218339 289322.60923536,
1540792.21541900 290472.63529214))', True), -1e-08) AS geom;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GEOM |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| MULTIPOLYGON(((1543327.42218339 289322.609235373,1540792.21541901 290472.635292145,1547018.61770388 302537.022853677,1549532.42729913 301257.073980266,1543327.42218339 289322.609235373))) |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
더 알아보기 (Learn more)
- ST_AREA
- ST_NPOINTS
- 지리공간 함수 (Geospatial functions)
- TO_GEOMETRY