从点云创建 DSM:网格化和可视化实用指南

今天我将向您展示如何从点云创建数字表面模型(DSM)。首先,我们将尝试了解 DSM 是什么,然后我们将进入讨论的更实际部分。

什么是 DSM?

DSM 是一个描述表面及其表面所有内容的模型。现在,为了更清楚地了解 DSM,您不仅对某些区域的地貌特征感兴趣,而且还对位于该表面的所有树木、灌木丛和大岩石感兴趣。然而,在 DTM(数字地形模型)中,只有地球表面,没有树木、岩石或灌木丛。这里我将创建一个DSM。要从点云生成数字表面模型 (DSM),第一步是将感兴趣的区域划分为网格。随后,为每个网格单元分配一个高程值,该高程值源自单元内或附近点的 3D 坐标(X、Y、Z)。此过程可全面呈现地球表面,捕获地形、建筑物和植被等特征。为了更好地理解网格化的工作原理,我将创建一个合成数据并自行实现网格化。

让我们首先导入必要的库:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker, cm
from mpl_toolkits.axes_grid1 import make_axes_locatable
from scipy.spatial import cKDTree

创建网格区域和一些样本点:

# grid range in x and y direction
x = np.arange(8)
y = np.arange(8)
# creating high number of points (70) for this grid area 
# with x, y, z coordinates
xp = np.random.random(size=70)*8 - 0.5
yp = np.random.random(size=70)*8 - 0.5
zp = np.random.randint(10, size = 70)
# grid coodinates
xc = np.arange(8) # x coordinates 
yc = np.arange(8) # y coordinates
grc = np.meshgrid(xc, yc) # grid coordinates

现在,下一步我们将使用最近邻插值来找到距离网格中心最近的点:

tree = cKDTree(np.c_[xp, yp])
dd, ii = tree.query(np.c_[grc[0].ravel(), grc[1].ravel()], k=1)
x_close = xp[ii]
y_close = yp[ii]

可视化以便更好地理解:

plt.figure(figsize = (12, 12))
plt.xticks(x-0.5)
plt.yticks(y-0.5)
plt.scatter(xp, yp, label='Observed Points')
plt.scatter(grc[0], grc[1], label='Grid Centers')
plt.grid(color='k', linestyle='-', linewidth=2)
plt.xlim((-.5,7.5))
plt.ylim((-.5,7.5))for i in range(len(ii)):plt.plot([grc[0].ravel()[i], xp[ii[i]]], [grc[1].ravel()[i], yp[ii[i]]], c='g')#plt.text(-0.11, 7.5-0.31, 'A )', bbox=dict(fill=False, edgecolor='r', linewidth=1.25), fontsize=18)plt.legend(bbox_to_anchor=(.95, 1.02), loc='upper left')

观察到蓝色点,橙色点是网格中心,绿线显示网格中心和距离该中心最近的点之间的连接。

然后,一旦为每个网格分配一个值,您就得到了栅格。让我们想象一下:

from matplotlib import ticker, cm
from mpl_toolkits.axes_grid1 import make_axes_locatable
fig, ax = plt.subplots(1, figsize = (12, 12))
ax.set_xticks(x-0.5)
ax.set_yticks(y-0.5)
elv = zp[ii]
elv.shape = (x.shape[0], y.shape[0])
im = ax.imshow(np.flip(elv, 0), cmap=cm.get_cmap('PuBu_r', 9))
ax.grid(color='k', linestyle='-', linewidth=2)
ax.tick_params('both', bottom=False, top=False, left=False, right=False,labelbottom=False, labeltop=False, labelleft=False, labelright=False)
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
cbar = fig.colorbar(im, ticks=np.arange(10), ax = ax, cax = cax)
cbar.ax.set_yticklabels(['0 m    ', '1 m    ', '2 m    ', '3 m     ', '4 m', '5 m', '6 m', '7 m', '8 m', '9 m'])  
cbar.ax.set_ylabel('Elevation of interpolated Points', rotation=270, fontsize=15)

上述合成点的栅格结果。

对现实世界数据进行网格化。

下一步,我将使用从 OpenTopography 下载的真实世界数据。可以从这里获取。让我们看看数据是什么样的:

来自 Colrado (OpenTopography) 的点云数据。

现在让我们对现实世界的点云数据进行网格化,但这次我将使用 scipy griddata 而不是编写自己的网格化操作:

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import laspy
path = "pointsColoradowithoutBuilding.las"
las = laspy.read(path)
points = las.xyz
amplitude = las.intensity
red = las.red
green = las.green
blue = las.blue
from scipy.interpolate import griddata
import matplotlib.pyplot as pltx = points[:, 0]
y = points[:, 1]
z = points[:, 2]# Define grid parameters
xmin, xmax = np.nanmin(x), np.nanmax(x)
ymin, ymax = np.nanmin(y), np.nanmax(y)
grid_resolution = .5# Create a grid
xi, yi = np.meshgrid(np.arange(xmin, xmax, grid_resolution), np.arange(ymin, ymax, grid_resolution))# Interpolate elevation values
zi = griddata((x, y), z, (xi, yi), method='linear')
plt.figure(figsize=(10, 8))
new_zi = np.nan_to_num(zi, nan=np.nanmax(zi))
new_zi = np.clip(new_zi, a_min=None, a_max=z.max()+1)
plt.imshow(new_zi, extent=[xi.min(), xi.max(), yi.min(), yi.max()], cmap="terrain")
plt.colorbar(label='Elevation')
plt.title('Digital Elevation Model (DEM) with imshow')
plt.xlabel('X-coordinate')
plt.ylabel('Y-coordinate')
plt.show()

网格点云数据。

这里我使用 scipy 库中的线性插值进行网格化,结果看起来非常好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习JavaEE的日子 Day28 异常,多线程

Day28 1.异常机制 1.1 异常概念 异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。 设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。 ​ Java语言使用异常处理机…

LabVIEW柴油机安保监控系统

LabVIEW柴油机安保监控系统 随着航运业的快速发展,确保船舶柴油机的安全稳定运行变得尤为重要。船舶柴油机故障不仅会导致重大的经济损失,还可能危及人员安全和环境。设计并开发了一套基于LabVIEW平台的柴油机安保监控系统,旨在通过实时监控…

Python数学建模-2.9Matplotlib库

Matplotlib库是Python中一个非常流行的绘图库,它提供了大量的绘图工具,可以生成各种类型的静态、动态、交互式的图表。Matplotlib的设计初衷是为了与NumPy配合使用,从而提供一个强大的数学绘图工具。 1.Matplotlib的主要特点 丰富的图表类型…

Ubuntu18.04显示--有线连接未托管

引用: Ubuntu18.04连不网 报"有线连接未托管"_ubuntu20.04以太网未托管-CSDN博客 正文 虚拟机环境配置: VirtaualBox Ubuntu18.04桌面版 问题现象: Ubuntu18.04虚拟机的桌面上提示“有线连接未托管”,虚拟机不能上网&#xf…

抖音视频批量下载软件可导出视频分享链接|手机网页视频提取|视频爬虫采集工具

解锁抖音视频无水印批量下载新姿势! 在快节奏的生活中,抖音作为时下最热门的短视频平台之一,吸引着广大用户的目光。而如何高效地获取喜欢的视频内容成为了许多人关注的焦点。Q:290615413现在,我们推出的抖音视频批量下载软件&…

初始Java篇(JavaSE基础语法)(3)

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 方法的使用 方法定义 实参和形参的关系 方法重载 方法签名 递归 方法的使用 方法就是一个代码片段. 类似于 C 语言中的 "函数"…

WordPress Plugin NotificationX插件 SQL注入漏洞复现(CVE-2024-1698)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。 0x02 漏洞概述 WordPress plugin NotificationX是一个应用插件。2.8.2版本及之前 存在安全漏洞,该…

音频转换器哪个好?5个角度详细测评~

我们常常会用到音频转换器,比如因为平台和设备对某些格式的不兼容,需要进行格式转换;比如有些音频文件可能过大,需要转换为更高效;压缩格式以节省存储空间或加快传输速度;比如调整音频文件的比特率、采样率…

Dijkstra算法

Dijkstra算法用于求无向图或者有向图中起点到各个顶点的最短路径,且边的权值需要为非负数下面这个题就可以用该算法求解 743. 网络延迟时间 有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i]…

【实例】React 组件传值方法: Props、回调函数、Context、路由传参

React原始传值方法 借用状态管理库的传值见下篇文:MobX 和 Redux 【实例】React 状态管理库 MobX Redux 入门及对比 文章目录 React原始传值方法父组件->子组件 props子组件->父组件 回调函数Context路由传值 父组件->子组件 props 父组件可以通过属性&a…

matlab实现对全球不规则投影数据的投影转换

前几个专栏我们讨论了几个不规则的投影转换问题,有需要的可以阅读以下文章: matlab实现对极地投影数据的投影转换_matlab极地投影-CSDN博客 联合matlab和Arcgis进行netcdf格式的雪覆盖数据的重新投影栅格-CSDN博客 这次遇到的问题是一个墨卡托投影的数据…

【机器学习】基于粒子群算法优化的BP神经网络分类预测(PSO-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】粒子群算法(PSO)原理及实现 2.设计与实现 数据集: 多输入多输出:样本特征24,标签类别4…

【web算法】列车车厢重排问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

大数据开发--02.环境准备

一.准备三台linux虚拟机 1.分别取名node1,node2,node3 2.配置静态ip 这里以node1为例,配置静态ip地址,其他node2.node3一样 配置完成之后别忘记 systemctl restart network 3.在各自的/etc/hosts文件中编辑三个Ip地址 三台都要配置, 4.然…

【PostGresql】------ pg多表数据多个条件汇总 使用 union 方法示例代码

1. 示例代码如下: SELECT"ID","DT_DATE","CNAME","RMAN_NAME","DEP_NAME","DEP_ID","INVEST_MAN_NAME","TYPE_NAME","INVEST_LEVEL_NAME","POSITION_NAME",…

第1关:创建数据库

任务描述 创建一个名为mydata的数据库。 相关知识 MySQL创建数据库的语法如下: 其中,database_name是要创建的数据库的名称。 开始你的任务吧,祝你成功! #请在此处添加实现代码 ########## Begin ########## CREATE DATABASE …

asp.net在线租车平台

说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql server数据库 功能模块: asp.net在线租车平台 用户功能有首页 行业新闻用户注册车辆查询租车介绍访问后台 后台管理员可以进行用户管理 管…

ubuntu20.04安装Pycharm

下载pycharm安装包 https://www.jetbrains.com/pycharm/download/#sectionlinux 使用社区版点击download 下载好的pycharm如图所示,右键解压: 打开终端,输入cd命令,进入刚刚解压文件夹下的bin文件夹,命令行是cd 文…

19.WEB渗透测试--抓包技术(下)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:18.WEB渗透测试--抓包技术(上)-CSDN博客 Burp含义和内容参考&…

CCDP.01.使用NotePad++辅助部署OpenStack的说明

前言 对于象OpenStack(OS)这样的复杂分布式系统(云计算平台),一次部署通过是需要相当的Linux基础、网络基础、分布式系统基础、云计算基础的。这里类比在开发大型复杂系统常常采用的“防御式编程”方法论,探…