공간 쿼리 사용하기 ============================= 공간 데이터 타입 --------------- 공간데이터 표기법은 OGC(Open Geospatial Consortium) 표준을 따르며, 다음과 같은 규칙을 가집니다. POINT ^^^^^^^^^^ :: POINT(10 10) POINT(20 20) LINESTRING ^^^^^^^^^^ :: LINESTRING (10 10, 20 20) LINESTRING (10 10, 20 20, 30 30) POLYGON ^^^^^^^^^^ :: POLYGON((10 10, 20 20, 30 30, 10 10)) POLYGON((10 10, 1024 2048, 1000 200, 500 500, 25 25, 10 10)) MULTIPOINT ^^^^^^^^^^ :: MULTIPOINT(10 10, 20 20, 30 30, 20 40, 100 200) MULTILINESTRING ^^^^^^^^^^^^^^^^^^^^ :: MULTILINESTRING((10 10, 20 20, 30 30),(10 20, 30 40, 50 60)) MULTIPOLYGON ^^^^^^^^^^^^^^^^^^^^ :: MULTIPOLYGON(((10 10, 20 20, 30 30, 10 10)), ((10 20, 30 40, 50 60, 10 20))) 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 사용 방법과 큰 차이가 없으며, 지원하는 옵션이나 함수에서 약간의 차이가 있습니다. 공간 함수 ---------------- IRIS 공간DB에서 지원하는 함수 목록입니다. 공간데이터 타입과 마찬가지로 OGC(Open Geospatial Consortium) 표준을 따릅니다. 공간 함수는 크게 기본 함수, 관계 함수, 분석 함수 세 가지 타입으로 나뉩니다. 공간 기본 함수 ^^^^^^^^^^^^^^ 공간 기본함수는 단일 공간 데이터에 대한 정보를 출력합니다. 인자로 공간 데이터 한개를 받아서 타입, 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 | +--------------------+---------------------------------------------------------+-----------------------------------------------------+ 공간 관계 함수 ^^^^^^^^^^^^^^ 공간 관계 함수는 이름 그대로 공간 데이터간의 관계를 판단하는 역할을 합니다. 예를들어 두 공간 데이터가 겹치는지, 혹은 한 점에서 만나는지 등의 여부를 계산하고, 그 결과를 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 | +------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ 공간 분석 함수 ^^^^^^^^^^^^^^ +---------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+ | 함수명 | 설명 | 사용예시 | +=====================+=====================================================================+=============================================================================================================+ | 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 | +---------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+ CREATE TABLE ---------------- 공간 데이터를 저장할 공간 테이블은 다음과 같이 생성합니다. .. code:: sql 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 옵션을 추가하면 됩니다. INSERT ---------- 공간 데이터는 다음과 같이 삽입합니다. .. code:: sql 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))' ); SELECT ---------- 공간 데이터를 조회하기 위해서는 일반 SELECT문법에 공간 함수를 추가해 쿼리하면 됩니다. 각 공간 함수에 대한 사용 예제는 "2.2 공간 함수" 의 표에 기술되어있습니다.