.HGT फ़ाइल से ऊंचाई निकालना?


20

मैं SRTM3 डेटा फ़ाइलों से ऊँचाई के लिए मानचित्र पर एक विशिष्ट लंबी / अव्यक्त स्थिति निर्दिष्ट करना चाहता हूं, लेकिन विशिष्ट मूल्य कैसे प्राप्त करें, इसका कोई पता नहीं है। इसलिए मैं N50E14.hgt ऊंचाई 50 ° 24'58.888 "N, 14 ° 55'11.377" E पर कैसे प्राप्त कर सकता हूं, इसके कुछ उदाहरण चाहते हैं।


1
आप कौन से सॉफ़्टवेयर का उपयोग कर रहे हैं? SRTM प्रलेखन.hgt में फ़ाइल प्रारूप पर कुछ नोट्स हैं , लेकिन एक विशिष्ट चरण-दर-चरण उत्तर आपके द्वारा उपलब्ध सॉफ़्टवेयर पर निर्भर करता है।
१०

1
मेरे पास कोई सॉफ्टवेयर नहीं है, मैं c # प्रोग्रामर हूं और मैं अपना खुद का एप्लिकेशन लिख रहा हूं। मैं हर पिक्सेल के लिए लंबे समय तक / लेट असाइन करने में सक्षम हूं और अब मैं प्रत्येक बिंदु पर ऊंचाई खोजना चाहता हूं। सर्वश्रेष्ठ डेटा प्रारूप सीएसवी फ़ाइल जैसा कुछ होना चाहिए। तो एक पंक्ति में मुझे देशांतर मिल सकता है, अक्षांश; ऊंचाई। मैंने SRTM प्रलेखन खोजा है, लेकिन मैं अभी भी कल्पना नहीं कर सकता कि मैं फ़ाइल पर डेटा खनन कैसे प्रदान कर सकता हूं।
मार्टिन डीएस

जवाबों:


30

डेटा स्वरूप

मैं इसे एक छोटे से अभ्यास के रूप में ले जाऊंगा कि डेटा रीडर कैसे प्रोग्राम किया जाए। प्रलेखन पर एक नज़र है :

SRTM डेटा को दो स्तरों में वितरित किया जाता है: SRTM1 (अमेरिका और इसके प्रदेशों और संपत्ति के लिए) अक्षांश और देशांतर में एक चाप-दूसरे अंतराल पर डेटा के साथ, और SRTM3 (दुनिया के लिए) तीन चाप-सेकंड में नमूना लिया गया।

"भौगोलिक" प्रक्षेपण में डेटा को एक डिग्री अक्षांश और देशांतर टाइल से एक में विभाजित किया जाता है, जिसे अक्षांश और देशांतर के बराबर अंतराल के साथ एक रेखापुंज प्रस्तुति कहना है, लेकिन सभी में हेरफेर और मोज़ेक के लिए आसान नहीं है।

फ़ाइल के नाम टाइल के निचले बाएँ कोने के अक्षांश और देशांतर को संदर्भित करते हैं - उदाहरण के लिए N37W105 का 37 डिग्री उत्तरी अक्षांश और 105 डिग्री पश्चिम देशांतर पर इसका निचला बाएँ कोने में है। अधिक सटीक होने के लिए, ये निर्देशांक निचले बाएँ पिक्सेल के ज्यामितीय केंद्र को संदर्भित करते हैं, जो SRTM3 डेटा के मामले में लगभग 90 मीटर की दूरी पर होगा।

ऊंचाई फ़ाइलों में एक्सटेंशन .HGT होता है और दो बाइट पूर्णांक पर हस्ताक्षर किए जाते हैं। बाइट्स मोटोरोला "बिग-एंडियन" क्रम में सबसे महत्वपूर्ण बाइट के साथ हैं, सीधे पावर पीसी प्रोसेसर का उपयोग करके सन स्पार्क, सिलिकॉन ग्राफिक्स और मैकिंटोश कंप्यूटर जैसे सिस्टम द्वारा सीधे पढ़ा जा सकता है। डीईसी अल्फा, अधिकांश पीसी और मैकिन्टोश कंप्यूटर 2006 के बाद निर्मित इंटेल ("लिटिल-एंडियन") आदेश का उपयोग करते हैं, इसलिए कुछ बाइट-स्वैपिंग आवश्यक हो सकती है। मीटर WGS84 / EGM96 जियोइड के संदर्भ में मीटर में हैं। डेटा voids को -32768 मान दिया जाता है।

कैसे आगे बढ़ा जाए

आपकी स्थिति के लिए, 50 ° 24'58.888 "N 14 ° 55'11.377" E, आपको पहले से ही सही टाइल, N50E14.hgt मिला। आइए जानें कि आप किस पिक्सेल में रुचि रखते हैं। पहला अक्षांश, 50 ° 24'58.888 "N:

24'58.888" = (24 * 60)" + 58.888" = 1498.888"

चाप सेकंड। तीन से विभाजित और निकटतम पूर्णांक तक गोल 500 की ग्रिड पंक्ति देता है। ग्रिड कॉलम 1104 में देशांतर परिणाम के लिए एक ही गणना।

क्विकस्टार्ट प्रलेखन में फ़ाइल में पंक्तियों और स्तंभों को कैसे व्यवस्थित किया जाता है, इसके बारे में जानकारी का अभाव है, लेकिन पूर्ण प्रलेखन में यह कहा गया है कि

डेटा पंक्ति प्रमुख क्रम में संग्रहीत किया जाता है (पंक्ति 1 के लिए सभी डेटा, इसके बाद पंक्ति 2 के लिए सभी डेटा, आदि)

फ़ाइल में पहली पंक्ति सबसे उत्तरी एक होने की संभावना है, अर्थात यदि हम निचले किनारे से पंक्ति 500 ​​में रुचि रखते हैं , तो हमें वास्तव में पंक्ति को देखना होगा

1201 - 500 = 701

शुरू से अगर फ़ाइल । हमारा ग्रिड सेल नंबर है

(1201 * 700) + 1104 = 841804

फ़ाइल की शुरुआत से (यानी 700 पंक्तियों को छोड़ें, और 701 में एक नमूना 1104 लें)। प्रति नमूना दो बाइट्स का मतलब है कि हमें फ़ाइल में पहले 1683606 बाइट्स को छोड़ना होगा और फिर अपनी ग्रिड सेल प्राप्त करने के लिए दो बाइट्स पढ़ना होगा। डेटा बड़ा-एंडियन है, जिसका अर्थ है कि आपको उदाहरण के लिए इंटेल प्लेटफॉर्म पर दो बाइट्स स्वैप करना होगा।

नमूना कार्यक्रम

सही डेटा पुनर्प्राप्त करने के लिए एक सरलीकृत पायथन कार्यक्रम इस तरह दिखाई देगा ( संरचना मॉड्यूल के उपयोग के लिए डॉक्स देखें ):

import struct

def get_sample(filename, n, e):
    i = 1201 - int(round(n / 3, 0))
    j = int(round(e / 3, 0))
    with open(filename, "rb") as f:
        f.seek(((i - 1) * 1201 + (j - 1)) * 2)  # go to the right spot,
        buf = f.read(2)  # read two bytes and convert them:
        val = struct.unpack('>h', buf)  # ">h" is a signed two byte integer
        if not val == -32768:  # the not-a-valid-sample value
            return val
        else:
            return None

if __name__ == "__main__":
    n = 24 * 60 + 58.888
    e = 55 * 60 + 11.377
    tile = "N50E14.hgt"  # Or some magic to figure it out from position
    print get_sample(tile, n, e)

ध्यान दें कि कुशल डेटा पुनर्प्राप्ति को थोड़ा और अधिक परिष्कृत देखना होगा (जैसे प्रत्येक नमूने के लिए फ़ाइल नहीं खोलना)।

वैकल्पिक

आप ऐसे प्रोग्राम का भी उपयोग कर सकते हैं जो .hgt फ़ाइलों को बॉक्स से बाहर पढ़ सकते हैं। लेकिन वह उबाऊ है।


मुझे इसे मारो, और बूट करने के लिए और अधिक विवरण के साथ!
21

अच्छा समझा, तुमसे प्यार करता हूँ। आपकी सहायता के लिए धन्यवाद। आप सभी लोग।
मार्टिन डेस

1
+1 हां, पंक्तियों को उत्तर से दक्षिण की ओर क्रमबद्ध किया गया है। जैसे ही आप किसी एक फाइल को मैप करते हैं, यह स्पष्ट है। इसके अलावा, स्थान के आसपास के चार सेल केंद्रों के बीच बिलिनियर प्रक्षेप के माध्यम से ऊंचाइयों को प्राप्त करने पर विचार करें।
whuber

इस व्यापक जानकारी के लिए धन्यवाद! मेरा एक सवाल है: जब हम 50 ° 24'58.888 के लिए ऊंचाई डेटा की तलाश कर रहे हैं, तो पंक्तियों को उत्तर से दक्षिण की ओर क्रमबद्ध करने पर आप पंक्ति संख्या 500 को निचले किनारे से क्यों घटाते हैं? धन्यवाद!
जॉर्ज

अगर मैं गलत नहीं हूं, तो मेरा मानना ​​है कि (j-1) सिर्फ j होगा। मान j 0 से लेकर 1200 तक होता है, इसलिए
1.38

6

GDAL SRTMHGT ड्राइवर के साथ इन रेखापुंज स्वरूपों को पढ़ / लिख सकता है । इसका मतलब है कि आप QGIS, ArcGIS के साथ रेखापुंज देख सकते हैं, या एक बिंदु से मान प्राप्त करने के लिए gdallocationinfo जैसी GDAL उपयोगिताओं का उपयोग कर सकते हैं, जैसे:

DMS को DD में बदलें:

  • लट: 50 ° 24'58.888 "एन = 50 + (24/60) + (58.888 / 3600) = 50.4163577778
  • लंबा: 14 ° 55'11.377 "ई = 14 + (55/60) + (11.377 / 3600) = 14.9198269444

फिर एक शेल से, उपयोग करें gdallocationinfo file.hgt -wgs84 long lat:

$ gdallocationinfo N50E14.hgt -wgs84 14.9198269444 50.4163577778
Report:
  Location: (1104P,700L)
  Band 1:
    Value: 216

ऊँचाई 216 मीटर है।


1
दक्षिण या पश्चिम के स्थानों के बारे में कैसे?
मुहम्मते अली आसन

2

यदि आप QGIS का उपयोग करते हैं, तो जांचें कि क्या अजगर प्लगइन "प्वाइंट सैम्पलिंग टूल" स्थापित है। आपको यह मिलेगा -> एन्हांसमेंट्स (पायथन) -> विश्लेषण।

आवश्यक पदों के अपने बिंदु परत का चयन करें, फिर पीएसटी शुरू करें, एचजीटी (या जो भी रेखापुंज / बहुभुज फ़ाइल) चुनें और आउटपुट के लिए एक नया बिंदु आकार चुनें।

बस इतना ही :-)

  Chris

0

क्रिस का जवाब इंगित करता है कि यह QGIS में एक परत से नमूना बिंदुओं के लिए सीधा है।

हालाँकि, जब से आपकी टिप्पणी का उत्तर स्पष्ट होता है, आप .hgtफ़ाइलों से उन्नयन मूल्यों को पढ़ने के लिए अपना कार्यक्रम लिख रहे हैं , SRTM डॉक्स में क्विकस्टार्ट पीडीएफ पर एक और नज़र डालें । यह बताता है कि उन्नयन डेटा कैसे संग्रहीत किया जाता है। संक्षेप में:

  • SRTM3 फ़ाइलों में बड़े-एंडियन पूर्णांक मानों का एक क्रम होता है।
  • प्रत्येक पूर्णांक मान "WGS84 / EGM96 जियोइड के लिए संदर्भित मीटर में" एक ऊंचाई का प्रतिनिधित्व करता है, के मूल्यों को छोड़कर -32768, जो कि बिना डेटा पिक्सल का संकेत देता है।
  • 1201 नमूनों की 1201 लाइनें हैं, इसलिए पूरी तरह से 1442401 पूर्णांक मान होना चाहिए।

आप कहते हैं कि आप lon / lat निर्देशांक और पिक्सेल के बीच परिवर्तित कर सकते हैं, इसलिए ऊँचाई प्राप्त करना फ़ाइल में उपयुक्त ऑफसेट से पूर्णांक मान को पढ़ने का मामला है। पिक्सेल निर्देशांक xऔर yदृश्य के ऊपरी बाएँ कोने के सापेक्ष दिया, यह मूल रूप से है offset = (y * 1201) + x। पिक्सेल 0,0फ़ाइल में पहला पूर्णांक है और पिक्सेल फ़ाइल 1200,1200में अंतिम पूर्णांक है।


1
यह सही है, लेकिन bhell के उत्तर द्वारा प्रदान किए गए कुछ महत्वपूर्ण विवरणों को याद कर रहा है, जिसमें निर्देशांक सेल केंद्रों से जुड़े हैं । इस प्रकार, उदाहरण के लिए, N50E014.hgt के ऊपरी बाएँ कोने वास्तव में देशांतर १३.९९९५८ ई, स्थित है अक्षांश ५१.०००४२ एन
whuber
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.