You need to enable JavaScript to run this app.
文档中心
ByteHouse云数仓版

ByteHouse云数仓版

复制全文
下载 pdf
高级引擎
GIS 时空分析
复制全文
下载 pdf
GIS 时空分析

ByteHouse 云数仓版提供高性能 GIS 时空分析功能,全面支持 Point、LineString、Polygon 等 7 种标准几何类型,以及完整的空间数据建表、插入和空间函数操作。通过 OLAP 与 GIS 技术的深度融合,ByteHouse 能够在处理海量地理空间数据的同时保持高性能查询,为精准广告投放、物流优化、位置洞察等业务场景提供实时地理空间分析支撑。本文将介绍 GIS 时空分析的基本概念、支持的数据类型以及不同数据类型如何执行建表与插入操作。

背景信息

在数字化时代,地理空间分析(Geospatial Analytics)成为辅助企业市场策略洞察的重要手段。无论是精准广告投放,还是电商物流的效率优化,都离不开对地理空间数据的查询、分析和可视化处理,以便助力企业更好决策。
随着实时分析报表等 OLAP 市场的扩大,地理空间分析也作为新的增值特性被业界几大 OLAP 主流产品所推广。OLAP+GIS 能力在满足用户地理空间数据分析的基础上,还能在数据体量大、实效性要求高的情况下,满足业务高性能查询的需求。作为火山引擎推出的一款 OLAP 引擎,ByteHouse 也开发了高性能地理空间分析 GIS 能力,为位置洞察、人群圈选等场景提供高性能地理数据分析服务。

基本概念

SRID(Spatial Reference Identifier ,空间引用标识):

  • SRID 是用于在地理空间数据中标识参考系统的唯一身份标识符。参考系统定义了地理空间数据如何在地球上进行测量和表示。
  • 常用的 SRID 值 4326,即 WGS84 地理坐标系统。这是一种广泛使用的全球参考系统,经纬度用度量单位表示。适用于一般只需要表示地理空间数据粗略的位置,无需进行精确的测量和分析的情况。
  • 只有两个实例具有相同的 SRID 时,才可以对两者进行空间运算。

数据类型

GIS 功能包含点、线、面等几何类型,几何之间的空间位置关系以及周边生态。为了兼容 OGC(Open Geospatial Consortium)标准,满足用户对使用需求,ByteHouse GIS 模块包括 Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection 共 7 种几何类型。

  • Point:点数据类型,可声明为 Geometry('Point', <SRID>),或 Geometry('Point')(缺省 SRID 为 0)。
  • LineString:线数据类型,可声明为 Geometry('LineString', <SRID>),或 Geometry('LineString')(缺省 SRID 为 0)。
  • Polygon:面数据类型,可声明为 Geometry('Polygon', <SRID>),或 Geometry('Polygon')(缺省 SRID 为 0)。
  • MultiPoint:多点数据类型,可声明为 Geometry('MultiPoint', <SRID>),或 Geometry('MultiPoint')(缺省 SRID 为 0)。
  • MultiLineString:多线数据类型,可声明为 Geometry('MultiLineString', <SRID>),或 Geometry('MultiLineString')(缺省 SRID 为 0)。
  • MultiPolygon:多面数据类型,可声明为 Geometry('MultiPolygon', <SRID>),或 Geometry('MultiPolygon')(缺省 SRID 为 0)。
  • GeometryCollection:几何集合数据类型,可声明为 Geometry('GeometryCollection', <SRID>),或Geometry('GeometryCollection')(缺省 SRID 为 0)。

开启 GIS 时空分析

注意

GIS 时空分析服务启用后无法关闭,请谨慎操作。

首次开通 ByteHouse

开启路径:进入 ByteHouse 产品首页,首次购买 ByteHouse 云数仓版时,可在计算组模块,启用GIS 时空分析功能。具体收费情况请参考界面收费说明。
Image

控制台单独开通

  1. 登录 ByteHouse 云数仓版控制台,在资源管理 > 计算组页签下,单击目标计算组操作列的编辑按钮。
    Image
  2. 单击展开高级配置模块,勾选高级特性,下拉列表中勾选 GIS 时空分析。
    Image
  3. 单击确认。系统将自动开启向量检索功能。

使用 GIS 时空分析

本节将通过实际的使用示例演示如何使用 GIS 时空分析功能。
如果您想创建 GIS 相关的表,需要在建表的时候声明对应的 geometry 列。
常见的声明数据类型包括:

  • 点数据类型,如声明为Geometry('Point', 4326),其中 4326 为 SRID 值,不填写的话 Geometry('Point') 默认值为 0
  • 线数据类型,如声明为Geometry('LineString', 4326)。
  • 面数据类型,如 Geometry('Polygon', 4326)。

如果想利用空间索引,需要在建表时使用的排序键 ODER BY 中指定 geometry 列为主键索引。

Point 类型

-- 1. 创建 GIS 测试数据库
CREATE DATABASE IF NOT EXISTS test_gis_db;

-- 2. 选择使用 GIS 测试数据库
USE test_gis_db;

-- 3. 创建测试表
CREATE TABLE IF NOT EXISTS test_gis_point_type
(
    `p` Geometry('Point', 4326)
)
    ENGINE = CnchMergeTree
ORDER BY p
SETTINGS index_granularity = 8192;

-- 4. 插入地理坐标数据
INSERT INTO
    test_gis_point_type VALUES ((0, 0)),
    ('(1,1)'),
    (ST_GeomFromText('POINT (2 2)'));

-- 5. 查询并显示地理数据
SELECT ST_AsText(p) FROM test_gis_point_type ORDER BY p;

LineString 类型

-- 1. 创建 GIS 测试数据库
CREATE DATABASE IF NOT EXISTS test_gis_db;

-- 2. 选择使用 GIS 测试数据库
USE test_gis_db;

-- 3. 创建测试表
CREATE TABLE IF NOT EXISTS test_gis_linestring_type
(
    `p` Geometry('LineString', 4326)
)
    ENGINE = CnchMergeTree
ORDER BY p
SETTINGS index_granularity = 8192;

-- 4. 插入 LineString 数据
INSERT INTO
    test_gis_linestring_type VALUES ([(0, 0), (0, 0)]),
    ('[(2,2), (2,2)]'),
    (ST_GeomFromText('LINESTRING (3 3, 3 3)'));

-- 5. 查询并显示数据
SELECT ST_AsText(p) FROM test_gis_linestring_type ORDER BY p;

Polygon 类型

-- 1. 创建 GIS 测试数据库
CREATE DATABASE IF NOT EXISTS test_gis_db;

-- 2. 选择使用 GIS 测试数据库
USE test_gis_db;

-- 3. 创建测试表
CREATE TABLE IF NOT EXISTS test_gis_polygon_type
(
    `p` Geometry('Polygon', 4326)
)
    ENGINE = CnchMergeTree
ORDER BY p
SETTINGS index_granularity = 8192;

-- 4. 插入数据
INSERT INTO test_gis_polygon_type VALUES ([[(0,0), (1,0), (1,1), (0,1), (0,0)]]), ('[[(0,0), (2,0), (2,2), (0,2), (0,0)]]'), (ST_GeomFromText('POLYGON ((0 0, 3 0, 3 3, 0 3, 0 0))'));

-- 5. 查询并显示数据
SELECT ST_AsText(p) FROM test_gis_polygon_type ORDER BY p;

MultiPoint 类型

-- 1. 创建 GIS 测试数据库
CREATE DATABASE IF NOT EXISTS test_gis_db;

-- 2. 选择使用 GIS 测试数据库
USE test_gis_db;

-- 3. 创建测试表
CREATE TABLE IF NOT EXISTS test_gis_multipoint_type
(
    `p` Geometry('MultiPoint', 4326)
)
    ENGINE = CnchMergeTree
ORDER BY p
SETTINGS index_granularity = 8192;

-- 4. 插入数据
INSERT INTO test_gis_multipoint_type VALUES ([(0,0), (0,0)]), ('[(2,2), (2,2)]'), (ST_GeomFromText('MULTIPOINT ((3 3), (3 3))'));

-- 5. 查询并显示数据
SELECT ST_AsText(p) FROM test_gis_multipoint_type ORDER BY p;

MultiLineString 类型

-- 1. 创建 GIS 测试数据库
CREATE DATABASE IF NOT EXISTS test_gis_db;

-- 2. 选择使用 GIS 测试数据库
USE test_gis_db;

-- 3. 创建测试表
CREATE TABLE IF NOT EXISTS test_gis_multilinestring_type
(
    `p` Geometry('MultiLineString', 4326)
)
    ENGINE = CnchMergeTree
ORDER BY p
SETTINGS index_granularity = 8192;

-- 4. 插入数据
INSERT INTO test_gis_multilinestring_type VALUES ([[(0,0), (0,0)], [(0,0), (0,0)]]), ('[[(1, 1), (1, 1)], [(1, 1), (1, 1)]]'), (ST_GeomFromText('MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))'));
 
-- 5. 查询并显示数据
SELECT ST_AsText(p) FROM test_gis_multilinestring_type ORDER BY p;

MultiPolygon 类型

-- 1. 创建 GIS 测试数据库
CREATE DATABASE IF NOT EXISTS test_gis_db;

-- 2. 选择使用 GIS 测试数据库
USE test_gis_db;

-- 3. 创建测试表
CREATE TABLE IF NOT EXISTS test_gis_multipolygon_type
(
    `p` Geometry('MultiPolygon', 4326)
)
    ENGINE = CnchMergeTree
ORDER BY p
SETTINGS index_granularity = 8192;

-- 4. 插入数据
INSERT INTO test_gis_multipolygon_type VALUES ([[[(0,0), (1,0), (1,1), (0,1), (0,0)]], [[(0,0), (2,0), (2,2), (0,2), (0,0)]]]), ('[[[(0,0), (1,0), (1,1), (0,1), (0,0)]], [[(0,0), (2,0), (2,2), (0,2), (0,0)]]]'), (ST_GeomFromText('MULTIPOLYGON (((1 1, 1 3, 3 3, 3 1, 1 1)), ((4 3, 6 3, 6 1, 4 1, 4 3)))')), (ST_GeomFromText('MULTIPOLYGON (((0 0, 3 0, 3 3, 0 3, 0 0)))'));

-- 5. 查询并显示数据
SELECT ST_AsText(p) FROM test_gis_multipolygon_type ORDER BY p;

GeometryCollection 类型

-- 1. 创建 GIS 测试数据库
CREATE DATABASE IF NOT EXISTS test_gis_db;

-- 2. 选择使用 GIS 测试数据库
USE test_gis_db;

-- 3. 创建测试表
CREATE TABLE IF NOT EXISTS test_gis_geometrycollection_type
(
    `p` Geometry('GeometryCollection', 4326)
)
    ENGINE = CnchMergeTree
ORDER BY p
SETTINGS index_granularity = 8192;

-- 4. 插入数据
INSERT INTO test_gis_geometrycollection_type VALUES (ST_GeomFromText('GEOMETRYCOLLECTION (MULTIPOINT((0 0), (1 1)), POINT(3 4), LINESTRING(2 3, 3 4))')), (ST_GeomFromText('GEOMETRYCOLLECTION (MULTIPOINT((2 2), (3 3)), POINT(5 6), LINESTRING(5 3, 3 4))')), (ST_GeomFromText('GEOMETRYCOLLECTION (MULTIPOINT((-1 -1), (1 1)), POINT(10 10), LINESTRING(20 30, 30 40))'));

-- 5. 查询并显示数据
SELECT ST_AsText(p) FROM test_gis_geometrycollection_type ORDER BY p;

空间函数

请参考地理函数。

最近更新时间:2026.11.06 14:32:18
这个页面对您有帮助吗?
有用
有用
无用
无用