點(diǎn)云模型
本文介紹了點(diǎn)云模型的用途、基本構(gòu)成和快速入門等內(nèi)容。
模型用途
簡(jiǎn)介
點(diǎn)云模型通常是由 3D 激光掃描儀掃描相關(guān)實(shí)體并以點(diǎn)的形式輸出的記錄,每一個(gè)點(diǎn)包含有三維坐標(biāo),有些可能含有顏色信息(RGB)或反射強(qiáng)度信息(Intensity),點(diǎn)云數(shù)據(jù)含有空間坐標(biāo)信息,且具有數(shù)量眾多、屬性維度復(fù)雜的特點(diǎn)。
Ganos PointCloud是對(duì)象關(guān)系型數(shù)據(jù)庫PostgreSQL兼容版本(PolarDB PostgreSQL版)的一個(gè)時(shí)空引擎擴(kuò)展,使上述數(shù)據(jù)庫能夠有效快速存儲(chǔ)管理點(diǎn)云數(shù)據(jù),并提供點(diǎn)云數(shù)據(jù)壓縮、解壓縮、屬性統(tǒng)計(jì)等功能,同時(shí)聯(lián)合Ganos其它模塊提供點(diǎn)云空間分析的能力。
功能概述
Ganos PointCloud主要提供PcPoint與PcPatch兩種數(shù)據(jù)類型,PcPoint是點(diǎn)云的基本對(duì)象,它可以支持點(diǎn)云數(shù)據(jù)導(dǎo)入與導(dǎo)出、點(diǎn)云數(shù)據(jù)元數(shù)據(jù)查詢、點(diǎn)云數(shù)據(jù)空間查詢等能力;PcPatch是點(diǎn)云的集合對(duì)象,它可以支持點(diǎn)云數(shù)據(jù)打包、點(diǎn)云數(shù)據(jù)包壓縮與解壓縮、點(diǎn)云數(shù)據(jù)包元數(shù)據(jù)查詢、點(diǎn)云數(shù)據(jù)包過濾等能力。
主要業(yè)務(wù)場(chǎng)景
Ganos PointCloud的常見使用場(chǎng)景有以下幾個(gè):
三維建模和可視化
Ganos PointCloud可以用于存儲(chǔ)和處理三維掃描數(shù)據(jù),通過點(diǎn)云數(shù)據(jù)進(jìn)行三維建模和可視化。這對(duì)于建筑設(shè)計(jì)、城市規(guī)劃、文物保護(hù)等領(lǐng)域非常有用。
機(jī)器人和自動(dòng)駕駛
Ganos PointCloud可以用于處理機(jī)器人和自動(dòng)駕駛系統(tǒng)中的三維感知數(shù)據(jù)。通過點(diǎn)云數(shù)據(jù),可以實(shí)現(xiàn)環(huán)境感知、障礙物檢測(cè)、路徑規(guī)劃等功能。
工業(yè)測(cè)量和質(zhì)量控制
在工業(yè)領(lǐng)域,Ganos PointCloud可以用于處理三維測(cè)量數(shù)據(jù),例如通過激光掃描儀獲取的產(chǎn)品表面形狀數(shù)據(jù)。這些數(shù)據(jù)可以用于質(zhì)量控制、產(chǎn)品設(shè)計(jì)和制造過程優(yōu)化等。
基本構(gòu)成
點(diǎn)云格式表
原始點(diǎn)云數(shù)據(jù)可能有若干維度值,不同值也可能有不同的精度。Ganos Pointcloud使用與PDAL一致的Schema Document(以下簡(jiǎn)稱概要文檔)來描述每個(gè)點(diǎn)包含的維度,每個(gè)維度的數(shù)據(jù)類型等元數(shù)據(jù)。
概要文檔與對(duì)應(yīng)的PCID一同存儲(chǔ)于數(shù)據(jù)庫的pointcloud_formats表內(nèi)。
點(diǎn)云對(duì)象
用戶可以用PcPoint類型或PcPatch類型在點(diǎn)云表中存儲(chǔ)點(diǎn)云數(shù)據(jù)。
PcPoint是基本的點(diǎn)云對(duì)象,最少具有X/Y坐標(biāo)兩個(gè)維度,還可能有更多維度。
一個(gè)PcPoint對(duì)象的JSON表達(dá)如下:
{ "pcid": 1, "pt": [0.01, 0.02, 0.03, 4] }
其中:
PCID:指向pointcloud_formats 表的外鍵。
pt:點(diǎn)云的具體信息,遵照PCID指向的概要文檔中所描述的格式。
PcPatch是一系列互相靠近的PcPoint的集合。這樣可以減少數(shù)據(jù)庫內(nèi)記錄的行數(shù)。
一個(gè)PcPatch對(duì)象的JSON 表達(dá)如下:
{ "pcid": 1, "pts": [ [0.02, 0.03, 0.05, 6], [0.02, 0.03, 0.05, 8] ] }
類型的選擇與實(shí)際業(yè)務(wù)用途相關(guān):
如果需要處理的粒度總是單個(gè)點(diǎn)的信息,可以選擇PcPoint。
如果要對(duì)大量的點(diǎn)云數(shù)據(jù)做高效的查詢和操作,則可以選擇PcPatch。
空間參考
空間參考系(Spatial Reference System,以下簡(jiǎn)稱為SRS )定義了如何將PointCloud對(duì)象關(guān)聯(lián)到地球表面上某個(gè)具體位置。
Ganos使用一個(gè)整數(shù)來表示SRS的定義引用,稱為SRID。PointCloud對(duì)象通過其自身的SRID值與SRS關(guān)聯(lián)。
更多內(nèi)容請(qǐng)參見空間參考。
數(shù)據(jù)列視圖
在Ganos PointCloud中,也存在類似于幾何模型中幾何列視圖的點(diǎn)云列視圖。
列名 | 類型 | 說明 |
schema | varchar(256) | 該表所在的schema。 |
table | varchar(63) | 該表的表名。 |
column | varchar(63) | 該表中某個(gè)點(diǎn)云列的列名。 |
pcid | integer | 點(diǎn)云列對(duì)應(yīng)的概要文檔的ID,是引用到pointcloud_formats表的外鍵。 |
srid | integer | 點(diǎn)云列SRID,是引用到spatial_ref_sys表的外鍵。 |
type | varchar(30) | PcPoint或PcPatch 。 |
可以通過如下語句查詢當(dāng)前數(shù)據(jù)庫中全部幾何數(shù)據(jù)列:
SELECT * FROM pointcloud_columns;
數(shù)據(jù)壓縮
點(diǎn)云數(shù)據(jù)往往具有相當(dāng)大的數(shù)據(jù)量。在Ganos PointCloud中,支持在概要文檔的定義中添加如下聲明,指定數(shù)據(jù)壓縮方式:
<pc:metadata>
<Metadata name="compression">壓縮方式</Metadata>
</pc:metadata>
目前,壓縮方式支持以下種類:
None:默認(rèn)值。按概要文檔中定義的類型和格式存儲(chǔ)PcPoint和PcPatch字節(jié)數(shù)組,不進(jìn)行壓縮處理。
Dimensional:僅對(duì)于PcPatch有意義。將PcPacth中按行存儲(chǔ)變?yōu)榘淳S度列存儲(chǔ),并啟用適當(dāng)?shù)膲嚎s方案。
游程編碼壓縮:適用于低邊異性的維度。
公共位去除:適用于數(shù)值僅在很窄范圍內(nèi)變化的維度。
使用zlib進(jìn)行deflate壓縮:不適用其他壓縮時(shí)的默認(rèn)方案。
LAZ/LASZip:LiDAR數(shù)據(jù)標(biāo)準(zhǔn)壓縮方式。
Dimensional壓縮
對(duì)于一個(gè)擁四個(gè)維度、六個(gè)點(diǎn)的PcPatch數(shù)據(jù):
{
"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壓縮后,該P(yáng)cPacth理論上等效于:
{
"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]
]
}
對(duì)于較為均勻的小體積PcPatch對(duì)象來說,Dimensiona壓縮的效率在3:1到 5:1之間。
快速入門
簡(jiǎn)介
快速入門文檔幫助用戶快速理解Ganos PointCloud引擎的基本用法,包括擴(kuò)展創(chuàng)建、定義點(diǎn)云schema、建表、插入數(shù)據(jù)、屬性計(jì)算等內(nèi)容。
語法說明
創(chuàng)建擴(kuò)展。
CREATE extension ganos_pointcloud cascade; CREATE extension ganos_pointcloud_geometry cascade;
說明建議將擴(kuò)展安裝在public模式下,避免權(quán)限問題。
CREATE extension ganos_pointcloud WITH schema public; CREATE extension ganos_pointcloud_geometry WITH schema public;
定義點(diǎn)云schema。
表pointcloud_formats默認(rèn)已經(jīng)創(chuàng)建好,往表中插入xml格式的schema,schema定義了點(diǎn)云的屬性維度,以及每個(gè)維度的數(shù)據(jù)大小、類型、名稱以及解釋說明。
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>');
點(diǎn)云數(shù)據(jù)類型。
--點(diǎn)類型 pcpoint CREATE type pcpoint(...); 點(diǎn)的維度信息由schema定義. 點(diǎn)類型數(shù)據(jù)只能一個(gè)點(diǎn)一行記錄存儲(chǔ)。 例如:ST_MakePoint(1, ARRAY[2,3,4,0.5])返回的就是一個(gè)pcpoint對(duì)象 --點(diǎn)集類型 pcpatch CREATE type pcpatch(...); 點(diǎn)集由一系列的點(diǎn)組合而成,支持壓縮,壓縮方式由schema中的“compression”決定. 點(diǎn)集類型優(yōu)勢(shì)是可將一系列點(diǎn)集成壓縮后存儲(chǔ)為一行記錄,減少存儲(chǔ)空間,同時(shí)支持空間檢索。
創(chuàng)建點(diǎn)云表。
-- 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數(shù)據(jù)。
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數(shù)據(jù)。
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屬性平均值計(jì)算。
SELECT ST_AsText(ST_PatchAvg(pa)) FROM patches WHERE id = 7; ------------------------- {"pcid":1,"pt":[-126.46,45.54,54.5,5]}
刪除擴(kuò)展(可選)。
DROP extension ganos_pointcloud_geometry; DROP extension ganos_pointcloud cascade;
SQL參考
詳細(xì)SQL手冊(cè)請(qǐng)參見PointCloud SQL參考。