Loading...
MySQL 9.5 Reference Manual 9.5의 14.16.8 Spatial Operator Functions의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
OpenGIS는 지오메트리를 생성할 수 있는 여러 함수를 제안합니다. 이들은 공간 연산자를 구현하도록 설계되었습니다. 이 함수들은 Open Geospatial Consortium 명세에 따라 적용 불가능한 조합을 제외한 모든 인수 타입 조합을 지원합니다.
MySQL은 함수 설명에 명시된 대로 OpenGIS의 확장에 해당하는 특정 함수들도 구현합니다. 추가로, Section 14.16.7, “Geometry Property Functions”에서는 기존 지오메트리로부터 새로운 지오메트리를 구성하는 여러 함수를 설명합니다. 이러한 함수들에 대한 설명은 해당 섹션을 참고하십시오:
별도로 명시되지 않는 한, 이 섹션의 함수들은 지오메트리 인수를 다음과 같이 처리합니다:
어떤 인수라도 NULL이면, 반환값은 NULL입니다.
어떤 지오메트리 인수라도 문법적으로 올바르게 구성된 지오메트리가 아니면, ER_GIS_INVALID_DATA 오류가 발생합니다.
어떤 지오메트리 인수라도 정의되지 않은 공간 참조 시스템(SRS)에 속하는 문법적으로 올바르게 구성된 지오메트리이면, ER_SRS_NOT_FOUND 오류가 발생합니다.
둘 이상의 지오메트리 인수를 받는 함수에서, 해당 인수들이 동일한 SRS에 속하지 않으면, ER_GIS_DIFFERENT_SRIDS 오류가 발생합니다.
어떤 지오메트리 인수라도 지리적 SRS에 대한 SRID 값을 가지는데 함수가 지리적 지오메트리를 처리하지 않으면, ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 오류가 발생합니다.
지리적 SRS 지오메트리 인수에 대해, 어떤 인수라도 범위를 벗어난 경도 또는 위도를 가지면 오류가 발생합니다:
경도 값이 범위 (−180, 180]에 속하지 않으면, ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 오류가 발생합니다.
위도 값이 범위 [−90, 90]에 속하지 않으면, ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 오류가 발생합니다.
표시된 범위는 도 단위입니다. 어떤 SRS가 다른 단위를 사용하면, 그 범위는 해당 단위에 상응하는 값들을 사용합니다. 부동소수점 연산으로 인해 정확한 범위 한계는 약간씩 달라질 수 있습니다.
NULL입니다.다음 공간 연산자 함수들을 사용할 수 있습니다:
지오메트리 값 g 로부터의 거리가 d 이하인 모든 점을 나타내는 지오메트리를 반환합니다. 결과는 지오메트리 인수와 동일한 SRS에 속합니다.
지오메트리 인수가 empty이면, ST_Buffer()는 empty 지오메트리를 반환합니다.
distance가 0이면, ST_Buffer()는 지오메트리 인수를 변경 없이 반환합니다:
1mysql> SET @pt = ST_GeomFromText('POINT(0 0)'); 2mysql> SELECT ST_AsText(ST_Buffer(@pt, 0)); 3+------------------------------+ 4| ST_AsText(ST_Buffer(@pt, 0)) | 5+------------------------------+ 6| POINT(0 0) | 7+------------------------------+
지오메트리 인수가 카르테시안 SRS에 속하는 경우:
ST_Buffer()는 Polygon 및 MultiPolygon 값, 그리고 Polygon 또는 MultiPolygon 값을 포함하는 지오메트리 컬렉션에 대해 음수 distance를 지원합니다.
결과가 너무 줄어들어 사라지는 경우, 결과는 empty 지오메트리입니다.
Point, MultiPoint, LineString, MultiLineString 값, 그리고 어떤 Polygon 또는 MultiPolygon 값도 포함하지 않는 지오메트리 컬렉션에 대해 음수 distance를 사용하는 ST_Buffer()에 대해서는 ER_WRONG_ARGUMENTS 오류가 발생합니다.
지리적 SRS에 속하는 Point 지오메트리는 다음 조건에 따라 허용됩니다:
distance가 음수가 아니고 strategy가 지정되지 않은 경우, 함수는 해당 SRS에서의 Point에 대한 지리적 버퍼를 반환합니다. distance 인수는 SRS의 거리 단위(현재는 항상 미터) 단위여야 합니다.
distance가 음수이거나 NULL 이외의 어떤 strategy라도 지정되면, ER_WRONG_ARGUMENTS 오류가 발생합니다.
Point가 아닌 지오메트리에 대해서는 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 오류가 발생합니다.
ST_Buffer()는 distance 인수 뒤에 최대 세 개의 선택적 strategy 인수를 허용합니다. strategy는 버퍼 계산에 영향을 줍니다. 이 인수들은 ST_Buffer_Strategy() 함수가 생성하는 바이트 문자열 값이며, point, join, end strategy에 사용됩니다:
point strategy는 Point 및 MultiPoint 지오메트리에 적용됩니다. point strategy가 지정되지 않으면 기본값은 ST_Buffer_Strategy('point_circle', 32) 입니다.
join strategy는 LineString, MultiLineString, Polygon, MultiPolygon 지오메트리에 적용됩니다. join strategy가 지정되지 않으면 기본값은 ST_Buffer_Strategy('join_round', 32) 입니다.
end strategy는 LineString 및 MultiLineString 지오메트리에 적용됩니다. end strategy가 지정되지 않으면 기본값은 ST_Buffer_Strategy('end_round', 32) 입니다.
각 타입마다 최대 하나의 strategy만 지정할 수 있으며, 이들은 어떤 순서로든 제공될 수 있습니다.
버퍼 strategy가 유효하지 않으면 ER_WRONG_ARGUMENTS 오류가 발생합니다. strategy가 invalid한 경우는 다음과 같습니다:
특정 타입(point, join, end)에 대해 여러 개의 strategy가 지정된 경우.
임의의 바이너리 문자열이나 숫자처럼 strategy가 아닌 값이 strategy로 전달된 경우.
point strategy가 전달되었는데 지오메트리에 Point 또는 MultiPoint 값이 전혀 포함되지 않은 경우.
end 또는 join strategy가 전달되었는데 지오메트리에 LineString, Polygon, MultiLinestring 또는 MultiPolygon 값이 전혀 포함되지 않은 경우.
1mysql> SET @pt = ST_GeomFromText('POINT(0 0)'); 2mysql> SET @pt_strategy = ST_Buffer_Strategy('point_square'); 3mysql> SELECT ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)); 4+--------------------------------------------+ 5| ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)) | 6+--------------------------------------------+ 7| POLYGON((-2 -2,2 -2,2 2,-2 2,-2 -2)) | 8+--------------------------------------------+
1mysql> SET @ls = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)'); 2mysql> SET @end_strategy = ST_Buffer_Strategy('end_flat'); 3mysql> SET @join_strategy = ST_Buffer_Strategy('join_round', 10); 4mysql> SELECT ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy)) 5+---------------------------------------------------------------+ 6| ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy)) | 7+---------------------------------------------------------------+ 8| POLYGON((5 5,5 10,0 10,-3.5355339059327373 8.535533905932738, | 9| -5 5,-5 0,0 0,5 0,5 5)) | 10+---------------------------------------------------------------+
이 함수는 버퍼 계산에 영향을 주기 위해 ST_Buffer()와 함께 사용할 strategy 바이트 문자열을 반환합니다.
strategy에 대한 정보는 Boost.org에서 확인할 수 있습니다.
첫 번째 인수는 strategy 옵션을 나타내는 문자열이어야 합니다:
point strategy에 대해 허용되는 값은 'point_circle' 및 'point_square' 입니다.
join strategy에 대해 허용되는 값은 'join_round' 및 'join_miter' 입니다.
end strategy에 대해 허용되는 값은 'end_round' 및 'end_flat' 입니다.
첫 번째 인수가 'point_circle', 'join_round', 'join_miter', 'end_round' 인 경우, points_per_circle 인수는 양수 숫자 값으로 제공되어야 합니다. 최대 points_per_circle 값은 max_points_in_geometry 시스템 변수의 값입니다.
예시는 ST_Buffer() 설명을 참고하십시오.
ST_Buffer_Strategy()는 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리하되, 다음과 같은 예외가 있습니다:
어떤 인수라도 invalid이면, ER_WRONG_ARGUMENTS 오류가 발생합니다.
첫 번째 인수가 'point_square' 또는 'end_flat' 인 경우, points_per_circle 인수를 제공해서는 안 하며, 제공하면 ER_WRONG_ARGUMENTS 오류가 발생합니다.
지오메트리 값 g 의 convex hull을 나타내는 지오메트리를 반환합니다.
이 함수는 먼저 꼭짓점(point)들이 공선(colinear)인지 확인하여 지오메트리의 convex hull을 계산합니다. 그럴 경우 선형 hull을 반환하고, 그렇지 않으면 폴리곤 hull을 반환합니다. 이 함수는 지오메트리 컬렉션을 처리할 때 컬렉션의 모든 구성 요소에서 모든 꼭짓점(point)을 추출해 MultiPoint 값을 생성한 다음, 그 convex hull을 계산합니다.
ST_ConvexHull()은 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리하되, 다음 예외가 있습니다:
NULL입니다.1mysql> SET @g = 'MULTIPOINT(5 0,25 0,15 10,15 25)'; 2mysql> SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))); 3+-----------------------------------------------+ 4| ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))) | 5+-----------------------------------------------+ 6| POLYGON((5 0,25 0,15 25,5 0)) | 7+-----------------------------------------------+
지오메트리 값 g1 과 g2 의 점 집합 차이(point set difference)를 나타내는 지오메트리를 반환합니다. 결과는 지오메트리 인수와 동일한 SRS에 속합니다.
ST_Difference()는 카르테시안 또는 지리적 SRS 중 어느 쪽이든 인수를 허용하며, 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리합니다.
1mysql> SET @g1 = Point(1,1), @g2 = Point(2,2); 2mysql> SELECT ST_AsText(ST_Difference(@g1, @g2)); 3+------------------------------------+ 4| ST_AsText(ST_Difference(@g1, @g2)) | 5+------------------------------------+ 6| POINT(1 1) | 7+------------------------------------+
지오메트리 값 g1 과 g2 의 점 집합 교집합(point set intersection)을 나타내는 지오메트리를 반환합니다. 결과는 지오메트리 인수와 동일한 SRS에 속합니다.
ST_Intersection()는 카르테시안 또는 지리적 SRS 중 어느 쪽이든 인수를 허용하며, 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리합니다.
1mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)'); 2mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)'); 3mysql> SELECT ST_AsText(ST_Intersection(@g1, @g2)); 4+--------------------------------------+ 5| ST_AsText(ST_Intersection(@g1, @g2)) | 6+--------------------------------------+ 7| POINT(2 2) | 8+--------------------------------------+
이 함수는 LineString 지오메트리와 범위 [0.0, 1.0]의 분수 거리(fractional distance)를 받아, 시작점으로부터 endpoint까지 거리의 해당 비율 위치에 있는 Point를 LineString 상에서 반환합니다. 이는 지오메트리 인수로 표현되는 도로를 따라 어느 Point가 중간 지점에 위치하는지와 같은 질문에 답하기 위해 사용할 수 있습니다.
이 함수는 카르테시안 및 지리적을 포함한 모든 공간 참조 시스템의 LineString 지오메트리에 대해 구현되어 있습니다.
fractional_distance 인수가 1.0인 경우, 결과는 LineString 인수의 마지막 point와 정확히 일치하지 않고, 근사값 계산의 수치 부정확성 때문에 그 근처의 point일 수 있습니다.
관련 함수인 ST_LineInterpolatePoints()는 유사한 인수를 받지만, 시작점에서 endpoint까지 거리의 각 분수에서 LineString 상의 Point 값들로 구성된 MultiPoint를 반환합니다. 두 함수의 예시는 ST_LineInterpolatePoints() 설명을 참고하십시오.
ST_LineInterpolatePoint()는 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리하되, 다음과 같은 예외가 있습니다:
지오메트리 인수가 LineString이 아니면, ER_UNEXPECTED_GEOMETRY_TYPE 오류가 발생합니다.
fractional distance 인수가 범위 [0.0, 1.0] 밖이면, ER_DATA_OUT_OF_RANGE 오류가 발생합니다.
ST_LineInterpolatePoint()는 OpenGIS에 대한 MySQL 확장입니다.
이 함수는 LineString 지오메트리와 범위 (0.0, 1.0]의 분수 거리(fractional distance)를 받아, LineString의 시작점과, 시작점에서 endpoint까지 거리의 각 분수 위치에 있는 Point 값들로 구성된 MultiPoint를 반환합니다. 이는 지오메트리 인수로 표현되는 도로를 따라 매 10% 지점에 위치하는 Point 값이 무엇인지와 같은 질문에 답하기 위해 사용할 수 있습니다.
이 함수는 카르테시안 및 지리적을 포함한 모든 공간 참조 시스템의 LineString 지오메트리에 대해 구현되어 있습니다.
fractional_distance 인수가 1.0을 나눴을 때 나머지가 0이 되는 경우, 근사값 계산의 수치 부정확성 때문에 결과에 LineString 인수의 마지막 point가 아닌 그 근처의 point가 포함될 수 있습니다.
관련 함수인 ST_LineInterpolatePoint()는 유사한 인수를 받지만, 시작점에서 endpoint까지 거리의 해당 분수 위치에 있는 Point를 LineString 상에서 반환합니다.
ST_LineInterpolatePoints()는 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리하되, 다음과 같은 예외가 있습니다:
지오메트리 인수가 LineString이 아니면, ER_UNEXPECTED_GEOMETRY_TYPE 오류가 발생합니다.
fractional distance 인수가 범위 [0.0, 1.0] 밖이면, ER_DATA_OUT_OF_RANGE 오류가 발생합니다.
1mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)'); 2mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .5)); 3+----------------------------------------------+ 4| ST_AsText(ST_LineInterpolatePoint(@ls1, .5)) | 5+----------------------------------------------+ 6| POINT(0 5) | 7+----------------------------------------------+ 8mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .75)); 9+-----------------------------------------------+ 10| ST_AsText(ST_LineInterpolatePoint(@ls1, .75)) | 11+-----------------------------------------------+ 12| POINT(2.5 5) | 13+-----------------------------------------------+ 14mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, 1)); 15+---------------------------------------------+ 16| ST_AsText(ST_LineInterpolatePoint(@ls1, 1)) | 17+---------------------------------------------+ 18| POINT(5 5) | 19+---------------------------------------------+ 20mysql> SELECT ST_AsText(ST_LineInterpolatePoints(@ls1, .25)); 21+------------------------------------------------+ 22| ST_AsText(ST_LineInterpolatePoints(@ls1, .25)) | 23+------------------------------------------------+ 24| MULTIPOINT((0 2.5),(0 5),(2.5 5),(5 5)) | 25+------------------------------------------------+
ST_LineInterpolatePoints()는 OpenGIS에 대한 MySQL 확장입니다.
이 함수는 LineString 지오메트리와, LineString의 공간 참조 시스템(SRS) 단위로 측정한 범위 [0.0, ST_Length(ls)]의 distance를 받아, 시작점에서 해당 distance만큼 떨어진 위치에 있는 Point를 LineString 상에서 반환합니다. 이는 지오메트리 인수로 표현되는 도로의 시작점으로부터 400미터 떨어진 Point 값이 무엇인지와 같은 질문에 답하기 위해 사용할 수 있습니다.
이 함수는 카르테시안 및 지리적을 포함한 모든 공간 참조 시스템의 LineString 지오메트리에 대해 구현되어 있습니다.
ST_PointAtDistance()는 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리하되, 다음과 같은 예외가 있습니다:
지오메트리 인수가 LineString이 아니면, ER_UNEXPECTED_GEOMETRY_TYPE 오류가 발생합니다.
fractional distance 인수가 범위 [0.0, ST_Length(ls)] 밖이면, ER_DATA_OUT_OF_RANGE 오류가 발생합니다.
ST_PointAtDistance()는 OpenGIS에 대한 MySQL 확장입니다.
지오메트리 값 g1 과 g2 의 점 집합 대칭 차이(point set symmetric difference)를 나타내는 지오메트리를 반환합니다. 이는 다음과 같이 정의됩니다:
1g1 symdifference g2 := (g1 union g2) difference (g1 intersection g2)
또는, 함수 호출 표기법으로는 다음과 같습니다:
1ST_SymDifference(g1, g2) = ST_Difference(ST_Union(g1, g2), ST_Intersection(g1, g2))
결과는 지오메트리 인수와 동일한 SRS에 속합니다.
ST_SymDifference()는 카르테시안 또는 지리적 SRS 중 어느 쪽이든 인수를 허용하며, 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리합니다.
1mysql> SET @g1 = ST_GeomFromText('MULTIPOINT(5 0,15 10,15 25)'); 2mysql> SET @g2 = ST_GeomFromText('MULTIPOINT(1 1,15 10,15 25)'); 3mysql> SELECT ST_AsText(ST_SymDifference(@g1, @g2)); 4+---------------------------------------+ 5| ST_AsText(ST_SymDifference(@g1, @g2)) | 6+---------------------------------------+ 7| MULTIPOINT((1 1),(5 0)) | 8+---------------------------------------+
지오메트리를 한 공간 참조 시스템(SRS)에서 다른 SRS로 변환합니다. 반환값은 입력 지오메트리와 동일한 타입의 지오메트리이며, 모든 좌표는 대상 SRID인 target_srid 로 변환됩니다. MySQL은 여기 나열된 SRS를 제외한 EPSG에서 정의한 모든 SRS를 지원합니다:
EPSG 1042 Krovak Modified
EPSG 1043 Krovak Modified (North Orientated)
EPSG 9816 Tunisia Mining Grid
EPSG 9826 Lambert Conic Conformal (West Orientated)
ST_Transform()는 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리하되, 다음과 같은 예외가 있습니다:
지리적 SRS에 대한 SRID 값을 가진 지오메트리 인수는 오류를 발생시키지 않습니다.
지오메트리 또는 target SRID 인수가 정의되지 않은 공간 참조 시스템(SRS)을 참조하는 SRID 값을 가지면, ER_SRS_NOT_FOUND 오류가 발생합니다.
지오메트리가 ST_Transform()가 변환을 수행할 수 없는 SRS에 속하면, ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTED 오류가 발생합니다.
target SRID가 ST_Transform()가 변환을 수행할 수 없는 SRS에 속하면, ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTED 오류가 발생합니다.
지오메트리가 WGS 84가 아닌 SRS에 속하면서 TOWGS84 절을 가지고 있지 않으면, ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84 오류가 발생합니다.
target SRID가 WGS 84가 아닌 SRS에 속하면서 TOWGS84 절을 가지고 있지 않으면, ER_TRANSFORM_TARGET_SRS_MISSING_TOWGS84 오류가 발생합니다.
ST_SRID(g, target_srid)와 ST_Transform(g, target_srid)는 다음과 같이 다릅니다:
ST_SRID()는 지오메트리 좌표를 변환하지 않고 SRID 값만 변경합니다.
ST_Transform()는 지오메트리 좌표를 변환하는 동시에 SRID 값도 변경합니다.
1mysql> SET @p = ST_GeomFromText('POINT(52.381389 13.064444)', 4326); 2mysql> SELECT ST_AsText(@p); 3+----------------------------+ 4| ST_AsText(@p) | 5+----------------------------+ 6| POINT(52.381389 13.064444) | 7+----------------------------+ 8mysql> SET @p = ST_Transform(@p, 4230); 9mysql> SELECT ST_AsText(@p); 10+---------------------------------------------+ 11| ST_AsText(@p) | 12+---------------------------------------------+ 13| POINT(52.38208611407426 13.065520672345304) | 14+---------------------------------------------+
지오메트리 값 g1 과 g2 의 점 집합 합집합(point set union)을 나타내는 지오메트리를 반환합니다. 결과는 지오메트리 인수와 동일한 SRS에 속합니다.
ST_Union()는 카르테시안 또는 지리적 SRS 중 어느 쪽이든 인수를 허용하며, 이 섹션 도입부에서 설명한 방식에 따라 인수를 처리합니다.
1mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)'); 2mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)'); 3mysql> SELECT ST_AsText(ST_Union(@g1, @g2)); 4+--------------------------------------+ 5| ST_AsText(ST_Union(@g1, @g2)) | 6+--------------------------------------+ 7| MULTILINESTRING((1 1,3 3),(1 3,3 1)) | 8+--------------------------------------+
14.16.7 Geometry Property Functions
14.16.9 Functions That Test Spatial Relations Between Geometry Objects