点云模型

本文介绍了点云模型的用途、基本构成和快速入门等内容。

模型用途

简介

点云模型通常是由 3D 激光扫描仪扫描相关实体并以点的形式输出的记录,每一个点包含有三维坐标,有些可能含有颜色信息(RGB)或反射强度信息(Intensity),点云数据含有空间坐标信息,且具有数量众多、属性维度复杂的特点。

Ganos PointCloud是对象关系型数据库PostgreSQL兼容版本(PolarDB PostgreSQL版(兼容Oracle))的一个时空引擎扩展,使上述数据库能够有效快速存储管理点云数据,并提供点云数据压缩、解压缩、属性统计等功能,同时联合Ganos其它模块提供点云空间分析的能力。

功能概述

Ganos PointCloud主要提供PcPoint与PcPatch两种数据类型,PcPoint是点云的基本对象,它可以支持点云数据导入与导出、点云数据元数据查询、点云数据空间查询等能力;PcPatch是点云的集合对象,它可以支持点云数据打包、点云数据包压缩与解压缩、点云数据包元数据查询、点云数据包过滤等能力。

主要业务场景

Ganos PointCloud的常见使用场景有以下几个:

  • 三维建模和可视化

    Ganos PointCloud可以用于存储和处理三维扫描数据,通过点云数据进行三维建模和可视化。这对于建筑设计、城市规划、文物保护等领域非常有用。

  • 机器人和自动驾驶

    Ganos PointCloud可以用于处理机器人和自动驾驶系统中的三维感知数据。通过点云数据,可以实现环境感知、障碍物检测、路径规划等功能。

  • 工业测量和质量控制

    在工业领域,Ganos PointCloud可以用于处理三维测量数据,例如通过激光扫描仪获取的产品表面形状数据。这些数据可以用于质量控制、产品设计和制造过程优化等。

基本构成

点云格式表

原始点云数据可能有若干维度值,不同值也可能有不同的精度。Ganos 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对象关联到地球表面上某个具体位置。

Ganos使用一个整数来表示SRS的定义引用,称为SRID。PointCloud对象通过其自身的SRID值与SRS关联。

更多内容请参见空间参考

数据列视图

在Ganos 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;

数据压缩

点云数据往往具有相当大的数据量。在Ganos PointCloud中,支持在概要文档的定义中添加如下声明,指定数据压缩方式:

<pc:metadata>
  <Metadata name="compression">压缩方式</Metadata>
</pc:metadata>

目前,压缩方式支持以下种类:

  • None:默认值。按概要文档中定义的类型和格式存储PcPoint和PcPatch字节数组,不进行压缩处理。

  • Dimensional:仅对于PcPatch有意义。将PcPacth中按行存储变为按维度列存储,并启用适当的压缩方案。

  • 游程编码压缩:适用于低边异性的维度。

  • 公共位去除:适用于数值仅在很窄范围内变化的维度。

  • 使用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压缩后,该PcPacth理论上等效于:

{
  "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之间。

快速入门

简介

快速入门文档帮助用户快速理解Ganos 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参考