地理空间
Databend 支持以下地理空间数据类型,用于处理空间数据:
-
GEOMETRY:使用平面坐标系(笛卡尔坐标),适合表示二维几何对象。坐标表示为 (X, Y) 对,单位由关联的空间参考系统(SRS)决定。默认的 SRID 为 0,但可以指定自定义 SRID。适用于城市或省级分析等小规模测量,提供高计算速度和低资源消耗,但在较大区域可能会引入显著误差。
-
GEOGRAPHY:使用地理坐标系(球面坐标),基于纬度(-90° 到 90°)和经度(-180° 到 180°),遵循 WGS 84(SRID 4326)。设计用于全球或大规模空间数据,提供大距离范围内的准确性,但计算复杂度和资源需求较高。在需要时可以转换为 GEOMETRY。
GEOMETRY 和 GEOGRAPHY 类型目前是实验性功能。要使用这些类型创建表,请先执行 SET enable_geo_create_table = 1
以启用它们。
支持的对象类型
Databend 支持多种地理空间对象类型,能够精确表示和分析平面(GEOMETRY)和球面(GEOGRAPHY)坐标系的空间数据。
对象类型 | 描述 | GEOMETRY 示例 | GEOGRAPHY 示例 |
---|---|---|---|
Point | 零维几何对象,表示特定位置或坐标点。 | POINT(10 20) | POINT(-122.4194 37.7749)(旧金山坐标) |
LineString | 由一系列连接点组成的一维几何对象,表示路径或线段。 | LINESTRING(10 20, 30 40, 50 60) | LINESTRING(-122.4194 37.7749, -73.9352 40.7306)(旧金山到纽约) |
Polygon | 二维几何对象,具有外环和可选的内环,表示 区域。 | POLYGON((10 20, 30 40, 50 60, 10 20)) | POLYGON((-122.5 37.7, -122.4 37.8, -122.3 37.7, -122.5 37.7))(旧金山的一个区域) |
MultiPoint | 多个零维几何对象的集合。 | MULTIPOINT((10 20), (30 40), (50 60)) | MULTIPOINT((-122.4194 37.7749), (-73.9352 40.7306))(旧金山和纽约的点) |
MultiLineString | 多个 LineString 对象的集合。 | MULTILINESTRING((10 20, 30 40), (50 60, 70 80)) | MULTILINESTRING((-122.5 37.7, -122.4 37.8), (-122.3 37.7, -122.2 37.8))(城市中的多条路径) |
MultiPolygon | 多个 Polygon 对象的集合,表示多个区域或面积。 | MULTIPOLYGON(((10 20, 30 40, 50 60, 10 20)), ((15 25, 25 35, 35 45, 15 25))) | MULTIPOLYGON(((-122.5 37.7, -122.4 37.8, -122.3 37.7, -122.5 37.7)))(城市中的多个区域) |
GeometryCollection | 不同类型几何对象的集合,如点、线和多边形。 | GEOMETRYCOLLECTION(POINT(10 20), LINESTRING(10 20, 30 40), POLYGON((10 20, 30 40, 50 60, 10 20))) | GEOMETRYCOLLECTION(POINT(-122.4194 37.7749), LINESTRING(-122.5 37.7, -122.4 37.8)) |
支持的输出格式
Databend 支持多种地理空间输出格式——WKT(Well-Known Text)、EWKT(Extended Well-Known Text)、WKB(Well-Known Binary)、EWKB(Extended Well-Known Binary)和 GeoJSON。EWKT 和 EWKB 通过包含 SRID(空间参考系统标识符)扩展了 WKT 和 WKB,以指定坐标参考系统,例如 SRID=4326;POINT(-44.3 60.1)
。
对象类型 | WKT 示例 | GeoJSON 示例 |
---|---|---|
Point | POINT(10 10) | {"coordinates":[10,10],"type":"Point"} |
LineString | LINESTRING(10 10, 20 30) | {"coordinates":[[10,10],[20,30]],"type":"LineString"} |
Polygon | POLYGON((10 10, 15 16, 22 10, 30 32)) | {"coordinates":[[[10,10],[15,16],[22,10],[30,32],[10,10]]],"type":"Polygon"} |
MultiPoint | MULTIPOINT((10 20), (30 40), (50 60)) | {"coordinates":[[10,20],[30,40],[50,60]],"type":"MultiPoint"} |
MultiLineString | MULTILINESTRING((10 20, 30 40), (50 60, 70 80)) | {"coordinates":[[[10,20],[30,40]],[[50,60],[70,80]]],"type":"MultiLineString"} |
MultiPolygon | MULTIPOLYGON(((10 20, 30 40, 50 60, 10 20)), ((15 25, 25 35, 35 45, 15 25))) | {"coordinates":[[[[10,20],[30,40],[50,60],[10,20]]],[[[15,25],[25,35],[35,45],[15,25]]]],"type":"MultiPolygon"} |
GeometryCollection | GEOMETRYCOLLECTION(POINT(10 20), LINESTRING(10 20, 30 40), POLYGON((10 20, 30 40, 50 60, 10 20))) | {"coordinates":[[[10,20],[30,40],[50,60],[10,20]]],"type":"Polygon"} |
要在 Databend 中切换地理空间输出格式,请使用 SET geometry_output_format
设置配置所需的格式。 例如:
SET geometry_output_format = 'geojson';
函数
通过以下链接探索按类别组织的所有可用地理空间函数。
示例
-- 启用地理空间类型
SET enable_geo_create_table=1;
-- 设置输出格式为 WKT
SET geometry_output_format='wkt';
CREATE OR REPLACE TABLE test (id INT, geo GEOMETRY);
INSERT INTO test VALUES
(1, 'POINT(66 12)'),
(2, 'MULTIPOINT((45 21), (12 54))'),
(3, 'LINESTRING(40 60, 50 50, 60 40)'),
(4, 'MULTILINESTRING((1 1, 32 17), (33 12, 73 49, 87.1 6.1))'),
(5, 'POLYGON((17 17, 17 30, 30 30, 30 17, 17 17))'),
(6, 'MULTIPOLYGON(((-10 0,0 10,10 0,-10 0)),((-10 40,10 40,0 20,-10 40)))'),
(7, 'GEOMETRYCOLLECTION(POLYGON((-10 0,0 10,10 0,-10 0)),LINESTRING(40 60, 50 50, 60 40), POINT(99 11))');
SELECT id, geo FROM test;
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ id │ geo │
├─────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 1 │ POINT(66 12) │
│ 2 │ MULTIPOINT(45 21,12 54) │
│ 3 │ LINESTRING(40 60,50 50,60 40) │
│ 4 │ MULTILINESTRING((1 1,32 17),(33 12,73 49,87.1 6.1)) │
│ 5 │ POLYGON((17 17,17 30,30 30,30 17,17 17)) │
│ 6 │ MULTIPOLYGON(((-10 0,0 10,10 0,-10 0)),((-10 40,10 40,0 20,-10 40))) │
│ 7 │ GEOMETRYCOLLECTION(POLYGON((-10 0,0 10,10 0,-10 0)),LINESTRING(40 60,50 50,60 40),POINT(99 11)) │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
-- 转换为WKB格式
SELECT id, st_aswkb(geo) FROM test WHERE id=1;
┌──────────────────────────────────────────────────────────────┐
│ id │ st_aswkb(geo) │
├─────────────────┼────────────────────────────────────────────┤
│ 1 │ 010100000000000000008050400000000000002840 │
└──────────────────────────────────────────────────────────────┘
-- 转换为GeoJSON格式
SELECT id, st_asgeojson(geo) FROM test WHERE id=1;
┌──────────────────────────────────────────────────────────┐
│ id │ st_asgeojson(geo) │
├─────────────────┼────────────────────────────────────────┤
│ 1 │ {"coordinates":[66,12],"type":"Point"} │
└──────────────────────────────────────────────────────────┘
-- 获取Point的X和Y坐标
SELECT id, st_x(geo), st_y(geo) FROM test WHERE id=1;
┌─────────────────────────────────────────────────────────┐
│ id │ st_x(geo) │ st_y(geo) │
├─────────────────┼───────────────────┼───────────────────┤
│ 1 │ 66 │ 12 │
└─────────────────────────────────────────────────────────┘
-- 获取数据的维度
SELECT id, st_dimension(geo) FROM test;
┌─────────────────────────────────────┐
│ id │ st_dimension(geo) │
├─────────────────┼───────────────────┤
│ 1 │ 0 │
│ 2 │ 0 │
│ 3 │ 1 │
│ 4 │ 1 │
│ 5 │ 2 │
│ 6 │ 2 │
│ 7 │ 2 │
└─────────────────────────────────────┘
-- 将空间参考系统从4326转换为3857
SELECT id, st_transform(geo, 4326, 3857) FROM test;
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ id │ st_transform(geo, 4326, 3857) │
├─────────────────┼──────────────────────────── ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 1 │ POINT(7347086.392356 1345708.408409) │
│ 2 │ MULTIPOINT(5009377.085697 2391878.587944,1335833.889519 7170156.294) │
│ 3 │ LINESTRING(4452779.631731 8399737.889818,5565974.539664 6446275.841017,6679169.447596 4865942.279503) │
│ 4 │ MULTILINESTRING((111319.490793 111325.142866,3562223.705385 1920825.040377),(3673543.196178 1345708.408409,8126322.827909 6274861.394007,9695927.648094 680335.356476)) │
│ 5 │ POLYGON((1892431.343486 1920825.040377,1892431.343486 3503549.843504,3339584.723798 3503549.843504,3339584.723798 1920825.040377,1892431.343486 1920825.040377)) │
│ 6 │ MULTIPOLYGON(((-1113194.907933 0,0 1118889.974858,1113194.907933 0,-1113194.907933 0)),((-1113194.907933 4865942.279503,1113194.907933 4865942.279503,0 2273030.926988,-1113194.907933 4865942.279503))) │
│ 7 │ GEOMETRYCOLLECTION(POLYGON((-1113194.907933 0,0 1118889.974858,1113194.907933 0,-1113194.907933 0)),LINESTRING(4452779.631731 8399737.889818,5565974.539664 6446275.841017,6679169.447596 4865942.279503),POINT(11020629.588534 1232106.801897)) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘