Chuyển đổi tập tin LAS sang mảng numpy?


15

Tôi đã bắt đầu học cách thao tác dữ liệu LAS trong python và muốn xem cách người khác xử lý các tệp LAS. Tôi muốn đọc các điểm (tôi đang sử dụng một mảng numpy) và lọc ra các lớp 1 và 2 (không được phân loại và tiếp đất) thành một mảng riêng biệt. Tôi có đoạn mã sau nhưng dường như không thể lọc được các điểm.

# 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

Tôi đã thấy arcpy.da.featureClassToNumpyArray, nhưng tôi không muốn nhập arcpy cũng như không phải chuyển đổi sang shapefile.

Làm thế nào khác tôi có thể lọc / đọc dữ liệu LAS thành một mảng numpy?


Thông báo lỗi (nếu có) là gì?
til_b

Không có lỗi. Tôi chỉ không biết cách lọc và không chắc chắn liệu có cách nào tốt hơn để đưa LAS vào mảng hay không.
Barbarossa

Câu trả lời:


14

PointsXYZICBây giờ của bạn là một mảng numpy. Điều đó có nghĩa là bạn có thể sử dụng lập chỉ mục gọn gàng để lọc dữ liệu bạn quan tâm. Ví dụ: bạn có thể sử dụng một chỉ mục của booleans để xác định những điểm cần lấy.

#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]

Bây giờ bạn sẽ có một mảng numpy với tất cả các giá trị trong đó dữ liệu không được phân loại hoặc mặt đất. Để có được các giá trị đã được phân loại, bạn có thể sử dụng:

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

Bộ lọc dường như hoạt động nhưng chỉ ghi 5 bản ghi. Tôi đã cố gắng chỉ lọc các lớp 1 và 2, và sau đó cố gắng lọc tất cả trừ 1 và 2, cả hai chỉ cho tôi 5 kết quả. Có ý kiến ​​gì không?
Barbarossa

5 bản ghi này nằm trong một mảng 1-d.
Barbarossa

Xin lỗi, đã cập nhật mã ở trên vì nó yêu cầu đặc điểm kỹ thuật của trục để thực hiện bất kỳ phép tính nào (không có mã này thực hiện hoặc trên tất cả các kích thước của mảng).
om_henners

5

Sử dụng laspy để đọc các tệp LAS và dễ dàng trả lại dữ liệu dưới dạng các mảng gọn gàng mà bạn có thể tương tác. laspy là python thuần, gần như nhanh như libLAS, có nhiều tính năng hơn các ràng buộc libLAS Python và dễ triển khai hơn nhiều.


0

Tôi xin lỗi nếu bạn đã biết về điều này, nhưng LASTools là một công cụ Nguồn mở tuyệt vời hiện tích hợp với cả ArcGIS và QGIS 2.0 - Điều này có các tùy chọn để lọc dữ liệu theo cách bạn đang xem.


Cảm ơn @Nicholas, tôi đang sử dụng thư viện python liblas, được liên kết chặt chẽ với LASTools
Barbarossa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.