CGAL GIS 应用 - 从点云到DTM

CGAL GIS 应用 - 从点云到DTM

GIS应用中使用的许多传感器(例如激光雷达)都会生成密集的点云。此类应用通常利用更高级的数据结构:例如,不规则三角网(TIN),它可以作为数字高程模型(DEM)的基础,特别是用于生成数字地形模型(DTM)。
点云也可以通过分类信息来丰富,分类信息将点分割为地面、植被和建筑物点(或其他用户定义的标签)

某些数据结构的定义可能因来源不同而有所不同。在本文中使用以下术语:

  • TIN:三角不规则网络,一种二维三角结构,根据它们在水平面上的投影连接3D点。
  • DSM:数字表面模型,包括建筑物和植被的整个扫描表面的模型。我们用一个TIN来存储DSM
  • DTM:数字地形模型,一种没有建筑物或植被等物体的裸地表面模型。我们都使用TIN和光栅来存储DTM
  • DEM:数字高程模型,一个更通用的术语,包括DSM和DTM`。

本文演示了以下场景。从输入点云,我们首先计算存储为TINDSM。然后,我们过滤掉与建筑立面或植被噪声相对应的过大的面片。保留与地面相对应的大型构件。对孔洞进行填充,并对得到的DEM重新网格化。由栅格DEM生成一组等高线折线。最后,对植被、建筑物和分组点进行有监督的三标签分类。

不规则三角网(TIN)

CGAL提供了多种三角网数据结构和算法。TIN可以通过将二维Delaunay三角剖分与投影特性相结合来生成:三角剖分结构是利用点沿选定平面(通常是xy平面)的二维位置来计算的,而点的三维位置则保留以供可视化和测量。

Digital Surface Model (DSM)

使用表示输入输出流stream操作符,可以很容易地将许多格式(XYZ、OFF、PLY、LAS)的点云加载到 CGAL::Point_set_3结构中。生成存储在TIN中的DSM很简单。

由于CGAL的Delaunay三角剖分是一个 FaceGraph 的模型,因此可以直接将生成的TIN转换为 CGAL::Surface_mesh 这样的网状结构,并保存为该结构支持的任何格式。

#include<iostream>
#include<CGAL/Surface_mesh.h>
#include<CGAL/Surface_mesh/IO/PLY.h>#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Projection_traits_xy_3.h>
#include <CGAL/Delaunay_triangulation_2.h>#include <CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>
#include <CGAL/boost/graph/copy_face_graph.h>#include <CGAL/Point_set_3.h>
#include <CGAL/Point_set_3/IO.h>using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Projection_traits = CGAL::Projection_traits_xy_3<Kernel>;
using Point_2 = Kernel::Point_2;
using Point_3 = Kernel::Point_3;// Triangulated Irregular Network
using TIN = CGAL::Delaunay_triangulation_2<Projection_traits>;
using Mesh = CGAL::Surface_mesh<Point_3>;int main() {std::ifstream ifile("points.xyz", std::ios_base::binary);CGAL::Point_set_3<Point_3> points;ifile >> points;std::cerr << points.size() << " point(s) read" << std::endl;// Create DSMTIN dsm(points.points().begin(), points.points().end());// Write DSMMesh dsm_mesh;CGAL::copy_face_graph(dsm, dsm_mesh);std::ofstream dsm_ofile("dsm.ply", std::ios_base::binary);CGAL::IO::set_binary_mode(dsm_ofile);CGAL::IO::write_PLY(dsm_ofile, dsm_mesh);dsm_ofile.close();return 0;
}

输入points.xyz
在这里插入图片描述
输出DSM ply文件:
在这里插入图片描述
注:由密集点云生成三角网格Mesh,可以使用GIS等软件如QGIS TIN Mesh Creation工具,
参考:QGIS 高程点生成Mesh

官方示例:b9_training.ply点云数据生成DSM

  const std::string fname = argc != 2 ? CGAL::data_file_path("../data/points_3/b9_training.ply") : argv[1];if (argc != 2){std::cerr << "Usage: " << argv[0] << " points.ply" << std::endl;std::cerr << "Running with default value " << fname << "\n";}// Read pointsstd::ifstream ifile (fname, std::ios_base::binary);CGAL::Point_set_3<Point_3> points;ifile >> points;std::cerr << points.size() << " point(s) read" << std::endl;// Create DSMTIN dsm (points.points().begin(), points.points().end());using Mesh = CGAL::Surface_mesh<Point_3>;Mesh dsm_mesh;CGAL::copy_face_graph (dsm, dsm_mesh);std::ofstream dsm_ofile ("dsm.ply", std::ios_base::binary);CGAL::IO::set_binary_mode (dsm_ofile);CGAL::IO::write_PLY (dsm_ofile, dsm_mesh);dsm_ofile.close();

在这里插入图片描述

数字地形模型(DTM)

生成的DSM被用作DTM计算的基础,即地面表示为过滤掉非地面点后的另一个TIN
本文提出一个简单的DTM估计方法,分解如下步骤:

  1. 对面片的高度进行阈值化,以消除高度的剧烈变化;
  2. 将其他面片聚类为连通分支;
  3. 过滤所有小于用户定义阈值的组件。
    该算法依赖于两个参数:一个高度阈值对应于建筑物的最小高度,一个周长阈值对应于二维投影上建筑物的最大尺寸。

CGAL从DSM到DTM区域提取
coloredTIN
CGAL从DSM到DTM filtering
Filtering

CGAL从DSM到DTM 孔洞填充及网格细化
DTM

栅格化

TIN数据结构可以与重心坐标相结合,以便插值并栅格化顶点中嵌入的任何信息所需的任何分辨率的高度图。

示例参见:

  1. Mesh 网格曲面栅格化
  2. 虚幻地形高度图生成及测试

生成栅格PPM
在这里插入图片描述
生成栅格PNG:
在这里插入图片描述

提取等高线

提取TIN上定义的函数的等值层是另一个可以使用CGAL完成的应用。本文演示如何提取等值高度来构建地形图。

步骤:

  1. 构建等高线图Graph
  2. Graph分裂为多折线Polyline;
  3. Polyline简化。

详细示例及代码参见:

Mesh地形曲面提取等高线

在这里插入图片描述

Classifying 分类

CGAL提供了一个包分类,可用于将点云分割为用户定义的标签集。目前CGAL中可用的最先进的分类器是ETHZ中的随机森林。由于它是一个监督分类器,因此需要一个训练集。
下面的代码片段展示了如何使用一些手动选择的训练集来训练随机森林分类器,并计算通过图割算法正则化的分类:

// Get training from inputPoint_set::Property_map<int> training_map;bool training_found;std::tie (training_map, training_found) = points.property_map<int>("training");if (training_found){std::cerr << "Classifying ground/vegetation/building" << std::endl;// Create labelsClassification::Label_set labels ({ "ground", "vegetation", "building" });// Generate featuresClassification::Feature_set features;Classification::Point_set_feature_generator<Kernel, Point_set, Point_set::Point_map>generator (points, points.point_map(), 5); // 5 scales
#ifdef CGAL_LINKED_WITH_TBB// If TBB is used, features can be computed in parallelfeatures.begin_parallel_additions();generator.generate_point_based_features (features);features.end_parallel_additions();
#elsegenerator.generate_point_based_features (features);
#endif// Train a random forest classifierClassification::ETHZ::Random_forest_classifier classifier (labels, features);classifier.train (points.range(training_map));// Classify with graphcut regularizationPoint_set::Property_map<int> label_map = points.add_property_map<int>("labels").first;Classification::classify_with_graphcut<Concurrency_tag>(points, points.point_map(), labels, classifier,generator.neighborhood().k_neighbor_query(12), // regularize on 12-neighbors graph0.5f, // graphcut weight12, // Subdivide to speed-up processlabel_map);// Evaluatestd::cerr << "Mean IoU on training data = "<< Classification::Evaluation(labels,points.range(training_map),points.range(label_map)).mean_intersection_over_union() << std::endl;// Save the classified point setstd::ofstream classified_ofile ("classification_gis_tutorial.ply");CGAL::IO::set_binary_mode (classified_ofile);classified_ofile << points;classified_ofile.close();}

在这里插入图片描述

参考及相关链接

  1. https://doc.cgal.org/latest/Manual/tuto_gis.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141907.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SOMEIP_ETS_111: SD_Empty_Entries_Array

测试目的&#xff1a; 验证DUT能够忽略声明了条目数组长度为零的SubscribeEventgroup消息。 描述 本测试用例旨在确保DUT在接收到一个Entries数组长度为零的SubscribeEventgroup消息时&#xff0c;能够正确地忽略该消息&#xff0c;不对其进行解释或响应。 测试拓扑&#x…

移动UI案例:工具类app整套案例

工具类App是指提供各种实用工具和功能的手机应用程序。这些工具可以包括但不限于日历、闹钟、备忘录、翻译、计算器、单位转换、天气预报、地图导航、音乐播放器、相机、视频编辑等。这些工具类App能够帮助用户解决日常生活和工作中的各种问题&#xff0c;提高效率和便利性。 …

基于是springboot小区物业管理系统

小区物业管理系统 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于小区物业管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了小区物业管理系统&#x…

Redis的存储原理和数据模型

一、Redis是单线程还是多线程呢&#xff1f; 我们通过跑redis的代码&#xff0c;查看运行的程序可以得知&#xff0c;Redis本身其实是个多线程&#xff0c;其中包括redis-server&#xff0c;bio_close_file&#xff0c;bio_aof_fsync&#xff0c;bio_lazy_free&#xff0c;io_t…

猫头虎分享:Python库 SQLAlchemy 的简介、安装、用法详解入门教程

&#x1f42f; 猫头虎分享&#xff1a;Python库 SQLAlchemy 的简介、安装、用法详解入门教程 大家好&#xff0c;我是猫头虎&#xff01;今天有粉丝问猫哥&#xff1a;“在项目开发中如何高效地进行数据库操作&#xff1f;是否有一个灵活又强大的ORM库推荐&#xff1f;”正好&…

[Linux] 进程优先级 进程的调度与切换 环境变量详解

进程优先级 && 进程的调度与切换 && 环境变量 1.进程优先级1.1查看进程1.2 PRI VS NI1.3用指令调整优先级 2.进程的调度与切换2.1 进程切换2.2 linux实现进程调度的算法 3.环境变量前言引入&#xff08;main参数--命令行参数&#xff09;3.1 环境变量3.2 PATH环…

题目:单调栈

1、关于栈的概述 栈是一种数据结构&#xff0c;遵循“后进先出”&#xff08;LIFO, Last In, First Out&#xff09;的原则。这意味着最后被插入栈中的元素会最先被移除。可以把它想象成一个垒盘子的情况&#xff0c;新的盘子总是放在最上面&#xff0c;而最上面的盘子会最先被…

4------维修手机工具 解锁 刷机 保资料修复 修改参数等多工具合集 工具预览与操作解析

此款工具可能很多维修技术都使用过。早期知名手机维修加密狗。目前已经修改为可以任何人使用。此工具集合了多个版本以及加密狗工具。所谓的这些手机维修仪器工具。只是把很多工具直接整合到他里面。然后按需运行。其实查看解压后的文件会在其中找到有些小工具集合。类似基带修…

英文翻译无忧:2024年四大翻译工具推荐!

在全球化时代&#xff0c;英语已成为国际交流的重要语言。对于许多英语非母语的伙伴来说&#xff0c;一款好用的英文翻译工具至关重要。今天&#xff0c;小编为大家盘点几款实用的英文翻译工具&#xff01; 福昕在线翻译 直达链接&#xff1a;fanyi.pdf365.cn/ 福昕在线翻译…

基于51单片机的220V交流数字电流表proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1QmpPLvDTuW7QG7P-JCLPPg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

vulkano (rust) 画一个三角形 (vulkan 渲染窗口初始化 (Linux) 下篇)

上文说到, vulkan 相比 OpenGL (ES), 更加贴近底层硬件, 许多东西需要应用软件手动管理, 所以 vulkan 的初始化过程比较麻烦, 或者说学习曲线比较陡峭. 但是, 这种麻烦是一次性的, 一旦学会了, 就能开始享受 vulkan 的诸多好处啦 ~ 本文以绘制一个三角形为例, 介绍 vulkan 的初…

DBA运维小技巧之存储篇-Oracle服务器根目录满了怎么处理(2)迁移至新存储空间

1 前情提要 话说上次DBA小倩通过删除home lv&#xff0c;把空间扩给了/分区&#xff0c;问题暂时得到了解决。 没过几天&#xff0c;领导找到小倩下达任务&#xff0c;客户说数据库在本地磁盘空间太小了又快要满了&#xff0c;由于之前用的服务器本地磁盘&#xff0c;性能也比…

信息安全工程师(5)域名与域名解析

一、域名 1. 定义与功能 域名&#xff08;Domain Name&#xff09;是互联网上用于标识网站或服务器地址的名称&#xff0c;由一串由点分隔的字符组成&#xff0c;如“example.com”。域名的主要功能是提供一种便于记忆和输入的地址形式&#xff0c;以代替难以记忆的IP地址。域名…

【软件测试】肇新合同管理系统 需求说明书

1 引言 1.1 编写目的 本文档将列举实现合同管理系统所需要的全部功能&#xff0c;并对每个功能给出简单的描述。 本文档的预期读者包括&#xff1a;最终用户&#xff0c;项目负责人&#xff0c;评审人员&#xff0c;产品人员&#xff0c;软件设计开发人员&#xff0c;测试人员…

linux网络编程——UDP编程

写在前边 本文是B站up主韦东山的4_8-3.UDP编程示例_哔哩哔哩_bilibili视频的笔记&#xff0c;其中有些部分博主也没有理解&#xff0c;希望各位辩证的看。 UDP协议简介 UDP 是一个简单的面向数据报的运输层协议&#xff0c;在网络中用于处理数据包&#xff0c;是一种无连接的…

OpenAI o1:AI推理的未来,如何平衡性能与成本?

OpenAI o1&#xff1a;AI推理的未来&#xff0c;如何平衡性能与成本&#xff1f; &#x1f680;人工智能的未来&#xff0c;已经悄然走向一个新的拐点&#xff01;9月14日&#xff0c;OpenAI正式推出了两款新型模型——o1-preview与o1-mini。虽然这并非是GPT-4的简单升级版&am…

Python 从入门到实战19(函数参数)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了函数的基本介绍。今天我们继续学习一下函数参…

java坏境搭建

目录 安装 步骤1 步骤2 步骤3 步骤4 环境变量 1、在桌面“计算机”或“此电脑”图标上右键&#xff0c;选择“属性”&#xff0c;进入控制面板的计算机系统页面后&#xff0c;点击“高级系统设置”&#xff0c;不同操作系统可能界面不同&#xff1a; 2、点击“环境变量”…

铝型材及其常用紧固件、连接件介绍

铝型材介绍&#xff08;包括紧固件和连接件以及走线&#xff09; 铝型材 铝型材一般是6063铝合金挤压成型&#xff0c;分为欧标和国标两个标准。&#xff08;左边国标&#xff0c;右边欧标&#xff0c;欧标槽宽一点&#xff09; 由于槽型不一样&#xff0c;相关的螺栓和螺母也…

VS Code终端命令执行后老是出现 __vsc_prompt_cmd_original: command not found

VS Code终端命令执行后老是出现 __vsc_prompt_cmd_original: command not found。 如下图&#xff08;vscode终端中&#xff09;&#xff1a; 解决方案&#xff1a; 1、vim ~/.bashrc 2、在~/.bashrc里面加入命令&#xff1a;unset PROMPT_COMMAND 3、source ~/.bashrc