Conversione di file LAS in array numpy?


15

Ho iniziato a imparare a manipolare i dati LAS in Python e volevo vedere come gli altri gestiscono i file LAS. Vorrei leggere i punti (sto usando una matrice numpy) e filtrare le classi 1 e 2 (non classificate e messe a terra) su una matrice separata. Ho il seguente codice ma non riesco a filtrare i punti.

# 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

Ho visto arcpy.da.featureClassToNumpyArray, ma non volevo importare arcpy né convertirlo in shapefile.

In quale altro modo posso filtrare / leggere i dati LAS in un array numpy?


Qual è il messaggio di errore (se presente)?
fino al

Nessun errore. Non sapevo come filtrare e non ero sicuro che ci fosse un modo migliore per inserire LAS nell'array.
Barbarossa,

Risposte:


14

PointsXYZICOra il tuo è un array intorpidito. Ciò significa che puoi utilizzare l'indicizzazione numpy per filtrare i dati che ti interessano. Ad esempio puoi utilizzare un indice di valori booleani per determinare quali punti prendere.

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

Ora dovresti avere un array intorpidito con tutti i valori in cui i dati non sono classificati o ground. Per ottenere i valori che sono stati classificati è possibile utilizzare:

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

Il filtro sembra funzionare ma scrive solo 5 record. Ho provato a filtrare solo le classi 1 e 2, quindi ho cercato di filtrare tutti tranne 1 e 2, ottenendo entrambi solo 5 risultati. Qualche idea?
Barbarossa,

Questi 5 record sono in un array 1-d.
Barbarossa,

Siamo spiacenti, ho aggiornato il codice sopra in quanto richiede la specifica dell'asse per eseguire il calcolo (senza che esegua o attraverso tutte le dimensioni dell'array).
om_henners,

5

Usa laspy per leggere i file LAS e restituire facilmente i dati come array intorpiditi con cui puoi interagire. laspy è puro python, è quasi veloce come libLAS, ha più funzionalità dei collegamenti libLAS Python ed è molto più facile da implementare.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.