Estoy tratando de hacer una copia de un archivo de LAS al insertar nuevos puntos usando python liblas módulo. El código siguiente crea la copia y agrega los puntos, pero por alguna razón los puntos añadidos no están en el lugar correcto. Además, parece que x, y, z valores están siendo almacenado int en lugar de valores flotantes. ¿Alguien puede explicarme por qué estoy teniendo este problema? Gracias de antemano por su ayuda.
Respuesta
¿Demasiados anuncios?He encontrado mi respuesta en el liblas.encabezado de la documentación. Estados de los siguientes:
"Los factores de escala en [x, y, z] para el punto de datos. libLAS utiliza el factores de escala más el :obj:
liblas.header.Header.offset
valores almacenar las coordenadas del punto como números enteros en el archivo.El factor de escala campos contienen un doble el valor de punto flotante que se utiliza para escalar el correspondiente X, Y, y Z valores de largo plazo el punto de registros. El correspondiente X, y y Z factor de escala debe ser multiplicado por X, Y o Z del punto de registro de valor para obtener los reales X, Y o Z de coordenadas. Por ejemplo, si X, y, y Z coordenadas están destinados a dos decimales los valores de punto, a continuación, cada uno de los factor de escala contendrá el número 0.01
Las coordenadas se calculan utilizando la siguiente fórmula(s):
- x = (x_int * x_scale) + x_offset
- y = (y_int * y_scale) + y_offset
- z = (z_int * z_scale) + z_offset
.. nota:: libLAS utiliza este valor de encabezado de cuando la lectura/escritura de raw punto los datos para el archivo. Si el cambio en el medio de la escritura de datos, esperar lo inesperado."
Dicho esto, he modificado mi código original para parecerse a esto:
# Get header
h = f.header
# Get scale factors
x_scale, y_scale, z_scale = h.scale[0], h.scale[1], h.scale[2]
# Get offset values
x_offset, y_offset, z_offset = h.offset[0], h.offset[1], h.offset[2]
for p in f:
if counter != 0:
# Code to Interpolate
# x, y, z for new point
# from existing points
vD = (new_x, new_y, new_z)
# vD is tuple of floats
x, y, z = vD[0], vD[1], vD[2]
new_pt = liblas.point.Point() # Create Point object
x_int = (x - x_offset) / x_scale # De-scale x value
y_int = (y - y_offset) / y_scale # De-scale y value
z_int = (z - z_offset) / z_scale # De-scale z value
new_pt.x = x_int # Set x property
new_pt.y = y_int # Set y property
new_pt.z = z_int # Set z property
fout.write(new_pt) # Write new_pt to fout
# Write p to fout, retaining original properties
fout.write(p)
counter += 1
fout.close()