跳到主要内容

地理空间

Databend 支持以下地理空间数据类型来处理空间数据:

  • GEOMETRY: 使用平面坐标系(笛卡尔坐标),适用于 2D 几何对象。坐标表示为 (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 示例
PointPOINT(10 10){"coordinates":[10,10],"type":"Point"}
LineStringLINESTRING(10 10, 20 30){"coordinates":[[10,10],[20,30]],"type":"LineString"}
PolygonPOLYGON((10 10, 15 16, 22 10, 30 32)){"coordinates":[[[10,10],[15,16],[22,10],[30,32],[10,10]]],"type":"Polygon"}
MultiPointMULTIPOINT((10 20), (30 40), (50 60)){"coordinates":[[10,20],[30,40],[50,60]],"type":"MultiPoint"}
MultiLineStringMULTILINESTRING((10 20, 30 40), (50 60, 70 80)){"coordinates":[[[10,20],[30,40]],[[50,60],[70,80]]],"type":"MultiLineString"}
MultiPolygonMULTIPOLYGON(((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"}
GeometryCollectionGEOMETRYCOLLECTION(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 │
├─────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────┤
1POINT(66 12)
2MULTIPOINT(45 21,12 54)
3LINESTRING(40 60,50 50,60 40)
4MULTILINESTRING((1 1,32 17),(33 12,73 49,87.1 6.1))
5POLYGON((17 17,17 30,30 30,30 17,17 17))
6MULTIPOLYGON(((-10 0,0 10,10 0,-10 0)),((-10 40,10 40,0 20,-10 40)))
7GEOMETRYCOLLECTION(POLYGON((-10 0,0 10,10 0,-10 0)),LINESTRING(40 60,50 50,60 40),POINT(99 11))
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

-- Convert to WKB format
SELECT id, st_aswkb(geo) FROM test WHERE id=1;
┌──────────────────────────────────────────────────────────────┐
│ id │ st_aswkb(geo)
├─────────────────┼────────────────────────────────────────────┤
1010100000000000000008050400000000000002840
└──────────────────────────────────────────────────────────────┘

-- Convert to GeoJSON format
SELECT id, st_asgeojson(geo) FROM test WHERE id=1;
┌──────────────────────────────────────────────────────────┐
│ id │ st_asgeojson(geo)
├─────────────────┼────────────────────────────────────────┤
1 │ {"coordinates":[66,12],"type":"Point"} │
└──────────────────────────────────────────────────────────┘

-- Get the X and Y coordinates of a Point
SELECT id, st_x(geo), st_y(geo) FROM test WHERE id=1;
┌─────────────────────────────────────────────────────────┐
│ id │ st_x(geo) │ st_y(geo)
├─────────────────┼───────────────────┼───────────────────┤
16612
└─────────────────────────────────────────────────────────┘

-- Get the dimension of the data
SELECT id, st_dimension(geo) FROM test;
┌─────────────────────────────────────┐
│ id │ st_dimension(geo)
├─────────────────┼───────────────────┤
10
20
31
41
52
62
72
└─────────────────────────────────────┘

-- Transform the spatial reference system from 4326 to 3857
SELECT id, st_transform(geo, 4326, 3857) FROM test;
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ id │ st_transform(geo, 4326, 3857)
├─────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
1POINT(7347086.392356 1345708.408409)
2MULTIPOINT(5009377.085697 2391878.587944,1335833.889519 7170156.294)
3LINESTRING(4452779.631731 8399737.889818,5565974.539664 6446275.841017,6679169.447596 4865942.279503)
4MULTILINESTRING((111319.490793 111325.142866,3562223.705385 1920825.040377),(3673543.196178 1345708.408409,8126322.827909 6274861.394007,9695927.648094 680335.356476))
5POLYGON((1892431.343486 1920825.040377,1892431.343486 3503549.843504,3339584.723798 3503549.843504,3339584.723798 1920825.040377,1892431.343486 1920825.040377))
6MULTIPOLYGON(((-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)))
7GEOMETRYCOLLECTION(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))
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
开始使用 Databend Cloud
低成本
快速分析
多种数据源
弹性扩展
注册