Mengonversi file LAS ke array numpy?

15

Saya sudah mulai belajar bagaimana memanipulasi data LAS dengan python dan ingin melihat bagaimana orang lain menangani file LAS. Saya ingin membaca poin (saya menggunakan array numpy), dan memfilter kelas 1 dan 2 (tidak terklasifikasi dan di-ground) ke array yang terpisah. Saya memiliki kode berikut tetapi sepertinya tidak bisa mendapatkan poin disaring.

# 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

Saya telah melihat arcpy.da.featureClassToNumpyArray, tetapi saya tidak ingin mengimpor arcpy juga tidak perlu mengkonversi ke shapefile.

Bagaimana lagi saya bisa memfilter / membaca data LAS ke array yang numpy?

Barbarossa
sumber
Apa pesan kesalahannya (jika ada)?
til_b
Tidak ada kesalahan Saya hanya tidak tahu cara memfilter, dan tidak yakin apakah ada cara yang lebih baik untuk memasukkan LAS ke dalam array.
Barbarossa

Jawaban:

14

Anda PointsXYZICsekarang array numpy. Yang berarti Anda dapat menggunakan pengindeksan numpy untuk memfilter data yang Anda minati. Misalnya Anda dapat menggunakan indeks boolean untuk menentukan poin mana yang akan diambil.

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

Anda sekarang harus memiliki array numpy dengan semua nilai di mana data tidak terklasifikasi atau di-ground. Untuk mendapatkan nilai yang telah diklasifikasikan Anda dapat menggunakan:

filter_array = np.all(
    [
        PointsXYZIC[:, 4] != unclassified, #The final column to index against
        PointsXYZIC[:, 4] != ground,
    ],
    axis=0
)
om_henners
sumber
Filter tampaknya berfungsi tetapi hanya menulis 5 catatan. Saya mencoba memfilter hanya kelas 1 dan 2, dan kemudian mencoba memfilter semua kecuali 1 dan 2, keduanya memberi saya hanya 5 hasil. Ada ide?
Barbarossa
5 catatan ini dalam array 1-d.
Barbarossa
Maaf, perbarui kode di atas karena memerlukan spesifikasi sumbu untuk melakukan perhitungan apa pun sepanjang (tanpa itu melakukan atau melintasi semua dimensi array).
om_henners
5

Gunakan laspy untuk membaca file LAS dan dengan mudah mengembalikan data sebagai array numpy Anda dapat berinteraksi dengan. laspy adalah python murni, hampir secepat libLAS, memiliki lebih banyak fitur daripada libLAS Python bindings, dan jauh lebih mudah untuk digunakan.

Howard Butler
sumber
0

Saya minta maaf jika Anda sudah mengetahui hal ini, tetapi LASTools adalah alat Open Source yang luar biasa yang sekarang terintegrasi dengan ArcGIS dan QGIS 2.0 - Ini memiliki opsi untuk menyaring data dengan cara yang Anda lihat.

Nicholas Duggan
sumber
Terima kasih @Nicholas, saya menggunakan liblas python library, yang terkait erat dengan LASTools
Barbarossa