2008-12-10 12 views
22

मुझे यकीन है कि यदि आप बाइनरी फाइलों के बारे में कुछ जानते हैं तो यह वास्तव में सरल है, लेकिन मैं उस स्कोर पर नौसिखिया हूं।नासा को कैसे पढ़ा जाए। एचजीटी बाइनरी फाइलें

मैं NASA .hgt फ़ाइलों से डेटा कैसे निकालूं?

SRTM डेटा फ़ाइलों "N34W119.hgt" की तरह नाम है: यहाँ www2.jpl.nasa.gov/srtm/faq.html से वर्णन है। अक्षरों और संख्याओं का संदर्भ क्या है, और ".hgt" प्रारूप क्या है?

प्रत्येक डेटा फ़ाइल में पृथ्वी की सतह के एक-डिग्री-रेखांश ब्लॉक द्वारा एक-डिग्री अक्षांश को शामिल किया जाता है। पहले सात वर्ण ब्लॉक के दक्षिण-पश्चिम कोने को इंगित करते हैं, जिसमें एन, एस, ई, और डब्ल्यू उत्तर, दक्षिण, पूर्व, और पश्चिम का जिक्र करते हैं। इस प्रकार, "N34W119.hgt" फ़ाइल अक्षांश 34 से 35 उत्तर और अक्षांश 118-119 पश्चिम (इस फ़ाइल में डाउनटाउन लॉस एंजिल्स, कैलिफ़ोर्निया) शामिल है। फ़ाइल नाम एक्सटेंशन ".hgt" बस "ऊंचाई" शब्द का अर्थ है, जिसका अर्थ है ऊंचाई। यह एक प्रारूप प्रकार नहीं है। ये फ़ाइलें "कच्चे" प्रारूप में नहीं हैं (कोई शीर्षलेख नहीं है और संपीड़ित नहीं है), 16-बिट हस्ताक्षरित पूर्णांक, "भौगोलिक" (अक्षांश और देशांतर सरणी) प्रोजेक्शन में समुद्र स्तर से ऊपर मीटर में मापा गया ऊंचाई, डेटा वॉयड्स के साथ संकेतित द्वारा -32768। इंटरनेशनल 3-आर्क-सेकेंड फाइलों में 2,014,802 बाइट्स (= 1201 x 1201 x 2) की कुल फाइलसाइज के साथ डेटा के 1201 कॉलम और 1201 पंक्तियां हैं, । यूनाइटेड राज्य 1-आर्क-सेकंड फ़ाइलों में 3601 कॉलम और 3601 पंक्तियां हैं, कुल 25834,402 बाइट्स (= 3601 x 3601 x 2) के फाइलसाइज के साथ। अधिक जानकारी के लिए http://edcftp.cr.usgs.gov/pub/data/srtm/Readme.html पर पाठ फ़ाइल "SRTM_Topo.txt" पढ़ें

किसी भी मदद के लिए धन्यवाद! मैं इस डेटा का उपयोग एक पायथन लिपि में करने जा रहा हूं, इसलिए यदि आप किसी अन्य भाषा के लिए किसी भी भाषा-विशिष्ट चाल का उपयोग नहीं कर पा रहे हैं, तो यह शानदार होगा।

+2

सवाल में लिंक टूटा हुआ है, लेकिन मुझे लगता है कि यह वही फ़ाइल है: http://dds.cr.usgs.gov/srtm/version1/Documentation/SRTM_Topo.txt – Hubro

उत्तर

6

के बाद से रिकॉर्ड ठीक लंबाई (16-बिट पूर्णांक पर हस्ताक्षर किए) और आप ग्रिड आकार (1201 x 1201 या 3601x3601) पता है, पायथन के struct मॉड्यूल आदर्श रूप से अनुकूल (अपरीक्षित कोड) लगता है:

from struct import unpack,calcsize 

# 'row_length' being 1201 or 3601 and 'row' being the raw data for one row 
def read_row(row, row_length): 
    format = 'h' # h stands for signed short 

    for i in range(0, row_length): 
     offset = i * calcsize(format) 
     (height,) = unpack(format, row[offset : offset+calcsize(format)) 
     # do something with the height 

बताते यह अधिक सामान्य शब्दों में, मूल रूप से आप एक बार में 2 बाइट्स में फ़ाइल को पढ़ना चाहते हैं, 16-बिट हस्ताक्षरित पूर्णांक के रूप में पढ़ने वाले बाइट को पार्स करें और इसे संसाधित करें। चूंकि आप पहले से ही ग्रिड आकार को जानते हैं, आप इसे पंक्ति में या किसी अन्य तरीके से पंक्ति में पढ़ सकते हैं जो आपके आवेदन के लिए सुविधाजनक है। इसका मतलब यह भी है कि आप डेटा फ़ाइल के अंदर यादृच्छिक रूप से विशिष्ट निर्देशांक की तलाश कर सकते हैं।

+3

आपको वास्तव में '! h' प्रारूप का उपयोग करने की आवश्यकता है। एसआरटीएम चश्मा में वर्णन के रूप में बड़े एंडियन – skrat

0

नासा एसआरटीएम डेटा फाइल बिग-एंडियन प्रारूप में हैं, इसलिए आप जिस प्लेटफॉर्म पर डेटा पढ़ रहे हैं उसके आधार पर, आपको बिग-एंडियन से लिटिल-एंडियन में रूपांतरण करना पड़ सकता है।

ऐसा करने के तरीके पर कई स्रोत हैं, मुझे पाइथन के साथ कोई अनुभव नहीं है, इसलिए मैं आपकी मदद नहीं कर सकता।

लेकिन यदि आप इसे भूल जाते हैं, तो आपके मूल्य सभी गड़बड़ होने जा रहे हैं।

0

यदि आपके पास फ़ोटोशॉप है तो आप इन फ़ाइलों को पढ़ने और उन्हें और अधिक उपयोगी बनाने के लिए कच्चे आयात के साथ खेलने में सक्षम हो सकते हैं। मुझे अतीत में इस तरह की चीज करने में कुछ सफलता मिली है।

4

यदि आप लाखों कॉलों से struct.unpack पर प्राप्त करने की तुलना में थोड़ा अधिक गति चाहते हैं, तो array.array पर एक नज़र डालें। "Struct और के लिए लूप" कार्यान्वयन मेरी बेशक धीमी गति से लैपटॉप पर कई सेकंड लेता है, निम्नलिखित तात्कालिक के पास है:

from array import array 

f = open(filename, 'rb') 
format = 'h' 
row_length = 1201 
data = array(format) 
data.fromfile(f, row_length*row_length) 
data.byteswap() 
f.close() 
6

एक numpy उदाहरण का परीक्षण किया:

import os 
import math 
import numpy 

fn = 'DMV/N51E000.hgt' 

siz = os.path.getsize(fn) 
dim = int(math.sqrt(siz/2)) 

assert dim*dim*2 == siz, 'Invalid file size' 

data = numpy.fromfile(fn, numpy.dtype('>i2'), dim*dim).reshape((dim, dim)) 
संबंधित मुद्दे