在编译CC源码时,需要使用pdal来读取las文件,所以记录一下配置过程
打开 osgeo4w-setup.exe,选择 Advanced Install:
选择 Install from Internet:
设置路径,记得一定要是这个路径:
在安装PDAL时,最好是这个路径,如果不是这个路径,在编译CC的时候会遇到很多问题
默认路径可能没有64,但是如果没有64,在编译CC时可能会存在问题
点击下一页:
点击第一个,并选择下一步:
添加武大源:http://gwmodel.whu.edu.cn/mirrors/osgeo4w,点击下一步:
在Search中输入 pdal:
点击 第三列下面的 Skip,找到 1.8.0 版本,可以选择其他版本。
如果不使用武大源,则可能是其他版本,大家按需下载。
选择好以后,点击下一页,之后就会进入安装的过程。安装pdal会涉及到其他第三方库,都会提示是否安装以及接受一些许可。
配置环境
为了更好的使用pdal,最好是在环境变量中做一些相应的设定
将bin目录添加到系统变量的Path中:
从OSGeo4W里下载的是Release版本的,所以在使用的时候,也最好在Release模式下开发,不然会出现一些bad_alloc的问题。
在Release属性配置中:
通用属性–>VC++目录–>包含目录:
通用属性–>VC++目录–>库目录:
链接器–>输入–>附加依赖项:
代码:
#pragma execution_character_set("utf-8")
#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>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
int main()
{
string fileName = "E:/data/T_509500_4153000.las";
pdal::Option las_opt("filename", 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;
printf("deltaX = %.4f\n", deltaX);
double ymin = las_header.minY();
double ymax = las_header.maxY();
double deltaY = ymax - ymin;
printf("deltaY = %.4f\n", deltaY);
double zmin = las_header.minZ();
double zmax = las_header.maxZ();
double deltaZ = zmax - zmin;
printf("deltaZ = %.4f\n", deltaZ);
unsigned int n_features = las_header.pointCount();
printf("deltaZ = %d\n", n_features);
unsigned int PointCount = las_header.pointCount();
double scale_x = las_header.scaleX();
double scale_y = las_header.scaleY();
double scale_z = las_header.scaleZ();
double offset_x = las_header.offsetX();
double offset_y = las_header.offsetY();
double offset_z = las_header.offsetZ();
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
cloud->points.resize(point_view->size());
for (pdal::PointId id = 0; id < point_view->size(); ++id)
{
double x = point_view->getFieldAs<double>(pdal::Dimension::Id::X, id); // X
double y = point_view->getFieldAs<double>(pdal::Dimension::Id::Y, id); // Y
double z = point_view->getFieldAs<double>(pdal::Dimension::Id::Z, id); // Z
double red = point_view->getFieldAs<double>(pdal::Dimension::Id::Red, id); // R
double green = point_view->getFieldAs<double>(pdal::Dimension::Id::Green, id); // G
double blue = point_view->getFieldAs<double>(pdal::Dimension::Id::Blue, id); // B
double point_class = point_view->getFieldAs<double>(pdal::Dimension::Id::Classification, id); // 分类标签
double GPSTime = point_view->getFieldAs<double>(pdal::Dimension::Id::GpsTime, id); // GPS时间
auto Intensity = point_view->getFieldAs<double>(pdal::Dimension::Id::Intensity, id); // 强度
cloud->points[id].x = x;
cloud->points[id].y = y;
cloud->points[id].z = z;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(0, 0, 0);
std::string name = u8"PDAL读点云PCL可视化";
viewer->setWindowName(name);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
如果可以正常读取并显示点云,则代表配置成功。