폴리곤 함수

폴리곤 함수 (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 라이브러리에 대한 이 프레젠테이션을 참고하세요.

더 알아보기 (Learn more)