Mehr

Vektor-zu-Raster-Konvertierung

Vektor-zu-Raster-Konvertierung


Ich verwende GRASS, bin aber auch mit R und QGIS vertraut.

Ich versuche, eine Vektorbereichskarte in eine Rasterkarte umzuwandeln. Mein Problem ist, dass die Auflösung des Rasters zu niedrig ist (und ich sie aus anderen Gründen nicht ändern kann) so dass viele Bereiche verschwinden.

Ich brauche jede Rasterzelle, die vom Vektor abgedeckt wird, um konvertiert zu werden und der Zelle die Abdeckung zuzuordnen (d. h. wenn die 20% der Zelle von der Vektorkarte bedeckt sind, beträgt ihr Wert 20).


Wenn ich Sie wäre, würde ich zuerst ein Raster mit höherer Auflösung erstellen (sagen wir die 10-fache Breite und 10-fache Höhe mit den gleichen Ausdehnungen wie Ihr Ziel-Raster) und Ihr Polygon darin rastern.

Sie haben jetzt ein hochauflösendes Raster, das Sie dann auf Ihre gewünschte Auflösung herunterrechnen. Sie können ein Mittel/Summe-Downsampling-Tool verwenden oder, wenn Sie mit R vertraut sind, Ihre eigene bewegliche Fenstersumme (10 mal 10, jedes Mal um 10 verschieben) erstellen. Die Summe für jeden 10 x 10 Patch, die dann einem 1 x 1 Pixel auf Ihrem endgültigen Raster zugewiesen wird, ist einfach der Anteil (praktisch von 100) der vom Polygon bedeckten Fläche.


Danke user1269942. Ich habe wie du gesagt hast.

Ich beantworte meine eigene Frage nur, um den R-Code zu posten, den ich gemacht habe, um das Problem zu lösen. Es ist nicht schnell und es könnte besser gemacht werden, aber es funktioniert.

Zuerst habe ich die Auflösung des Ziel-Rasters um das 20-fache erhöht (in beide Richtungen) und dann die Vektorebene mit dieser Auflösung gerastert. "vegetazione.asc" ist die exportierte Rasterkarte im AAIGrid-Format mit 6 Zeilen Kopfzeile. "Scala" ist das Verhältnis zwischen gerasterter Karte und Originalauflösung (in diesem Fall 20). Die Datei "progress.txt", die ich schreibe, dient nur dazu, den Fortschritt des Codes zu überprüfen.

vegetazione <- read.table("Scrivania/Vegetazione.asc",skip=6,na.strings = "255") scala <- 20 target <- data.frame(matrix(ncol = length(vegetazione[1,]) /scala,nrow = length(vegetazione[,1])/scala)) for(i in 1:(length(vegetazione[,1])/scala)){ for(j in 1:(length(vegetazione[1, ])/skala)) { cont <- 0 for(k in ((i-1)*skala+1):(i*skala)){ for(l in ((j-1)*skala+1): (j*scala)){ if(!is.na(vegetazione[k,l])){ cont <- cont+1 } } } target[i,j] <- cont write.table(j,"Scrivania/ progress.txt",append=TRUE,quote = FALSE,row.names = FALSE,col.names = FALSE) } } Ziel <- Ziel/(skala*skala)

"target" ist die zu speichernde Ausgabe.

PS: In meinem Fall hat die Karte "vegetazione" 16540 * 3360 Zellen und die Ausführung dauert ungefähr 3 Stunden. Vielleicht kann es parallelisiert werden, um die Leistung zu verbessern


Schau das Video: Laser Control with Inkscape #2