मैं affine निर्देशांक को lat / lng में कैसे परिवर्तित करूं?


14

मैं जीआईएस के लिए बेहद नया हूं।

मैं gdalएक लैंडयूज़ / लैंडओवर मैप में पढ़ने के लिए उपयोग कर रहा हूं और मुझे कुछ लैंड कवर प्रकारों के lat / lng को अलग डेटासेट में इंडेक्स करने के लिए चुनना होगा जो केवल lat / lng में व्यक्त किया गया है। Unfortuantely, मैं एक्स के रूप और 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) और आपको यह जानना होगा कि प्रोजेक्शन लंबे समय तक / लट निर्देशांकों को "अनप्रोजेक्ट" करने के लिए क्या है।

@ धन्यवाद, तो मुझे पता है कि मैं एक के माध्यम से प्रक्षेपण प्राप्त कर सकता हूं dataset.GetProjectionRef()और पता लगा सकता हूं कि मैं "यूटीएम जोन 10" का उपयोग कर रहा हूं, लेकिन फिर क्या? मैं "unproject" जैसे तरीकों के लिए चारों ओर घूम रहा हूं, लेकिन मैं अशक्त हो रहा हूं।
अमीर

दशमलव डिग्री में डेटा अप्रमाणित (उद्धरण में) शब्द के उपयोग के लिए खेद नहीं है, लेकिन यदि आप किसी दिए गए प्रक्षेपण से दशमलव डेटा को वापस प्राप्त करना चाहते हैं, तो आपको (उद्धरण) "प्रोजेक्ट" नोट करना होगा यह एक भौगोलिक समन्वय प्रणाली, उर्फ ​​दशमलव डिग्री डेटा के लिए वापस आ गया है।

2
: यह (नए) धागा एक स्पष्ट उदाहरण और एक अन्य समाधान प्रदान करता है gis.stackexchange.com/questions/8430/...
whuber

जवाबों:


10

gdal_translate आपके डेटा को किसी भी अन्य के लिए जो भी प्रक्षेपण है, उसमें से किसी अन्य (इस मामले में आपको EPSG: 4326) का उपयोग करके पुन: अस्वीकार कर देगा:

gdal_translate -a_srs epsg:4326 srcfile new_file 

या आप बिंदुओं को परिवर्तित करने के लिए gdaltrasform का उपयोग कर सकते हैं (और मुझे यकीन है कि आप पायथन (?) से भी एक्सेस कर सकते हैं)


(+1) मुझे नहीं पता कि यह क्यों अस्वीकृत किया गया था, इयान, क्योंकि यह मुझे कुछ प्रकार के ऑपरेशन की तरह दिखता है, जैसे कि यह आवश्यक है कि चक्कर परिवर्तन लागू होने के बाद इसकी आवश्यकता होगी।
whuber

gdal_translate आपके पास इस तरह से काम नहीं करेगा (या इसके बजाय यह केवल EPSG: 4326 डेटा को निर्दिष्ट करेगा), आपको डेटा को कुछ इस तरह से ताना चाहिए: gdalwarp -s_srs EPSG: 321010 -t_srs EPSG: 4326 src dest डेटा में मेटाडेटा पहले से ही है, आप -s_srs पैरामीटर को खोद सकते हैं।
19:00 पर MerseyViking

शायद यह मैं के बाद कर रहा हूँ। क्या "एप्सग: 4326" ग्लोबल लेट / लैंग का रूपांतरण है? मुझे लगता है कि मैं कुछ कक्षाएं देखता हूं जहां मैं एक प्रक्षेपण प्रदान कर सकता हूं, मैं सोच रहा था "डब्ल्यूजीएस: 84", लेकिन मुझे अंतर नहीं पता है।
रिच

1
@ अपने प्रश्न में "समन्वय-प्रणाली" टैग पर क्लिक करें , परिणाम पृष्ठ को वोटों के अनुसार क्रमबद्ध करें, और पढ़ना शुरू करें। आपके कई सवालों के जवाब कुछ ही मिनटों में मिल जाएंगे।
whuber

7

जियोट्रांसफॉर्म https://gdal.org/user/raster_data_model.html पर प्रलेखित है । विचार यह है कि आप (x, y) सीधे डेटासेट से समन्वय करते हैं, प्राप्त करने के लिए एक रैखिक परिवर्तन लागू करते हैं (यू, वी)

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

(आप इसे एक रेखीय परिवर्तन की परिभाषा के रूप में ले सकते हैं ), फिर मूल को geotransform [0] को u और जियोट्रांसफ़ॉर्म [3] में जोड़कर v को शिफ़्ट करें। इससे (x, y) का "affine रूपांतरण" होता है। यह वास्तव में घुमाने के लिए, पैमाने बदलने के लिए, शायद कुछ तिरछा त्रुटियों के लिए थोड़ा सही है, और एक ज्ञात समन्वय प्रणाली से मिलान करने के लिए डेटा-विशिष्ट निर्देशांक (x, y) को फिर से बनाना है। परिणाम अनुमानित निर्देशांक का उत्पादन करने के लिए माना जाता है इसका सीधा सा मतलब है कि एक गणितीय प्रक्रिया है (देशांतर, अक्षांश) और उन्हें ज्ञात निर्देशांक में बदलना: इसे "प्रक्षेपण" कहा जाता है। "अनप्रोजेक्टिंग" रिवर्स कर रहा है; इसलिए, यदि आप जानते हैं कि किस प्रक्षेपण की आवश्यकता है, तो आप इसे लागू करते हैं कि परिवृत में परिवर्तित किया गया (x, y) निर्देशांक अक्षांश और देशांतर प्राप्त करने के लिए।

वैसे, जियोट्रांसफॉर्म सरणी में 1, 2, 4, और 5 प्रविष्टियों द्वारा स्थिरांक, बी, सी, डी के मान दिए गए हैं।


1
मैंने आपके द्वारा दिए गए लिंक के जियोट्रांसफॉर्म सेक्शन को पढ़ा, लेकिन मुझे नहीं लगता कि यह मेरे बाद है। खेद है कि अगर मैं आज्ञाकारी हो रहा हूं, लेकिन क्या यह एक्स और वाई सूचकांकों (0 से XSize या YSize) को अनुमानित निर्देशांक बनाने के लिए नहीं बताता है? मुझे उत्सुकता है कि आप अनुमानित निर्देशांक को अक्षांश और देशांतर में कैसे अनुवाद करते हैं। एक सरल उदाहरण के रूप में, जियोट्रांसफॉर्म अनुमानित निर्देशांक में रेखापुंज के ऊपरी बाएं हाथ के कोने के x / y मूल को परिभाषित करता है (447466.693808, 4952570.40529)। मैं उन निर्देशांकों को वापस अक्षांश / lng में कैसे बदलूंगा (lat: 44, lng: -122 की तरह कुछ)।
रिच

@Rich नहीं, वह लिंक एक प्रक्षेपण का वर्णन नहीं करता है। यह केवल दो मानचित्रों के बीच समन्वय के परिवर्तन का वर्णन करता है, न कि दुनिया और मानचित्र के बीच। Unprojection affine (अक्षां, देशांतर) में निर्देशांक के परिणत हो जाता है। आप इसके लिए कोड नहीं लिखना चाहते हैं यदि आप इसे मदद कर सकते हैं! अप्रतिबंध लगभग हमेशा यह पहचानने का विषय है कि प्रोजेक्शन की क्या आवश्यकता है और आपके लिए काम करने के लिए सही सॉफ़्टवेयर को कॉल करना (जैसा कि @ iant के उत्तर में सुझाव दिया गया है)।
whuber

लिंक टूट गया है। @ क्या मैं सही हूं कि एफलाइन ट्रांसफ़ॉर्म (जीडीएएल के गेटगोट्रांसफॉर्म से) पिक्सल और सीआरएस निर्देशांक के बीच का रूपांतरण है? उदाहरण के लिए, यदि डेटा GDA प्रोजेक्शन में है, तो पॉइंट्स को WGS84 / lat / lon से GDAXX में बदलना चाहिए जैसे कि CoordianteTransform का उपयोग कर, और फिर अफ़ीम GeoTransform का उपयोग करके पिक्सल में? यह दो-चरणीय प्रक्रिया कुछ ऐसी है जो मुझे काफी परेशान कर रही है, और मुझे संदेह है कि ओपी परेशानी भी पैदा कर रहा है। मदद नहीं की है कि xarray / rasterio एक बग प्रतीत होता है जो GeoTransform मानों पर शिकंजा कसता है: github.com/pydata/xarray/issues/3185
naught101

@naught मैंने नया 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)

समन्वय सभी पिक्सेल के देशांतर (x) और अक्षांश (y) को लौटाएगा। ध्यान रखें कि निर्देशांक एक पिक्सेल के बाएं कोने के होते हैं


क्या यह इंडिक्स नहीं होना चाहिए [1] * पैडफट्रांसफॉर्म [1] + इंडेक्स [0] * पैडफट्रांसफॉर्म [2] और इसके विपरीत yp?
CMCDragonkai
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.