Konwertujesz plik LAS na tablicę numpy?

15

Zacząłem uczyć się, jak manipulować danymi LAS w pythonie i chciałem zobaczyć, jak inni obsługują pliki LAS. Chciałbym przeczytać punkty (używam tablicy numpy) i odfiltrować klasy 1 i 2 (niesklasyfikowane i uziemione) do osobnej tablicy. Mam następujący kod, ale nie mogę odfiltrować punktów.

# 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

Widziałem arcpy.da.featureClassToNumpyArray, ale nie chciałem importować arcpy ani konwertować do pliku shapefile.

Jak inaczej mogę filtrować / odczytywać dane LAS do tablicy numpy?

Barbarossa
źródło
Jaki jest komunikat o błędzie (jeśli występuje)?
til_b
Żaden błąd. Po prostu nie wiedziałem, jak filtrować, i nie byłem pewien, czy istnieje lepszy sposób na umieszczenie LAS w tablicy.
Barbarossa,

Odpowiedzi:

14

Twój PointsXYZICjest teraz tablicą numpy. Co oznacza, że ​​możesz użyć indeksowania numpy do filtrowania interesujących Cię danych. Na przykład możesz użyć indeksu booleanów, aby określić, które punkty chcesz zdobyć.

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

Powinieneś teraz mieć tablicę numpy ze wszystkimi wartościami, w których dane są niesklasyfikowane lub uziemione. Aby uzyskać wartości, które zostały sklasyfikowane, możesz użyć:

filter_array = np.all(
    [
        PointsXYZIC[:, 4] != unclassified, #The final column to index against
        PointsXYZIC[:, 4] != ground,
    ],
    axis=0
)
om_henners
źródło
Filtr wydaje się działać, ale zapisuje tylko 5 rekordów. Próbowałem filtrować tylko klasy 1 i 2, a następnie próbowałem filtrować wszystkie oprócz 1 i 2, obie dały mi tylko 5 wyników. Jakieś pomysły?
Barbarossa,
Te 5 rekordów znajduje się w tablicy 1-d.
Barbarossa,
Przepraszamy, zaktualizowałem powyższy kod, ponieważ wymaga on specyfikacji osi, aby wykonać dowolne obliczenia wzdłuż (bez tego nie wykonuje wszystkich wymiarów tablicy).
om_henners
5

Użyj laspy, aby odczytać pliki LAS i łatwo zwrócić dane jako tablice numpy, z którymi możesz wchodzić w interakcje. laspy to czysty python, jest prawie tak szybki jak libLAS, ma więcej funkcji niż wiązania libLAS Python i jest znacznie łatwiejszy do wdrożenia.

Howard Butler
źródło
0

Przepraszam, jeśli już o tym wiesz, ale LASTools to fantastyczne narzędzie Open Source, które teraz integruje się zarówno z ArcGIS, jak i QGIS 2.0 - Ma opcje filtrowania danych w sposób, w jaki patrzysz.

Nicholas Duggan
źródło
Dzięki @Nicholas, używam biblioteki liblas python, która jest ściśle powiązana z LASTools
Barbarossa