ฉันจะแปลงข้อมูลในรูปแบบ lat, lon, value เป็นไฟล์ raster โดยใช้ R ได้อย่างไร?


40

ฉันมีชุดข้อมูลของค่าเหนือกริดกม. ในทวีปอเมริกาคอลัมน์คือ "ละติจูด", "ลองจิจูด" และ "การสังเกต" เช่น:

"lat"    "lon"     "yield"
 25.567  -120.347  3.6 
 25.832  -120.400  2.6
 26.097  -120.454  3.4
 26.363  -120.508  3.1
 26.630  -120.562  4.4

หรือในฐานะกรอบข้อมูล R:

mydata <- structure(list(lat = c(25.567, 25.832, 26.097, 26.363, 26.63), 
lon = c(-120.347, -120.4, -120.454, -120.508, -120.562), 
yield = c(3.6, 2.6, 3.4, 3.1, 4.4)), .Names = c("lat", 
"lon", "yield"), class = "data.frame", row.names = c(NA, -5L))

(สามารถดาวน์โหลดชุดข้อมูลแบบเต็มเป็น csv ได้ที่นี่ )

ข้อมูลจะถูกส่งออกจากรูปแบบการครอบตัด (ตั้งใจจะเปิด) ตาราง 30 กม. x 30 กม. (จากMiguez et al 2012 )

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะแปลงไฟล์เหล่านี้เป็นไฟล์แรสเตอร์ด้วยข้อมูลเมตาที่เกี่ยวข้องกับ GIS เช่นการฉายแผนที่ได้อย่างไร

เป็นการดีที่ไฟล์จะเป็นไฟล์ข้อความ (ASCII?) เพราะฉันต้องการให้เป็นแพลตฟอร์มและซอฟต์แวร์ที่เป็นอิสระ


ในฐานะ CSV สิ่งนี้เป็น "ไฟล์ข้อความ" ใน ASCII แล้ว นอกจากนี้เนื่องจากไม่มีการคาดการณ์เลยอาจมีข้อมูลเมตาที่เกี่ยวข้องเพียงเล็กน้อยที่จะเพิ่ม (ข้อมูลส่วนใหญ่) คุณจะเจาะจงเจาะจงมากขึ้นเกี่ยวกับผลลัพธ์ที่คุณค้นหาและสิ่งที่คุณต้องการจะทำกับมันได้หรือไม่?
whuber

ฉันต้องการทำให้เป็นเรื่องง่ายที่สุดเท่าที่จะเป็นไปได้สำหรับใครบางคนที่จะใช้ข้อมูลกับซอฟต์แวร์แผนที่ต่าง ๆ (ArcGIS, Google Maps, Grass, R, ฯลฯ ) เพื่ออำนวยความสะดวกในการใช้ซ้ำเช่นโดยไม่ต้องมีขั้นตอนการแปลงเพิ่มเติม จากหน้า Wikipediaของรูปแบบไฟล์ GIS ฉันสรุป 1) ไฟล์ "แรสเตอร์" ควรมี rownames พร้อมชื่อละติจูดและลองจิจูดเช่นภาพและ 2) ข้อมูลเมตาควรมีข้อมูลทางภูมิศาสตร์ (ตำแหน่งของมุมพื้นที่ครอบคลุม โดยข้อมูล)
เอ็บ

นี่คือหนึ่งในการอ้างอิงที่ดีที่สุดที่ฉันเจอใน R และ GIS ขอบคุณมาก! คุณช่วยกรุณาให้ csv อื่นด้วย lat และ long ด้วย proj4string ที่ถูกต้องได้หรือไม่? ฉันจะขอบคุณมันจริงๆ

@Nandini ไม่แน่ใจว่า proj4string ที่ถูกต้องคือผมสงสัยlambert proj +proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-145.5 +lat_0=1.0มาตราส่วน: ฉันไม่แน่ใจว่าสิ่งที่คุณถามเกี่ยวกับไฟล์ csv อื่น - มันจะแตกต่างจากไฟล์ที่เชื่อมโยงในคำถามหรือว่าจะเกิดจากคำตอบที่ยอมรับได้?
Abe

สำหรับฉันไม่ทำงาน! ฉันไม่รู้ว่าจะใส่อะไรใน "x" และ "y" ถึง "พิกัด (pts) = ~ x + y"

คำตอบ:


44

ต้องใช้หลายขั้นตอน:

  1. คุณบอกว่ามันเป็นกริด 1km ปกติ แต่นั่นหมายความว่า lat-long นั้นไม่ปกติ ก่อนอื่นคุณต้องแปลงให้เป็นระบบพิกัดกริดปกติดังนั้นค่า X และ Y จะเว้นระยะสม่ำเสมอ

    อ่านมันเข้าไปใน R เป็นกรอบข้อมูลโดยมีคอลัมน์ x, y, ให้ผลตอบแทน

    pts = read.table("file.csv",......)

    ข แปลงเฟรมข้อมูลเป็น SpatialPointsDataFrame โดยใช้แพ็คเกจ sp และสิ่งที่ชอบ:

    library(sp)
    library(rgdal)
    coordinates(pts)=~x+y

    ค แปลงเป็นระบบ km ปกติของคุณโดยบอกเป็นครั้งแรกว่า CRS คืออะไรจากนั้น spTransform ไปยังปลายทาง

    proj4string(pts)=CRS("+init=epsg:4326") # set it to lat-long
    pts = spTransform(pts,CRS("insert your proj4 string here"))

    d บอก R ว่านี่คือ gridded:

    gridded(pts) = TRUE

    ณ จุดนี้คุณจะได้รับข้อผิดพลาดหากพิกัดของคุณไม่ได้อยู่บนกริดปกติ

  2. ตอนนี้ใช้แพ็คเกจแรสเตอร์เพื่อแปลงเป็นแรสเตอร์และตั้งค่า CRS:

    r = raster(pts)
    projection(r) = CRS("insert your proj4 string here")
  3. ตอนนี้มีลักษณะ:

    plot(r)
  4. ตอนนี้เขียนเป็นไฟล์ geoTIFF โดยใช้แพ็คเกจ raster:

    writeRaster(r,"pts.tif")

geoTIFF นี้ควรอ่านได้ในแพ็คเกจ GIS ที่สำคัญทั้งหมด สิ่งที่ขาดหายไปอย่างเห็นได้ชัดที่นี่คือสตริง proj4 ที่จะแปลงเป็น: นี่อาจเป็นระบบอ้างอิง UTM บางประเภท ยากที่จะบอกหากไม่มีข้อมูลเพิ่มเติม ...


+1 ขอบคุณสำหรับการจัดทำเวิร์กโฟลว์ โปรดทราบว่าข้อมูลมีอยู่ที่ลิงค์ที่ให้ไว้ในคำถาม: ลองดู คุณจะค้นพบว่าสมมติฐานบางอย่างของคุณเกี่ยวกับพวกเขานั้นไม่ถูกต้อง (โดยเฉพาะอย่างยิ่งผมตามล่าใด ๆเอกสารเกี่ยวกับการฉายที่ใช้ในการสร้างตาราง แต่ก็พบว่าไม่มีและมันเป็นโปรเจคที่แปลกประหลาดที่คุณสามารถดูจากพล็อตจุด..)
whuber

มันใกล้เคียงกับการเป็นระบบ UTM แต่ไม่มีสิ่งใดที่ฉันเคยลองมาอยู่ใกล้กับกริดปกติสำหรับ R เพื่อกริดพวกเขา ฉันอยากจะวนซ้ำผ่านฐานข้อมูล epsg ทั้งหมดของ R ....
Spacedman

นั่นจะเป็นทัวร์เดอบังคับจริงถ้าคุณสามารถค้นพบการฉายภาพในแบบนั้น! กุญแจสำคัญคือการหาเกณฑ์ที่มีประสิทธิภาพและมีประสิทธิภาพเพื่อพิจารณาว่าเมื่อใดที่คะแนนเหล่านี้อยู่ใกล้กับตารางปกติมากกว่า7,000+ จุด(เพราะอาจเป็นไปได้ที่พวกเขาอาจไม่ได้สร้างกริดที่สมบูรณ์แบบในการฉายมาตรฐานใด ๆ เลย) สำหรับการวิ่งผ่านฐานข้อมูลอย่างรวดเร็วมันควรจะเพียงพอที่จะเปรียบเทียบระยะทางจำนวนเล็กน้อยเช่นระยะทางตะวันออก - ตะวันตกในส่วนเหนือของตารางกับระยะทางตะวันออก - ตะวันตกในภาคใต้ นั่นควรกำจัดผู้สมัครส่วนใหญ่อย่างรวดเร็ว
whuber

3
ฉันวิ่งผ่านการคาดการณ์ (เริ่มต้น) ทั้งหมดที่สนับสนุนโดยMathematica 8 พบว่ามีการฉายในจุดที่ดูเหมือนจะตกอยู่ในตาราง: Alaska State Plane (1983) Zone 10! นี่คือการประมาณการของ Lambert Conformal Conic ผมเชื่อว่ามันเป็นEPSG 26940 หากคุณปรับเปลี่ยนค่านี้ให้อยู่กึ่งกลางโดยประมาณที่ลองจิจูด -106 จุดจะเป็นกริดที่ดี
whuber

1
แน่นอนคุณหมายถึงการอ่านเว็บเพจหรือไม่? r = Import[ "https://ebi-forecast.igb.illinois.edu/bety/miscanthusyield.csv", "Data"];มันเป็น คุณสามารถรับพล็อตด่วนของคะแนนหลังจากนั้นผ่านทางdata = Rest[r]; ListPlot[data[[;; , {3, 2}]]](หรือListPointPlot3D[data[[;; , {3, 2, 4}]]]) สำหรับการถอดแบบเริ่มต้นด้วยความช่วยเหลือGeoGridPositionจากนั้นทำการเดาที่ชาญฉลาดและการอ้างอิงโยงเพื่อหาว่าเกิดอะไรขึ้น :-) BTW, @ Spacedman คำอธิบายนั้นมีความเกี่ยวข้องจริงๆ: การบิดเบือนของเมตริกจาก 25 ถึง 49 องศาเท่ากับ cos (25) / cos (49) = 1.38; นั่นเป็นรูปธรรม
whuber

29

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

library(raster)
rasterFromXYZ(mydata)

1
ขอโทษด้วย @ เหน็ดเหนื่อยกับคนที่ช่วยฉันบ่อยครั้ง แต่ฉันคิดว่าคำตอบนี้สมควรได้รับการทำเครื่องหมายสีเขียวครึกครื้น
geotheory

@geotheory ฉันจะเลือกคำตอบนี้ฟังก์ชั่นที่ดีของมัน แต่มันดูเหมือนว่าจะช้ามากในชุดข้อมูลที่ผมใช้ (การเชื่อมโยงไปในสหกรณ์)
เอ็บ

1
... อันที่จริงแล้วมันสำลักเพราะมันใช้ไฟล์ ~ 400KB ของฉันและสร้างไฟล์ขึ้นมา/tmp/นั่นคือ ~ 19GB เมื่อฉันมีพื้นที่ดิสก์เหลืออยู่
Abe

อาจจะมีกระบวนการ n-squared อยู่ที่ไหนสักแห่ง คุณอาจสามารถจัดกลุ่มข้อมูลคะแนนด้วยกริดแบบกว้าง ๆ ทำการ rasterise แต่ละกลุ่มทีละรายการแล้วmerge()รวมผลลัพธ์เข้าด้วยกัน
geotheory

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