【Lidar】Laspy库介绍+基础函数(读取、可视化、保存、旋转、筛选、创建点云数据)

1 Laspy库介绍

        laspy是一个Python库,主要用于读取、修改和创建LAS点云文件。该库兼容Python 2.6+和3.5+,并且可以处理LAS版本1.0-1.3的文件。

        在laspy库中,可以使用命令行工具进行文件操作,如格式转换和验证,以及比较LAS文件。此外,laspy还支持分块读取、直接保存和分块保存等操作。对于创建新的LAS文件,该库也提供了相应的功能。此外,laspy库还支持不同版本的LAS文件之间的转换,并提供了访问公共头和点记录的方法。

  1. 易于使用:laspy库的API设计简洁明了,易于学习和使用。
  2. 高效:laspy库采用了高效的内存管理和数据压缩技术,可以快速地读取、修改和写入LAS文件。
  3. 支持多种操作:laspy库支持对LAS文件的多种操作,如格式转换、验证、比较等,以及创建新的LAS文件。
  4. 支持不同版本:laspy库支持LAS版本1.0-1.3的文件,并可以轻松实现不同版本之间的转换。
  5. 良好的文档和社区支持:laspy库提供了详细的文档和社区支持,方便用户快速解决问题和学习更多内容。

2 基础函数

2.1 读取点云数据

def read_las(file=r'G:/彭俊喜/10.las'):  # 读取点云数据las = laspy.read(file)las_header = las.header# point = las.points  # print(point)# points_data = np.v stack((las.x, las.y, las.z, las.intensity, las.gps_time, las.point_source_id,# las.classification, las.user_data, las.red, las.green, las.blue)).transpose()# xyz = points_data[:, :3]  # 以数组的形式显示所有点# print(points)print('主版本号:' + str(las_header.major_version))print('副版本号:' + str(las_header.minor_version))print('最小值:%f,%f,%f' % (las_header.min[0], las_header.min[1], las_header.min[2]))print('最大值:%f,%f,%f' % (las_header.max[0], las_header.max[1], las_header.max[2]))print('比例:%f,%f,%f' % (las_header.scale[0], las_header.scale[1], las_header.scale[2]))print('偏移量:%f,%f,%f' % (las_header.offset[0], las_header.offset[1], las_header.offset[2]))print('点云数量:%d' % las_header.point_records_count)# 遍历点for i in range(las_header.point_records_count):# 遍历所有的点云数据print('x=%f, y=%f, z=%f, intensity=%d, GPStime=%f, PointSourceID=%f, ''Classification=%d, UserData=%d, Red=%d, Green=%d, Blue=%d'% (las.x[i], las.y[i], las.z[i],las.intensity[i], las.gps_time[i], las.point_source_id[i],las.classification[i], las.user_data[i],las.red[i], las.green[i], las.blue[i]))

2.2 筛选点云数据

def filtering_las(file=r'G:/彭俊喜/10.las'):  # 通过条件筛选点云数据(颜色/回波强度等)las = laspy.read(file)  # 读取点云数据new_file_c0 = laspy.create(point_format=las.header.point_format,file_version=las.header.version)def multiple_conditions(value1, value2, value3, value4):# 创建筛选条件condition1 = value1 < 60condition2 = value1 > 105condition3 = value2 < 125condition4 = value2 > 255condition5 = value3 < 120condition6 = value3 > 255condition7 = value4 > 100# 若条件都满足,返回True,否则返回Falsereturn ((condition1 or condition2) and (condition3 or condition4) and (condition5 or condition6)) and condition7result = np.vectorize(multiple_conditions)(las.red, las.green, las.blue, las.intensity)  # 获取符合条件的布尔值new_file_c0.points = las.points[result]  # 通过布尔值选择点云数据new_file_c0.write(r'G:/彭俊喜/10.las')  # 写入点云数据

2.3 旋转点云

def rotation_las(file=r'G:/彭俊喜/10.las'):  # 旋转点云las = laspy.read(file)  # 读取点云数据las_header = las.headercenter_x = (las_header.min[0] + las_header.max[0]) / 2center_y = (las_header.min[1] + las_header.max[1]) / 2  # 计算中心点(有的点云含有地理坐标)cos = -1  # 控制旋转角度sin = math.sqrt(1 - cos ** 2)x_all = []y_all = []xj = []  # 创建新列表存储旋转后的点云数据for i in range(las_header.point_records_count):# 遍历所有的点云数据x = las.x[i] - center_xy = las.y[i] - center_yx_rotation = x * cos - y * sin + center_xy_rotation = x * sin + y * cos + center_yx_all.append(x_rotation)y_all.append(y_rotation)xj.append(i)  # 将旋转后的点加入列表中header = laspy.LasHeader(point_format=3, version="1.2")  # 定义头文件header.offsets = [np.min(x_all), np.min(y_all), las.header.offsets[2]]  # 定义偏移量header.scales = np.array([0.0001, 0.0001, 0.0001])  # 定义缩放比例header.add_extra_dim(laspy.ExtraBytesParams(name="xj", type=np.int32))new_las = laspy.LasData(header)new_las.x = x_allnew_las.y = y_allnew_las.z = las.znew_las.intensity = las.intensitynew_las.gps_time = las.gps_timenew_las.point_source_id = las.point_source_idnew_las.classification = las.classificationnew_las.red = las.rednew_las.green = las.greennew_las.blue = las.bluenew_las.xj = xjnew_las.write('G:/彭俊喜/10.las')

2.4 创建点云

def create_las(file=r'G:/彭俊喜/10.las'):  # 创建点云# 0. Creating some dummy datamy_data_xx, my_data_yy = np.meshgrid(np.linspace(-20, 20, 15), np.linspace(-20, 20, 15))my_data_zz = my_data_xx ** 2 + 0.25 * my_data_yy ** 2my_data = np.hstack((my_data_xx.reshape((-1, 1)), my_data_yy.reshape((-1, 1)), my_data_zz.reshape((-1, 1))))# 1. Create a new headerheader = laspy.LasHeader(point_format=3, version="1.2")header.add_extra_dim(laspy.ExtraBytesParams(name="random", type=np.int32))header.offsets = np.min(my_data, axis=0)header.scales = np.array([0.1, 0.1, 0.1])# 2. Create a Laslas = laspy.LasData(header)las.x = my_data[:, 0]las.y = my_data[:, 1]las.z = my_data[:, 2]las.random = np.random.randint(-1503, 6546, len(las.points), np.int32)las.write(file)

2.5 保存点云

def save_point(path, point_type):  # 保存点云# ---------------------------laspy库保存----------------------------las = laspy.read(r"Z:\Personal\彭俊喜\Lidar_try/2.las")  # read a las filepoints = las.pointsout_file = laspy.LasData(las.header)ground = [2, 5, 6]  # 索引out_file.points = points[np.array(ground)]  # extract ground points, and save it to a las file.out_file.write(r"Z:\Personal\彭俊喜\Lidar_try/out1.las")

2.6 可视化点云

def show_point(file=r"Z:\Personal\彭俊喜\Lidar_try/out.las"):  # 可视化点云las = laspy.read(file)  # read a las filepoints = las.pointsxyz = np.vstack((las.x, las.y, las.z)).transpose()  # extract x, y, z and put into a list  # 点云的空间位置x = las.xy = las.yz = las.z# 绘制三维散点图fig = plt.figure()ax = fig.add_subplot(projection='3d')ax.set_xlabel('X Axes')ax.set_ylabel('Y Axes')ax.set_zlabel('Z Axes')# ax.grid(None)  # 隐藏格网ax.scatter(x, y, z)plt.show()

3 需要安装的库

# -*- coding: utf-8 -*-
"""
@Time : 2023/11/30 15:30
@Auth : RS迷途小书童
@File :Laspy Function.py
@IDE :PyCharm
@Purpose:laspy库的基础操作
"""
import math
import laspy
import numpy as np
import matplotlib.pyplot as plt

4 总结

        总的来说,laspy库是一个功能强大且易于使用的Python库,适用于处理LAS点云文件。它可以帮助用户快速读取、修改和创建LAS文件,并支持多种操作和版本转换。对于需要处理LAS文件的用户来说,laspy库是一个值得考虑的选择。

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

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

相关文章

Apache或Nginx在Linux上配置虚拟主机

在Linux上使用Apache或Nginx配置虚拟主机可以让您在同一台服务器上托管多个网站。这样不仅可以充分利用服务器资源&#xff0c;还能降低每个网站的运营成本。以下是使用Apache和Nginx配置虚拟主机的步骤。 使用Apache配置虚拟主机 安装Apache服务器软件。在终端中使用以下命令…

RK3568驱动指南|第八篇 设备树插件-第74章 虚拟文件系统ConfigFS介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

mysql数据恢复

使用MySQL第三方工具binlog2sql binlog2sql&#xff0c;一款基于python开发的开源工具&#xff0c;是由大众点评团队的DBA使用python开发出来的&#xff0c;从MySQL binlog解析出你要的SQL。根据不同选项&#xff0c;你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。其功…

大数据驱动下的人口普查:新时代下的新变革

人口普查数据大屏&#xff0c;是指一种通过大屏幕显示人口普查数据的设备&#xff0c;可以将人口普查数据以可视化的形式呈现出来&#xff0c;为决策者提供直观、准确的人口数据。这种大屏幕的出现&#xff0c;让人口普查数据的利用变得更加高效、便捷。 如果您需要制作一张直观…

一篇文章让你读懂Jenkins的用途

Jenkins是一款强大的自动化构建工具,广泛应用于软件开发和测试领域。它能够帮助团队在软件开发过程中实现自动化,从而提高生产效率和质量。下面我们将详细介绍Jenkins的用途。 1、持续集成与持续部署 Jenkins最大的特点是支持持续集成与持续部署。在软件开发过程中,持续集…

Linux目录创建的高级操作技巧和命令

在Linux系统中&#xff0c;创建目录是日常操作中的基础之一。除了常规的 mkdir 命令&#xff0c;还有一些高级的操作技巧和命令可以提高效率。本博客将介绍一些常用的目录创建方法&#xff0c;以及如何结合不同命令实现更复杂的目录结构。 1. 使用 mkdir 命令 基本创建&#x…

无人机高空巡查+智能视频监控技术,打造森林防火智慧方案

随着冬季的到来&#xff0c;森林防火的警钟再次敲响&#xff0c;由于森林面积广袤&#xff0c;地形复杂&#xff0c;且人员稀少&#xff0c;一旦发生火灾&#xff0c;人员无法及时发现&#xff0c;稍有疏忽就会酿成不可挽救的大祸。无人机高空巡查智能视频监控是一种非常有效的…

Linux:符号和符号表

文章目录 什么是符号&#xff1f;什么是符号表&#xff1f;全局符号和本地符号1. 全局符号&#xff1a;symtab符号表 2. 本地符号&#xff1a; 符号在汇编阶段符号在链接阶段1.由模块 m 定义并能被其他模块引用的全局符号。2.由其他模块定义并被模块 m 引用的全局符号。3.只被模…

Linux【2】:清理几天前的文件夹YYYYMMDD

Linux【2】&#xff1a;清理几天前的文件夹YYYYMMDD 1、清理指定日期【文件名】前文件夹脚本2、清理指定日期【文件日期】前的文件3、find命令说明 1、清理指定日期【文件名】前文件夹脚本 脚本如下#!/bin/bash #移除模糊目录下的日期文件夹 RemoveDir/root/tlogs/* dtdate %Y…

Ruoyi-vue上传下载文件

1. Controller /*** 修改文书发布记录*/RepeatSubmit //禁止重复提交Log(title "文书发布记录", businessType BusinessType.UPDATE)PostMapping("update") //RequestParam("xxx") RequestBody RequestPart("xxx") 这3个注解都…

深入了解ThreadLocal:避免内存泄漏的陷阱与最佳实践

多线程编程中&#xff0c;数据共享与隔离一直是开发者需要面对的挑战之一。而Java中的ThreadLocal提供了一种优雅的解决方案&#xff0c;允许每个线程都拥有自己独立的数据副本&#xff0c;从而避免了共享数据带来的线程安全问题。然而&#xff0c;正如事物总有两面性一样&…

Kimichat使用案例:将一大片无序文本内容整理成有序的Excel表格

Kimichat是一个国产的AI大模型应用。2024年10月9日&#xff0c;专注于通用人工智能领域的公司月之暗面&#xff08;Moonshot Al&#xff09;宣布在“长文本”领域实现了突破&#xff0c;推出了首个支持输入20万汉字的大模型moonshot&#xff0c;以及搭载该模型的智能助手产品Ki…

ORCLE APEX和EBS集成的2个小问题

from跳转后&#xff0c;没有跳转到指定页 从EBS菜单跳转登录后&#xff0c;没有跳转到APEX的指定页&#xff0c; 原因&#xff1a;再USER_INTERFACE定义的地方&#xff0c;HOME URL 被设置成了固定值 0&#xff0c;如上图 解决方法&#xff1a;定义APP级别的ITEM,在自动登录的…

使用Dockerfile Maven Plugin 将Docker镜像Push到AWS ECR (Elastic Container Registry)

文章目录 小结问题解决AWS ECR (Elastic Container Registry)的登录问题 pull access denied for jdk, repository does not exist问题 Could not acquire image ID or digest following builddockerfile-maven-plugin 使用 参考 小结 本文记录使用Dockerfile Maven Plugin 将…

通过一道CTF题目来认识一下Frida

本文作者&#xff1a;杉木涂鸦智能安全实验室 Frida https://github.com/frida/frida Frida是一个动态代码插入工具&#xff0c;可用于各种应用程序的调试和逆向工程。它提供了多种安装选项&#xff0c;包括Python和Node.js绑定&#xff0c;并提供了详细的命令行参数和选项。…

JVM虚拟机系统性学习-运行时数据区(虚拟机栈、本地方法栈)

虚拟机栈 虚拟机栈为每个线程所私有的&#xff0c;如下图&#xff1a; 栈帧是什么&#xff1f; 栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息 栈内存为线程私有的空间&#xff0c;每个方法在执行时都会创建一个栈帧&#xff0c;执行该方法时&…

Java的NIO工作机制

文章目录 1. 问题引入2. NIO的工作方式3. Buffer的工作方式4. NIO数据访问方式 1. 问题引入 在网络通信中&#xff0c;当连接已经建立成功&#xff0c;服务端和客户端都会拥有一个Socket实例&#xff0c;每个Socket实例都有一个InputStream和OutputStream&#xff0c;并通过这…

选择法排序

本题要求将给定的n个整数从大到小排序后输出。 输入格式&#xff1a; 输入第一行给出一个不超过10的正整数n。第二行给出n个整数&#xff0c;其间以空格分隔。 输出格式&#xff1a; 在一行中输出从大到小有序的数列&#xff0c;相邻数字间有一个空格&#xff0c;行末不得有…

企业IT安全:内部威胁检测和缓解

什么是内部威胁 内部威胁是指由组织内部的某个人造成的威胁&#xff0c;他们可能会造成损害或窃取数据以谋取自己的经济利益&#xff0c;造成这种威胁的主要原因是心怀不满的员工。 任何内部人员&#xff0c;无论是员工、前雇员、承包商、第三方供应商还是业务合作伙伴&#…

SSL证书HTTPS保护服务

SSL证书属于数字证书的其中一种&#xff0c;广泛用于https协议&#xff0c;从而可以让数据传输在加密前提下完成&#xff0c;确保HTTPS网络安全是申请SSL证书必要工作。 SSL证书是主要用于https是一种加密协议&#xff0c;仔细观察网站地址会发现目前主流的网址前面都会有http…