本文介绍了点云模型的用途、基本构成和快速入门等内容。
模型用途
简介
点云模型通常是由 3D 激光扫描仪扫描相关实体并以点的形式输出的记录,每一个点包含有三维坐标,有些可能含有颜色信息(RGB)或反射强度信息(Intensity),点云数据含有空间坐标信息,且具有数量众多、属性维度复杂的特点。
GanosBase PointCloud是对象关系型数据库PostgreSQL兼容版本(PolarDB PostgreSQL版)的一个时空引擎扩展,使上述数据库能够有效快速存储管理点云数据,并提供点云数据压缩、解压缩、属性统计等功能,同时联合GanosBase其它模块提供点云空间分析的能力。
功能概述
GanosBase PointCloud主要提供PcPoint与PcPatch两种数据类型,PcPoint是点云的基本对象,它可以支持点云数据导入与导出、点云数据元数据查询、点云数据空间查询等能力;PcPatch是点云的集合对象,它可以支持点云数据打包、点云数据包压缩与解压缩、点云数据包元数据查询、点云数据包过滤等能力。
主要业务场景
GanosBase PointCloud的常见使用场景有以下几个:
三维建模和可视化
GanosBase PointCloud可以用于存储和处理三维扫描数据,通过点云数据进行三维建模和可视化。这对于建筑设计、城市规划、文物保护等领域非常有用。
机器人和自动驾驶
GanosBase PointCloud可以用于处理机器人和自动驾驶系统中的三维感知数据。通过点云数据,可以实现环境感知、障碍物检测、路径规划等功能。
工业测量和质量控制
在工业领域,GanosBase PointCloud可以用于处理三维测量数据,例如通过激光扫描仪获取的产品表面形状数据。这些数据可以用于质量控制、产品设计和制造过程优化等。
基本构成
点云格式表
原始点云数据可能有若干维度值,不同值也可能有不同的精度。GanosBase Pointcloud使用与PDAL一致的Schema Document(以下简称概要文档)来描述每个点包含的维度,每个维度的数据类型等元数据。
概要文档与对应的PCID一同存储于数据库的pointcloud_formats表内。
点云对象
用户可以用PcPoint类型或PcPatch类型在点云表中存储点云数据。
PcPoint是基本的点云对象,最少具有X/Y坐标两个维度,还可能有更多维度。
一个PcPoint对象的JSON表达如下:
{ "pcid": 1, "pt": [0.01, 0.02, 0.03, 4] }
其中:
PCID:指向pointcloud_formats 表的外键。
pt:点云的具体信息,遵照PCID指向的概要文档中所描述的格式。
PcPatch是一系列互相靠近的PcPoint的集合。这样可以减少数据库内记录的行数。
一个PcPatch对象的JSON 表达如下:
{ "pcid": 1, "pts": [ [0.02, 0.03, 0.05, 6], [0.02, 0.03, 0.05, 8] ] }
类型的选择与实际业务用途相关:
如果需要处理的粒度总是单个点的信息,可以选择PcPoint。
如果要对大量的点云数据做高效的查询和操作,则可以选择PcPatch。
空间参考
空间参考系(Spatial Reference System,以下简称为SRS )定义了如何将PointCloud对象关联到地球表面上某个具体位置。
GanosBase使用一个整数来表示SRS的定义引用,称为SRID。PointCloud对象通过其自身的SRID值与SRS关联。
更多内容请参见空间参考。
数据列视图
在GanosBase PointCloud中,也存在类似于几何模型中几何列视图的点云列视图。
列名 | 类型 | 说明 |
schema | varchar(256) | 该表所在的schema。 |
table | varchar(63) | 该表的表名。 |
column | varchar(63) | 该表中某个点云列的列名。 |
pcid | integer | 点云列对应的概要文档的ID,是引用到pointcloud_formats表的外键。 |
srid | integer | 点云列SRID,是引用到spatial_ref_sys表的外键。 |
type | varchar(30) | PcPoint或PcPatch 。 |
可以通过如下语句查询当前数据库中全部几何数据列:
SELECT * FROM pointcloud_columns;
数据压缩
点云数据往往具有相当大的数据量。在GanosBase PointCloud中,支持在概要文档的定义中添加如下声明,指定数据压缩方式:
<pc:metadata>
<Metadata name="compression">压缩方式</Metadata>
</pc:metadata>
目前,压缩方式支持以下种类:
None:默认值。按概要文档中定义的类型和格式存储PcPoint和PcPatch字节数组,不进行压缩处理。
Dimensional:仅对于PcPatch有意义。将PcPatch中按行存储变为按维度列存储,并启用适当的压缩方案。
游程编码压缩:适用于低边异性的维度。
公共位去除:适用于数值仅在很窄范围内变化的维度。
使用zlib进行deflate压缩:不适用其他压缩时的默认方案。
LAZ/LASZip:LiDAR数据标准压缩方式。
Dimensional压缩
对于一个拥四个维度、六个点的PcPatch数据:
{
"pcid": 1,
"pts": [
[-126.99, 45.01, 1, 0],
[-126.98, 45.02, 2, 0],
[-126.97, 45.03, 3, 0],
[-126.96, 45.04, 4, 0],
[-126.95, 45.05, 5, 0],
[-126.94, 45.06, 6, 0]
]
}
启用Dimensional压缩后,该PcPatch理论上等效于:
{
"pcid": 1,
"dims": [
[-126.99, -126.98, -126.97, -126.96, -126.95, -126.94],
[45.01, 45.02, 45.03, 45.04, 45.05, 45.06],
[1, 2, 3, 4, 5, 6],
[0, 0, 0, 0, 0, 0]
]
}
对于较为均匀的小体积PcPatch对象来说,Dimensiona压缩的效率在3:1到 5:1之间。
快速入门
简介
快速入门文档帮助用户快速理解GanosBase PointCloud引擎的基本用法,包括扩展创建、定义点云schema、建表、插入数据、属性计算等内容。
语法说明
创建扩展。
CREATE extension ganos_pointcloud cascade; CREATE extension ganos_pointcloud_geometry cascade;
说明建议将扩展安装在public模式下,避免权限问题。
CREATE extension ganos_pointcloud WITH schema public; CREATE extension ganos_pointcloud_geometry WITH schema public;
定义点云schema。
表pointcloud_formats默认已经创建好,往表中插入xml格式的schema,schema定义了点云的属性维度,以及每个维度的数据大小、类型、名称以及解释说明。
INSERT INTO pointcloud_formats (pcid, srid, schema) VALUES (1, 4326, '<?xml version="1.0" encoding="UTF-8"?> <pc:PointCloudSchema xmlns:pc="http://pointcloud.org/schemas/PC/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <pc:dimension> <pc:position>1</pc:position> <pc:size>4</pc:size> <pc:description>X coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description> <pc:name>X</pc:name> <pc:interpretation>int32_t</pc:interpretation> <pc:scale>0.01</pc:scale> </pc:dimension> <pc:dimension> <pc:position>2</pc:position> <pc:size>4</pc:size> <pc:description>Y coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description> <pc:name>Y</pc:name> <pc:interpretation>int32_t</pc:interpretation> <pc:scale>0.01</pc:scale> </pc:dimension> <pc:dimension> <pc:position>3</pc:position> <pc:size>4</pc:size> <pc:description>Z coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description> <pc:name>Z</pc:name> <pc:interpretation>int32_t</pc:interpretation> <pc:scale>0.01</pc:scale> </pc:dimension> <pc:dimension> <pc:position>4</pc:position> <pc:size>2</pc:size> <pc:description>The intensity value is the integer representation of the pulse return magnitude. This value is optional and system specific. However, it should always be included if available.</pc:description> <pc:name>Intensity</pc:name> <pc:interpretation>uint16_t</pc:interpretation> <pc:scale>1</pc:scale> </pc:dimension> <pc:metadata> <Metadata name="compression">dimensional</Metadata> </pc:metadata> </pc:PointCloudSchema>');
点云数据类型。
--点类型 pcpoint CREATE type pcpoint(...); 点的维度信息由schema定义. 点类型数据只能一个点一行记录存储。 例如:ST_MakePoint(1, ARRAY[2,3,4,0.5])返回的就是一个pcpoint对象 --点集类型 pcpatch CREATE type pcpatch(...); 点集由一系列的点组合而成,支持压缩,压缩方式由schema中的“compression”决定. 点集类型优势是可将一系列点集成压缩后存储为一行记录,减少存储空间,同时支持空间检索。
创建点云表。
-- A table of points CREATE TABLE points ( id SERIAL PRIMARY KEY, pt PCPOINT(1) --(1)代表选择pointcloud_formats中pcid值为1的schema ); -- A table of patches CREATE TABLE patches ( id SERIAL PRIMARY KEY, pa PCPATCH(1) );
插入pcpoint数据。
INSERT INTO points (pt) SELECT ST_MakePoint(1, ARRAY[x,y,z,intensity]) FROM ( SELECT -127+a/100.0 AS x, 45+a/100.0 AS y, 1.0*a AS z, a/10 AS intensity FROM generate_series(1,100) AS a ) AS values; SELECT ST_MakePoint(1, ARRAY[-127, 45, 124.0, 4.0]); ------------------------- 010100000064CEFFFF94110000703000000400 SELECT ST_AsText('010100000064CEFFFF94110000703000000400'::pcpoint); ------------------------- {"pcid":1,"pt":[-127,45,124,4]}
插入pcpatch数据。
INSERT INTO patches (pa) SELECT ST_Patch(pt) FROM points GROUP BY id/10; SELECT ST_AsText(ST_MakePatch(1, ARRAY[-126.99,45.01,1,0, -126.98,45.02,2,0, -126.97,45.03,3,0])); ------------------------- {"pcid":1,"pts":[ [-126.99,45.01,1,0],[-126.98,45.02,2,0],[-126.97,45.03,3,0] ]}
pcpatch属性平均值计算。
SELECT ST_AsText(ST_PatchAvg(pa)) FROM patches WHERE id = 7; ------------------------- {"pcid":1,"pt":[-126.46,45.54,54.5,5]}
删除扩展(可选)。
DROP extension ganos_pointcloud_geometry; DROP extension ganos_pointcloud cascade;
SQL参考
详细SQL手册请参见PointCloud SQL参考。