R'de bir raster kırpma


33

Kuzeydoğu ABD için bir harita yapıyorum Harita arka planının bir yükseklik haritası veya ortalama yıllık sıcaklık haritası olması gerekir. Worldclim.org'dan bana bu değişkenleri veren iki rasterim var, ancak ilgilendiğim devletlerin derecesine göre klipslemem gerekiyor. Bunun nasıl yapılacağına dair herhangi bir öneriniz var. Şu ana kadar sahip olduğum şey bu:

#load libraries
library (sp)
library (rgdal)
library (raster)
library (maps)
library (mapproj)


#load data
state<- data (stateMapEnv)
elevation<-raster("alt.bil")
meantemp<-raster ("bio_1.asc")

#build the raw map
nestates<- c("maine", "vermont", "massachusetts", "new hampshire" ,"connecticut",
  "rhode island","new york","pennsylvania", "new jersey",
  "maryland", "delaware", "virginia", "west virginia")

map(database="state", regions = nestates, interior=T,  lwd=2)
map.axes()

#add site localities
sites<-read.csv("sites.csv", header=T)
lat<-sites$Latitude
lon<-sites$Longitude

map(database="state", regions = nestates, interior=T, lwd=2)
points (x=lon, y=lat, pch=17, cex=1.5, col="black")
map.axes()
library(maps)                                                                  #Add axes to  main map
map.scale(x=-73,y=38, relwidth=0.15, metric=T,  ratio=F)

#create an inset map

 # Next, we create a new graphics space in the lower-right hand corner.  The numbers are proportional distances within the graphics window (xmin,xmax,ymin,ymax) on a scale of 0 to 1.
  # "plt" is the key parameter to adjust
    par(plt = c(0.1, 0.53, 0.57, 0.90), new = TRUE)

  # I think this is the key command from http://www.stat.auckland.ac.nz/~paul/RGraphics/examples-map.R
    plot.window(xlim=c(-127, -66),ylim=c(23,53))

  # fill the box with white
    polygon(c(0,360,360,0),c(0,0,90,90),col="white")

  # draw the map
    map(database="state", interior=T, add=TRUE, fill=FALSE)
    map(database="state", regions=nestates, interior=TRUE, add=TRUE, fill=TRUE, col="grey")

Yükseklik ve kasıtlı nesneler, nestates nesnesinin alanı kadar kırpılması gereken nesnelerdir. Herhangi bir giriş yardımcı olacaktır


2
Belki de aynı ölçüde ve çözünürlükte rastgele verilerden rasterler oluşturarak bunu başkaları tarafından tekrarlanabilir hale getirme şansınız var mı?
Spacedman

Yanıtlar:


38

mapsPaketi kullanarak bırakıp bir durum shapefile bulurdum . Sonra bunu kullanarak R'ye yükleyin rgdalve sonra bazı çokgen bindirme işlerini yapın.

library(raster)
# use state bounds from gadm website:
# us = shapefile("USA_adm1.shp")
us <- getData("GADM", country="USA", level=1)
# extract states (need to uppercase everything)
nestates <- c("Maine", "Vermont", "Massachusetts", "New Hampshire" ,"Connecticut",
         "Rhode Island","New York","Pennsylvania", "New Jersey",
         "Maryland", "Delaware", "Virginia", "West Virginia")

ne = us[match(toupper(nestates),toupper(us$NAME_1)),]


# create a random raster over the space:        
r = raster(xmn=-85,xmx=-65,ymn=36,ymx=48,nrow=100,ncol=100)
r[]=runif(100*100)

# plot it with the boundaries we want to clip against:
plot(r)
plot(ne,add=TRUE)

# now use the mask function
rr <- mask(r, ne)

# plot, and overlay:
plot(rr);plot(ne,add=TRUE)

O nasıl? Gadm shapefile oldukça ayrıntılı, bunun yerine daha genel bir tane bulmak isteyebilirsiniz.


Şerefe Robert, hoş düzenleme. Sanırım maskeyi unutmuşum.
Spacedman

32

İşte kullanan bir yaklaşımdır extract()gelen rasterpaketin. Bunu WorldClim web sitesindeki irtifa ve ortalama sıcaklık verileriyle test ettim (bu örneği irtifa ile sınırlarım, sıcaklık benzer şekilde çalışır) ve ABD'nin devlet sınırlarını içeren uygun bir şekil dosyasını burada bulabilirsiniz . Sadece .zip verilerini indirin ve çalışma dizininize açın.

Sen yüke ihtiyaç rgdalve rasterdevam etmek için kütüphaneler.

library(rgdal)
library(raster)

Şimdi ABD şekil dosyasını kullanalım readOGR(). Şekil dosyasının CRS'sini ayarladıktan sonra, istenen durumları içeren bir altküme oluşturdum. Büyük ve küçük harflerin kullanılmasına dikkat edin!

state <- readOGR(dsn = path.data, layer = "usa_state_shapefile")
projection(state) <- CRS("+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs")

# Subset US shapefile by desired states
nestates <- c("Maine", "Vermont", "Massachusetts", "New Hampshire" ,"Connecticut",
             "Rhode Island","New York","Pennsylvania", "New Jersey",
             "Maryland", "Delaware", "Virginia", "West Virginia")

state.sub <- state[as.character(state@data$STATE_NAME) %in% nestates, ]

Ardından, raster verilerini kullanarak içe aktarın ve raster()önceden oluşturulmuş durumları alt kümesinin kapsamına göre kırpın.

elevation <- raster("/path/to/data/alt.bil")

# Crop elevation data by extent of state subset
elevation.sub <- crop(elevation, extent(state.sub))

Son bir adım olarak, yükselti rasterinizin piksellerini verilen durum poligonlarının sınırları dahilinde tanımlamanız gerekir. Bunun için 'maske' işlevini kullanın.

elevation.sub <- mask(elevation.sub, state.sub)

İşte sonuçların çok basit bir komplo:

plot(elevation.sub)
plot(state.sub, add = TRUE)

Kuzeydoğu ABD eyaletlerinin DEM’i

Şerefe,
Florian


Devlet şeklini nereden aldın?
Ben Del Toro

@IDelToro, ben aldım Geocommons .
fdetsch

~ 11mb rasterlayer ve tek poligon şekil dosyasıyla çalışırken neden bu kadar uzun sürüyor (>> 15 dakika, belki saat)? Daha verimli bir yöntem var mı?
ekolojist

@ ecologist1234, bir örnek verebilir misiniz?
fdetsch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.