ฉันจะแปลงพิกัดเลียนแบบเป็น lat / lng ได้อย่างไร


14

ฉันใหม่มากกับ GIS

ฉันใช้gdalเพื่ออ่านใน landuse / landcover map และฉันต้องเลือก lat / lng ของชนิดของ land land บางชนิดเพื่อทำดัชนีในชุดข้อมูลอื่นซึ่งแสดงเป็น lat / lng เท่านั้น โชคไม่ดีฉันไม่เข้าใจรูปแบบของพิกัด x และ y ที่มอบให้ฉันจากการเปลี่ยนรูปทางภูมิศาสตร์โดยเฉพาะoriginXและoriginYด้านล่าง:

geotransform = dataset.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]

การพิมพ์ค่าเหล่านี้ให้พิกัดเหมือน(447466.693808, 4952570.40529)กัน สิ่งเหล่านี้เกี่ยวข้องกับละติจูดและลองจิจูดดั้งเดิมอย่างไร

แก้ไข:

นี่เป็นตัวอย่างของงูหลามที่ทำให้ฉันได้รับสิ่งที่ฉันกำลังมองหา:

srs = osr.SpatialReference()
srs.ImportFromWkt(dataset.GetProjection())

srsLatLong = srs.CloneGeogCS()
ct = osr.CoordinateTransformation(srs,srsLatLong)
print ct.TransformPoint(originX,originY)

ถูกขโมยจาก: tolatlong.py


ดูเหมือนว่าข้อมูลของคุณจะถูกฉาย (เช่น UTM) และคุณจะต้องรู้ว่าการคาดการณ์คืออะไรเพื่อ "unproject" กลับไปที่พิกัดยาว / lat

@ แดนขอบคุณดังนั้นฉันรู้ว่าฉันสามารถฉายภาพผ่านทางdataset.GetProjectionRef()และหาว่าฉันใช้ "UTM Zone 10" แต่แล้วอะไรนะ? ฉัน googling ไปรอบ ๆ สำหรับวิธีการเช่น "unproject" แต่ฉันกำลังจะมาเป็นโมฆะ
รวย

ขออภัยสำหรับการใช้คำว่า unproject (ในเครื่องหมายคำพูด) เนื่องจากข้อมูลในรูปทศนิยมไม่ได้ถูกฉาย แต่ถ้าคุณต้องการให้ข้อมูลที่ฉายกลับไปเป็นองศาทศนิยมจากการฉายภาพใดก็ตามคุณต้อง (หมายเหตุเครื่องหมายคำพูด) "project" มันกลับไปที่ระบบพิกัดทางภูมิศาสตร์หรือที่รู้จักกันว่าข้อมูลระดับทศนิยม

2
เธรด (ใหม่กว่า) นี้ให้ตัวอย่างที่ชัดเจนและวิธีแก้ปัญหาอื่น: gis.stackexchange.com/questions/8430/…
whuber

คำตอบ:


10

gdal_translateจะปฏิเสธข้อมูลของคุณไม่ว่าจะฉายภาพใด ๆ ก็ตาม (ในกรณีนี้คุณต้องการ EPSG: 4326) โดยใช้:

gdal_translate -a_srs epsg:4326 srcfile new_file 

หรือคุณสามารถใช้gdaltrasformเพื่อแปลงคะแนน (และฉันแน่ใจว่าคุณสามารถเข้าถึงได้จาก Python (?) ด้วย)


(+1) ฉันไม่รู้ว่าทำไมสิ่งนี้จึงถูกลดทอนลงเอียนเพราะมันดูเหมือนว่าฉันจะต้องมีการดำเนินการบางอย่างเหมือนที่จะต้องใช้หลังจากการแปลงเลียนแบบถูกนำไปใช้
whuber

gdal_translate จะไม่ทำงานในแบบที่คุณมี (หรือมากกว่านั้นจะกำหนด EPSG: 4326 ให้กับข้อมูล) คุณจะต้องบิดข้อมูลด้วย ggwwarp -s_srs EPSG: 32610 -t_srs EPSG: 4326 src dest หาก data มี proj metadata อยู่แล้วคุณสามารถกำหนดพารามิเตอร์ -s_srs ได้
MerseyViking

บางทีนี่อาจเป็นสิ่งที่ฉันตามมา "epsg: 4326" เปลี่ยนเป็น lat lat / lng ทั่วโลกหรือไม่? ฉันคิดว่าฉันเห็นบางคลาสที่ฉันสามารถฉายภาพได้ฉันคิดว่า "WGS: 84" แต่ฉันไม่รู้ความแตกต่าง
รวย

1
@Rich คลิกที่แท็ก "ระบบพิกัด"ในคำถามของคุณเรียงลำดับหน้าผลลัพธ์ด้วยคะแนนโหวตและเริ่มอ่าน คำถามของคุณจำนวนมากจะได้รับคำตอบภายในไม่กี่นาที
whuber

7

เปลี่ยนแปลงสัเป็นเอกสารที่https://gdal.org/user/raster_data_model.html ความคิดคือคุณใช้ (x, y) พิกัดโดยตรงจากชุดข้อมูลใช้การแปลงเชิงเส้นเพื่อรับ (u, v) ด้วย

u = a*x + b*y
v = c*x + d*y

(คุณสามารถใช้นี่เป็นนิยามของการแปลงเชิงเส้น) จากนั้นเลื่อนต้นกำเนิดโดยการเพิ่ม geotransform [0] ไปที่ u และ geotransform [3] เป็น v. ที่ให้ "การแปลงเลียนแบบ" ของ (x, y) มันมีจุดประสงค์เพื่อหมุนเปลี่ยนระดับอาจแก้ไขข้อผิดพลาดเล็กน้อยบางอย่างและแก้ไขตำแหน่งพิกัดเฉพาะข้อมูล (x, y) อีกครั้งเพื่อให้ตรงกับระบบพิกัดที่รู้จัก ผลลัพธ์ควรจะสร้างพิกัดที่คาดการณ์ไว้ นี่หมายความว่ามีขั้นตอนทางคณิตศาสตร์ในการทำ (ลองจิจูด, ละติจูด) และเปลี่ยนเป็นพิกัดที่รู้จัก: เรียกว่า "การฉายภาพ" "Unprojecting" กำลังทำสิ่งที่ตรงกันข้าม ดังนั้นถ้าคุณรู้ว่าต้องการการฉายภาพแบบใดคุณจะใช้มันกับพิกัดเลียนแบบ (x, y) เพื่อรับละติจูดและลองจิจูด

โดยวิธีการค่าของค่าคงที่ a, b, c, d จะได้รับจาก 1, 2, 4 และ 5 รายการในอาร์เรย์ geotransform


1
ฉันอ่านส่วนพิกัดทางภูมิศาสตร์ของลิงก์ที่คุณระบุไว้ แต่ฉันไม่คิดว่านี่เป็นสิ่งที่ฉันต้องการ ขออภัยถ้าฉันเป็นป้าน แต่นี่ไม่ได้อธิบายวิธีการฉายดัชนี x และ y (0 ถึง XSize หรือ YSize) ไปยังพิกัดที่ฉาย? ฉันอยากรู้ว่าคุณแปลพิกัดที่ฉายเป็นละติจูดและลองจิจูดได้อย่างไร ตัวอย่างง่ายๆ geotransform กำหนดต้นกำเนิด x / y ของมุมซ้ายบนของแรสเตอร์ในพิกัดที่ฉาย (447466.693808, 4952570.40529) ฉันจะเปลี่ยนพิกัดเหล่านั้นกลับเป็น lat / lng ได้อย่างไร (เช่น lat: 44, lng: -122)
รวย

@ ริชไม่ลิงก์นั้นไม่ได้อธิบายการฉายภาพ มันอธิบายการเปลี่ยนแปลงของพิกัดระหว่างแผนที่สองแห่งเท่านั้นไม่ใช่ระหว่างโลกกับแผนที่ การคลายจะเปลี่ยนการแปลงเลียนแบบของพิกัดเป็น (lat, lon) คุณไม่ต้องการเขียนรหัสสำหรับสิ่งนั้นถ้าคุณสามารถช่วยได้! การเพิกถอนมักจะเป็นเรื่องของการระบุว่าต้องการการฉายภาพใดและเรียกซอฟต์แวร์ที่เหมาะสมเพื่อทำงานให้คุณ (ตามที่แนะนำในการตอบกลับของ @ iant)
whuber

ลิงก์เสีย @ เมื่อฉันถูกต้องว่าการแปลงเลียนแบบ (จาก GetGeoTransform ของ GDAL) เป็นการแปลงระหว่างพิกเซลและพิกัด CRS หรือไม่ ตัวอย่างเช่นหากข้อมูลอยู่ในโปรเจค GDA ต้องแปลงคะแนนจาก WGS84 / lat / lon เป็น GDAXX โดยใช้ CoordianteTransform แล้วเปลี่ยนเป็นพิกเซลที่ใช้ GeoTransform หรือไม่ กระบวนการสองขั้นตอนนี้เป็นสิ่งที่ทำให้ฉันสะดุดมากขึ้นและฉันคิดว่าเป็นสาเหตุของปัญหา OP ด้วย ไม่ได้ช่วยให้ xarray / rasterio ดูเหมือนจะมีข้อผิดพลาดที่ขันค่า GeoTransform: github.com/pydata/xarray/issues/3185
naught101

@ ไม่มีฉันพบ URL ใหม่และอัปเดตโพสต์ของฉัน
whuber

0

คุณสามารถใช้สิ่งต่อไปนี้:

import gdal, numpy as n
def coord(file):
    padfTransform = file.GetGeoTransform()
    indices = n.indices(file.ReadAsArray().shape)
    xp = padfTransform[0] + indices[1]*padfTransform[1] + indices[1]*padfTransform[2]   
    yp = padfTransform[3] + indices[0]*padfTransform[4] + indices[0]*padfTransform[5]  
    return xp,yp
file = gdal.Open('Yourfile.tif') # A GeoTiff file
x,y = coord(file)

coord จะส่งคืนลองจิจูด (x) และละติจูด (y) ของพิกเซลทั้งหมด โปรดทราบว่าพิกัดอยู่ที่มุมซ้ายของพิกเซล


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