2013-10-08 43 views
5

Chciałbym dokonać ponownego próbkowania rastra z wysokiej rozdzielczości do niskiej rozdzielczości (z różnym zakresem) w zdefiniowanej komórce siatki. Czy istnieje sposób użycia istniejącego pliku rastrowego jako danych wejściowych do przyciągania?Jak zmienić próbnik rastra na istniejącą siatkę?

W pakiecie rastrowym, aggregate i resample wydają się być odpowiednie, ale nie mogę znaleźć, jak to zrobić.

+0

Czy trzeba interpolować na inną siatkę, czy co? Wszystkie pliki rastrowe, o ile wiem, definiują dane na jednolitej prostokątnej siatce, więc "używanie istniejącego pliku rastrowego" oznaczałoby po prostu "agregowanie lub interpolowanie z MxN do siatki LxK". –

+0

Pytanie nie było jasne i nie miało przykładu. –

Odpowiedz

1

można l uruchom zewnętrzne polecenie za pomocą system i wywołaj polecenie gdal_translate lub gdal_warp. Wymaga to oczywiście instalację narzędzi gdal

+0

Dziękujemy za pomysł, ale użycie gdal_translate nie pozwala kontrolować metody interpolacji. Znalazłem rozwiązanie za pomocą gdalwarp – Wraf

6

Możesz użyć do tego celu projectRaster, jeśli masz raster w jednej projekcji i rozdzielczości i potrzebujesz wyjścia w innej rozdzielczości i projekcji.

Argument from jest rastrem wysokiej rozdzielczości, a argumentem to jest raster o niskiej rozdzielczości. Należy wybrać właściwą metodę agregacji (tj bilinear dla danych ciągłych i ngb (najbliższy sąsiad) dla danych kategorycznych.

require(raster) 

# Projection info 
proj1 <- CRS("+proj=laea +lon_0=20 +lat_0=5 +ellps=sphere +unit=km +to_meter=1e3") 
proj2 <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84") 
# High res raster 
r1km <- raster(nrows = 1515 , ncols = 2300 , xmn = -4000 , xmx = -1700 , ymn = -15 , ymx = 1500 , crs = proj1) 

# Low res raster 
r5km <- raster(nrows = 303 , ncols = 460 , xmn = -20 , xmx = -5 , ymn = 4 , ymx = 15 , crs = proj2) 

# Set some values in high res raster 
pts <- rasterToPoints(r1km) 
values(r1km) <- 0.01*pts[,1] + sin(0.02*pi*pts[,2]) 

# Reproject using the attributes of the low res raster for output 
out <- projectRaster(from = r1km , to = r5km , method = "bilinear") 

# Plot - extent of second raster doesn't fully cover first so some data is missing 
par(mfrow = c(1,2)) 
plot(r1km) 
plot(out) 

enter image description here

Jeśli dane wejściowe i wyjściowe są takie same, z wyjątkiem rozdzielczości ty można użyć agregat ...

# If same extent and resolution require use aggregate 
r1 <- raster(system.file("external/rlogo.grd", package="raster")) 
r5 <- aggregate(r1 , fact = 5 , method = "bilinear") 
par(mfrow = c(1,2)) 
plot(r1) 
plot(r5) 

enter image description here

+1

Dzięki, ale ponieważ moje dwa pliki są w tej samej projekcji, projekt nie działa. O agregacie, nie mogę określić pliku bezpośrednio w celu przyciągnięcia do siatki, ponieważ nie chcę użyć argumentu "fakt", ale plik? – Wraf

+0

@Wraf powinieneś naprawdę dostarczyć powtarzalny przykład pokazujący, co zrobiłeś wtedy. Nie sądzę, że poświęcę więcej wysiłku na zgadywanie twoich wymagań. Przeczytaj [** jak zrobić świetny powtarzalny przykład **] (http://stackoverflow.com/q/5963269/1478381) i odpowiednio zaktualizuj swoje pytanie! –

+0

Dzięki. Rzeczywiście, nie jest łatwo znaleźć odpowiedź, jeśli nie podano powtarzalnego przykładu. Ale używany zbiór danych jest duży i wykonanie takiego przykładu nie jest takie łatwe. – Wraf

1

To rozwiązanie działa:

system(paste("gdalwarp" 
,paste(dir_path,"fileHR.tif",sep="") 
,paste(dir_path,"fileLR.tif",sep=""),sep=" ")) 

gdzie dir_path jest katalog, w którym plik jest przechowywany, fileHR.tif jest plik o wysokiej rozdzielczości, fileLR.tif jest niska plik resoltion .