Conversion de fichiers LAS à un tableau numpy?

15

J'ai commencé à apprendre à manipuler les données LAS en python et je voulais voir comment les autres gèrent les fichiers LAS. Je voudrais lire les points (j'utilise un tableau numpy) et filtrer les classes 1 et 2 (non classifiées et au sol) dans un tableau séparé. J'ai le code suivant mais je n'arrive pas à filtrer les points.

# 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

J'ai vu arcpy.da.featureClassToNumpyArray, mais je ne voulais pas importer arcpy ni convertir en fichier de formes.

Sinon, comment filtrer / lire les données LAS dans un tableau numpy?

Barbarossa
la source
Quel est le message d'erreur (le cas échéant)?
til_b
Pas d'erreur. Je ne savais tout simplement pas comment filtrer et je ne savais pas s'il y avait une meilleure façon d'intégrer le LAS dans le tableau.
Barbarossa

Réponses:

14

Votre PointsXYZICest maintenant un tableau numpy. Ce qui signifie que vous pouvez utiliser l' indexation numpy pour filtrer les données qui vous intéressent. Par exemple, vous pouvez utiliser un index de booléens pour déterminer les points à saisir.

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

Vous devriez maintenant avoir un tableau numpy avec toutes les valeurs où les données sont non classifiées ou rectifiées. Pour obtenir les valeurs qui ont été classées, vous pouvez utiliser:

filter_array = np.all(
    [
        PointsXYZIC[:, 4] != unclassified, #The final column to index against
        PointsXYZIC[:, 4] != ground,
    ],
    axis=0
)
om_henners
la source
Le filtre semble fonctionner mais n'écrit que 5 enregistrements. J'ai essayé de filtrer uniquement les classes 1 et 2, puis j'ai essayé de filtrer tout sauf 1 et 2, les deux ne me donnant que 5 résultats. Des idées?
Barbarossa
Ces 5 enregistrements sont dans un tableau 1-d.
Barbarossa
Désolé, mis à jour le code ci-dessus car il nécessite la spécification de l'axe pour effectuer le calcul (sans cela, il effectue la ou dans toutes les dimensions du tableau).
om_henners
5

Utilisez laspy pour lire les fichiers LAS et renvoyer facilement les données sous forme de tableaux numpy avec lesquels vous pouvez interagir. laspy est pur python, est presque aussi rapide que libLAS, a plus de fonctionnalités que les liaisons libLAS Python et est beaucoup plus facile à déployer.

Howard Butler
la source
0

Je m'excuse si vous le savez déjà, mais LASTools est un fantastique outil Open Source qui s'intègre désormais à la fois avec ArcGIS et QGIS 2.0 - Il a des options pour filtrer les données de la manière que vous regardez.

Nicholas Duggan
la source
Merci @Nicholas, j'utilise la bibliothèque python liblas, qui est étroitement liée à LASTools
Barbarossa