跳到主要内容

地理空间

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(10 20)POINT(-122.4194 37.7749)(旧金山坐标)
线串一维几何对象,由一系列连接的点组成,表示路径或线段。LINESTRING(10 20, 30 40, 50 60)LINESTRING(-122.4194 37.7749, -73.9352 40.7306)(旧金山到纽约)
多边形二维几何对象,具有外环和可选的内环,表示区域。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((10 20), (30 40), (50 60))MULTIPOINT((-122.4194 37.7749), (-73.9352 40.7306))(旧金山和纽约的点)
多线串多个线串对象的集合。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(((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(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(扩展 Well-Known Text)、WKB(Well-Known Binary)、EWKB(扩展 Well-Known Binary)和 GeoJSON。EWKT 和 EWKB 通过包含 SRID(空间参考系统标识符)来扩展 WKT 和 WKB,以指定坐标参考系统,例如 SRID=4326;POINT(-44.3 60.1)

对象类型WKT 示例GeoJSON 示例
POINT(10 10){"coordinates":[10,10],"type":"Point"}
线串LINESTRING(10 10, 20 30){"coordinates":[[10,10],[20,30]],"type":"LineString"}
多边形POLYGON((10 10, 15 16, 22 10, 30 32)){"coordinates":[[[10,10],[15,16],[22,10],[30,32],[10,10]]],"type":"Polygon"}
多点MULTIPOINT((10 20), (30 40), (50 60)){"coordinates":[[10,20],[30,40],[50,60]],"type":"MultiPoint"}
多线串MULTILINESTRING((10 20, 30 40), (50 60, 70 80)){"coordinates":[[[10,20],[30,40]],[[50,60],[70,80]]],"type":"MultiLineString"}
多多边形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(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))
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

-- 转换为 WKB 格式
SELECT id, st_aswkb(geo) FROM test WHERE id=1;
┌──────────────────────────────────────────────────────────────┐
│ id │ st_aswkb(geo)
├─────────────────┼────────────────────────────────────────────┤
1010100000000000000008050400000000000002840
└──────────────────────────────────────────────────────────────┘

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

-- 获取点的 X 和 Y 坐标
SELECT id, st_x(geo), st_y(geo) FROM test WHERE id=1;
┌─────────────────────────────────────────────────────────┐
│ id │ st_x(geo) │ st_y(geo)
├─────────────────┼───────────────────┼───────────────────┤
16612
└─────────────────────────────────────────────────────────┘

-- 获取数据的维度
SELECT id, st_dimension(geo) FROM test;
┌─────────────────────────────────────┐
│ id │ st_dimension(geo)
├─────────────────┼───────────────────┤
10
20
31
41
52
62
72
└─────────────────────────────────────┘

-- 将空间参考系统从 4326 转换为 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
低成本
快速分析
多种数据源
弹性扩展
注册