폴리곤 함수
폴리곤 함수 (Polygon Functions)
폴리곤 기하 객체를 만들고, 넓이·둘레·거리를 계산하며, 폴리곤 간의 합집합·교집합·대칭차·포함 여부를 판단하는 함수들이에요. 좌표는 구면(spherical) 또는 직교(Cartesian) 좌표계로 해석할 수 있어요.
출처: 문서
본문
WKT
다양한 Geo 데이터 타입에서 WKT(Well Known Text) 기하 객체를 반환해요. 지원되는 WKT 객체는 다음과 같아요:
- POINT
- MULTIPOINT
- POLYGON
- MULTIPOLYGON
- LINESTRING
- MULTILINESTRING
구문 (Syntax)
WKT(geo_data)
파라미터 (Parameters)
geo_data는 다음 Geo 데이터 타입 또는 그 기본(primitive) 타입 중 하나일 수 있어요:
- Point
- MultiPoint
- Ring
- Polygon
- MultiPolygon
- LineString
- MultiLineString
반환 값 (Returned value)
- Point에 대해 WKT 기하 객체
POINT가 반환돼요. - MultiPoint에 대해
MULTIPOINT가 반환돼요. - Polygon에 대해
POLYGON이 반환돼요. - MultiPolygon에 대해
MULTIPOLYGON이 반환돼요. - LineString에 대해
LINESTRING이 반환돼요. - MultiLineString에 대해
MULTILINESTRING이 반환돼요.
예시 (Examples)
튜플에서 POINT:
SELECT wkt((0., 0.));
POINT(0 0)
튜플 배열 또는 튜플 배열의 배열에서 POLYGON:
SELECT wkt([(0., 0.), (10., 0.), (10., 10.), (0., 10.)]);
POLYGON((0 0,10 0,10 10,0 10))
다차원 튜플 배열 배열에서 MULTIPOLYGON:
SELECT wkt([[[(0., 0.), (10., 0.), (10., 10.), (0., 10.)], [(4., 4.), (5., 4.), (5., 5.), (4., 5.)]], [[(-10., -10.), (-10., -9.), (-9., 10.)]]]);
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))
readWKTMultiPolygon
WKT(Well Known Text) MultiPolygon을 MultiPolygon 타입으로 변환해요.
예시 (Example)
SELECT
toTypeName(readWKTMultiPolygon('MULTIPOLYGON(((2 0,10 0,10 10,0 10,2 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))')) AS type,
readWKTMultiPolygon('MULTIPOLYGON(((2 0,10 0,10 10,0 10,2 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))') AS output FORMAT Markdown
| type | output |
|---|---|
| MultiPolygon | [[[(2,0),(10,0),(10,10),(0,10),(2,0)],[(4,4),(5,4),(5,5),(4,5),(4,4)]],[[(-10,-10),(-10,-9),(-9,10),(-10,-10)]]] |
입력 파라미터 (Input parameters)
MULTIPOLYGON으로 시작하는 문자열
반환 값 (Returned value)
MultiPolygon
readWKTPolygon
WKT MultiPolygon을 Polygon 타입으로 변환해요.
예시 (Example)
SELECT
toTypeName(readWKTPolygon('POLYGON((2 0,10 0,10 10,0 10,2 0))')) AS type,
readWKTPolygon('POLYGON((2 0,10 0,10 10,0 10,2 0))') AS output
FORMAT Markdown
| type | output |
|---|---|
| Polygon | [[(2,0),(10,0),(10,10),(0,10),(2,0)]] |
입력 파라미터 (Input parameters)
POLYGON으로 시작하는 문자열
반환 값 (Returned value)
Polygon
readWKTPoint
ClickHouse의 readWKTPoint 함수는 Point 기하의 WKT(Well-Known Text) 표현을 파싱해 내부 ClickHouse 형식의 점을 반환해요.
구문 (Syntax)
readWKTPoint(wkt_string)
인자 (Arguments)
wkt_string: Point 기하를 나타내는 입력 WKT 문자열.
반환 값 (Returned value)
Point 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKTPoint('POINT (1.2 3.4)');
(1.2,3.4)
readWKTLineString
LineString 기하의 WKT(Well-Known Text) 표현을 파싱해 내부 ClickHouse 형식으로 반환해요.
구문 (Syntax)
readWKTLineString(wkt_string)
반환 값 (Returned value)
linestring 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKTLineString('LINESTRING (1 1, 2 2, 3 3, 1 1)');
[(1,1),(2,2),(3,3),(1,1)]
readWKTMultiLineString
MultiLineString 기하의 WKT(Well-Known Text) 표현을 파싱해 내부 ClickHouse 형식으로 반환해요.
구문 (Syntax)
readWKTMultiLineString(wkt_string)
반환 값 (Returned value)
multilinestring 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKTMultiLineString('MULTILINESTRING ((1 1, 2 2, 3 3), (4 4, 5 5, 6 6))');
[[(1,1),(2,2),(3,3)],[(4,4),(5,5),(6,6)]]
readWKTMultiPoint
MultiPoint 기하의 WKT(Well-Known Text) 표현을 파싱해 내부 ClickHouse 형식으로 반환해요.
구문 (Syntax)
readWKTMultiPoint(wkt_string)
반환 값 (Returned value)
multipoint 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKTMultiPoint('MULTIPOINT (1 1, 2 2, 3 3)');
[(1,1),(2,2),(3,3)]
readWKTRing
Polygon 기하의 WKT(Well-Known Text) 표현을 파싱해 내부 ClickHouse 형식의 링(닫힌 linestring)을 반환해요.
구문 (Syntax)
readWKTRing(wkt_string)
반환 값 (Returned value)
링(닫힌 linestring) 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKTRing('POLYGON ((1 1, 2 2, 3 3, 1 1))');
[(1,1),(2,2),(3,3),(1,1)]
polygonsWithinSpherical
한 폴리곤이 다른 폴리곤 안에 완전히 놓여 있는지 여부에 따라 true 또는 false를 반환해요. 참조: within
예시 (Example)
SELECT polygonsWithinSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]);
0
readWKBMultiPolygon
WKB(Well Known Binary) MultiPolygon을 MultiPolygon 타입으로 변환해요.
예시 (Example)
SELECT
toTypeName(readWKBMultiPolygon(unhex('0106000000020000000103000000020000000500000000000000000000400000000000000000000000000000244000000000000000000000000000002440000000000000244000000000000000000000000000002440000000000000004000000000000000000500000000000000000010400000000000001040000000000000144000000000000010400000000000001440000000000000144000000000000010400000000000001440000000000000104000000000000010400103000000010000000400000000000000000024c000000000000024c000000000000024c000000000000022c000000000000022c0000000000000244000000000000024c000000000000024c0'))) AS type,
readWKBMultiPolygon(unhex('0106000000020000000103000000020000000500000000000000000000400000000000000000000000000000244000000000000000000000000000002440000000000000244000000000000000000000000000002440000000000000004000000000000000000500000000000000000010400000000000001040000000000000144000000000000010400000000000001440000000000000144000000000000010400000000000001440000000000000104000000000000010400103000000010000000400000000000000000024c000000000000024c000000000000024c000000000000022c000000000000022c0000000000000244000000000000024c000000000000024c0')) AS output FORMAT Markdown
| type | output |
|---|---|
| MultiPolygon | [[[(2,0),(10,0),(10,10),(0,10),(2,0)],[(4,4),(5,4),(5,5),(4,5),(4,4)]],[[(-10,-10),(-10,-9),(-9,10),(-10,-10)]]] |
입력 파라미터 (Input parameters)
MULTIPOLYGON으로 시작하는 문자열
반환 값 (Returned value)
MultiPolygon
readWKBPolygon
WKB(Well Known Binary) MultiPolygon을 Polygon 타입으로 변환해요.
예시 (Example)
SELECT
toTypeName(readWKBPolygon(unhex('010300000001000000050000000000000000000040000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000400000000000000000'))) AS type,
readWKBPolygon(unhex('010300000001000000050000000000000000000040000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000400000000000000000')) AS output
FORMAT Markdown
| type | output |
|---|---|
| Polygon | [[(2,0),(10,0),(10,10),(0,10),(2,0)]] |
입력 파라미터 (Input parameters)
POLYGON으로 시작하는 문자열
반환 값 (Returned value)
Polygon
readWKBPoint
ClickHouse의 readWKBPoint 함수는 Point 기하의 WKB(Well-Known Binary) 표현을 파싱해 내부 ClickHouse 형식의 점을 반환해요.
구문 (Syntax)
readWKBPoint(wkb_string)
반환 값 (Returned value)
Point 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKBPoint(unhex('0101000000333333333333f33f3333333333330b40'));
(1.2,3.4)
readWKBLineString
LineString 기하의 WKB(Well-Known Binary) 표현을 파싱해 내부 ClickHouse 형식으로 반환해요.
구문 (Syntax)
readWKBLineString(wkb_string)
반환 값 (Returned value)
linestring 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKBLineString(unhex('010200000004000000000000000000f03f000000000000f03f0000000000000040000000000000004000000000000008400000000000000840000000000000f03f000000000000f03f'));
[(1,1),(2,2),(3,3),(1,1)]
readWKBMultiLineString
MultiLineString 기하의 WKB(Well-Known Binary) 표현을 파싱해 내부 ClickHouse 형식으로 반환해요.
구문 (Syntax)
readWKBMultiLineString(wkb_string)
반환 값 (Returned value)
multilinestring 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKBMultiLineString(unhex('010500000002000000010200000003000000000000000000f03f000000000000f03f0000000000000040000000000000004000000000000008400000000000000840010200000003000000000000000000104000000000000010400000000000001440000000000000144000000000000018400000000000001840'));
[[(1,1),(2,2),(3,3)],[(4,4),(5,5),(6,6)]]
반환 값 (Returned value)
UInt8, false면 0, true면 1
readWKBMultiPoint
MultiPoint 기하의 WKB(Well-Known Binary) 표현을 파싱해 내부 ClickHouse 형식으로 반환해요.
구문 (Syntax)
readWKBMultiPoint(wkb_string)
반환 값 (Returned value)
multipoint 기하의 ClickHouse 내부 표현을 반환해요.
예시 (Example)
SELECT readWKBMultiPoint(unhex('0104000000020000000101000000000000000000f03f000000000000f03f010100000000000000000000400000000000000040'));
[(1,1),(2,2)]
polygonsDistanceSpherical
한 점이 첫 번째 폴리곤에, 다른 점이 또 다른 폴리곤에 속할 때 두 점 사이의 최소 거리를 계산해요. Spherical(spherical)은 좌표가 순수하고 이상적인 구 위의 좌표로 해석됨을 의미하며, 지구에는 해당하지 않아요. 이런 좌표계를 사용하면 실행이 빨라지지만 정밀하지는 않아요.
예시 (Example)
SELECT polygonsDistanceSpherical([[[(0, 0), (0, 0.1), (0.1, 0.1), (0.1, 0)]]], [[[(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)]]])
0.24372872211133834
입력 파라미터 (Input parameters)
두 폴리곤
반환 값 (Returned value)
Float64
polygonsDistanceCartesian
두 폴리곤 사이의 거리를 계산해요.
예시 (Example)
SELECT polygonsDistanceCartesian([[[(0, 0), (0, 0.1), (0.1, 0.1), (0.1, 0)]]], [[[(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)]]])
14.000714267493642
반환 값 (Returned value)
Float64
polygonsEqualsCartesian
두 폴리곤이 같으면 true를 반환해요.
예시 (Example)
SELECT polygonsEqualsCartesian([[[(1., 1.), (1., 4.), (4., 4.), (4., 1.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]])
1
반환 값 (Returned value)
UInt8, false면 0, true면 1
polygonsSymDifferenceSpherical
두 폴리곤 사이의 공간 집합론적 대칭 차(XOR)를 계산해요.
예시 (Example)
SELECT wkt(arraySort(polygonsSymDifferenceSpherical([[(50., 50.), (50., -50.), (-50., -50.), (-50., 50.), (50., 50.)], [(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)], [(-10., -10.), (-10., -40.), (-40., -40.), (-40., -10.), (-10., -10.)]], [[(-20., -20.), (-20., 20.), (20., 20.), (20., -20.), (-20., -20.)]])));
MULTIPOLYGON(((-20 -10.3067,-10 -10,-10 -20.8791,-20 -20,-20 -10.3067)),((10 20.8791,20 20,20 10.3067,10 10,10 20.8791)),((50 50,50 -50,-50 -50,-50 50,50 50),(20 10.3067,40 10,40 40,10 40,10 20.8791,-20 20,-20 -10.3067,-40 -10,-40 -40,-10 -40,-10 -20.8791,20 -20,20 10.3067)))
반환 값 (Returned value)
MultiPolygon
polygonsSymDifferenceCartesian
polygonsSymDifferenceSpherical와 같지만 좌표가 직교(Cartesian) 좌표계에 있으며, 이는 실제 지구 모델에 더 가까워요.
예시 (Example)
SELECT wkt(polygonsSymDifferenceCartesian([[[(0, 0), (0, 3), (1, 2.9), (2, 2.6), (2.6, 2), (2.9, 1), (3, 0), (0, 0)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]))
MULTIPOLYGON(((1 2.9,1 1,2.9 1,3 0,0 0,0 3,1 2.9)),((1 2.9,1 4,4 4,4 1,2.9 1,2.6 2,2 2.6,1 2.9)))
반환 값 (Returned value)
MultiPolygon
polygonsIntersectionSpherical
폴리곤 사이의 교집합(AND)을 계산하며, 좌표는 구면(spherical)이에요.
예시 (Example)
SELECT wkt(arrayMap(a -> arrayMap(b -> arrayMap(c -> (round(c.1, 6), round(c.2, 6)), b), a), polygonsIntersectionSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]])))
MULTIPOLYGON(((4.3666 50.8434,4.36024 50.8436,4.34956 50.8536,4.35268 50.8567,4.36794 50.8525,4.3666 50.8434)))
반환 값 (Returned value)
MultiPolygon
polygonsWithinCartesian
두 번째 폴리곤이 첫 번째 폴리곤 안에 있으면 true를 반환해요.
예시 (Example)
SELECT polygonsWithinCartesian([[[(2., 2.), (2., 3.), (3., 3.), (3., 2.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]])
1
반환 값 (Returned value)
UInt8, false면 0, true면 1
polygonsIntersectCartesian
두 폴리곤이 교차하면(공통 영역 또는 경계를 공유하면) true를 반환해요.
예시 (Example)
SELECT polygonsIntersectCartesian([[[(2., 2.), (2., 3.), (3., 3.), (3., 2.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]])
1
반환 값 (Returned value)
UInt8, false면 0, true면 1
polygonsIntersectSpherical
두 폴리곤이 교차하면(공통 영역 또는 경계를 공유하면) true를 반환해요. 참조: intersects
예시 (Example)
SELECT polygonsIntersectSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]);
1
반환 값 (Returned value)
UInt8, false면 0, true면 1
geometryIntersectCartesian
두 기하가 교차하면(공통 점, 선 또는 영역을 공유하면) true를 반환해요.
polygonsIntersectCartesian과 달리 모든 기하 데이터 타입(Point, MultiPoint, LineString, MultiLineString, Ring, Polygon, MultiPolygon), 공통 Geometry 타입을 포함해서 받아들여요. 두 인자는 서로 다른 타입일 수 있어요.
좌표는 직교(Cartesian) 좌표계에 있어요.
예시 (Example)
SELECT geometryIntersectCartesian([(2., 2.), (2., 3.), (3., 3.), (3., 2.)]::Ring, [(1., 1.), (1., 4.), (4., 4.), (4., 1.)]::Ring)
1
반환 값 (Returned value)
UInt8, false면 0, true면 1
geometryIntersectSpherical
두 기하가 교차하면(공통 점, 선 또는 영역을 공유하면) true를 반환해요.
polygonsIntersectSpherical과 달리 모든 기하 데이터 타입(Point, MultiPoint, LineString, MultiLineString, Ring, Polygon, MultiPolygon), 공통 Geometry 타입을 포함해서 받아들여요. 두 인자는 서로 다른 타입일 수 있어요.
좌표는 이상적인 구 위에 있는 것으로 해석돼요.
예시 (Example)
SELECT geometryIntersectSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]]::MultiPolygon, (4.36, 50.85)::Point)
1
반환 값 (Returned value)
UInt8, false면 0, true면 1
polygonConvexHullCartesian
볼록 껍질(convex hull)을 계산해요. 참조
좌표는 직교(Cartesian) 좌표계에 있어요.
예시 (Example)
SELECT wkt(polygonConvexHullCartesian([[[(0., 0.), (0., 5.), (5., 5.), (5., 0.), (2., 3.)]]]))
POLYGON((0 0,0 5,5 5,5 0,0 0))
입력 파라미터 (Input parameters)
MultiPolygon
반환 값 (Returned value)
Polygon
polygonAreaSpherical
폴리곤의 표면적을 계산해요.
예시 (Example)
SELECT round(polygonAreaSpherical([[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]), 14)
9.387704e-8
반환 값 (Returned value)
Float
polygonsUnionSpherical
합집합(OR)을 계산해요.
예시 (Example)
SELECT wkt(polygonsUnionSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]))
MULTIPOLYGON(((4.36661 50.8434,4.36623 50.8408,4.34496 50.8333,4.33807 50.8487,4.34669 50.8583,4.35268 50.8567,4.36136 50.8652,4.36131 50.8651,4.39045 50.8565,4.38303 50.8429,4.36661 50.8434)))
반환 값 (Returned value)
MultiPolygon
polygonPerimeterSpherical
폴리곤의 둘레를 계산해요.
예시 (Example)
짐바브웨를 나타내는 폴리곤
짐바브웨를 나타내는 폴리곤:
POLYGON((30.0107 -15.6462,30.0502 -15.6401,...))
polygonPerimeterSpherical 함수 사용
SELECT round(polygonPerimeterSpherical([(30.010654, -15.646227), (30.050238, -15.640129), ...]), 5)
0.45539
반환 값 (Returned value)
polygonsIntersectionCartesian
폴리곤의 교집합을 계산해요.
예시 (Example)
SELECT wkt(polygonsIntersectionCartesian([[[(0., 0.), (0., 3.), (1., 2.9), (2., 2.6), (2.6, 2.), (2.9, 1.), (3., 0.), (0., 0.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]))
MULTIPOLYGON(((1 2.9,2 2.6,2.6 2,2.9 1,1 1,1 2.9)))
반환 값 (Returned value)
MultiPolygon
polygonAreaCartesian
폴리곤의 넓이를 계산해요.
예시 (Example)
SELECT polygonAreaCartesian([[[(0., 0.), (0., 5.), (5., 5.), (5., 0.)]]])
25
반환 값 (Returned value)
Float64
polygonPerimeterCartesian
폴리곤의 둘레를 계산해요.
예시 (Example)
SELECT polygonPerimeterCartesian([[[(0., 0.), (0., 5.), (5., 5.), (5., 0.)]]])
15
반환 값 (Returned value)
Float64
polygonsUnionCartesian
폴리곤의 합집합을 계산해요.
예시 (Example)
SELECT wkt(polygonsUnionCartesian([[[(0., 0.), (0., 3.), (1., 2.9), (2., 2.6), (2.6, 2.), (2.9, 1), (3., 0.), (0., 0.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]))
MULTIPOLYGON(((1 2.9,1 4,4 4,4 1,2.9 1,3 0,0 0,0 3,1 2.9)))
반환 값 (Returned value)
MultiPolygon
기하 시스템에 대한 자세한 내용은 ClickHouse가 사용하는 Boost 라이브러리에 대한 이 프레젠테이션을 참고하세요.