Python 如何获取存储在';数据';使用liblas的las点字段?

Python 如何获取存储在';数据';使用liblas的las点字段?,python,lidar,Python,Lidar,我正在使用多脉冲激光雷达数据,该数据收集飞行路径内多条线路上的点。我试图确定las文件中各行的名称和数量。我正在python中使用liblas模块 我发现这解释了las文件中存储的不同字段。它在页面的最底部提到了一个数据字段(get_data和set_data) 标题中的“点数据格式”和“点数据记录长度”为该“数据”字段留出了空间。我的标题说我为数据字段预留了28个字节,数据字段中存储了28个值。第19个值(至少在来自两个不同传感器的两个数据集中)指的是行号。我在单脉冲数据中有一个值,在多脉冲数

我正在使用多脉冲激光雷达数据,该数据收集飞行路径内多条线路上的点。我试图确定las文件中各行的名称和数量。我正在python中使用liblas模块

我发现这解释了las文件中存储的不同字段。它在页面的最底部提到了一个数据字段(get_data和set_data)

标题中的“点数据格式”和“点数据记录长度”为该“数据”字段留出了空间。我的标题说我为数据字段预留了28个字节,数据字段中存储了28个值。第19个值(至少在来自两个不同传感器的两个数据集中)指的是行号。我在单脉冲数据中有一个值,在多脉冲数据中有4个值

我想知道这个字段中存储的内容是否有一个标准,或者它是否是专有的

另外,为了获得每条扫描线的名称,我编写了以下代码:

import liblas
from liblas import file as lasfile

# Get parameters
las_file = r"E:\Testing\00101.las"

f = lasfile.File(las_file, mode='r')

line_list = []
counter = 0
for p in f:
    line_num = p.data[18]
    if line_num not in line_list:
        line_list.append(line_num)
    counter += 1
print line_list
它会导致以下错误:

Traceback (most recent call last):
  File "D:\Tools\Python_Scripts\point_info.py", line 46, in <module>
    line_num = p.data[18]
  File "C:\Python27\ArcGIS10.1\lib\site-packages\liblas\point.py", line 560, in get_data
    length = self.header.data_record_length
  File "C:\Python27\ArcGIS10.1\lib\site-packages\liblas\point.py", line 546, in get_header
    return header.Header(handle=core.las.LASPoint_GetHeader(self.handle))
WindowsError: [Error -529697949] Windows Error 0xE06D7363
回溯(最近一次呼叫最后一次):
文件“D:\Tools\Python\u Scripts\point\u info.py”,第46行,在
行数=p.data[18]
get\U数据中的文件“C:\Python27\ArcGIS10.1\lib\site packages\liblas\point.py”,第560行
长度=self.header.data\u记录长度
文件“C:\Python27\ArcGIS10.1\lib\site packages\liblas\point.py”,第546行,位于get\U标题中
返回header.header(handle=core.las.LASPoint_GetHeader(self.handle))
WindowsError:[错误-529697949]Windows错误0xE06D7363

是否有人更了解las点/标题中存储的行号?有人能解释这个错误吗?在我得到错误之前,它似乎分配了近2gb的ram。我在WinXP上,所以我猜这是内存错误,但我不明白为什么访问这个“数据”字段会占用内存。非常感谢您的帮助

我并不假装是这方面的专家,但我对GIS数据很感兴趣,所以这引起了我的兴趣。我在Fedora19系统上安装了
liblas
及其依赖项,并播放了
liblas
附带的示例数据文件

使用你的代码,我遇到了同样的问题,看着我所有的记忆都被消耗殆尽。我不知道为什么会发生这种情况——也许是不必要的引用使垃圾收集器无法像我们希望的那样工作。这可能会被修复,但我不会尝试

我确实注意到了
liblas
模块的一些有趣特性,并决定尝试它们。我相信你能得到你想要的数据

打开文件后,查看标题中的XML描述

h = f.get_header()
print(h.get_xml())
很难查看(可以随意使用xml.dom.minidom或lxml.etree),但在我的示例文件中,它显示了点数据的字节布局(我的也有28个字节)。在我的例子中,偏移量18是分配给点源ID的一个短字符(2字节)。你应该能够用
p.data[18:19]
p.get\u data()[18:19]
p.Point\u Source\u ID
,或者
p.get\u-Point\u Source\u\u-ID()
来检索它。不幸的是,
数据
引用占用了内存,并且
p.point\u source\u id
有一个bug(提交给开发人员的bug修复请求)。如果我们将您的代码更改为使用最后一个访问方法,那么一切似乎都正常工作。因此,请在
for
循环中尝试以下操作:

for p in f:
    line_num = p.get_point_source_id()
    if line_num not in line_list:
        line_list.append(line_num)
    counter += 1
注意

counter == h.get_count()
如果只需要一组唯一的点源ID值

line_set = set(p.get_point_source_id() for p in f)

希望您的数据值也可用作
p。获取\u point\u source\u id()
。请在评论中告诉我它是如何为您工作的。干杯

我并不假装是这方面的专家,但我对GIS数据很感兴趣,所以这引起了我的兴趣。我在Fedora19系统上安装了
liblas
及其依赖项,并播放了
liblas
附带的示例数据文件

使用你的代码,我遇到了同样的问题,看着我所有的记忆都被消耗殆尽。我不知道为什么会发生这种情况——也许是不必要的引用使垃圾收集器无法像我们希望的那样工作。这可能会被修复,但我不会尝试

我确实注意到了
liblas
模块的一些有趣特性,并决定尝试它们。我相信你能得到你想要的数据

打开文件后,查看标题中的XML描述

h = f.get_header()
print(h.get_xml())
很难查看(可以随意使用xml.dom.minidom或lxml.etree),但在我的示例文件中,它显示了点数据的字节布局(我的也有28个字节)。在我的例子中,偏移量18是分配给点源ID的一个短字符(2字节)。你应该能够用
p.data[18:19]
p.get\u data()[18:19]
p.Point\u Source\u ID
,或者
p.get\u-Point\u Source\u\u-ID()
来检索它。不幸的是,
数据
引用占用了内存,并且
p.point\u source\u id
有一个bug(提交给开发人员的bug修复请求)。如果我们将您的代码更改为使用最后一个访问方法,那么一切似乎都正常工作。因此,请在
for
循环中尝试以下操作:

for p in f:
    line_num = p.get_point_source_id()
    if line_num not in line_list:
        line_list.append(line_num)
    counter += 1
注意

counter == h.get_count()
如果只需要一组唯一的点源ID值

line_set = set(p.get_point_source_id() for p in f)

希望您的数据值也可用作
p。获取\u point\u source\u id()
。请在评论中告诉我它是如何为您工作的。干杯

这有帮助吗?很遗憾,它没有引用“data”属性。这有帮助吗?很遗憾,它没有引用“data”属性。谢谢。根据las 1.2规范,点源id应包含行号(偏移18)。p、 数据[18]返回正确的值,而p.point\u source\u id始终返回0。另外,当我查看p.xml时,pointsourceid标记包含正确的行值。我开始认为这是一个bug问题。对不起,刚才看到你编辑了源代码。我相信你的回答。我还看到了def设置点源