Podałem obraz Geotiff i odpowiadające mu dane Lidara (x, y, z) we współrzędnych UTM. Muszę scalić dane Lidar z wartościami RGB z obrazu.
Oznacza to, że na koniec muszę wydrukować (3D) każdy punkt chmury LiDAR oznaczony odpowiednią wartością RGB z obrazu Geotiff.
Przekształciłem dane Lidara w plik kształtu za pomocą QGIS. Co mam teraz zrobić?
W R wypróbowałem tę plot3D
funkcję, ale nie działała. Załączam dokument tekstowy , plik kształtu i obraz tif
Edytować:
Zrobiłem następujący program, jak pokazano poniżej:
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)
}
}
Ale podczas próby wykreślenia wykresu pojawia się następujący błąd:
Błąd w
[.data.frame
(x @ data, i, j, ..., drop = FALSE): nieużywany argument (1)
Edytować:
Mam model 3D bez RGB, jak pokazano poniżej:
Odpowiedzi:
Dziękujemy za wyjaśnienie pytania, ponieważ było ono wcześniej niejasne. Możesz odczytać raster wielopasmowy za pomocą funkcji stosu lub cegły w pakiecie rastrowym i przypisać powiązane wartości RGB do obiektu SpatialPointsDataFrame za pomocą ekstrakcji, również z rastra. Przymus obiektu data.frame (wynikający z read.csv) na obiekt punktu sp, który można przekazać do wypakowania, osiąga się za pomocą pakietu sp.
Fabuła 3D pochodzi z pakietu rgl. Ponieważ wykres jest interaktywny i nie jest przekazywany do pliku, możesz utworzyć plik za pomocą rgl.snapshot. Podstawowa funkcja rgb przyjmuje trzy wartości RGB i tworzy odpowiadający jednokrotny kolor R. Tworząc wektor odpowiadający danym, możesz pokolorować wykres za pomocą argumentu col bez definiowania koloru jako rzeczywistego wymiaru (co wydawało się być początkowym zamieszaniem).
Oto szybki przykład manekina.
Oto działający przykład z podanymi danymi.
źródło
Alternatywą do renderowania danych LiDAR i wartości RGB w 3D jest FugroViewer .
Poniżej znajduje się przykład z podanymi przez nich przykładowymi danymi. Użyłem pliku zatytułowanego,
Bmore_XYZIRGB.xyz
który wygląda następująco:Podczas otwierania w Fugro Viewer wybierz odpowiednie pola dostępne w pliku (w tym przypadku plik .xyz):
Następnie pokoloruj punkty za pomocą danych RGB, wybierając narzędzie
Color Points by Encoding RGB Image Values
(patrz czerwona strzałka na zrzucie ekranu poniżej). Włącz3D
przycisk do wizualizacji 3D.źródło
Edycja: jak wspomniała Mathiaskopo, nowsze wersje LAStools używają lascolor ( README ).
Inną opcją byłoby użycie las2las w następujący sposób:
źródło
Ten kod używa gdal, numpy i matplotlib do wyodrębnienia wartości x, y, z rastra i uzyskania jego modelu 3D.
Użyłem powyższego kodu z rastrem o nachyleniu (GTiff, 50 wierszy x 50 kolumn) i uzyskałem następujący wynik:
źródło