Geometry 데이터 타입
Geometry 데이터 타입 (Geometry Data Type)
GEOMETRY 데이터 타입은 점(point), 선(line), 다각형(polygon) 같은 기하 객체를 저장하고 조작하는 데 사용돼요. v1.5부터 DuckDB 내장 타입이 됐고, 대부분의 관련 함수(거리·면적·교차 계산 등)는 여전히 spatial 익스텐션에 속해 있어요.
출처: 문서
본문
| 이름 | 설명 |
|---|---|
GEOMETRY |
지리공간 엔티티 |
GEOMETRY 데이터 타입은 점, 선, 다각형 같은 기하 객체를 저장하고 조작하는 데 사용돼요.
GEOMETRY 타입은 원래 spatial 익스텐션의 일부였지만 DuckDB v1.5에서 내장 데이터 타입이 됐어요. GEOMETRY를 내장 타입으로 가짐으로써 얻는 이점 대부분(예: 저장 최적화, 통계 등)은 그래서 storage version v1.5 이상을 쓰는 데이터베이스에서만 사용할 수 있어요. 하지만 지오메트리 작업(예: 거리, 면적, 교차 계산)과 관련된 함수는 거의 모두 여전히 spatial의 일부예요.
Geometry 타입 (Types of Geometries)
개념적으로 GEOMETRY 타입은 지리공간 데이터베이스와 GIS 소프트웨어에서 널리 쓰이는 Simple Features 표준에 정의된 핵심 데이터 모델을 따릅니다. 따라서 GEOMETRY 값은 7가지 모양을 나타낼 수 있어요:
| Geometry 타입 | 설명 |
|---|---|
| Point | 좌표(예: 경도·위도)로 정의된 공간의 단일 위치. |
| LineString | 직선으로 연결된 일련의 점 — 경로나 루트를 나타냄. |
| Polygon | 일련의 점으로 정의된 닫힌 링(ring) 집합 — 국가 경계나 건물 발자국 같은 영역을 나타냄. 첫 링은 "shell"이고 "내부" 링은 다각형의 홀(hole)을 나타냄. |
| MultiPoint | 점의 모음. |
| MultiLineString | LineString의 모음. |
| MultiPolygon | Polygon의 모음. |
| GeometryCollection | 서로 다른 geometry 타입의 모음 — 점, 선, 다각형 또는 심지어 중첩된 다른 geometry 컬렉션을 결합한 복잡한 geometry를 허용. |
지오메트리의 텍스트 표현은 "Well-Known Text" (WKT) 형식을 사용해요. 지오메트리는 WKT 문자열로/에서 캐스팅될 수 있어서, SQL 문에서 문자열 리터럴로 지오메트리를 직접 만들 수 있어요.
다음 예시에서는 지원되는 7가지 geometry 타입을 가진 GEOMETRY 컬럼을 만들어요:
CREATE TABLE geometries (
id INTEGER,
geom GEOMETRY
);
INSERT INTO geometries VALUES
(1, 'POINT (30 10)'),
(2, 'LINESTRING (30 10, 10 30, 40 40)'),
(3, 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'),
(4, 'MULTIPOINT ((10 40), (40 30), (20 20), (30 10))'),
(5, 'MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20))'),
(6, 'MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)), ((15 5, 40 10, 10 20, 5 10,15 5)))'),
(7, 'GEOMETRYCOLLECTION (POINT(40 10), LINESTRING(10 10,20 20,10 40), POLYGON((40 40,20 45,45 30,40 40)))');
SELECT * FROM geometries;
----
┌───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ id │ geom │
│ int32 │ geometry │
├───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 1 │ POINT (30 10) │
│ 2 │ LINESTRING (30 10, 10 30, 40 40) │
│ 3 │ POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10)) │
│ 4 │ MULTIPOINT (10 40, 40 30, 20 20, 30 10) │
│ 5 │ MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20)) │
│ 6 │ MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5))) │
│ 7 │ GEOMETRYCOLLECTION (POINT (40 10), LINESTRING (10 10, 20 20, 10 40), POLYGON ((40 40, 20 45, 45 30, 40 40))) │
└───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
다차원 Geometry (Multi-Dimensional Geometries)
GEOMETRY 타입은 주로 2차원(예: X/Y 또는 longitude/latitude)의 모양을 모델링하지만, Z(고도)나 M(measure), 또는 둘 다 같은 추가 정점 차원을 가진 모양도 지원해요.
GEOMETRY 값의 정점 차원은 모든 정점에 걸쳐 일관되어야 해요. 예를 들어 한 정점에 X, Y, Z 좌표가 있으면 그 geometry의 다른 모든 정점도 X, Y, Z 좌표를 가져야 해요. 즉 같은 geometry 안에서 2D와 3D 정점을 섞을 수 없어요. 이는 MULTIPOINT나 GEOMETRYCOLLECTION 같은 geometry 컬렉션에도 적용되며, 컬렉션 안의 모든 geometry는 같은 정점 차원을 가져야 해요.
GEOMETRY 값에서 동작하는 함수는 명시적으로 지정하지 않는 한 X와 Y를 넘어선 추가 차원은 일반적으로 무시해요. 하지만 그 차원들은 저장될 수 있고 필요하면 검색할 수 있어요.
다음 예시에서는 2D, 3D(Z), 3D(M), 4D(ZM) 점을 가진 GEOMETRY 테이블을 만들어요:
CREATE TABLE points (
id INTEGER,
geom GEOMETRY
);
INSERT INTO points VALUES
(1, 'POINT (30 10)'),
(2, 'POINT Z (30 10 5)'),
(3, 'POINT M (30 10 1)'),
(4, 'POINT ZM (30 10 5 1)');
SELECT * FROM points;
----
┌───────┬──────────────────────┐
│ id │ geom │
│ int32 │ geometry │
├───────┼──────────────────────┤
│ 1 │ POINT (30 10) │
│ 2 │ POINT Z (30 10 5) │
│ 3 │ POINT M (30 10 1) │
│ 4 │ POINT ZM (30 10 5 1) │
└───────┴──────────────────────┘
-- 하지만 같은 geometry 안에서 서로 다른 정점 차원을 섞을 수는 없어요!
INSERT INTO points VALUES
(5, 'MULTIPOINT (POINT (30 10), POINT Z (30 10 5))');
----
Invalid Input Error:
Geometry has inconsistent Z/M dimension
빈 Geometry (Empty Geometries)
지오메트리는 "빈"(empty) 상태일 수도 있어요(예: POINT EMPTY, LINESTRING EMPTY, MULTIPOLYGON EMPTY 등). 이는 정점을 포함하지 않는다는 뜻이에요. 빈 지오메트리는 여전히 유효한 지오메트리이며 공간 연산에 사용할 수 있지만, 대부분 유효한 기하 표현이 없는 토폴로지 연산의 결과를 나타내는 데 유용해요(예: 서로 겹치지 않는 두 지오메트리의 교차는 빈 지오메트리).
Geometry 저장 (Geometry Storage)
내부적으로 GEOMETRY 값은 DuckDB의 BLOB 타입과 비슷하게 바이트 시퀀스로 저장돼요. 정확한 바이너리 형식은 아직 안정화되지 않았으며 향후 릴리스에서 바뀔 수 있지만, DuckDB storage version v1.5부터는 지오메트리의 표준 바이너리 인코딩인 little-endian Well-Known Binary (WKB)를 기반으로 해요. 이전 저장 버전에서는 지오메트리가 spatial 익스텐션이 사용하는 서로 다른 커스텀 바이너리 형식으로 저장됐지만, 이 변환은 저장 계층에서 자동으로 수행되며 실행 엔진이나 사용자에게는 보이지 않아요.
분해(shredding)와 압축 (Shredding and Compression)
GEOMETRY 타입은 "shredding"이라는 저장 최적화를 지원해요. 이는 모든 값이 같은 geometry 타입과 정점 차원을 공유하는 geometry 컬럼의 압축을 개선해요.
행 그룹이 자격을 갖추면 DuckDB는 행 그룹 안의 geometry 세그먼트를 가변 크기 바이너리 블롭을 저장하는 것보다 훨씬 효율적으로 독립적으로 압축할 수 있는 프리미티브 STRUCT, LIST, DOUBLE 세그먼트로 분해해요.
분해된 레이아웃은 geometry 타입에 따라 달라요:
POINT- STRUCT(X DOUBLE, Y DOUBLE) (및/또는 Z, M)LINESTRING- STRUCT(X DOUBLE, Y DOUBLE)[]POLYGON- STRUCT(X DOUBLE, Y DOUBLE)[][]MULTIPOINT,MULTILINESTRING,MULTIPOLYGON- 위와 같되 리스트 중첩 레벨이 하나 더 추가됨
행 그룹이 GEOMETRYCOLLECTION, 어떤 EMPTY 지오메트리, 또는 여러 geometry 하위 타입을 포함하면 분해되지 않아요.
또한 최소 크기 임계값(기본: 최대 행 그룹 크기의 약 25%, 즉 30,000행) 미만이면 행 그룹은 분해되지 않아요.
이 임계값은 geometry_minimum_shredding_size 설정으로 구성할 수 있어요. 0으로 설정하면 항상 분해하고, -1로 설정하면 완전히 비활성화해요.
-- geometry 컬럼 분해 비활성화
SET geometry_minimum_shredding_size = -1;
-- 행 그룹 크기와 무관하게 geometry 컬럼 항상 분해
SET geometry_minimum_shredding_size = 0;
분해의 주요 이점은 크게 개선된 압축이지만, 향후에는 지오메트리를 다시 바이너리로 "재조립"하지 않고도 분해된 표현을 실행 엔진에 직접 노출하는 방법을 추가할 계획이에요.
다음 예시는 GEOMETRY 컬럼의 저장 공간에 대한 분해의 효과를 보여줘요.
-- storage version v1.5의 영구 데이터베이스 연결
ATTACH 'geometry_db.db' as geometry_db (STORAGE_VERSION 'v1.5.0');
USE geometry_db;
-- 분해를 완전히 비활성화하고 100만 개의 2D 점으로 테이블 생성
SET geometry_minimum_shredding_size = -1;
CREATE OR REPLACE TABLE points AS SELECT printf('POINT (%d %d)', x, y)::GEOMETRY AS geom
FROM range(0, 1000) AS rx(x), range(0, 1000) AS ry(y);
-- 데이터와 저장 레이아웃을 디스크에 영속화하기 위해 체크포인트
CHECKPOINT;
-- 두 번째 데이터베이스 연결
ATTACH 'shredded_db.db' as shredded_db (STORAGE_VERSION 'v1.5.0');
USE shredded_db;
-- 이번에는 최소 분해 크기를 0으로 설정해 geometry 컬럼을 항상 분해하고,
-- 같은 100만 개의 2D 점 테이블 생성
SET geometry_minimum_shredding_size = 0;
CREATE OR REPLACE TABLE points AS SELECT printf('POINT (%d %d)', x, y)::GEOMETRY AS geom
FROM range(0, 1000) AS rx(x), range(0, 1000) AS ry(y);
-- 데이터와 저장 레이아웃을 디스크에 영속화하고 분해 적용을 위해 체크포인트
CHECKPOINT;
-- 이제 두 연결된 데이터베이스에서 geometry 컬럼의 저장 레이아웃과 메모리 사용량 확인
SELECT database_name, database_size FROM pragma_database_size();
----
┌───────────────┬───────────────┐
│ database_name │ database_size │
│ varchar │ varchar │
├───────────────┼───────────────┤
│ shredded_db │ 2.2 MiB │ -- 분해 덕분에 거의 3배 더 작은 저장 공간!
│ geometry_db │ 6.5 MiB │
│ memory │ 0 bytes │
└───────────────┴───────────────┘
-- 각 데이터베이스에서 geometry 컬럼을 저장하는 데 사용된 세그먼트 유형을
-- `pragma_storage_info` 함수로 검사할 수 있어요.
-- `geometry_db`의 geometry 컬럼은 일반 GEOMETRY 세그먼트로 저장됨
SELECT DISTINCT(segment_type) FROM pragma_storage_info('geometry_db.points');
----
┌──────────────┐
│ segment_type │
│ varchar │
├──────────────┤
│ GEOMETRY │
│ VALIDITY │
└──────────────┘
-- 반면 `shredded_db`의 geometry 컬럼은 훨씬 효율적으로 압축할 수 있는
-- 프리미티브 DOUBLE 세그먼트로 분해됨!
SELECT DISTINCT(segment_type) FROM pragma_storage_info('shredded_db.points');
----
┌──────────────┐
│ segment_type │
│ varchar │
├──────────────┤
│ VALIDITY │
│ DOUBLE │
└──────────────┘
Geometry 통계 (Geometry Statistics)
GEOMETRY 컬럼은 각 행 그룹의 지오메트리 바운딩 박스와, 행 그룹에 존재하는 geometry 타입 및 정점 차원 집합을 추적하는 geometry 특화 통계를 포함해요.
stats() 함수로 컬럼의 통계를 검사할 수 있어요:
CREATE TABLE geometries as select 'POINT Z (30 10 5)'::GEOMETRY as geom;
SELECT stats(geom) AS geom_stats FROM geometries;
----
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ geom_stats │
│ varchar │
├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ [Extent: [X: [30.000000, 30.000000], Y: [10.000000, 10.000000], Z: [5.000000, 5.000000], M: [inf, -inf]], Types: [point_z], Flags: [Has Empty Geom: false, Has No Empty Geom: true, Has Empty Part: │
│ false, Has No Empty Part: true]][Has Null: false, Has No Null: true][Approx Unique: 1] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
이 통계는 쿼리 최적화 프로그램이 쿼리가 요구하는 geometry 타입이나 정점 차원과 일치하지 않는 행 그룹을 건너뛰거나, 행 그룹의 지오메트리 바운딩 박스가 쿼리 지오메트리의 바운딩 박스와 겹치는지 먼저 확인해 공간 프레디킷을 가속화하는 데 사용할 수 있어요.
현재 && 연산자(지오메트리 바운딩 박스가 다른 지오메트리의 바운딩 박스와 교차하는지 확인하는 데 사용)만 WHERE 절에서 사용할 때 geometry 통계를 활용할 수 있어요. ST_Intersects, ST_Distance 같은 spatial 익스텐션 함수에 더 많은 통계 기반 최적화 지원을 추가하는 작업이 진행 중이에요.
geometry 통계를 영속화하는 것은 storage version v1.5 이상에서만 가능해요. 그래서 이전 저장 버전을 사용하면 체크포인트 시 geometry 통계가 "unknown" 통계로 바뀌어요. 즉 바운딩 박스가 무한히 큰 바운딩 박스로 설정되고 모든 geometry 타입과 정점 차원이 "있을 수도 있음"으로 표시되어, 실행 엔진이 geometry 통계를 기반으로 어떤 최적화도 할 수 없게 돼요.
좌표 참조 시스템 (Coordinate Reference Systems)
실행 엔진이 보기에 지오메트리는 데카르트 좌표계에 존재한다고 간주돼요. 하지만 실제로 대부분의 지리공간 데이터는 좌표가 지구 표면의 실제 위치와 어떻게 관련되는지 정의하는 특정 좌표 참조 시스템(CRS)과 연관돼요.
유용한 비유는 CRS를 지리공간 데이터의 "시간대"에 해당하는 것으로 생각하는 것이에요. 시간대가 지역 시간과 표준 참조 시간(예: UTC)의 관계를 정의하는 것처럼, CRS는 지오메트리의 좌표가 표준 참조 시스템(예: WGS 84)과 어떻게 관련되는지 정의해요. CRS는 보통 지리좌표계(예: 위도·경도를 쓰는 WGS 84)이거나 투영좌표계(예: 미터 같은 선형 단위를 쓰는 UTM)예요.
지리공간 데이터를 다룰 때는 서로 다른 데이터셋과 연관된 CRS를 인식하는 것이 중요해요. 적절한 변환 없이 서로 다른 CRS의 지오메트리에 공간 연산을 수행하면 결과가 틀릴 가능성이 높아요.
DuckDB에서 CRS는 어떻게 저장되나요?
이런 실수를 피하기 위해 DuckDB는 GEOMETRY 컬럼에 CRS를 명시적으로 연결할 수 있게 해요.
이는 GEOMETRY 타입의 파라미터로 CRS "식별자"를 전달해서 이루어져요. 예를 들어 GEOMETRY('OGC:CRS84') 타입의 컬럼은 "OGC CRS84" 좌표 참조 시스템과 연관된 지오메트리를 저장해요.
DuckDB의 CRS 식별자는 항상 문자열이에요. OGC:CRS84는 X 좌표가 경도, Y 좌표가 위도를 나타내는 전 세계를 아우르는 일반적인 지리좌표계의 식별자예요. DuckDB가 이걸 아는 것은 'OGC:CRS84' 식별자가 시스템 카탈로그에 알려진 CRS로 등록돼 있기 때문이에요.
기본적으로 소수의 일반 CRS만 알려진 것으로 등록되지만, 익스텐션도 추가로 알려진 CRS를 등록할 수 있어요. 특히 spatial 익스텐션은 아마도 가장 널리 쓰이는 CRS 데이터베이스인 EPSG Geodetic Parameter Dataset의 7,000개 이상의 CRS를 등록해요.
duckdb_coordinate_systems() 함수로 DuckDB에 알려진 모든 CRS를 나열할 수 있어요:
SELECT * FROM duckdb_coordinate_systems();
----
┌───────────────┬──────────────┬─────────────┬────────────┬─────────┬───────────┬───────────┬───────────┬───────────────────────────────────────┬───────────────────────────────────────┐
│ database_name │ database_oid │ schema_name │ schema_oid │ crs_oid │ crs_name │ auth_name │ auth_code │ projjson │ wkt2_2019 │
│ varchar │ int64 │ varchar │ int64 │ int64 │ varchar │ varchar │ varchar │ varchar │ varchar │
├───────────────┼──────────────┼─────────────┼────────────┼─────────┼───────────┼───────────┼───────────┼───────────────────────────────────────┼───────────────────────────────────────┤
│ system │ 0 │ main │ 0 │ 1354 │ OGC:CRS83 │ OGC │ CRS83 │ {"$schema":"https://proj.org/schemas… │ GEOGCRS["NAD83 (CRS83)",DATUM["North… │
│ system │ 0 │ main │ 0 │ 1353 │ OGC:CRS84 │ OGC │ CRS84 │ {"$schema":"https://proj.org/schemas… │ GEOGCRS["WGS 84 (CRS84)",ENSEMBLE["W… │
└───────────────┴──────────────┴─────────────┴────────────┴─────────┴───────────┴───────────┴───────────┴───────────────────────────────────────┴───────────────────────────────────────┘
알 수 없는 CRS 다루기 (Handling Unknown Coordinate Reference Systems)
위에서 언급했듯이 시스템 카탈로그에 등록된(즉 DuckDB에 "알려진") 좌표계만 GEOMETRY 컬럼을 만들 때 사용할 수 있어요.
알 수 없는 CRS 식별자로 GEOMETRY 컬럼을 만들려고 하면(수동으로든 외부 지리공간 데이터셋을 가져와서든) 문이 에러와 함께 실패해요.
SELECT 'POINT(1 2)'::GEOMETRY('DUCK:1337') AS my_point;
----
Binder Error:
Encountered unrecognized coordinate system 'DUCK:1337' when trying to create GEOMETRY type
The coordinate system definition may be incomplete or invalid ...
이 제한이 있는 이유는 DuckDB가 좌표 변환을 수행하고 GeoParquet 같은 CRS 메타데이터를 포함하는 형식으로 내보내기 위해 식별자뿐 아니라 완전한 CRS 정의가 필요하기 때문이에요. 시스템 카탈로그 항목이 없으면 식별자를 전체 정의로 해석할 방법이 없어요.
ignore_unknown_crs 구성 옵션을 true로 설정하면 알 수 없는 CRS를 그냥 건너뛰고 CRS 없이 GEOMETRY 컬럼을 만들 수 있어요.
-- 알 수 없는 CRS 식별자는 무시
SET ignore_unknown_crs = true;
select 'POINT(1 2)'::GEOMETRY('DUCK:1337') AS my_point;
----
┌─────────────┐
│ my_point │
│ geometry │ -- geometry는 만들어지지만 CRS는 타입에서 빠진다!
├─────────────┤
│ POINT (1 2) │
└─────────────┘
또는 GEOMETRY 컬럼을 직접 정의하려고 한다면, 축약 식별자 대신 WKT나 PROJJSON 형식의 완전한 CRS 정의를 CRS 파라미터로 제공할 수 있어요. 하지만 완전한 CRS 정의는 보통 매우 커서 금세 다루기 어려워지므로 대화형 사용에는 권장하지 않아요.
현재 SQL에서 커스텀 CRS를 정의하거나, DuckDB가 geometry 컬럼의 CRS 식별자를 해석하는 데 사용할 수 있도록 커스텀 CRS 정의를 데이터베이스에 영속화하는 것은 불가능해요. 하지만 이는 미래에 고려 중인 사항이에요.
서로 다른 CRS의 Geometry 작업하기 (Working with Geometries in Different Coordinate Reference Systems)
타입 시스템의 일부로 CRS를 추적하는 이점 중 하나는 서로 다른 좌표계의 지오메트리를 다룰 때 발생할 수 있는 많은 일반적인 실수를 방지한다는 것이에요. 여러 GEOMETRY 값을 다루는 대부분의 공간 함수는 연산을 수행하기 전에 모든 입력 표현식이 같은 CRS를 가지는지 검증해요. 마찬가지로, 소스나 대상에 CRS가 지정되지 않은 경우에만 GEOMETRY 컬럼이 다른 GEOMETRY 컬럼으로/에서 암시적으로 캐스팅될 수 있어요.
지오메트리를 한 CRS에서 다른 CRS로 변환하려면 spatial 익스텐션의 ST_Transform(geom, crs) 함수를 사용할 수 있어요.
LOAD spatial;
SELECT ST_Transform('POINT(4.897070 52.377956)'::GEOMETRY('OGC:CRS84'), 'EPSG:3857') AS transformed;
----
┌────────────────────────────────────────────┐
│ transformed │
│ geometry('epsg:3857') │
├────────────────────────────────────────────┤
│ POINT (545139.3387790163 6868755.38408516) │
└────────────────────────────────────────────┘
ST_SetCRS(geom, crs) 함수로 CRS가 없는 지오메트리에 CRS를 할당하거나, 좌표를 변환하지 않고 CRS를 재할당할 수도 있어요(예: 데이터가 이미 올바른 좌표계에 있지만 올바른 CRS가 없는 경우).
SELECT ST_SetCRS('POINT(4.897070 52.377956)'::GEOMETRY, 'OGC:CRS84') AS with_crs;
----
┌───────────────────────────┐
│ with_crs │
│ geometry('ogc:crs84') │
├───────────────────────────┤
│ POINT (4.89707 52.377956) │
└───────────────────────────┘
지오메트리에서 CRS를 제거하고 싶다면 GEOMETRY로 캐스팅하거나 CRS를 ''로 설정하면 돼요:
SELECT 'POINT(4.897070 52.377956)'::GEOMETRY('OGC:CRS84')::GEOMETRY AS no_crs;
----
┌───────────────────────────┐
│ no_crs │
│ geometry │
├───────────────────────────┤
│ POINT (4.89707 52.377956) │
└───────────────────────────┘
SELECT ST_SetCRS('POINT(4.897070 52.377956)'::GEOMETRY('OGC:CRS84'), '') AS no_crs;
----
┌───────────────────────────┐
│ no_crs │
│ geometry │
├───────────────────────────┤
│ POINT (4.89707 52.377956) │
└───────────────────────────┘
물론 ST_CRS(geom)으로 지오메트리의 CRS를 가져올 수도 있어요:
SELECT ST_CRS('POINT(4.897070 52.377956)'::GEOMETRY('OGC:CRS84')) AS crs;
----
┌───────────┐
│ crs │
│ varchar │
├───────────┤
│ OGC:CRS84 │
└───────────┘
함수 (Functions)
- 내장 geometry 함수 목록은 geometry functions을 참고해요.
- 면적, 거리, 교차, 합집합 계산 등을 포함한 익스텐션이 제공하는 대규모 추가 geometry 함수 집합은
spatial익스텐션 문서를 참고해요.
더 알아보기 (Learn more)
- Geometry 함수 — 내장 geometry 함수.
- Spatial 익스텐션 — 추가 지리공간 함수.