将LAS文件转换为numpy数组?


15

我已经开始学习如何在python中处理LAS数据,并希望了解其他人如何处理LAS文件。我想阅读要点(我使用的是numpy数组),并将1类和2类(未分类和分类)过滤到单独的数组中。我有以下代码,但似乎无法过滤点。

# Import modules
from liblas import file
import numpy as np

if __name__=="__main__":
    '''Read LAS file and create an array to hold X, Y, Z values'''
    # Get file
    las_file = r"E:\Testing\ground_filtered.las"
    # Read file
    f = file.File(las_file, mode='r')
    # Get number of points from header
    num_points = int(f.__len__())
    # Create empty numpy array
    PointsXYZIC = np.empty(shape=(num_points, 5))
    # Load all LAS points into numpy array
    counter = 0
    for p in f:
        newrow = [p.x, p.y, p.z, p.intensity, p.classification]
        PointsXYZIC[counter] = newrow
        counter += 1

我见过arcpy.da.featureClassToNumpyArray,但是我不想导入arcpy,也不必转换为shapefile。

我还能如何将LAS数据过滤/读取到numpy数组中?


错误消息是什么(如果有)?
til_b 2013年

没错 我只是不知道如何过滤,并且不确定是否有更好的方法将LAS放入阵列。
巴巴罗萨2013年

Answers:


14

PointsXYZIC现在是一个numpy数组。这意味着您可以使用numpy索引来过滤您感兴趣的数据。例如,您可以使用布尔值索引来确定要抓取的点。

#the values we're classifying against
unclassified = 1
ground = 2

#create an array of booleans
filter_array = np.any(
    [
        PointsXYZIC[:, 4] == unclassified, #The final column to index against
        PointsXYZIC[:, 4] == ground,
    ],
    axis=0
)

#use the booleans to index the original array
filtered_rows = PointsXYZIC[filter_array]

现在,您应该拥有一个numpy数组,其中包含未分类或未分类数据的所有值。要获取已分类的值,可以使用:

filter_array = np.all(
    [
        PointsXYZIC[:, 4] != unclassified, #The final column to index against
        PointsXYZIC[:, 4] != ground,
    ],
    axis=0
)

该过滤器似乎可以工作,但是只写入5条记录。我尝试仅过滤类1和2,然后尝试过滤除1和2之外的所有类,但都只给我5个结果。有任何想法吗?
Barbarossa 2013年

这5条记录位于一维数组中。
Barbarossa 2013年

抱歉,更新了上面的代码,因为它需要指定轴才能进行任何计算(如果不执行,它将执行数组的所有维或在数组的所有维上进行)。
om_henners 2013年

5

使用laspy读取LAS文件,并轻松以可交互的numpy数组形式返回数据。laspy是纯python,几乎与libLAS一样快,比libLAS Python绑定具有更多功能,并且易于部署。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.