Konvertieren von LAS-Dateien in Numpy-Arrays?

15

Ich habe angefangen zu lernen, wie man LAS-Daten in Python manipuliert und wollte sehen, wie andere mit LAS-Dateien umgehen. Ich möchte die Punkte lesen (ich verwende ein Numpy-Array) und die Klassen 1 und 2 (nicht klassifiziert und geerdet) in einem separaten Array herausfiltern. Ich habe den folgenden Code, kann die Punkte jedoch nicht filtern.

# 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

Ich habe arcpy.da.featureClassToNumpyArray gesehen, wollte aber weder arcpy importieren noch in Shapefile konvertieren.

Wie kann ich LAS-Daten in ein Numpy-Array filtern / lesen?

Barbarossa
quelle
Was ist die Fehlermeldung (falls vorhanden)?
til_b
Kein Fehler. Ich wusste nur nicht, wie man filtert, und war mir nicht sicher, ob es einen besseren Weg gibt, LAS in Array zu bringen.
Barbarossa

Antworten:

14

Ihr PointsXYZICist jetzt ein numpy Array. Dies bedeutet, dass Sie die gewünschten Daten mithilfe der Numpy-Indizierung filtern können. Beispielsweise können Sie mithilfe eines Index von Booleschen Werten bestimmen, welche Punkte erfasst werden sollen.

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

Sie sollten jetzt ein numpy-Array mit allen Werten haben, bei denen die Daten nicht klassifiziert oder geerdet sind. Um die klassifizierten Werte zu erhalten, können Sie Folgendes verwenden:

filter_array = np.all(
    [
        PointsXYZIC[:, 4] != unclassified, #The final column to index against
        PointsXYZIC[:, 4] != ground,
    ],
    axis=0
)
om_henners
quelle
Der Filter scheint zu funktionieren, schreibt aber nur 5 Datensätze. Ich habe versucht, nur die Klassen 1 und 2 zu filtern und dann alle außer 1 und 2 zu filtern. Beide haben nur 5 Ergebnisse geliefert. Irgendwelche Ideen?
Barbarossa
Diese 5 Datensätze befinden sich in einem 1-d-Array.
Barbarossa
Der obige Code wurde leider aktualisiert, da für die Berechnung die Angabe der Achse erforderlich ist (ohne diese Angabe wird die oder über alle Dimensionen des Arrays ausgeführt).
Om_henners
5

Verwenden Sie laspy , um LAS-Dateien zu lesen und die Daten einfach als Numpy-Arrays zurückzugeben, mit denen Sie interagieren können. laspy ist reines Python, ist fast so schnell wie libLAS, hat mehr Funktionen als die libLAS-Python-Bindungen und ist viel einfacher zu implementieren.

Howard Butler
quelle
0

Ich entschuldige mich, wenn Sie dies bereits wissen, aber LASTools ist ein fantastisches Open Source-Tool, das jetzt sowohl in ArcGIS als auch in QGIS 2.0 integriert ist.

Nicholas Duggan
quelle
Danke @Nicholas, ich benutze die Liblas-Python-Bibliothek, die eng mit LASTools
Barbarossa