Я дал изображение Геотифа и соответствующие ему лидарные данные (x, y, z) в координатах UTM. Мне нужно объединить данные лидара со значениями RGB из изображения.
Это означает, что в конце мне нужно построить (3D) каждую точку цвета облака LiDAR, закодированную с соответствующим значением RGB из изображения Geotiff.
Я преобразовал данные Lidar в шейп-файл, используя QGIS. Что я должен делать дальше?
В R я попробовал plot3D
функцию, но она не сработала. Я прилагаю текстовый документ , шейп- файл и изображение TIF
Редактировать:
Я сделал следующую программу, как показано ниже:
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)
}
}
Но при попытке построить график, он показывает следующую ошибку:
Ошибка в
[.data.frame
(x @ data, i, j, ..., drop = FALSE): неиспользованный аргумент (1)
Редактировать:
Я получил 3D-модель без RGB, как показано ниже:
Ответы:
Спасибо за разъяснение вашего вопроса, так как ранее он был совершенно неясен. Вы можете прочитать многоканальный растр, используя функцию стека или кирпича в растровом пакете, и назначить связанные значения RGB для объекта sp SpatialPointsDataFrame, используя извлечение, также из растра. Приведение объекта data.frame (являющегося результатом read.csv) к объекту sp point, который можно передать для извлечения, достигается с помощью пакета sp.
3D-сюжет взят из пакета rgl. Поскольку график является интерактивным и не передается в файл, вы можете создать файл с помощью rgl.snapshot. Базовая функция rgb принимает три значения RGB и создает соответствующий одноцветный R-цвет. Создавая вектор, соответствующий данным, вы можете раскрасить график, используя аргумент col, не определяя цвет в качестве фактического измерения (что, по-видимому, было вашей первоначальной путаницей).
Вот быстрый пример.
И вот рабочий пример с предоставленными вами данными.
источник
Альтернативой для визуализации данных LiDAR и значений RGB в 3D является FugroViewer .
Ниже приведен пример с примерами данных, которые они предоставляют. Я использовал файл под названием,
Bmore_XYZIRGB.xyz
который выглядит так:При открытии в Fugro Viewer выберите соответствующие поля, доступные в файле (в данном случае файл .xyz):
Затем раскрасьте точки, используя данные RGB, выбрав инструмент
Color Points by Encoding RGB Image Values
(см. Красную стрелку на снимке экрана ниже). Включите3D
кнопку для 3D-визуализации.источник
Редактировать: как уже упоминалось Mathiaskopo, более новые версии LAStools используют lascolor ( README ).
Другой вариант - использовать las2las следующим образом:
источник
Этот код использует gdal, numpy и matplotlib для извлечения значений x, y, z из растра и получения его 3D-модели.
Я использовал приведенный выше код с растром? Наклонной длины (GTiff, 50 строк х 50 столбцов), и я получил следующий результат:
источник