ByteHouse 云数仓版提供高性能 GIS 时空分析功能,全面支持 Point、LineString、Polygon 等 7 种标准几何类型,以及完整的空间数据建表、插入和空间函数操作。通过 OLAP 与 GIS 技术的深度融合,ByteHouse 能够在处理海量地理空间数据的同时保持高性能查询,为精准广告投放、物流优化、位置洞察等业务场景提供实时地理空间分析支撑。本文将介绍 GIS 时空分析的基本概念、支持的数据类型以及不同数据类型如何执行建表与插入操作。
在数字化时代,地理空间分析(Geospatial Analytics)成为辅助企业市场策略洞察的重要手段。无论是精准广告投放,还是电商物流的效率优化,都离不开对地理空间数据的查询、分析和可视化处理,以便助力企业更好决策。
随着实时分析报表等 OLAP 市场的扩大,地理空间分析也作为新的增值特性被业界几大 OLAP 主流产品所推广。OLAP+GIS 能力在满足用户地理空间数据分析的基础上,还能在数据体量大、实效性要求高的情况下,满足业务高性能查询的需求。作为火山引擎推出的一款 OLAP 引擎,ByteHouse 也开发了高性能地理空间分析 GIS 能力,为位置洞察、人群圈选等场景提供高性能地理数据分析服务。
SRID(Spatial Reference Identifier ,空间引用标识):
GIS 功能包含点、线、面等几何类型,几何之间的空间位置关系以及周边生态。为了兼容 OGC(Open Geospatial Consortium)标准,满足用户对使用需求,ByteHouse GIS 模块包括 Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection 共 7 种几何类型。
Geometry('Point', <SRID>),或 Geometry('Point')(缺省 SRID 为 0)。Geometry('LineString', <SRID>),或 Geometry('LineString')(缺省 SRID 为 0)。Geometry('Polygon', <SRID>),或 Geometry('Polygon')(缺省 SRID 为 0)。Geometry('MultiPoint', <SRID>),或 Geometry('MultiPoint')(缺省 SRID 为 0)。Geometry('MultiLineString', <SRID>),或 Geometry('MultiLineString')(缺省 SRID 为 0)。Geometry('MultiPolygon', <SRID>),或 Geometry('MultiPolygon')(缺省 SRID 为 0)。Geometry('GeometryCollection', <SRID>),或Geometry('GeometryCollection')(缺省 SRID 为 0)。注意
GIS 时空分析服务启用后无法关闭,请谨慎操作。
开启路径:进入 ByteHouse 产品首页,首次购买 ByteHouse 云数仓版时,可在计算组模块,启用GIS 时空分析功能。具体收费情况请参考界面收费说明。
本节将通过实际的使用示例演示如何使用 GIS 时空分析功能。
如果您想创建 GIS 相关的表,需要在建表的时候声明对应的 geometry 列。
常见的声明数据类型包括:
Geometry('Point', 4326),其中 4326 为 SRID 值,不填写的话 Geometry('Point') 默认值为 0Geometry('LineString', 4326)。Geometry('Polygon', 4326)。如果想利用空间索引,需要在建表时使用的排序键 ODER BY 中指定 geometry 列为主键索引。
-- 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;
-- 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;
-- 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;
-- 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;
-- 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;
-- 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;
-- 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;
请参考地理函数。