2013-02-20 13 views
8

Mam plik kształtu pobrany ze strony worldwildlife.org dla naziemnych ekoregionów świata. Plik można załadować tutaj: http://worldwildlife.org/publications/terrestrial-ecoregions-of-the-world.Shapefile do konwersji rastrowej w R?

Jest dostarczany jako standardowy plik kształtu i chciałbym zrobić z nim dwie rzeczy. pierwsze: wziąć shapefile z mojego lokalnego katalogu i przypiąć go do stopnia wschodniej Ameryce Północnej (EXT = stopniu (-95, -50, 24, 63))

# Read shapefile using package "maptools" 
eco_shp <- readShapeLines("F:/01_2013/Ecoregions/Global/wwf_terr_ecos.shp", 
          proj4string=CRS("+proj=utm +zone=33 +datum=WGS84")) 


# Set the desired extent for the final raster using package "raster" 
ext <- extent(-95, -50, 24, 63) 

Jestem pewien, że musiał użyć funkcja rasteryzacji w pakiecie "raster", ale nadal nie jestem w stanie sprawić, by działała poprawnie. Byłbym wdzięczny za wszelkie sugestie, jak to zrobić.

+0

Potrzebują Państwo to być rasterised? Czy wystarczy wycinanie kształtu za pomocą wielokąta? – mnel

+0

Mnel: Potrzebuję go zrasteryzować do pliku .asc, aby pasował do moich innych warstw środowiska. –

+0

Pierwszy krok przycinania pliku shapfile byłby pomocny, wtedy nowy obiekt mógłby zostać zrasteryzowany i może być mniej intensywny. –

Odpowiedz

11

Masz rację, myśląc, że powinieneś używać raster (zamiast sp rastrowych klas przestrzennych) dla przestrzennych danych rastrowych. Powinieneś także użyć rgdal (zamiast maptools) do czytania, pisania i manipulowania przestrzennymi danymi wektorowymi.

To powinno Ci zacząć:

library(rgdal) 
library(raster) 

## Read in the ecoregion shapefile (located in R's current working directory) 
teow <- readOGR(dsn = "official_teow/official", layer = "wwf_terr_ecos") 

## Set up a raster "template" to use in rasterize() 
ext <- extent (-95, -50, 24, 63) 
xy <- abs(apply(as.matrix(bbox(ext)), 1, diff)) 
n <- 5 
r <- raster(ext, ncol=xy[1]*n, nrow=xy[2]*n) 

## Rasterize the shapefile 
rr <-rasterize(teow, r) 

## A couple of outputs 
writeRaster(rr, "teow.asc") 
plot(rr) 

enter image description here

+0

Dzięki Josh O'Brien, kod wydaje się działać bardzo dobrze! :) –

+1

Cieszę się, że to słyszę. Zauważ, że w praktyce prawdopodobnie będziesz chciał użyć jednej z twoich własnych warstw rastrowych jako szablonu rastra ('r' w' rasteryzuj (teow, r) ') i może zaistnieć potrzeba odrobiny manipulowania, aby uzyskać proj4strings dopasowane (chociaż zarówno ** raster **, jak i ** rgdal ** są naprawdę dobre w obsłudze metadanych projekcji.). –

+1

Należy zauważyć, że rasteryzacja() wydaje się niemożliwie niestabilna i nieefektywna w przypadku dużych zbiorów danych. Ostatnio próbowałem rasteryzować zasięg miasta Seattle z rozdzielczością 6 stóp (wyjście to plik GeoTIFF o wielkości 14 MB, 8095 x 14819), a R spędził około 3 godzin z 7 wątkami przed "zakończeniem" bez wyjścia i bez komunikatu o błędzie . Użycie R do wygenerowania pustego rastra GeoTIFF o żądanym zasięgu i rozdzielczości, a następnie uruchomienie operacji rasteryzacji za pomocą gdal (z pewną pomocą z QGIS) zajęło mniej niż pół godziny w jednym wątku. –