15 votos

¿Cómo convertir el archivo LAS que numpy matriz?

He empezado a aprender cómo manipular LAS datos en python y quería ver cómo los demás manejar archivos LAS. Me gustaría leer los puntos (estoy usando una colección de la matriz), y filtrar las clases 1 y 2 (sin clasificar y tierra) a una matriz independiente. Tengo el siguiente código, pero no parecen llegar a los puntos de filtrado.

# 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

He visto arcpy.da.featureClassToNumpyArray, pero yo no quería importar arcpy ni tiene que convertir a shapefile. Cualquier sugerencia sobre el filtrado o la manera más fácil leer LAS datos en una colección de la matriz son bienvenidos.

14voto

ESV Puntos 4591

Su PointsXYZIC es ahora una colección de la matriz. Lo que significa que usted puede utilizar numpy de indexación para filtrar los datos que interesan. Por ejemplo, usted puede utilizar un índice de booleanos para determinar qué puntos para agarrar.

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

Ahora debería tener una colección array con todos los valores de los datos sin clasificar o en el suelo. Para obtener los valores que han sido clasificados usted podría utilizar:

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

Buena suerte!

5voto

csmba Puntos 2440

Uso laspy a leer LAS de los archivos y volver fácilmente los datos como arrays de numpy se puede interactuar con el. laspy es puro python, es casi tan rápido como libLAS, tiene más características que la libLAS enlaces Python, y es mucho más fácil de implementar.

0voto

Sergio Moura Puntos 111

Me disculpo si ya sabes de esto, pero LASTools es una fantástica herramienta de código Abierto que se integra ahora con tanto ArcGIS y QGIS 2.0 - Este tiene opciones para filtrar los datos en la forma que se está mirando.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X