Loading...
MySQL 9.5 Reference Manual 9.5의 13.4.3 Supported Spatial Data Formats의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Query에서 geometry object를 표현하기 위해 두 개의 표준 공간 데이터 형식이 사용됩니다:
Well-Known Text (WKT) format
Well-Known Binary (WKB) format
내부적으로, MySQL은 geometry 값을 WKT나 WKB format과 동일하지 않은 형식으로 저장합니다. (내부 형식은 WKB와 비슷하지만, 처음 4 bytes가 SRID를 나타냅니다.)
다른 데이터 형식 사이를 변환하기 위한 함수들이 제공됩니다. Section 14.16.6, “Geometry Format Conversion Functions”을 참조하십시오.
다음 절에서는 MySQL이 사용하는 공간 데이터 형식을 설명합니다:
Geometry 값의 Well-Known Text (WKT) 표현은 ASCII 형식으로 geometry 데이터를 교환하기 위해 설계되었습니다. OpenGIS 명세는 WKT 값을 작성하기 위한 형식적 생성 규칙을 명시하는 Backus-Naur 문법을 제공합니다(Section 13.4, “Spatial Data Types” 참조).
Geometry object의 WKT 표현 예시는 다음과 같습니다:
Point:POINT(15 20)
Point 좌표는 쉼표 없이 지정됩니다. 이는 좌표 사이에 쉼표가 필요한 SQL Point() 함수의 구문과 다릅니다. 주어진 공간 연산의 컨텍스트에 적합한 구문을 사용하도록 주의하십시오. 예를 들어, 다음 구문은 둘 다 ST_X()를 사용하여 Point object에서 X 좌표를 추출합니다. 첫 번째는 Point() 함수를 사용하여 object를 직접 생성합니다. 두 번째는 WKT 표현을 ST_GeomFromText()를 사용해 Point로 변환합니다.
1mysql> SELECT ST_X(Point(15, 20)); 2+---------------------+ 3| ST_X(POINT(15, 20)) | 4+---------------------+ 5| 15 | 6+---------------------+ 7 8mysql> SELECT ST_X(ST_GeomFromText('POINT(15 20)')); 9+---------------------------------------+ 10| ST_X(ST_GeomFromText('POINT(15 20)')) | 11+---------------------------------------+ 12| 15 | 13+---------------------------------------+
LineString:LINESTRING(0 0, 10 10, 20 25, 50 60)
Point 좌표 쌍은 쉼표로 구분됩니다.
Polygon:POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
Point 값을 가진 MultiPoint:MULTIPOINT(0 0, 20 20, 60 60)
ST_MPointFromText() 및 ST_GeomFromText()와 같이 WKT 형식의 MultiPoint 값 표현을 허용하는 공간 함수들은 값 내부의 개별 point가 괄호로 둘러싸이는 것을 허용합니다. 예를 들어, 다음 두 함수 호출은 모두 유효합니다:
1ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') 2ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')
LineString 값을 가진 MultiLineString:MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
Polygon 값을 가진 MultiPolygon:MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
Point 값과 하나의 LineString으로 구성된 GeometryCollection:GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
Geometry 값의 Well-Known Binary (WKB) 표현은 geometry 데이터를 기하 WKB 정보를 포함하는 BLOB 값으로 표현되는 이진 스트림으로 교환하기 위해 사용됩니다. 이 형식은 OpenGIS 명세에 의해 정의됩니다(Section 13.4, “Spatial Data Types” 참조). 또한 ISO SQL/MM Part 3: Spatial 표준에서도 정의됩니다.
WKB는 1-byte 부호 없는 정수, 4-byte 부호 없는 정수, 8-byte 배정밀도 수(IEEE 754 형식)를 사용합니다. 1 byte는 8 bit입니다.
예를 들어, POINT(1 -1)에 해당하는 WKB 값은 각각 두 개의 16진수 숫자로 표현되는 21개의 byte로 이루어진 다음 시퀀스로 구성됩니다:
0101000000000000000000F03F000000000000F0BF
이 시퀀스는 다음 표에 나와 있는 구성 요소로 구성됩니다.
Table 13.2 WKB Components Example
| Component | Size | Value |
|---|---|---|
| Byte order | 1 byte | 01 |
| WKB type | 4 bytes | 01000000 |
| X coordinate | 8 bytes | 000000000000F03F |
| Y coordinate | 8 bytes | 000000000000F0BF |
구성 요소 표현은 다음과 같습니다:
Byte order indicator는 리틀 엔디언 또는 빅 엔디언 저장을 나타내기 위해 1 또는 0입니다. 리틀 엔디언과 빅 엔디언 byte order는 각각 Network Data Representation (NDR)과 External Data Representation (XDR)로도 알려져 있습니다.
WKB type은 geometry type을 나타내는 코드입니다. MySQL은 Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection을 나타내기 위해 1에서 7까지의 값을 사용합니다.
Point 값은 각각 배정밀도 값으로 표현되는 X와 Y 좌표를 가집니다.
보다 복잡한 geometry 값의 WKB 값은 OpenGIS 명세에 자세히 설명된 것처럼 더 복잡한 데이터 구조를 가집니다.
MySQL은 geometry 값을 SRID를 나타내는 4 bytes와 그 뒤에 값의 WKB 표현을 사용하여 저장합니다. WKB 형식에 대한 설명은 Well-Known Binary (WKB) Format을 참조하십시오.
WKB 부분에 대해서는 다음과 같은 MySQL 고유의 사항이 적용됩니다:
Byte-order indicator byte는 1입니다. 이는 MySQL이 geometry를 리틀 엔디언 값으로 저장하기 때문입니다.
MySQL은 Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection geometry type을 지원합니다. 다른 geometry type은 지원되지 않습니다.
빈 값이 될 수 있는 것은 GeometryCollection뿐입니다. 이러한 값은 요소 0개로 저장됩니다.
Polygon ring은 시계 방향과 반시계 방향 모두로 지정할 수 있습니다. MySQL은 데이터를 읽을 때 ring을 자동으로 뒤집습니다.
Cartesian 좌표는 공간 참조 시스템의 길이 단위로 저장되며, X 값은 X 좌표에, Y 값은 Y 좌표에 저장됩니다. 축 방향은 공간 참조 시스템에서 지정된 방향입니다.
Geographic 좌표는 공간 참조 시스템의 각도 단위로 저장되며, 경도는 X 좌표에, 위도는 Y 좌표에 저장됩니다. 축 방향과 기준 자오선은 공간 참조 시스템에서 지정된 값입니다.
LENGTH() 함수는 값 저장에 필요한 byte 단위 공간을 반환합니다. 예:
1mysql> SET @g = ST_GeomFromText('POINT(1 -1)'); 2mysql> SELECT LENGTH(@g); 3+------------+ 4| LENGTH(@g) | 5+------------+ 6| 25 | 7+------------+ 8mysql> SELECT HEX(@g); 9+----------------------------------------------------+ 10| HEX(@g) | 11+----------------------------------------------------+ 12| 000000000101000000000000000000F03F000000000000F0BF | 13+----------------------------------------------------+
값 길이는 다음 구성 요소로 구성된 25 byte입니다(16진수 값에서 확인할 수 있습니다):
정수 SRID(0)에 대한 4 bytes
정수 byte order(1 = 리틀 엔디언)에 대한 1 byte
정수 type 정보(1 = Point)에 대한 4 bytes
배정밀도 X 좌표(1)에 대한 8 bytes
배정밀도 Y 좌표(−1)에 대한 8 bytes
13.4.2 The OpenGIS Geometry Model
13.4.4 Geometry Well-Formedness and Validity