J'ai donné une image Geotiff et ses données Lidar correspondantes (x, y, z) en coordonnées UTM. J'ai besoin de fusionner les données Lidar avec les valeurs RVB de l'image.
Cela signifie qu'à la fin, je dois tracer (3D) chaque point de la couleur du nuage LiDAR codé avec sa valeur RVB correspondante à partir de l'image Geotiff.
J'ai converti les données Lidar en un fichier de formes à l'aide de QGIS. Que devrais-je faire ensuite?
Dans R, j'ai essayé la plot3D
fonction, mais cela n'a pas fonctionné. J'attache le document texte , le fichier de formes et l' image tif
Éditer:
J'ai fait le programme suivant comme indiqué ci-dessous:
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)
}
}
Mais en essayant de tracer le graphique, il montre l'erreur suivante:
Erreur dans
[.data.frame
(x @ data, i, j, ..., drop = FALSE): argument inutilisé (1)
Éditer:
J'ai obtenu le modèle 3D sans RVB comme indiqué ci-dessous:
Réponses:
Merci d'avoir clarifié votre question car elle n'était pas assez claire auparavant. Vous pouvez lire un raster multibande à l'aide de la fonction pile ou brique du package raster et affecter les valeurs RVB associées à un objet Sp SpatialPointsDataFrame à l'aide de l'extraction, également à partir du raster. La contrainte de l'objet data.frame (qui résulte de read.csv) sur un objet point sp, qui peut être passé pour être extrait, est obtenue à l'aide du package sp.
L'intrigue 3D provient du package rgl. Le tracé étant interactif et non transmis à un fichier, vous pouvez créer un fichier à l'aide de rgl.snapshot. La fonction RVB de base prend trois valeurs RVB et crée une couleur R à valeur unique correspondante. En créant un vecteur, correspondant aux données, vous pouvez colorier un tracé en utilisant l'argument col sans définir la couleur comme une dimension réelle (ce qui semblait être votre confusion initiale).
Voici un exemple factice rapide.
Et, voici un exemple concret avec les données que vous avez fournies.
la source
Une alternative pour rendre les données LiDAR et les valeurs RVB en 3D est FugroViewer .
Ci-dessous, un exemple avec des exemples de données qu'ils fournissent. J'ai utilisé le fichier intitulé
Bmore_XYZIRGB.xyz
qui ressemble à ceci:Lors de l'ouverture dans Fugro Viewer, sélectionnez les champs correspondants disponibles dans le fichier (dans ce cas, un fichier .xyz):
Ensuite, coloriez les points à l'aide des données RVB, en sélectionnant l'outil
Color Points by Encoding RGB Image Values
(voir la flèche rouge sur la capture d'écran ci-dessous). Activez le3D
bouton pour la visualisation 3D.la source
Edit: comme mentionné par Mathiaskopo, les nouvelles versions de LAStools utilisent lascolor ( README ).
Une autre option serait d'utiliser las2las comme suit:
la source
Ce code utilise gdal, numpy et matplotlib pour extraire les valeurs x, y, z d'un raster et pour en avoir un modèle 3D.
J'ai utilisé le code ci-dessus avec un raster de longueur de pente (GTiff, 50 lignes x 50 colonnes) et j'ai obtenu le résultat suivant:
la source