แยก Raster จาก Raster โดยใช้ Polygon shapefile ใน R


13

ฉันใหม่สำหรับ R และใช้แพ็คเกจแรสเตอร์ ฉันมีปัญหาในการแยกรูปหลายเหลี่ยมจากไฟล์แรสเตอร์ที่มีอยู่ ถ้าฉันใช้

extract(raster, poly_shape)

ฟังก์ชั่นบนแรสเตอร์มันมักจะสร้างรายการที่มีข้อมูล สิ่งที่ฉันต้องการคือการแยกไฟล์แรสเตอร์อื่นที่ฉันสามารถโหลดด้วย ArcGIS อีกครั้ง หลังจากอ่านอีกเล็กน้อยฉันคิดว่าฟังก์ชั่นการครอบตัดคือสิ่งที่ฉันต้องการจริงๆ แต่เมื่อลองใช้ฟังก์ชั่นนี้

crop(raster, poly_shape)

ฉันได้รับข้อผิดพลาดนี้:

Error in .local(x, y, ...) : extents do not overlap
In addition: Warning message:
In intersect(extent(x), extent(y)) : Objects do not overlap

ไฟล์ raster และ poly_shape เหมือนกันทั้งสองฟังก์ชั่น คุณช่วยบอกฉันทีว่าอะไรที่นี่ผิด มันถูกต้องไหมที่ฟังก์ชั่นการครอบตัดสร้างอีกแบบแรสเตอร์และไม่ใช่รายการ?

แก้ไข : ฟังก์ชั่นขอบเขต () ไม่ทำงานสำหรับฉัน ฉันยังคงได้รับข้อผิดพลาดเดียวกัน แต่ฉันแน่ใจว่าชุดข้อมูล 2 ชุดทับซ้อนกัน! กับ

extract(raster, poly_shape)

ฉันได้รับข้อมูลที่ถูกต้องจากมัน เช่นเดียวกับรายการและไม่ใช่แรสเตอร์อย่างที่ฉันต้องการ ฉันเพิ่งโหลดชุดข้อมูลใน ArcGIS มาก่อนและพวกมันก็พอดีมากดังนั้นฉันจึงไม่ได้ตรวจสอบการฉาย ตอนนี้ฉันพยายามแล้ว

projection(raster) # "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
projection(poly_shape) # "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"

และคุณจะเห็นได้ว่าการคาดการณ์ไม่เหมาะสม ฟังก์ชั่นแตกไฟล์ดูเหมือนจะสามารถแปลงไฟล์โดยอัตโนมัติในวิธีที่ถูกต้อง ฉันรู้ว่าเพราะฉันทำต่อไปนี้:

  • ฉันตัดส่วนที่แน่นอนของรูปหลายเหลี่ยมที่ฉันแยกใน R ออกมาใน ArcGIS ด้วย
  • ฉันคำนวณผลรวมของค่าทั้งหมดของรูปหลายเหลี่ยม R ที่แยกแล้ว (รายการ)
  • ฉันคำนวณผลรวมของเซลล์แรสเตอร์ทั้งหมดที่ฉันตัดออกใน ArcGIS

2 มีผลลัพธ์เดียวกันแน่นอนดังนั้นฉันเดาว่าข้อสรุปควรเป็นว่าฟังก์ชันการแยกทำงานได้ถูกต้อง ตอนนี้ฉันมี 2 ตัวเลือกฉันเดา:

  1. ฉันต้องการวิธีที่จะนำ Raster ออกจากรายการที่แยกอีกครั้งหรือ
  2. ชุดข้อมูล 2 ชุด (raster + poly_shape) จำเป็นต้องใช้การปฏิเสธแบบเดียวกันและฟังก์ชันการครอบตัดควรทำงาน

คุณอยากแนะนำให้ทำอะไรที่นี่?


เกิดอะไรขึ้นถ้ามันเป็นแรสเตอร์ rgbi 4 วง? วงจะหายไป ...
ดอริส

ยินดีต้อนรับสู่ GIS SE! ในฐานะผู้ใช้ใหม่โปรดให้แน่ใจว่าจะใช้เวลาสั้น ๆเกี่ยวกับการท่องเที่ยว จากนั้นให้พิจารณาแก้ไขคำตอบของคุณเพื่อให้ข้อมูลเพิ่มเติมและการอ้างอิง ดูฉันจะเขียนคำตอบที่ดีได้อย่างไร สำหรับข้อมูลเพิ่มเติม
Andy

หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม รวมลิงค์ไปยังคำถามนี้หากช่วยระบุบริบท - จากการรีวิว
Erik

คำตอบ:


19

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

โปรดจำไว้ว่า R ไม่สามารถฉายภาพได้ทันทีดังนั้นโปรดตรวจสอบการคาดการณ์ของคุณ คุณสามารถตรวจสอบว่าขอบเขตของคุณทับซ้อนกันโดยใช้ฟังก์ชัน "scope ()"

นี่คือตัวอย่างของการปลูกพืชโดยใช้ขอบเขตรูปหลายเหลี่ยมจากนั้นปิดบังแรสเตอร์ที่เกิดขึ้นโดยใช้รูปหลายเหลี่ยมที่ "rasterized"

# Add required packages
require(raster)
require(rgeos)
require(sp)

# Create some data using meuse 
data(meuse)
  coordinates(meuse) <- ~x+y
    proj4string(meuse) <- CRS("+init=epsg:28992")
data(meuse.grid)
  coordinates(meuse.grid) = ~x+y
    proj4string(meuse.grid) <- CRS("+init=epsg:28992")
      gridded(meuse.grid) = TRUE    
        r <- raster(meuse.grid) 
          r[] <- runif(ncell(r))

# Create a polygon
f <- gBuffer(meuse[10,], byid=FALSE, id=NULL, width=250, 
                         joinStyle="ROUND", quadsegs=10)   

# Plot full raster and polygon                       
plot(r)
  plot(f,add=T)

# Crop using extent, rasterize polygon and finally, create poly-raster
#          **** This is the code that you are after ****  
cr <- crop(r, extent(f), snap="out")                    
  fr <- rasterize(f, cr)   
    lr <- mask(x=cr, mask=fr)

# Plot results
plot(lr)
  plot(f,add=T)

4
สารสกัด () ไม่ดำเนินการเกี่ยวกับเส้นโครงอีกครั้งทันที แต่ตัด () ไม่ได้ นั่นอาจทำให้เกิดความสับสน
mdsumner

@Jefferey ครอบตัด () และหน้ากาก () เพียงคลิปแรสเตอร์ตามขอบเขตรูปสี่เหลี่ยมผืนผ้าของรูปหลายเหลี่ยมที่ไม่ได้ตัดออกจากภายในขอบเขตของรูปหลายเหลี่ยม ความคิดใดที่คำสั่งใดสามารถตัดแรสเตอร์ภายในขอบเขตของรูปหลายเหลี่ยมที่กำหนดได้
csheth

1
@Chintan Sheth สำหรับการมาส์กเพื่อเซตย่อยภายในรูปหลายเหลี่ยมคุณจำเป็นต้องมีแรสเตอร์แทนค่าภายในรูปหลายเหลี่ยม นี่คือเหตุผลที่คุณแรสเตอร์รูปหลายเหลี่ยมชุดย่อยจากนั้นซ่อนไว้ ขั้นตอนการครอบตัดคือการลดขอบเขตของแรสเตอร์ให้เท่ากันกับรูปหลายเหลี่ยมชุดย่อยซึ่งในอดีตหากข้ามไปจะทำให้เกิดข้อผิดพลาดที่ไม่ตรงกันในขอบเขต
Jeffrey Evans

spTransformจากspแพคเกจ (บางครั้งโหลดโดยอัตโนมัติด้วยแพ็คเกจ R เชิงพื้นที่อื่น) ช่วยให้การคัดลอกเพื่อให้ไฟล์ทั้งสองอยู่ในการฉายเดียวกันเช่น good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170 ใช่มั้ย ไม่แน่ใจว่าคุณกำลังทำอะไรอยู่ คำถามนี้เกิดขึ้นในเวลาที่แพ็คเกจแรสเตอร์เพิ่งเพิ่ม "ในการฉายภาพทันที" ภายในบางอย่างถ้าฟังก์ชั่นของมัน ฟังก์ชั่นเหล่านี้เคยเกิดข้อผิดพลาดเมื่อการคาดการณ์ไม่ตรงกัน แต่โพสต์นี้มาจากปี 2014 คุณควรระวังในการโหลด rgdal เมื่อใช้ sp :: spTransform () เพราะมันเพิ่มฟังก์ชั่นเพิ่มเติมที่สำคัญเบื้องหลัง
เจฟฟรีย์อีแวนส์

8

สิ่งที่ฉันค้นหาจริงๆคือmask()ฟังก์ชั่น

mask(raster, poly_shape)

ทำงานได้โดยไม่มีข้อผิดพลาดและส่งคืนสิ่งที่ฉันค้นหา


2
ปฏิเสธข้อมูลของคุณเพื่อให้อยู่ในพื้นที่ฉายภาพเดียวกัน แม้แต่ใน ArcGIS ที่การฉายภาพในทันทีเป็นไปโดยอัตโนมัติมันเป็นวิธีปฏิบัติที่เลวร้ายมากในการทำการวิเคราะห์ในรูปแบบต่าง ๆ ด้วยข้อมูลในการฉายภาพที่แตกต่างกันข้อมูลของคุณจะไม่แชร์ขอบเขตทั่วไปซึ่งเป็นข้อผิดพลาดที่คุณได้รับ
Jeffrey Evans

ใช้ projectExtent () เพื่อขยายขอบเขตการครอบตัดแรสเตอร์
mdsumner

เพื่อให้เหมาะสมกับรูปแบบคำถาม & คำตอบของเว็บไซต์สิ่งนี้ควรวางไว้ในเนื้อหาหลักของคำถามเป็นการแก้ไข / อัปเดต (จากนั้นเพิ่มความคิดเห็นในคำตอบที่อยู่ใน "ตอบกลับ" เพื่อให้พวกเขารู้ว่ามีอะไรมากกว่านี้)
matt wilkie

@mattwilkie ขออภัยที่ไม่เหมาะกับรูปแบบ แต่ข้อความของฉันยาวเกินไปที่จะโพสต์เป็นความคิดเห็นได้ที่นี่ @JeffreyEvans ฉันลองต่อไปนี้: projection(raster) = projection(poly_shape)และวิธีอื่น ๆprojection(poly_shape) = projection(raster)แต่ทั้งสองวิธีทำให้เกิดข้อผิดพลาดเดียวกัน: Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. มีวิธีที่ฉันสามารถดูการฉายภาพที่ใช้ในการบินโดยใช้ฟังก์ชันแยก () (เพราะฟังก์ชั่นนี้ชัด)
ลาร์ส

1
สิ่งที่ฉันค้นหาจริงๆคือฟังก์ชั่นหน้ากาก () mask(raster, poly_shape)ทำงานได้โดยไม่มีข้อผิดพลาดและส่งคืนสิ่งที่ฉันค้นหา
ลาร์ส

-1

ขอบเขตทำงานได้ดี ... ฉันคิดว่าขอบเขต Xmin, Xmax, Ymin และ Ymax ของคุณนั้นแตกต่างจาก X และ Y ของแรสเตอร์ของคุณ - เช่นตั้งอยู่ตรงกันข้าม

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