Eu dei uma imagem Geotiff e seus dados Lidar correspondentes (x, y, z) nas coordenadas UTM. Preciso mesclar os dados do Lidar com os valores RGB da imagem.
Isso significa que, no final, eu preciso plotar (3D) cada ponto da nuvem LiDAR codificada por cores com seu valor RGB correspondente da imagem Geotiff.
Eu converti os dados do Lidar em um shapefile usando o QGIS. O que eu devo fazer a seguir?
Em R, tentei a plot3D
função, mas não funcionou. Estou anexando o documento doc , shapefile e tif image
Editar:
Eu fiz o seguinte programa, como mostrado abaixo:
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)
}
}
Mas, ao tentar plotar o gráfico, ele mostra o seguinte erro:
Erro em
[.data.frame
(x @ dados, i, j, ..., drop = FALSE): argumento não utilizado (1)
Editar:
Eu consegui o modelo 3D sem o RGB, como mostrado abaixo:
Respostas:
Obrigado por esclarecer sua pergunta, pois antes ela não era clara. Você pode ler uma varredura multibanda usando a função stack ou brick no pacote raster e atribuir os valores RGB associados a um objeto SpatialPointsDataFrame sp usando extração, também da varredura. A coerção do objeto data.frame (que resulta de read.csv) para um objeto de ponto sp, que pode ser transmitido para extração, é obtida usando o pacote sp.
A plotagem 3D vem do pacote rgl. Como a plotagem é interativa e não passada para um arquivo, é possível criar um arquivo usando rgl.snapshot. A função rgb base utiliza três valores RGB e cria uma cor R de valor único correspondente. Ao criar um vetor, correspondente aos dados, é possível colorir uma plotagem usando o argumento col sem definir a cor como uma dimensão real (que parecia ser sua confusão inicial).
Aqui está um exemplo rápido e fictício.
E, aqui está um exemplo trabalhado com os dados que você forneceu.
fonte
Uma alternativa para renderizar dados LiDAR e valores RGB em 3D é o FugroViewer .
Abaixo, há um exemplo com dados de amostra que eles fornecem. Eu usei o arquivo intitulado
Bmore_XYZIRGB.xyz
que se parece com isso:Ao abrir no Fugro Viewer, selecione os campos correspondentes disponíveis no arquivo (neste caso, um arquivo .xyz):
Em seguida, pinte os pontos usando os dados RGB, selecionando a ferramenta
Color Points by Encoding RGB Image Values
(veja a seta vermelha na captura de tela abaixo). Ligue o3D
botão para visualização 3D.fonte
Edit: como mencionado por Mathiaskopo, as versões mais recentes do LAStools usam lascolor ( README ).
Outra opção seria usar las2las da seguinte maneira:
fonte
Esse código usa gdal, numpy e matplotlib para extrair os valores x, y, z de uma varredura e ter um modelo 3D.
Usei o código acima com uma varredura de comprimento de inclinação (GTiff, 50 linhas x 50 colunas) e obtive o seguinte resultado:
fonte