libLAS是一款非常好的點雲數據處理庫,但是,As of 2018, libLAS has been replaced by the PDAL project and it is in hibernation or maintenance mode.
筆者爲了編譯CloudCompare需要用到PDAL;曾經用Conda編譯過PDAL,但是一直報錯。
因此,利用OSGeo4W配置PDAL,很開心。
一、下載OSGeo4W
下載地址:https://trac.osgeo.org/osgeo4w/
二、安裝
2.1 選擇“Advanced Install”;接下來默認即可(聽說安裝路徑變了後很麻煩)
2.2 搜索pdal,單擊skip,變成(選擇)1.8.0。(我安裝過了,所以是keep)。
PDAL的依賴庫會一同安裝。
然後一直下一步或同意即可。
2.3 安裝完成後,C:\OSGeo4W64會有很多文件(包括其它依賴庫)。
三、配置環境變量
右擊電腦屬性—高級系統設置—高級—環境變量—系統變量—Path
添加路徑:(不知道對不對,哈哈;歡迎大佬批評指正)
C:\OSGeo4W64\bin
重啓電腦。
四、安裝過程中出現的問題:
4.1 時間較長;(PDAL的依賴庫較多,網速需要穩定且快)
4.2 出錯一次,顯示安裝不完整,重新安裝後可以了;(可能是網絡問題)
4.3 筆者編譯CloudCompare需要配置PDAL。
編譯CloudCompare2.10後,運行CloudCompare.exe時顯示缺少gdal203.dll。
因此,重新運行OSGeo4W,搜索gdal,發現gdal203.dll(下圖箭頭)並沒有安裝;(下圖是安裝後的)
於是,筆者安裝 gdal203.dll;
重新編譯CloudCompare,運行CloudCompare.exe時就不報錯了。(同類錯誤可以以此類推)
五、測試
5.1 新建項目Windows控制檯應用程序
5.2 配置:右擊項目——屬性——配置屬性
C/C++——常規——附加包含目錄:添加 C:\OSGeo4W64\include
C/C++——預處理器——預處理器定義:添加
_CRT_SECURE_NO_DEPRECATE
_SCL_SECURE_NO_DEPRECATE
參考:https://www.cnblogs.com/douzi2/p/3974959.html
鏈接器——常規——附加庫目錄:添加 C:\OSGeo4W64\lib
鏈接器——輸入——附加依懶項:添加 pdalcpp.lib、pdal_util.lib
分享給有需要的人,代碼質量勿噴。
#pragma execution_character_set("utf-8")//解決中文
#include "pch.h"
#include <iostream>
#include <memory>
#include <pdal/PointTable.hpp>
#include <pdal/PointView.hpp>
#include <pdal/io/LasReader.hpp>
#include <pdal/io/LasHeader.hpp>
#include <pdal/Options.hpp>
using namespace std;
int main()
{
string xjFileName = "E:\\測試\\test.las";//中文路徑可能報錯
pdal::Option las_opt("filename", xjFileName);//參數1:"filename"(鍵)
pdal::Options las_opts;
las_opts.add(las_opt);
pdal::PointTable table;
pdal::LasReader las_reader;
las_reader.setOptions(las_opts);
las_reader.prepare(table);
pdal::PointViewSet point_view_set = las_reader.execute(table);
pdal::PointViewPtr point_view = *point_view_set.begin();
pdal::Dimension::IdList dims = point_view->dims();
pdal::LasHeader las_header = las_reader.header();
double xmin = las_header.minX();
double xmax = las_header.maxX();
double deltaX = xmax - xmin;
cout << "deltaX=" << fixed << setprecision(4) << deltaX << endl;
double ymin = las_header.minY();
double ymax = las_header.maxY();
double deltaY = ymax - ymin;
cout << "deltaY=" << fixed << setprecision(4) << deltaY << endl;
double zmin = las_header.minZ();
double zmax = las_header.maxZ();
double deltaZ = zmax - zmin;
cout << "deltaZ=" << fixed << setprecision(4) << deltaZ << endl;
unsigned int n_features = las_header.pointCount();
cout << "PointCount=" << n_features << endl;
}
5.3 計算結果與CloudCompare顯示是一致的。
六、代碼參考