天天看點

PostgreSQL 核心擴充之 - 管理十億級3D掃描資料(基于Lidar産生的point cloud資料)

還記得成龍演的那部《十二生肖》裡用3d掃描和列印技術複制的生肖嗎?

PostgreSQL 核心擴充之 - 管理十億級3D掃描資料(基于Lidar産生的point cloud資料)

3d列印是近幾年興起的一種技術,除了存儲 物體表面的位置資訊,還有顔色,密度等資訊 。

而3d掃描其實在軍用領域很早以前就有了。

如果使用普通的資料庫來存儲,得把這些屬性拆開來存。

而在postgresql中,你完全不需要把這些屬性拆開,他們本來就是一體的,用好pg的擴充接口就好了。

postgresql 擴充指南 :

<a href="https://yq.aliyun.com/articles/55981">https://yq.aliyun.com/articles/55981</a>

3d掃描的基礎知識,來自百度百科

lidar——light detection and ranging,即雷射探測與測量。

是利用gps(global position system)和imu(inertial measurement unit,慣性測量裝置)機載雷射掃描。

其所測得的資料為數字表面模型(digital surface model, dsm)的離散點表示,資料中含有 空間三維資訊 和 雷射強度 資訊。

應用分類(classification)技術在這些原始數字表面模型中移除建築物、人造物、覆寫植物等測點,即可獲得數字高程模型(digital elevation model, dem),并同時得到地面覆寫物的高度。

機載lidar技術在國外的發展和應用已有十幾年的曆史,但是我國在這方面的研究和應用還隻是剛剛起步,其中利用航空雷射掃描探測資料進行困難地區dem、dom、dlg資料産品生産是當今的研究熱點之一。

該技術在地形測繪、環境檢測、三維城市模組化等諸多領域具有廣闊的發展前景和應用需求,有可能為測繪行業帶來一場新的技術革命。

針對不同的應用領域及成果要求,結合靈活的搭載方式,lidar技術可以廣泛應用于基礎測繪、道路工程、電力電網、水利、石油管線、海岸線及海島礁、數字城市等領域,提供高精度、大比例尺(1:500至1:10000)的空間資料成果。

例子

雷射掃描裝置裝置可記錄一個單發射脈沖傳回的首回波﹑中間多個回波與最後回波,通過對每個回波時刻記錄,可同時獲得多個高程資訊,将imu/dgps系統和雷射掃描技術進行內建,飛機向前飛行時,掃描器橫向對地面發射連續的雷射束,同時接受地面反射回波,imu/dgps系統記錄每一個雷射發射點的瞬間空間位置和姿态,進而可計算得到雷射反射點的空間位置。

PostgreSQL 核心擴充之 - 管理十億級3D掃描資料(基于Lidar産生的point cloud資料)

雷射雷達的雷射束掃瞄機場的滑道,探測飛機将遇到的風切變,即逆風的改變。

PostgreSQL 核心擴充之 - 管理十億級3D掃描資料(基于Lidar産生的point cloud資料)

<a href="https://en.wikipedia.org/wiki/point_cloud">https://en.wikipedia.org/wiki/point_cloud</a>

前面提到了lidar掃描的資料包括了位置資訊,以及其他傳感器在對應這個位置采集的其他資訊如 rgb、時間、溫度、濕度等等(你可以大開腦洞想,什麼都有)。

也就是說,每一個點都包含了大量的資訊。

point cloud則是很多點的集合,是以資訊量是非常龐大的。

postgresql 存儲的point cloud格式與pdal(point data abstraction library)庫一緻。

非常好的複用了pdal的資料結構,操作方法等。

因為pdal的通用性,是以相容性也非常的好。

基本類型,樣例

pcpoint的聚合類型,一個pcpatch存儲的是一些臨近pcpoint的聚合。

樣例

構造pcpoint

pcpoint轉換成人類可讀的文本

取pcid

将pcpoint轉換為ogc wkb編碼的二進制

讀取pcpoint包含的次元(指定屬性)資訊

讀取pcpoint的屬性,傳回array

把多個pcpoint聚合成一個pcpatch

pcpatch中包含多少個pcpoint

傳回pcpatch包含的pcpoint的pcid

将pcpatch轉換為ogc wkb編碼的二進制

将pcpatch轉換為文本

傳回json格式的文本

解壓pcpatch

多個pcpatch聚合為一個pcpatch

判斷兩個pcpatch是否有交叉

将pcpatch轉換為pcpoint

求pcpatch中包含的某個次元的資訊的平均值

求pcpatch中包含的某個次元的資訊的最大值

求pcpatch中包含的某個次元的資訊的最小值

求pcpatch中所有pcpoint的所有次元的平均值

求pcpatch中所有pcpoint的所有次元的最大值

求pcpatch中所有pcpoint的所有次元的最小值

傳回pcpatch中在指定次元上大于指定值的pcpoint

傳回pcpatch中在指定次元上小于指定值的pcpoint

傳回pcpatch中在指定次元上在指定範圍的pcpoint

傳回pcpatch中在指定次元上等于指定值的pcpoint

壓縮pcpatch

傳回pcpatch中第n個pcpoint,正值從頭開始計數,負值反向計數。

判斷pcpatch和geometry是否有相交

傳回pcpatch中與geometry相交的點組成的一個新的pcpatch

将pcpatch中的位置屬性的資訊轉換為geometry類型

postgresql point cloud,使用document輸入時,可以指定壓縮方法。

寫法如下,

支援的壓縮方法如下

the point and patch binary formats start with a common header, which provides:

endianness flag, to allow portability between architectures

pcid number, to look up the schema information in the pointcloud_formats table

point binary

the patch binary formats have additional standard header information:

the compression number, which indicates how to interpret the data

the number of points in the patch

patch binary (uncompressed)

pcpatch的壓縮格式的二進制表述請參考

<a href="https://github.com/pgpointcloud/pointcloud">https://github.com/pgpointcloud/pointcloud</a>

有兩種格式導入

from wkb

from pdal

參考

<a href="https://en.wikipedia.org/wiki/lidar">https://en.wikipedia.org/wiki/lidar</a>

<a href="http://baike.baidu.com/view/2922098.htm">http://baike.baidu.com/view/2922098.htm</a>

<a href="http://pointcloud.org/">http://pointcloud.org/</a>

<a href="http://www.pdal.io/">http://www.pdal.io/</a>

<a href="http://www.pdal.io/quickstart.html">http://www.pdal.io/quickstart.html</a>