การแปลงไฟล์ LAS ไปเป็นอาร์เรย์ที่ไม่มีค่า?


15

ฉันเริ่มเรียนรู้วิธีจัดการข้อมูล 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 และไม่ต้องแปลงเป็นรูปร่างไฟล์

ฉันจะกรอง / อ่านข้อมูล LAS เข้าสู่อาเรย์ numpy ได้อย่างไร?


ข้อความแสดงข้อผิดพลาด (ถ้ามี) คืออะไร
til_b

ไม่มีข้อผิดพลาด ฉันไม่รู้วิธีกรองและไม่แน่ใจว่ามีวิธีที่ดีกว่าในการจัดเรียง LAS
Barbarossa

คำตอบ:


14

PointsXYZICตอนนี้คุณเป็นอาร์เรย์ที่มีจำนวนมาก ซึ่งหมายความว่าคุณสามารถใช้การจัดทำดัชนีแบบ numpyเพื่อกรองข้อมูลที่คุณสนใจตัวอย่างเช่นคุณสามารถใช้ดัชนีของ booleans เพื่อกำหนดจุดที่จะคว้า

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

ตอนนี้คุณควรมีอาร์เรย์ที่มีค่าที่มีค่าทั้งหมดซึ่งข้อมูลไม่ได้จัดประเภทหรือกราวด์ ในการรับค่าที่ถูกจัดประเภทคุณสามารถใช้:

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

5 ระเบียนเหล่านี้อยู่ในอาร์เรย์ 1-d
Barbarossa

ขออภัยอัปเดตโค้ดด้านบนเนื่องจากต้องใช้สเปคของแกนเพื่อทำการคำนวณใด ๆ ตาม (โดยไม่ต้องทำการคำนวณหรือข้ามมิติทั้งหมดของอาร์เรย์)
om_henners

5

ใช้laspyเพื่ออ่านไฟล์ LAS และส่งคืนข้อมูลได้อย่างง่ายดายเนื่องจากอาร์เรย์ numpy ที่คุณสามารถโต้ตอบได้ laspy เป็นไพ ธ อนบริสุทธิ์เกือบเร็วเท่ากับ libLAS มีคุณสมบัติมากกว่าการผูก libLAS Python และง่ายต่อการปรับใช้


0

ฉันขอโทษถ้าคุณรู้เรื่องนี้อยู่แล้ว แต่LASToolsเป็นเครื่องมือโอเพ่นซอร์สที่น่าอัศจรรย์ซึ่งตอนนี้ผสานรวมกับทั้ง ArcGIS และ QGIS 2.0 - ตัวเลือกนี้มีตัวเลือกในการกรองข้อมูลในลักษณะที่คุณกำลังดูอยู่


@Nicholas ขอบคุณฉันใช้ liblas ห้องสมุดหลามซึ่งจะเชื่อมโยงอย่างใกล้ชิดกับ LASTools
รอสซา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.