全部產品
Search
文件中心

PolarDB:點雲模型

更新時間:Oct 17, 2024

本文介紹了點雲模型的用途、基本構成和快速入門等內容。

模型用途

簡介

點雲模型通常是由 3D 雷射掃描器掃描相關實體並以點的形式輸出的記錄,每一個點包含有三維座標,有些可能含有顏色資訊(RGB)或反射強度資訊(Intensity),點雲資料含有空間座標資訊,且具有數量眾多、屬性維度複雜的特點。

GanosBase PointCloud是對象關係型資料庫PostgreSQL相容版本(PolarDB PostgreSQL版(相容Oracle))的一個時空引擎擴充,使上述資料庫能夠有效快速儲存管理點雲資料,並提供點雲資料壓縮、解壓縮、屬性統計等功能,同時聯合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參考