本文介紹了點雲模型的用途、基本構成和快速入門等內容。
模型用途
簡介
點雲模型通常是由 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參考。