지리(Geo) 데이터 타입
지리(Geo) 데이터 타입
위치, 땅 같은 지리 객체를 표현하기 위한 데이터 타입들이에요. Point, MultiPoint, Ring, LineString, MultiLineString, Polygon, MultiPolygon, Geometry가 있어요.
출처: 문서
본문
ClickHouse는 지리 객체 — 위치, 땅 등 — 를 표현하기 위한 데이터 타입을 지원해요.
Point
Point는 X, Y 좌표로 표현되며, Tuple(Float64, Float64)로 저장돼요.
예시 (Example)
쿼리:
CREATE TABLE geo_point (p Point) ENGINE = Memory();
INSERT INTO geo_point VALUES((10, 10));
SELECT p, toTypeName(p) FROM geo_point;
응답:
┌─p───────┬─toTypeName(p)─┐
│ (10,10) │ Point │
└─────────┴───────────────┘
MultiPoint
MultiPoint는 점들의 집합으로, 점 배열(Array(Point))로 저장돼요.
예시 (Example)
쿼리:
CREATE TABLE geo_multipoint (mp MultiPoint) ENGINE = Memory();
INSERT INTO geo_multipoint VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]);
SELECT mp, toTypeName(mp) FROM geo_multipoint;
응답:
┌─mp────────────────────────────┬─toTypeName(mp)─┐
│ [(0,0),(10,0),(10,10),(0,10)] │ MultiPoint │
└───────────────────────────────┴────────────────┘
Ring
Ring은 구멍이 없는 단순 다각형으로, 점 배열(Array(Point))로 저장돼요.
예시 (Example)
쿼리:
CREATE TABLE geo_ring (r Ring) ENGINE = Memory();
INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]);
SELECT r, toTypeName(r) FROM geo_ring;
응답:
┌─r─────────────────────────────┬─toTypeName(r)─┐
│ [(0,0),(10,0),(10,10),(0,10)] │ Ring │
└───────────────────────────────┴────────────────┘
LineString
LineString은 선으로, 점 배열(Array(Point))로 저장돼요.
예시 (Example)
쿼리:
CREATE TABLE geo_linestring (l LineString) ENGINE = Memory();
INSERT INTO geo_linestring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]);
SELECT l, toTypeName(l) FROM geo_linestring;
응답:
┌─l─────────────────────────────┬─toTypeName(l)─┐
│ [(0,0),(10,0),(10,10),(0,10)] │ LineString │
└───────────────────────────────┴────────────────┘
MultiLineString
MultiLineString은 여러 개의 선으로, LineString의 배열(Array(LineString))로 저장돼요.
예시 (Example)
쿼리:
CREATE TABLE geo_multilinestring (l MultiLineString) ENGINE = Memory();
INSERT INTO geo_multilinestring VALUES([[(0, 0), (10, 0), (10, 10), (0, 10)], [(1, 1), (2, 2), (3, 3)]]);
SELECT l, toTypeName(l) FROM geo_multilinestring;
응답:
┌─l───────────────────────────────────────────────────┬─toTypeName(l)───┐
│ [[(0,0),(10,0),(10,10),(0,10)],[(1,1),(2,2),(3,3)]] │ MultiLineString │
└─────────────────────────────────────────────────────┴─────────────────┘
Polygon
Polygon은 구멍이 있는 다각형으로, 링 배열(Array(Ring))로 저장돼요. 바깥 배열의 첫 번째 요소가 다각형의 바깥 모양이고, 나머지 요소들은 모두 구멍이에요.
예시 (Example)
다음은 구멍이 하나 있는 다각형이에요.
쿼리:
CREATE TABLE geo_polygon (pg Polygon) ENGINE = Memory();
INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, 30), (50, 50), (50, 30)]]);
SELECT pg, toTypeName(pg) FROM geo_polygon;
응답:
┌─pg────────────────────────────────────────────────────────────┬─toTypeName(pg)─┐
│ [[(20,20),(50,20),(50,50),(20,50)],[(30,30),(50,50),(50,30)]] │ Polygon │
└───────────────────────────────────────────────────────────────┴────────────────┘
MultiPolygon
MultiPolygon은 여러 다각형으로 구성되며, 다각형 배열(Array(Polygon))로 저장돼요.
예시 (Example)
이 멀티폴리곤은 두 개의 분리된 다각형으로 이루어져 있어요 — 첫 번째는 구멍이 없고, 두 번째는 구멍이 하나예요.
쿼리:
CREATE TABLE geo_multipolygon (mpg MultiPolygon) ENGINE = Memory();
INSERT INTO geo_multipolygon VALUES([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]]);
SELECT mpg, toTypeName(mpg) FROM geo_multipolygon;
응답:
┌─mpg─────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─toTypeName(mpg)─┐
│ [[[(0,0),(10,0),(10,10),(0,10)]],[[(20,20),(50,20),(50,50),(20,50)],[(30,30),(50,50),(50,30)]]] │ MultiPolygon │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┘
Geometry
Geometry는 위의 모든 타입에 대한 공통 타입이에요. 그 타입들의 Variant와 같아요.
예시 (Example)
쿼리:
CREATE TABLE IF NOT EXISTS geo (geom Geometry) ENGINE = Memory();
INSERT INTO geo VALUES ((1, 2));
SELECT * FROM geo;
응답:
┌─geom──┐
│ (1,2) │
└───────┘
쿼리:
CREATE TABLE IF NOT EXISTS geo_dst (geom Geometry) ENGINE = Memory();
CREATE TABLE IF NOT EXISTS geo (geom String, id Int) ENGINE = Memory();
INSERT INTO geo VALUES ('POLYGON((1 0,10 0,10 10,0 10,1 0),(4 4,5 4,5 5,4 5,4 4))', 1);
INSERT INTO geo VALUES ('POINT(0 0)', 2);
INSERT INTO geo VALUES ('MULTIPOLYGON(((1 0,10 0,10 10,0 10,1 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))', 3);
INSERT INTO geo VALUES ('LINESTRING(1 0,10 0,10 10,0 10,1 0)', 4);
INSERT INTO geo VALUES ('MULTILINESTRING((1 0,10 0,10 10,0 10,1 0),(4 4,5 4,5 5,4 5,4 4))', 5);
INSERT INTO geo_dst SELECT readWKT(geom) FROM geo ORDER BY id;
SELECT * FROM geo_dst;
응답:
┌─geom─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [[(1,0),(10,0),(10,10),(0,10),(1,0)],[(4,4),(5,4),(5,5),(4,5),(4,4)]] │
│ (0,0) │
│ [[[(1,0),(10,0),(10,10),(0,10),(1,0)],[(4,4),(5,4),(5,5),(4,5),(4,4)]],[[(-10,-10),(-10,-9),(-9,10),(-10,-10)]]] │
│ [(1,0),(10,0),(10,10),(0,10),(1,0)] │
│ [[(1,0),(10,0),(10,10),(0,10),(1,0)],[(4,4),(5,4),(5,5),(4,5),(4,4)]] │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘