He dado una imagen de Geotiff y sus datos Lidar correspondientes (x, y, z) en coordenadas UTM. Necesito fusionar los datos Lidar con los valores RGB de la imagen.
Eso significa que, al final, necesito trazar (3D) cada punto del color de la nube LiDAR codificado con su valor RGB correspondiente de la imagen Geotiff.
Convertí los datos de Lidar en un shapefile usando QGIS. ¿Qué debería hacer después?
En R, probé la plot3D
función, pero no funcionó. Adjunto el documento de texto , el archivo de forma y la imagen tif
Editar:
Hice el siguiente programa como se muestra a continuación:
require(raster)
require(maptools) # to take shape files
#require(car) # for scatter3D
require(plot3Drgl)
##setwd("C:\\Users\\Bibin Wilson\\Documents\\R")
##source('Lidar.r')
data = read.csv("C:\\Users\\Bibin Wilson\\Desktop\\Lidar\\lidardata.csv")
#nr = nrow(data)
nc = ncol(data)
nr = 500
require(rgdal)
X = readGDAL("C:\\Users\\Bibin Wilson\\Desktop\\Lidar\\image.tif")
topx = 4.968622208855732e+05;
topy = 5.419739403811632e+06;
final = matrix(nrow = nr, ncol = nc+2)
for(i in 1:nr) {
x = data[i,1]
y = data[i,2]
rr = round((topy-y)/0.0833)
cc = abs(round((x-topx)/0.0833))
if(rr == 0) {
rr = 1
}
if(cc == 0) {
cc = 1
}
final[i,1] = x
final[i,2] = y
final[i,3] = data[i,3]
final[i,4] = rr
final[i,5] = cc
}
for(i in 1:nr) {
x = final[i,1]
y = final[i,2]
z = final[i,3]
rr = final[i,4]
cc = final[i,5]
if(rr <= 5086 && cc<=3265) {
r = X[rr,cc,1]/255
g = X[rr,cc,2]/255
b = X[rr,cc,3]/255
c = cbind(r,g,b)
scatter3D(x,y,z,2,c)
}
}
Pero al intentar trazar el gráfico, muestra el siguiente error:
Error en
[.data.frame
(x @ data, i, j, ..., drop = FALSE): argumento no utilizado (1)
Editar:
Obtuve el modelo 3D sin RGB como se muestra a continuación:
Respuestas:
Gracias por aclarar su pregunta, ya que anteriormente no estaba clara. Puede leer un ráster multibanda usando la función de pila o ladrillo en el paquete ráster y asignar los valores RGB asociados a un objeto sp SpatialPointsDataFrame usando extracto, también desde el ráster. La coerción del objeto data.frame (que resulta de read.csv) a un objeto de punto sp, que se puede pasar a extraer, se logra utilizando el paquete sp.
La trama 3D proviene del paquete rgl. Dado que el gráfico es interactivo y no se pasa a un archivo, puede crear un archivo usando rgl.snapshot. La función base rgb toma tres valores RGB y crea un color R de valor único correspondiente. Al crear un vector, correspondiente a los datos, puede colorear un gráfico utilizando el argumento col sin definir el color como una dimensión real (que parecía ser su confusión inicial).
Aquí hay un ejemplo ficticio rápido.
Y, aquí hay un ejemplo trabajado con los datos que proporcionó.
fuente
Una alternativa para representar datos LiDAR y valores RGB en 3D es FugroViewer .
A continuación, hay un ejemplo con datos de muestra que proporcionan. Usé el archivo titulado
Bmore_XYZIRGB.xyz
que se ve así:Al abrir en Fugro Viewer, seleccione los campos correspondientes disponibles dentro del archivo (en este caso, un archivo .xyz):
Luego, colorea los puntos usando los datos RGB, seleccionando la herramienta
Color Points by Encoding RGB Image Values
(ver la flecha roja en la captura de pantalla a continuación). Active el3D
botón para visualización en 3D.fuente
Editar: como lo menciona Mathiaskopo, las versiones más nuevas de LAStools usan lascolor ( README ).
Otra opción sería usar las2las de la siguiente manera:
fuente
Este código usa gdal, numpy y matplotlib para extraer los valores x, y, z de un ráster y tener un modelo 3D del mismo.
Utilicé el código anterior con un ráster de longitud de pendiente (GTiff, 50 filas x 50 columnas) y obtuve el siguiente resultado:
fuente