R: วิธีรับละติจูดและลองจิจูดจาก RasterLayer


14

ฉันเป็นผู้เริ่มต้นที่สมบูรณ์ของข้อมูลทางภูมิศาสตร์ดังนั้นโปรดยกโทษให้ฉันหากคำถามไม่เหมาะสม

ฉันดาวน์โหลดข้อมูลจาก NCDC NARR และจัดการโหลดลงใน R โดยใช้rasterแพ็คเกจ ฉันต้องการรับรายการที่มีละติจูดลองจิจูดและค่า ฉันเข้าใจว่าrasterToPoints()ควรทำสิ่งที่ฉันต้องการอย่างแน่นอนอย่างไรก็ตามค่าละติจูดและลองจิจูดของฉันดูแปลก ๆ :

r <- raster(myfile)
data_matrix <- rasterToPoints(r)
head(data_matrix)
            x       y value
[1,] -5405401 4347242    70
[2,] -5372938 4347242    88
[3,] -5340475 4347242    76
[4,] -5308012 4347242    85
[5,] -5275549 4347242    87
[6,] -5243086 4347242    88

ฉันคิดว่าฉันควรทำอะไรกับการฉายภาพซึ่งปัจจุบันเป็น Lambert Conformal Conic (LCC) นี่คือข้อมูลเพิ่มเติมเกี่ยวกับแรสเตอร์

> r
class       : RasterLayer 
dimensions  : 277, 349, 96673  (nrow, ncol, ncell)
resolution  : 32463, 32463  (x, y)
extent      : -5648874, 5680713, -4628777, 4363474  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=lcc +lat_1=50 +lat_2=50 +lat_0=50 +lon_0=-107 +x_0=0 +y_0=0 +a=6371200 +b=6371200 +units=m +no_defs 
data source : mypath-to-file
names       : value

ฉันต้องทำอย่างไรเพื่อให้ได้ค่าละติจูดและลองจิจูดในสหรัฐอเมริกาที่แท้จริง

คำตอบ:


14

คุณต้องปฏิเสธภาพแรสเตอร์ลงในโปรเจคชันทางภูมิศาสตร์ (องศาทศนิยม) โดยใช้ "projectRaster" หรือ "spTransform" ดูคำจำกัดความ sp CRS ที่ระบุสตริงการฉายที่คุณต้องการ ตัวอย่างในวิธีใช้สำหรับ "projectRaster" ค่อนข้างชัดเจนในวิธีการทำเช่นนี้

หากคุณบีบบังคับข้อมูลแรสเตอร์ของคุณให้เป็นวัตถุ SpatialPointsDataFrame คุณจะต้องใช้ "spTransform" และดึงพิกัดจากช่อง @coordinates และเพิ่มลงใน data.frame ในช่อง @data นี่คือตัวอย่างของสิ่งที่จะมีลักษณะ

library(raster)
library(rgdal) # for spTransform

# Create data
r <- raster(ncols=100, nrows=100)
  r[] <- runif(ncell(r))
  crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"
  projection(r)

# Convert raster to SpatialPointsDataFrame
r.pts <- rasterToPoints(r, spatial=TRUE)
  proj4string(r.pts)

# reproject sp object
geo.prj <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
r.pts <- spTransform(r.pts, CRS(geo.prj)) 
  proj4string(r.pts)

# Assign coordinates to @data slot, display first 6 rows of data.frame
r.pts@data <- data.frame(r.pts@data, long=coordinates(r.pts)[,1],
                         lat=coordinates(r.pts)[,2])                         
head(r.pts@data)

ฉันควรทราบว่ามันไม่ใช่วิธีปฏิบัติที่ดีในการแปลง rasters เป็นคลาสเวกเตอร์วัตถุและคัดค้านข้อดีของแพ็คเกจ raster ที่ให้การประมวลผลที่ปลอดภัยของหน่วยความจำ บ่อยครั้งที่รอบคอบที่จะคิดถึงปัญหาของคุณและประเมินว่าคุณกำลังเข้าใกล้อย่างถูกต้องหรือไม่ หาก OP ได้ให้บริบทว่าทำไมพวกเขาต้องการพิกัด [x, y] สำหรับทุกเซลล์ชุมชนฟอรัมอาจให้ทางเลือกในการคำนวณที่จะทำให้เกิดปัญหาในสภาพแวดล้อมแบบแรสเตอร์


1
วิธีหนึ่งที่จะใช้ความระมัดระวัง (เกี่ยวกับการหลีกเลี่ยงการแปลงข้อมูล) ไปที่หัวใจคือการยกเลิกโครงการแรสเตอร์ดั้งเดิม (อาจจะเป็นตารางที่หยาบมาก) สร้างกริดละติจูดและลองจิจูดสองค่าที่ครอบคลุมขอบเขตของโครงการ ขอบเขตของกริดดั้งเดิม ไม่มีการสร้างคลาสเวกเตอร์: เป็นชุดของการดำเนินการแบบแรสเตอร์ทั้งหมด
whuber

4

รับพิกัดของศูนย์เซลล์และสร้างวัตถุเชิงพื้นที่:

spts <- rasterToPoints(r, spatial = TRUE)

เปลี่ยนคะแนนเป็นเป้าหมายที่คุณต้องการ:

library(rgdal)
llprj <-  "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
llpts <- spTransform(spts, CRS(llprj))

ค่าจะถูกคัดลอกเป็นคอลัมน์ใน SpatialPointsDataFrame นี้

print(llpts)

ตอนนี้ให้เสร็จเพื่อรับ data.frame:

x <- as.data.frame(llpts)

มีการใช้งานทั่วไปของสิ่งนี้ในแพ็คเกจ SGAT ดูฟังก์ชั่นlonlatFromCellที่นี่:

https://github.com/SWotherspoon/SGAT/blob/master/R/Raster.R


ฉันลองสิ่งนี้ แต่ได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้: > llpts$layer1 <- values(r[[1]]) Error in [[<-. data.frame (* tmp *, name, value = c(NA, NA, NA, NA, NA, : replacement has 96673 rows, data has 95025
janosdivenyi

ที่จริงคุณไม่จำเป็นต้องถ่ายโอนแอตทริบิวต์ฉันจะลบมัน
mdsumner

นอกเหนือจากคำแนะนำแพคเกจ SGAT นี่ไม่ใช่คำตอบ / ตัวอย่างเดียวกันกับที่ฉันให้ไว้หรือไม่ พิกัดจะไม่แพร่กระจายไปยัง data.frame ใน data slot เฉพาะค่าจาก raster อันที่จริงแล้วพิกัดอยู่ในสล็อตพิกัดและจำเป็นต้องเพิ่มลงใน data.frame
Jeffrey Evans

ขอบคุณฉันเพิ่มขั้นตอน as.data.frame ฉันคิดว่ามันเป็นคำแนะนำที่น่ากลัวในการเพิ่มพิกัดเป็นคุณลักษณะ - โดยเฉพาะอย่างยิ่งเมื่อมีช่องเสียบเนื่องจากพิกัดของวัตถุสามารถเปลี่ยนแปลงได้ ถ้าคุณต้องการ data.frame แบบดิบๆให้สร้างมันขึ้นมา ฉันไม่สนใจว่าข้อมูลอยู่ที่ไหนเพียงแค่แก้ไขข้อมูลของคุณและเราสามารถตอบคำถามนี้ได้
mdsumner

OP ต้องการเฉพาะพิกัดและฉันคิดว่ามันซ้ำซ้อนในการบันทึกไปยัง data.frame แยกต่างหาก ปกติฉันไม่ชอบการเพิ่มพิกัดไปยังช่องเสียบข้อมูลเป็นหลักเพราะซ้ำซ้อนกับช่องพิกัด นอกเหนือจากนี้มันไม่ใช่ "คำแนะนำที่แย่มาก" ในการเพิ่มข้อมูลลงในช่องข้อมูล ถ้าคุณต้องการมีระบบพิกัดสองระบบ คุณสามารถเพิ่ม lat / long ในช่องข้อมูลและมีวัตถุในการฉายที่แตกต่างกันโดยสิ้นเชิง นอกจากนี้หากคุณต้องการส่งออกไฟล์แฟล็ตไม่ใช่รูปแบบ GIS ต่อ se คุณสามารถเพิ่มพิกัดใน data.frame และบันทึกเป็น csv
Jeffrey Evans

0

ดูเหมือนว่าคุณมีพิกัดที่คาดการณ์ไว้ที่นั่น (ไม่ใช่ละติจูด / ลองจิจูดหรือที่รู้จักกันในพิกัด GCS) อาจไม่ชัดเจนสำหรับคุณที่เป็นปัญหา ดูโพสต์นี้ การแปลงระบบพิกัดทางภูมิศาสตร์ใน R


ฉันไม่ได้โพสต์ที่คุณอ้างอิงก่อนที่จะตอบ คุณอาจต้องการตั้งค่าสถานะนี้ซ้ำ แม้ว่าการเพิ่มการบังคับขู่เข็ญ SpatialPointsDataFrame และการกำหนดพิกัดจะทำถ้าแตกต่างกันเล็กน้อย การโทรของคุณ
Jeffrey Evans

ฉันคิดเกี่ยวกับการทำเครื่องหมายว่าเป็นเช่นนั้น แต่ฉันคิดว่าถ้าบุคคลอื่นกำลังค้นหาคำตอบที่คล้ายกันโดยไม่ทราบว่าพวกเขาต้องการฉายค่าเหล่านี้อาจปรากฏขึ้นสำหรับพวกเขา นอกจากคำตอบของคุณยังเสนอวิธีที่แตกต่างในการไปที่นั่น (เพิ่มขึ้น)
jbchurchill

ฉันพยายามดูแหล่งข้อมูลที่คุณระบุไว้ เพื่อให้ได้รับมาตรฐานละติจูด / lonlat_r <- projectRaster(r, crs="+init=epsg:4326")ลองจิจูดฉันออก อย่างไรก็ตามขอบเขตของแรสเตอร์ใหม่นั้น-181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)อยู่ไกลจากสิ่งที่ฉันคาดหวังจากสหรัฐอเมริกา (ซึ่งควรอยู่ระหว่าง 30 ถึง 70 และ -60 ถึง -160 ถึง -160) ฉันควรจะเข้าใจผิดบางอย่าง
janosdivenyi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.