วิธีการปฏิเสธ raster จาก 0 360 ถึง -180 180 ด้วยการตัด 180 meridian


31

ฉันมีภาพแรสเตอร์เชิงพิกัดที่มีระบบพิกัดที่มีความยาวตั้งแต่ 0 ถึง 360 จุดศูนย์กลางแนวนอนของภาพคือ 180 longtitude ดูภาพด้านล่าง:

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

ฉันต้องการแปลงเป็น EPSG: 4326 SRS ด้วยช่วงความยาว -180 180 และฉันต้องการให้ศูนย์กลางของภาพอยู่ที่ Greenwich meridian (0) ฉันคิดว่า srs นี้ใช้กันอย่างแพร่หลายมาก ฉันหวังว่าผลลัพธ์จะเป็นดังนี้:

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

ดังนั้นฉันใช้คำสั่ง gdalwarp เพื่อปฏิเสธ:

gdalwarp -s_srs '+proj=latlong +datum=WGS84 +pm=180dW' -t_srs EPSG:4326 test_col.tif test_4326.tif

แต่ฉันจะได้รับความยุ่งยากที่มีขนาดใหญ่ขึ้น (พิกเซลมากขึ้น) และ EPSG: 4326 เมทาดาทา ภาพมีลักษณะเหมือนกันกับภาพแรก แต่ฉันคาดหวังว่ามันจะแลกเปลี่ยนซีกโลก

คำถามคือ - ฉันจะถ่ายภาพให้เป็น -180 180 EPSG ได้อย่างไร: 4326 โดยมีศูนย์กลางอยู่ที่ 0 longtitude?

นี่คือ gdalinfo ของไฟล์เริ่มต้นของฉัน:

Origin = (-0.102272598067084,89.946211604095552)
Pixel Size = (0.204545196134167,-0.204423208191126)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (  -0.1022726,  89.9462116) (  0d 6' 8.18"W, 89d56'46.36"N)
Lower Left  (  -0.1022726, -89.9462116) (  0d 6' 8.18"W, 89d56'46.36"S)
Upper Right (     359.897,      89.946) (359d53'50.18"E, 89d56'46.36"N)
Lower Right (     359.897,     -89.946) (359d53'50.18"E, 89d56'46.36"S)
Center      ( 179.8975000,  -0.0000000) (179d53'51.00"E,  0d 0' 0.00"S)

นี่คือ gdalinfo หลังจาก gdalwarp

Origin = (-180.102727401932952,89.946211604095552)
Pixel Size = (0.091397622896436,-0.091420837939082)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (-180.1027274,  89.9462116) (180d 6' 9.82"W, 89d56'46.36"N)
Lower Left  (-180.1027274, -89.9699975) (180d 6' 9.82"W, 89d58'11.99"S)
Upper Right ( 179.8211116,  89.9462116) (179d49'16.00"E, 89d56'46.36"N)
Lower Right ( 179.8211116, -89.9699975) (179d49'16.00"E, 89d58'11.99"S)
Center      (  -0.1408079,  -0.0118929) (  0d 8'26.91"W,  0d 0'42.81"S)

เกี่ยวกับความละเอียดที่แตกต่างกันคุณลองเพิ่มการ-tr xres yresตั้งค่าสถานะหรือไม่
Nickves

คำตอบ:


21

คุณสามารถกำหนดช่วงพิกัดเอาต์พุตอย่างชัดเจนโดยใช้ตัวเลือกขอบเขตเป้าหมายเป็น gdalwarp (เช่น "-te -180 -90 -90 180 90") แต่คุณยังสามารถใช้ตัวเลือกการกำหนดค่า CENTER_LONG เพื่อบังคับใช้การหมุนรอบกลางเส้นแวงกลางใหม่ บางสิ่งเช่นนี้

  gdalwarp -t_srs WGS84 ~/0_360.tif 180.tif  -wo SOURCE_EXTRA=1000 \
           --config CENTER_LONG 0

โปรดทราบว่าตัวเลือกวาร์ป "SOURCE_EXTRA = 1000" เมื่อทำการ rewrapping การคำนวณสี่เหลี่ยมต้นฉบับจะทำให้เกิดความสับสนเกี่ยวกับการหยุดชะงักของลองจิจูดและสูญเสียภาพบางส่วน ตัวเลือกนี้บอกว่าดึงพิเศษบางอย่าง คุณก็จะเห็นช่องว่างของข้อมูลใกล้กับเส้นลมปราณหลัก

PS การตั้งค่าเมริเดียนหลักของ 180dW อย่างที่คุณทำไม่ใช่ความคิดที่ดี


1
อืม--config CENTER_LONG 0ไม่ทำอะไรเลยผลที่ได้คือแรสเตอร์เดียวกัน อะไรที่ฉันคิดถึงที่นี่? ทำงานบน GDAL เวอร์ชัน 2.2.3
jurajb

6

โดยทั่วไปคุณจะต้องตัดแรสเตอร์ออกเป็นสองส่วนแล้วนำกลับมารวมกับออฟเซ็ต / สเกลใหม่

มีตัวอย่างวิธีการทำเช่นนี้ตั้งแต่ [-180,180] ถึง [0,360] ด้วย gdal_translate และไดรเวอร์ VRT: http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

สแกนลงไปที่ "5 นาทีกวดวิชา" และรายละเอียดอยู่ภายใต้ "ไฟล์เสมือน" ควรง่ายพอที่จะปรับเปลี่ยนตัวอย่างให้เหมาะสม


2

สิ่งนี้สามารถทำได้ใน R กับรหัสหนึ่งบรรทัดโดยใช้rotateฟังก์ชั่นกับrasterแพคเกจ

library(raster)
your_raster <- raster("path/to/raster.tif")
rotated_raster <- rotate(your_raster)

1

หากคุณต้องการดูแรสเตอร์ใน QGIS คุณสามารถตั้งค่าการฉายภาพแบบกำหนดเองด้วยพารามิเตอร์ + lon_wrap = 180

ความเข้าใจของฉันเกี่ยวกับเรื่องนี้ก็คือตามค่าเริ่มต้น proj4 จะดึงละติจูดจาก 0 -> 360 ถึง -180 -> 180 + lon_wrap = 180 จะยกเลิกการห่อนี้ได้อย่างมีประสิทธิภาพและแสดงละติจูดระหว่าง 180 ถึง 360 ในซีกโลกตะวันตก

ตัวเลือก + ขึ้นไปควรปิดการใช้งานการตัดทั้งหมด แต่อย่างน้อยในกรณีของฉันแรสเตอร์ไม่แสดงอย่างถูกต้องเมื่อใช้ตัวเลือกนั้น

ดูhttp://proj4.org/parameters.html#lon-wrap-over-longitude-wrappingสำหรับข้อมูลเพิ่มเติม


0

นี่คือฟังก์ชั่นที่ฉันสร้างขึ้นเพื่อปฏิเสธอาร์เรย์สลัวของค่ากริดเดียวโดยใช้ javascript จาก 0-360 ถึง -180-180 ฉันหวังว่ามันจะเป็นประโยชน์กับใครบางคน

  let xstart = 180 / xres //xres is the number of values per 1 degree
  for (let y = 0; y < data.height; y++) {
    let index = (y * data.width) + 1,
    start = index + xstart,
    end = index + data.width
    array.splice(index, 0, ...array.splice(start, (end - start)))
  }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.