การตัดแรสเตอร์ใน R


32

ฉันกำลังสร้างแผนที่สำหรับภาคตะวันออกเฉียงเหนือของสหรัฐอเมริกาพื้นหลังของแผนที่จำเป็นต้องเป็นแผนที่ระดับความสูงหรือแผนที่อุณหภูมิเฉลี่ยรายปี ฉันมีแรสเตอร์สองตัวจาก Worldclim.org ซึ่งให้ตัวแปรเหล่านี้แก่ฉัน แต่ฉันต้องคลิปพวกมันให้มากเท่าที่ฉันสนใจข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการทำเช่นนี้ นี่คือสิ่งที่ฉันมี:

#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")

วัตถุการยกระดับและวัตถุที่มีความหมายเป็นวัตถุที่จำเป็นต้องถูกตัดส่วนของพื้นที่ของวัตถุซ้อน ข้อมูลใด ๆ ที่จะช่วย


2
โอกาสใดที่คุณสามารถทำสิ่งนี้ให้ผู้อื่นทำซ้ำได้โดยการสร้าง rasters จากข้อมูลสุ่มที่มีขอบเขตและความละเอียดเท่ากัน?
Spacedman

คำตอบ:


38

ฉันจะวางโดยใช้mapsแพคเกจและค้นหาสถานะ shapefile จากนั้นโหลดลงใน R โดยใช้rgdalและจากนั้นทำงานทับซ้อนหลายเหลี่ยมบางอย่าง

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)

วิธีที่ว่า? ไฟล์รูปร่าง gadm นั้นมีรายละเอียดค่อนข้างมากคุณอาจต้องการค้นหาไฟล์ที่มีการวางนัยทั่วไปมากกว่าแทน


ไชโยโรเบิร์ตดีแก้ไข ฉันคิดว่าฉันลืมหน้ากาก
Spacedman

32

นี่เป็นวิธีการใช้extract()จากrasterแพ็คเกจ ผมทดสอบกับระดับความสูงและอุณหภูมิเฉลี่ยข้อมูลจากWorldClimเว็บไซต์ (ฉัน จำกัด ตัวอย่างนี้ไปสูงอุณหภูมิทำงานคล้าย) และ shapefile ที่เหมาะสมของรัฐชายแดนที่มีสหรัฐที่สามารถพบได้ที่นี่ เพียงดาวน์โหลดข้อมูล. zip และคลายการบีบอัดข้อมูลลงในไดเรกทอรีทำงานของคุณ

คุณต้องโหลดrgdalและrasterไลบรารีเพื่อดำเนินการต่อ

library(rgdal)
library(raster)

Let 's นำเข้า shapefile readOGR()สหรัฐตอนนี้ใช้ หลังจากตั้งค่า CRS ของ shapefile ฉันจะสร้างชุดย่อยที่มีสถานะที่ต้องการ ให้ความสนใจกับการใช้เงินทุนและตัวอักษรเริ่มต้นเล็ก ๆ !

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, ]

จากนั้นนำเข้าข้อมูลแรสเตอร์โดยใช้raster()และครอบตัดด้วยขอบเขตของชุดย่อยสถานะที่สร้างไว้ก่อนหน้านี้

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

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

ในขั้นตอนสุดท้ายคุณต้องระบุพิกเซลเหล่านั้นของแรสเตอร์ระดับความสูงที่อยู่ภายในเส้นขอบของรูปหลายเหลี่ยมของรัฐที่กำหนด ใช้ฟังก์ชั่น 'หน้ากาก' สำหรับสิ่งนั้น

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

นี่เป็นพล็อตเรื่องง่าย ๆ ของผลลัพธ์:

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

DEM ของอเมริกาตะวันออกเฉียงเหนือ

ไชโย
Florian


คุณได้รับสถานะไฟล์ที่ไหน
ฉัน Del Toro

@IDelToro ผมได้รับมันจากGeocommons
fdetsch

เหตุใดจึงใช้เวลานานมาก (>> 15 นาทีอาจจะเป็นชั่วโมง) เมื่อทำงานกับ rasterlayer ~ 11mb และไฟล์รูปหลายเหลี่ยมเดียว? มีวิธีที่มีประสิทธิภาพมากกว่านี้ไหม?
นักนิเวศวิทยา

@ ecologist1234 คุณช่วยยกตัวอย่างได้ไหม
fdetsch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.