Ich habe ein Geotiff-Bild und die entsprechenden Lidar-Daten (x, y, z) in UTM-Koordinaten angegeben. Ich muss die Lidar-Daten mit den RGB-Werten aus dem Bild zusammenführen.
Das bedeutet, dass ich am Ende jeden Punkt der LiDAR-Wolkenfarbe (3D) zeichnen muss, der mit dem entsprechenden RGB-Wert aus dem Geotiff-Bild codiert ist.
Ich habe die Lidar-Daten mit QGIS in ein Shapefile konvertiert. Was soll ich als nächstes tun?
In R habe ich die plot3D
Funktion ausprobiert , aber sie hat nicht funktioniert. Ich hänge das Textdokument , das Shapefile und das TIF-Bild an
Bearbeiten:
Ich habe das folgende Programm wie unten gezeigt durchgeführt:
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)
}
}
Beim Versuch, das Diagramm zu zeichnen, wird jedoch der folgende Fehler angezeigt:
Fehler in
[.data.frame
(x @ data, i, j, ..., drop = FALSE): nicht verwendetes Argument (1)
Bearbeiten:
Ich habe das 3D-Modell ohne RGB wie unten gezeigt erhalten:
Antworten:
Vielen Dank für die Klärung Ihrer Frage, da diese bisher recht unklar war. Sie können ein Multiband-Raster mithilfe der Stack- oder Brick-Funktion im Rasterpaket lesen und die zugehörigen RGB-Werte mithilfe des Extrakts, ebenfalls aus dem Raster, einem sp SpatialPointsDataFrame-Objekt zuweisen. Das Erzwingen des data.frame-Objekts (das aus read.csv resultiert) zu einem sp-Punkt-Objekt, das zum Extrahieren übergeben werden kann, wird mit dem sp-Paket erreicht.
Das 3D-Diagramm stammt aus dem rgl-Paket. Da der Plot interaktiv ist und nicht an eine Datei übergeben wird, können Sie mit rgl.snapshot eine Datei erstellen. Die Basis-RGB-Funktion nimmt drei RGB-Werte an und erzeugt eine entsprechende einwertige R-Farbe. Durch Erstellen eines Vektors, der den Daten entspricht, können Sie ein Diagramm mit dem Argument col einfärben, ohne Farbe als tatsächliche Dimension zu definieren (was Ihre anfängliche Verwirrung zu sein schien).
Hier ist ein kurzes Dummy-Beispiel.
Und hier ist ein Beispiel mit den von Ihnen angegebenen Daten.
quelle
Eine Alternative zum Rendern von LiDAR-Daten und RGB-Werten in 3D ist FugroViewer .
Unten finden Sie ein Beispiel mit Beispieldaten, die sie bereitstellen. Ich habe die Datei mit
Bmore_XYZIRGB.xyz
dem Titel verwendet, die so aussieht:Wählen Sie beim Öffnen in Fugro Viewer die entsprechenden Felder aus, die in der Datei verfügbar sind (in diesem Fall eine .xyz-Datei):
Färben Sie dann die Punkte mit den RGB-Daten aus und wählen Sie das Werkzeug aus
Color Points by Encoding RGB Image Values
(siehe den roten Pfeil auf dem Screenshot unten). Aktivieren Sie die3D
Schaltfläche für die 3D-Visualisierung.quelle
Bearbeiten: Wie von Mathiaskopo erwähnt, verwenden neuere Versionen von LAStools Lascolor ( README ).
Eine andere Möglichkeit wäre, las2las wie folgt zu verwenden:
quelle
Dieser Code verwendet gdal, numpy und matplotlib, um die x-, y- und z-Werte aus einem Raster zu extrahieren und ein 3D-Modell davon zu erstellen.
Ich habe den obigen Code mit einem Raster mit Steigungslänge (GTiff, 50 Zeilen x 50 Spalten) verwendet und das folgende Ergebnis erhalten:
quelle