MySQL 8.0에서 추가된 모든 기능

MySQL 8.0에서 추가된 모든 기능 – GIS

Estimated reading: 5 minutes 51 views

1. 공간 참조 시스템(SRS)

[원본제공링크 1 2 3 4]

공간 참조 시스템(Spatial Reference Systems)은 지리 데이터에서 위치를 정의하기 위한 좌표계와 투영법을 포함하는 시스템입니다. MySQL 8.0에서는 SRS를 지원하여 지리 공간 데이터를 정확하게 저장하고 처리할 수 있습니다. 표준 SRID(Spatial Reference System Identifier)를 사용하여 지리 데이터를 특정 좌표계로 관리할 수 있습니다.

예시:

CREATE TABLE locations (
    id INT PRIMARY KEY,
    geom GEOMETRY NOT NULL SRID 4326
);

이 예시에서는 SRID 4326(WGS 84 좌표계)을 사용하는 geom 컬럼을 생성합니다.

2. CREATE SPATIAL REFERENCE SYSTEM 문

[원본제공링크 1 2]

MySQL 8.0부터 CREATE SPATIAL REFERENCE SYSTEM 명령문을 사용하여 사용자 정의 공간 참조 시스템(SRS)을 생성할 수 있습니다. 이 명령문은 새로운 SRID와 해당 좌표 체계를 정의하며, 기존 SRS와의 호환성을 유지하면서도 프로젝트나 애플리케이션 요구 사항에 맞는 커스터마이징된 SRS를 추가할 수 있게 해줍니다.
생성에 SUPER 권한이 필요하여 AWS RDS등 클라우드의 관리형 MySQL에서는 사용할 수 없습니다.

예시:

CREATE SPATIAL REFERENCE SYSTEM 123212321
NAME 'Minhang SRS'
DEFINITION 'PROJCS["Anguilla 1957 / British West Indies Grid",GEOGCS["Anguilla 1957",DATUM["Anguilla 1957",SPHEROID["Clarke 1880 (RGS)",6378249.145,293.465,AUTHORITY["EPSG","7012"]],AUTHORITY["EPSG","6600"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943278,AUTHORITY["EPSG","9122"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY["EPSG","4600"]],PROJECTION["Transverse Mercator",AUTHORITY["EPSG","9807"]],PARAMETER["Latitude of natural origin",0,AUTHORITY["EPSG","8801"]],PARAMETER["Longitude of natural origin",-62,AUTHORITY["EPSG","8802"]],PARAMETER["Scale factor at natural origin",0.9995,AUTHORITY["EPSG","8805"]],PARAMETER["False easting",400000,AUTHORITY["EPSG","8806"]],PARAMETER["False northing",0,AUTHORITY["EPSG","8807"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["E",EAST],AXIS["N",NORTH],AUTHORITY["EPSG","2000"]]'
DESCRIPTION '사용자 정의 공간 참조 시스템';

3. DROP SPATIAL REFERENCE SYSTEM 문

[원본제공링크 1]

DROP SPATIAL REFERENCE SYSTEM 문은 기존에 생성된 사용자 정의 SRS를 삭제합니다. 이를 통해 더 이상 필요하지 않은 SRS를 관리할 수 있습니다.

예시:

DROP SPATIAL REFERENCE SYSTEM 123212321;

4. SRID 타입 수정자

[원본제공링크 1 2]

MySQL 8.0부터 공간 데이터 타입의 컬럼에 SRID 타입 수정자(SRID Type Modifier)를 지정하여 해당 컬럼에 저장되는 공간 데이터의 공간 참조 시스템(SRS)을 명시적으로 설정할 수 있습니다. 이를 통해 특정 SRID를 강제하여 데이터의 일관성을 유지하고, 공간 인덱스의 최적화를 도모할 수 있습니다.

예시:

CREATE TABLE roads (
    id INT PRIMARY KEY,
    geom LINESTRING SRID 123212321
);

이 예시에서는 geom 컬럼에 SRID 123212321(위에서 생성한 사용자 정의 SRS)을 지정합니다. DROP까지 적용한 상태라면 “ERROR 3548 (SR001): There’s no spatial reference system with SRID 123212321.”라는 에러 발생합니다.

5. 지리적 R-트리

[원본제공링크 1] [다른참고할만한링크 1]

MySQL 8.0부터는 공간 데이터의 효율적인 저장과 검색을 위해 R-트리(R-Tree) 자료구조를 활용한 SPATIAL 인덱스를 지원합니다. 이는 특히 지리적 정보 시스템(GIS)에서의 위치 기반 서비스 구현에 유용합니다.

R-트리(R-Tree)란?
R-트리는 다차원 공간 데이터를 인덱싱하기 위한 트리 구조로, 2차원 이상의 공간 정보를 효율적으로 관리합니다. 각 객체를 감싸는 최소 경계 사각형(MBR, Minimum Bounding Rectangle)을 이용하여 계층적으로 데이터를 구성하며, 이는 공간 검색 시 효율성을 높입니다.

예시:

CREATE TABLE geom (
    g GEOMETRY NOT NULL SRID 4326,
    SPATIAL INDEX(g)
);

이 예시에서는 g 컬럼에 대해 SPATIAL INDEX를 생성하여 공간 검색을 최적화합니다.

6. 신규 setter 함수 ST_SRID(geometry, new_srid)

[원본제공링크 1]

MySQL ST_SRID(geometry, new_srid) 함수는 공간 객체의 SRID(Spatial Reference System Identifier)를 새로운 값으로 설정한 새로운 공간 객체를 반환합니다. 이 함수는 좌표계를 변경하지 않고, SRID 값만 바꿉니다.

예시:

-- 현재 SRID 확인
SELECT ST_SRID(geom) AS current_srid
FROM geom_table;

-- SRID 변경
UPDATE geom_table
SET geom = ST_SRID(geom, 4326)
WHERE ST_SRID(geom) = 0;
참고
-- 현재 SRID 확인
mysql> SELECT ST_SRID(geom) AS current_srid
    -> FROM geom_table;
+--------------+
| current_srid |
+--------------+
|            0 |
|         4326 |
|            0 |
+--------------+
3 rows in set (0.00 sec)


-- SRID 변경
mysql> UPDATE geom_table
    -> SET geom = ST_SRID(geom, 4326)
    -> WHERE ST_SRID(geom) = 0;
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2  Changed: 2  Warnings: 0

-- 다시 SRID 확인 
mysql> SELECT ST_SRID(geom) AS current_srid
    -> FROM geom_table;
+--------------+
| current_srid |
+--------------+
|         4326 |
|         4326 |
|         4326 |
+--------------+
3 rows in set (0.00 sec)

7. 신규 setter 함수 ST_X(geometry, new_x)

[원본제공링크 1]

ST_X 함수POINT 객체의 X 좌표값을 설정합니다. 이를 통해 점의 위치를 변경할 수 있습니다.

예시:

SET @point = ST_PointFromText('POINT(10 20)', 4326);
SET @new_point = ST_X(@point, 15);

이 예시에서는 @point의 X 좌표를 15로 변경합니다.

8. 신규 setter 함수 ST_Y(geometry, new_y)

[원본제공링크 1]

ST_Y 함수POINT 객체의 Y 좌표값을 설정합니다. 이를 통해 점의 위치를 변경할 수 있습니다.

예시:

SET @point = ST_PointFromText('POINT(10 20)', 4326);
SET @new_point = ST_Y(@point, 25);

이 예시에서는 @point의 Y 좌표를 25로 변경합니다.

9. 신규 함수 ST_SwapXY

[원본제공링크 1]

ST_SwapXY 함수공간 객체의 X와 Y 좌표를 서로 교환합니다. 이를 통해 좌표계 변환이나 데이터 오류 수정 시 유용하게 사용할 수 있습니다.

예시:

SET @geom = ST_GeomFromText('LINESTRING(10 20, 30 40)', 4326);
SET @swapped_geom = ST_SwapXY(@geom);

이 예시에서는 @geom의 모든 점에 대해 X와 Y 좌표를 교환합니다.

10. 신규 함수 ST_Latitude

[원본제공링크 1]

ST_Latitude 함수POINT 객체의 위도(Y 좌표)를 반환합니다. 지리적 좌표계에서 위도 값을 쉽게 얻을 수 있습니다.

예시:

SELECT ST_Latitude(ST_PointFromText('POINT(37.5665 126.9780)', 4326)) AS latitude;

이 예시는 서울의 위도 37.5665를 반환합니다.

11. 신규 함수 ST_Longitude

[원본제공링크 1]

ST_Longitude 함수POINT 객체의 경도(X 좌표)를 반환합니다. 지리적 좌표계에서 경도 값을 쉽게 얻을 수 있습니다.

예시:

SELECT ST_Longitude(ST_PointFromText('POINT(37.5665 126.9780)', 4326)) AS longitude;

이 예시는 서울의 경도 126.9780을 반환합니다.

12. 신규 함수 ST_Transform

[원본제공링크 1]

ST_Transform 함수공간 객체를 다른 SRID로 변환합니다. 이를 통해 서로 다른 좌표계를 사용하는 공간 데이터를 일치시킬 수 있습니다.

예시:

SET @geom = ST_GeomFromText('POINT(37.5665 126.9780)', 4326);
SET @transformed_geom = ST_Transform(@geom, 3857);

이 예시는 WGS 84 좌표계(SRID 4326)의 점을 Web Mercator 투영(SRID 3857)으로 변환합니다.

13. ST_Distance, ST_Contains, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within, MBRContains, MBRCoveredBy, MBRCovers, MBRDisjoint, MBREquals, MBRIntersects, MBROverlaps, MBRTouches, MBRWithin, ST_IsSimple, ST_IsValid, ST_Length, ST_Validate, ST_Area의 지리 지원

[원본제공링크 1 2 3 4 5 6 7 8]

MySQL 8.0부터는 지리적 공간 참조 시스템(SRS)을 활용한 공간 데이터 처리가 가능해졌습니다. MySQL 8.0에서는 ST_Distance, ST_Contains, ST_Intersects 등 여러 공간 함수들이 지리적 좌표계(SRID 4326 등)를 지원합니다. 이전 버전에서는 SRID가 지정되더라도 모든 연산이 단순한 평면 좌표계(Cartesian)로 처리되었습니다. 하지만 8.0 버전에서는 SRID에 따라 지리적 좌표계를 인식하고, 이에 맞는 정확한 공간 연산을 수행합니다.

예시:

SELECT ST_Distance(
    ST_GeomFromText('POINT(37.5665 126.9780)', 4326),
    ST_GeomFromText('POINT(37.4979 127.0276)', 4326)
) AS distance_in_meters;

이 예시는 서울의 두 지점 간의 거리를 미터 단위로 계산합니다.

14. ST_Distance_Sphere 함수의 지리적 지오메트리 지원

[원본제공링크 1]

ST_Distance_Sphere() 함수는 두 지리적 지오메트리(Point 또는 MultiPoint) 간의 구면 거리를 미터 단위로 계산합니다. 이 함수는 지리적 좌표계를 고려하여 두 지점 사이의 최단 거리를 정확하게 측정하는 데 유용합니다.

예시:

SELECT ST_Distance_Sphere(
    ST_GeomFromText('POINT(126.9780 37.5665)'),
    ST_GeomFromText('POINT(127.0276 37.4979)')
) AS approx_distance;

15. 모든 지오메트리 유형 간의 타원체 기반 거리 계산 ST_Distance

[원본제공링크 1]

MySQL 8.0.18부터 ST_Distance() 함수는 지리적 공간 참조 시스템(SRS)을 사용하는 모든 지오메트리 유형 간의 거리를 타원체(지구의 실제 형태)를 기반으로 정확하게 계산할 수 있습니다. 이로 인해 포인트, 라인스트링, 폴리곤 등 다양한 지오메트리 간의 실제 지표면 거리를 보다 정밀하게 측정할 수 있습니다.

예시:

SELECT ST_Distance(
    ST_GeomFromText('POINT(37.5665 126.9780)', 4326),
    ST_GeomFromText('LINESTRING(37.5 127.0, 37.6 127.1)', 4326)
) AS distance;

16. GEOMCOLLECTION을 GEOMETRYCOLLECTION의 동의어로

[원본제공링크 1 2 3]

GEOMCOLLECTION은 이제 GEOMETRYCOLLECTION의 동의어로 사용됩니다. 이는 표준화된 용어를 지원하기 위한 변경이며, GEOMCOLLECTION이 표준에 부합하는 선호되는 명칭입니다. 기존의 GEOMCOLLECTION 사용은 계속 유효합니다.

허나, 매뉴얼에 따르면 둘이 동의어로 완전히 같은 기능을 하는 것 처럼 나와있지만, 실제로는 다르게 동작하는 것 같습니다. 같은 구문이 GEOMCOLLECTION쪽에서만 에러가 발생합니다. Release Note에도 GEOMCOLLECTION에 대한 언급이 없고하여 정확한 원인은 알기 어렵습니다만, 그냥 GEOMETRYCOLLECTION쪽을 사용하여야 될 것 같습니다.

예시:

mysql> SET @geom1 = ST_GeomFromText('GEOMCOLLECTION(POINT(126.9780 37.5665), LINESTRING(126.9760 37.5650, 126.9800 37.5670))');
ERROR 3037 (22023): Invalid GIS data provided to function st_geomfromtext.
mysql> SELECT ST_AsText(@geom1) AS geom1_text;
+------------+
| geom1_text |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

mysql> SET @geom2 = ST_GeomFromText('GEOMETRYCOLLECTION(POINT(126.9780 37.5665), LINESTRING(126.9760 37.5650, 126.9800 37.5670))');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT ST_AsText(@geom2) AS geom2_text;
+-------------------------------------------------------------------------------------+
| geom2_text                                                                          |
+-------------------------------------------------------------------------------------+
| GEOMETRYCOLLECTION(POINT(126.978 37.5665),LINESTRING(126.976 37.565,126.98 37.567)) |
+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

17. R-tree 인덱스 절에서 선택적 SPATIAL 키워드

[원본제공링크 1]

R-트리 인덱스를 생성할 때 SPATIAL 키워드가 선택사항이 되었습니다. 즉, 공간 컬럼에 인덱스를 생성할 때 SPATIAL 키워드를 명시하지 않아도 자동으로 R-트리(R-tree) 인덱스가 생성됩니다.

예시:

-- SPATIAL 키워드를 명시적으로 사용하는 경우
CREATE SPATIAL INDEX idx ON geom (g);

-- SPATIAL 키워드를 생략한 경우
CREATE INDEX idx ON geom (g);
-- 생략해도 SPATIAL로 생성 됨 = SPATIAL KEY `idx` (`g`)

18. ST_Distance() 함수에서 길이 단위 지정 기능

[원본제공링크 1]

ST_Distance() 함수는 두 지오메트리 간의 거리를 계산할 때 선택적으로 거리 단위를 지정할 수 있는 세 번째 인자를 지원합니다. 이를 통해 결과를 원하는 단위(예: 미터, 피트)로 얻을 수 있습니다.

예시:

-- 두 지점 간의 거리를 미터 단위(기본값)로 계산
SELECT ST_Distance(
    ST_GeomFromText('POINT(1 1)', 4326),
    ST_GeomFromText('POINT(2 2)', 4326)
) AS distance_in_meters;

-- 두 지점 간의 거리를 피트 단위로 계산
SELECT ST_Distance(
    ST_GeomFromText('POINT(1 1)', 4326),
    ST_GeomFromText('POINT(2 2)', 4326),
    'foot'
) AS distance_in_feet;

19. ST_Length() 함수에서 길이 단위 지정 가능

[원본제공링크 1]

ST_Length() 함수에서도 길이 단위를 지정하여 선의 길이를 원하는 단위로 계산할 수 있습니다.

예시:

-- 미터 단위(기본값)로 LINESTRING의 길이 계산
SET @ls = ST_GeomFromText('LINESTRING(1 1, 2 2, 3 3)', 4326);
SELECT ST_Length(@ls) AS length_in_meters;

-- 피트 단위로 LINESTRING의 길이 계산
SELECT ST_Length(@ls, 'foot') AS length_in_feet;

Leave a Comment



이 문서 공유

MySQL 8.0에서 추가된 모든 기능 – GIS

링크 복사

CONTENTS