3. 공간 쿼리 사용하기

3.1. 공간 데이터 타입

공간데이터 표기법은 OGC(Open Geospatial Consortium) 표준을 따르며, 다음과 같은 규칙을 가집니다.

3.1.1. POINT

POINT(10 10)
POINT(20 20)

3.1.2. LINESTRING

LINESTRING (10 10, 20 20)
LINESTRING (10 10, 20 20, 30 30)

3.1.3. POLYGON

POLYGON((10 10, 20 20, 30 30, 10 10))
POLYGON((10 10, 1024 2048, 1000 200, 500 500, 25 25, 10 10))

3.1.4. MULTIPOINT

MULTIPOINT(10 10, 20 20, 30 30, 20 40, 100 200)

3.1.5. MULTILINESTRING

MULTILINESTRING((10 10, 20 20, 30 30),(10 20, 30 40, 50 60))

3.1.6. MULTIPOLYGON

MULTIPOLYGON(((10 10, 20 20, 30 30, 10 10)), ((10 20, 30 40, 50 60, 10 20)))

3.1.7. GEOMCOLLECTION

GeomCollection(

POINT(10 10),

MULTIPOLYGON(
((10 20, 30 40, 50 60, 10 10)), ((10 10, 40 60, 100 200, 10 10))
),

GeomCollection(LINESTRING(10 20, 20 10), POINT(30 40)))
)

공간 쿼리는 기본적인 CREATE, INSERT, SELECT 사용 방법과 큰 차이가 없으며, 지원하는 옵션이나 함수에서 약간의 차이가 있습니다.

3.2. 공간 함수

IRIS 공간DB에서 지원하는 함수 목록입니다.

공간데이터 타입과 마찬가지로 OGC(Open Geospatial Consortium) 표준을 따릅니다.

공간 함수는 크게 기본 함수, 관계 함수, 분석 함수 세 가지 타입으로 나뉩니다.

3.2.1. 공간 기본 함수

공간 기본함수는 단일 공간 데이터에 대한 정보를 출력합니다.

인자로 공간 데이터 한개를 받아서 타입, srid, 경계 등을 반환합니다.

함수명

설명

사용예시

ST_GeometryType

인스턴스의 타입을 반환

SELECT ST_GeometryType(geom) FROM SPATIAL_TABLE

ST_SRID

인스턴스의 srid를 반환

SELECT ST_SRID(geom) FROM SPATIAL_TABLE

ST_Envelop

인스턴스의 최소 경계 사각형을 POLYGON으로 반환

SELECT ST_Envelop(geom) FROM SPATIAL_TABLE

ST_AsText

인스턴스를 Well-known Text 형식으로 반환

SELECT ST_AsText(geom) FROM SPATIAL_TABLE

ST_AsBinary

인스턴스를 Well-known Binary 형식으로 반환

SELECT ST_AsBinary(geom) FROM SPATIAL_TABLE

ST_IsEmpty

인스턴스가 좌표값을 가지지 않으면 1, 아닐 경우 0 반환

SELECT ST_IsEmpty(geom) FROM SPATIAL_TABLE

ST_IsSimple

Simple한 인스턴스일 경우 1, 아닐 경우 0 반환

SELECT ST_IsSimple(geom) FROM SPATIAL_TABLE

ST_Boundary

인스턴스의 경계를 반환

SELECT ST_Boundary(geom) FROM SPATIAL_TABLE

3.2.2. 공간 관계 함수

공간 관계 함수는 이름 그대로 공간 데이터간의 관계를 판단하는 역할을 합니다.

예를들어 두 공간 데이터가 겹치는지, 혹은 한 점에서 만나는지 등의 여부를 계산하고,

그 결과를 1 또는 0으로 반환합니다.

함수명

설명

사용예시

ST_Equals

두 인스턴스가 동일하면 1, 아니면 0 반환

SELECT ST_Equals(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geom) FROM SPATIAL_TABLE

ST_Disjoint

두 인스턴스가 겹치는 부분이 없으면 1, 아니면 0 반환

SELECT ST_Disjoint(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geom) FROM SPATIAL_TABLE

ST_Intersects

두 인스턴스간의 관계가 존재하면 1, 아니면 0 반환

SELECT ST_Intersects(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geom) FROM SPATIAL_TABLE

ST_Touches

두 인스턴스가 한 점에서 만나면 1, 아니면 0 반환

SELECT ST_Touches(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geom) FROM SPATIAL_TABLE

ST_Within

한 인스턴스가 다른 인스턴스에 완전히 포함되면 1, 아니면 0 반환

SELECT ST_Within(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geom) FROM SPATIAL_TABLE

ST_Contains

한 인스턴스가 다른 인스턴스를 완전히 포함하면 1, 아니면 0 반환

SELECT ST_Contains(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geom) FROM SPATIAL_TABLE

ST_Overlaps

두 인스턴스가 부분적으로 겹치면 1, 아니면 0 반환

SELECT ST_Overlaps(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geom) FROM SPATIAL_TABLE

3.2.3. 공간 분석 함수

함수명

설명

사용예시

ST_Distance

두 인스턴스간 최단거리 반환

SELECT ST_Distance(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’), geometry) FROM SPATIAL_TABLE

ST_Buffer

인스턴스를 일정한 크기만큼 확장한 결과 반환

SELECT ST_Buffer(geom, 5) FROM SPATIAL_TABLE

ST_ConvexHull

인스턴스의 ConvexHull 반환

SELECT ST_ConvexHull(geom) FROM SPATIAL_TABLE

ST_Intersection

두 인스턴스의 겹치는 부분 반환

SELECT ST_Intersection(geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’) FROM SPATIAL_TABLE

ST_Union

두 인스턴스를 합한 결과 반환

SELECT ST_Union(geom, geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’) FROM SPATIAL_TABLE

ST_Difference

한 인스턴스에서 다른 인스턴스를 뺀 결과 반환

SELECT ST_Difference(geom, geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’) FROM SPATIAL_TABLE

ST_SymDifference

두 인스턴스의 Union에서 Intersection을 뺀 결과 반환 (대칭 차집합)

SELECT ST_SymDifference(geom, geomfromtext(‘POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))’) FROM SPATIAL_TABLE

3.3. CREATE TABLE

공간 데이터를 저장할 공간 테이블은 다음과 같이 생성합니다.

CREATE TABLE SPATIAL_TABLE (
   k         TEXT,
   p         TEXT,
   geom      GEOMETRY(SRID=4326)
)
datascope       LOCAL
ramexpire       30
diskexpire      34200
partitionkey    k
partitiondate   p
partitionrange  10
extension       geospatial
;

공간 데이터 타입으로는 POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMCOLLECTION을 사용할 수 있습니다.

특정 타입을 구분하지 않고 모든 공간 데이터를 저장하고싶다면 GEOMETRY타입을 사용하시면 됩니다.

srid는 컬럼 옵션을 통해 설정할 수 있으며, 설정하지 않는다면 Default는 4326입니다.

테이블 생선 옵션에 extension geospatial 옵션을 추가하면 됩니다.

3.4. INSERT

공간 데이터는 다음과 같이 삽입합니다.

INSERT INTO SPATIAL_TABLE (k, p, geom) VALUES ('k7', '20181122000000', 'POINT(60 60)');

INSERT INTO SPATIAL_TABLE (k, p, geom) VALUES ('k7', '20181122000000', 'POINT(60 60)', 'POLYGON((10 10, 30 10, 30 30, 10 30, 10 10))' );

3.5. SELECT

공간 데이터를 조회하기 위해서는 일반 SELECT문법에 공간 함수를 추가해 쿼리하면 됩니다.

각 공간 함수에 대한 사용 예제는 “2.2 공간 함수” 의 표에 기술되어있습니다.