.HGT ফাইল থেকে উচ্চতা তোলা হচ্ছে?


20

আমি এসআরটিএম 3 ডেটা ফাইল থেকে উচ্চতার জন্য মানচিত্রে একটি নির্দিষ্ট দীর্ঘ / ল্যাট অবস্থান নির্ধারণ করতে চাই, তবে নির্দিষ্ট মানটি কীভাবে খুঁজে পাবে তার কোনও ধারণা নেই। সুতরাং আমি কীভাবে N50E14.hgt উচ্চতা 50 ° 24'58.888 "এন, 14 ° 55'11.377" E তে পেতে পারি তার কিছু উদাহরণ চাই।


1
আপনি কি সফ্টওয়্যার ব্যবহার করছেন? এসআরটিএম ডকুমেন্টেশনে.hgt ফাইল ফর্ম্যাটে কিছু নোট রয়েছে তবে আপনার উপলব্ধ সফ্টওয়্যারটির উপর একটি নির্দিষ্ট ধাপে ধাপে উত্তর নির্ভর করে।
পূর্বোক্ত

1
আমার কাছে কোনও সফ্টওয়্যার নেই, আমি সি # প্রোগ্রামার এবং আমি আমার নিজের অ্যাপ্লিকেশনটি লিখছি। আমি প্রতিটি পিক্সেল লম্বা / ল্যাট স্বাক্ষর করতে সক্ষম এবং এখন আমি প্রতিটি বিন্দুতে উচ্চতা অনুসন্ধান করতে চাই। সেরা ডেটা ফর্ম্যাটটি CSV ফাইলের মতো কিছু হওয়া উচিত। সুতরাং এক সারিতে আমি দ্রাঘিমাংশ; অক্ষাংশ; উচ্চতা পেতে পারি। আমি এসআরটিএম ডকুমেন্টেশন সন্ধান করেছি, তবে আমি এখনও কল্পনা করতে পারি না যে আমি কীভাবে ফাইলটিতে ডেটা মাইনিং সরবরাহ করতে পারি।
মার্টিনস

উত্তর:


30

উপাত্ত বিন্যাস

ডেটা রিডারকে কীভাবে প্রোগ্রাম করবেন তা আমি একটু অনুশীলন হিসাবে নেব। ডকুমেন্টেশন একবার দেখুন :

এসআরটিএম ডেটা দুটি স্তরে বিতরণ করা হয়: এসআরটিএম 1 (মার্কিন যুক্তরাষ্ট্রে এবং এর অঞ্চলগুলি এবং সংস্থাগুলির জন্য) অক্ষাংশ এবং দ্রাঘিমাংশের এক আরক-সেকেন্ডের বিরতিতে ডেটা নমুনাযুক্ত এবং এসআরটিএম 3 (বিশ্বের জন্য) তিনটি চাপ-সেকেন্ডে নমুনাযুক্ত।

"ভৌগলিক" প্রক্ষেপণে ডেটা এক ডিগ্রি অক্ষাংশ এবং দ্রাঘিমাংশ টাইলগুলিতে বিভক্ত করা হয়, যা হ'ল ম্যানিপুলেট এবং মোজাইক ছাড়া কোনও প্রক্ষেপণে অক্ষাংশ এবং দ্রাঘিমাণের সমান বিরতি সহ একটি রাস্টার উপস্থাপনা বলে।

ফাইলের নামগুলি টাইলের নীচের বাম কোণার অক্ষাংশ এবং দ্রাঘিমাংশকে বোঝায় - যেমন এন 37 ডাব্লু 105 এর নিম্ন বাম কোণটি 37 ডিগ্রি উত্তর অক্ষাংশ এবং 105 ডিগ্রি পশ্চিম দ্রাঘিমাংশে রয়েছে has আরও সঠিকভাবে বলতে গেলে, এই স্থানাঙ্কগুলি নীচের বাম পিক্সেলের জ্যামিতিক কেন্দ্রকে বোঝায়, যা এসআরটিএম 3 ডেটার ক্ষেত্রে প্রায় 90 মিটার পরিমাণে হবে।

উচ্চতা ফাইলগুলির এক্সটেনশন .HGT রয়েছে এবং দুটি বাইট সংখ্যায় স্বাক্ষরিত হয়। বাইটগুলি মটরোলা "বিগ-এন্ডিয়ান" ক্রমে সর্বাধিক উল্লেখযোগ্য বাইট রয়েছে যা সান স্পার্ক, সিলিকন গ্রাফিক্স এবং ম্যাকিনটোস কম্পিউটারগুলি পাওয়ার পিসি প্রসেসর ব্যবহার করে সরাসরি পাঠযোগ্য। ডিইসি আলফা, 2006 এর পরে নির্মিত বেশিরভাগ পিসি এবং ম্যাকিনটোস কম্পিউটারগুলি ইন্টেল ("লিটল-এন্ডিয়ান") অর্ডার ব্যবহার করে যাতে কিছু বাইট-অদলবদলের প্রয়োজন হতে পারে। উচ্চতাগুলি WGS84 / EGM96 জিওডের সাথে সম্পর্কিত মিটারে রয়েছে। ডেটা voids মান -32768 নির্ধারিত হয়।

কিভাবে এগিয়ে যেতে হবে

আপনার অবস্থানের জন্য, 50 ° 24'58.888 "এন 14 ° 55'11.377" ই, আপনি ইতিমধ্যে সঠিক টাইলটি পেয়ে গেছেন, N50E14.hgt। আসুন আপনি কোন পিক্সেলটিতে আগ্রহী তা খুঁজে বার করুন First প্রথম অক্ষাংশ, 50 ° 24'58.888 "N:

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

চাপ সেকেন্ড। তিনটি দ্বারা বিভক্ত এবং নিকটতম পূর্ণসংখ্যার সাথে বৃত্তাকারে 500 এর গ্রিড সারি দেয় long গ্রিড কলামে 1104 দ্রাঘিমাংশের জন্য দ্রাঘিমাংশের ফলাফলের জন্য একই গণনা।

কুইকস্টার্ট ডকুমেন্টেশনে ফাইলটিতে সারি এবং কলামগুলি কীভাবে সংগঠিত করা হয় সে সম্পর্কে তথ্যের অভাব রয়েছে, তবে সম্পূর্ণ ডকুমেন্টেশনে এটি বর্ণিত হয়েছে যে

ডেটা সারি প্রধান ক্রমে সংরক্ষণ করা হয় (সারি 1 এর সমস্ত ডেটা, সারি 2 এর সমস্ত ডেটা ইত্যাদি)

ফাইলটির প্রথম সারিটি খুব সম্ভবত উত্তরতমতম এক, অর্থাত্ যদি আমরা নীচের প্রান্ত থেকে 500 সারিটিতে আগ্রহী হয় তবে আমাদের অবশ্যই সারিটি দেখতে হবে

1201 - 500 = 701

শুরু থেকে ফাইল যদি । আমাদের গ্রিড সেলটি নম্বর

(1201 * 700) + 1104 = 841804

ফাইলটির শুরু থেকে (অর্থাত্ 700 টি সারি বাদ দিন, এবং 701 ম একের মধ্যে 1104 নমুনা নিন)। নমুনা প্রতি দুটি বাইট মানে আমাদের ফাইলের প্রথম 1683606 বাইট বাদ দিতে হবে এবং তারপরে আমাদের গ্রিড সেলটি পেতে দুটি বাইট পড়তে হবে। ডেটা বিগ-এন্ডিয়ান, যার অর্থ আপনার যেমন দুটি বাইট যেমন ইন্টেল প্ল্যাটফর্মগুলিতে অদলবদল করা দরকার।

নমুনা প্রোগ্রাম

একটি সরল পাইথন প্রোগ্রাম ডান ডেটা পুনরুদ্ধার করতে (দেখুন ভালো দেখাবে ডক্স struct হয় মডিউল ব্যবহারের জন্য):

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 ফাইলগুলি পড়তে পারে। কিন্তু এটি বিরক্তিকর।


আমাকে এটি মারুন, এবং আরও বিশদ সহ বুট করুন!
পূর্বোক্ত

সুন্দর বুঝিয়েছি, তোমাকে ভালোবাসি। আপনার সাহায্যের জন্য ধন্যবাদ. তোমরা সবাই।
মার্টিনস

1
+1 হ্যাঁ, সারিগুলি উত্তর থেকে দক্ষিণে অর্ডার করা হয়েছে। আপনি যে কোনও একটি ফাইলকে ম্যাপ করার সাথে সাথে এটি স্পষ্ট হয়ে যায়। এছাড়াও, স্থানটির চারপাশে চারটি কেন্দ্র কেন্দ্রের মধ্যে বিলাইনার ইন্টারপোলেশনের মাধ্যমে উচ্চতা অর্জনের কথা বিবেচনা করুন।
whuber

এই বিস্তৃত তথ্যের জন্য ধন্যবাদ! আমার একটি প্রশ্ন রয়েছে: যখন আমরা 50 ° 24'58.888 এর জন্য উচ্চতার ডেটা খুঁজছি, সারিগুলি উত্তর থেকে দক্ষিণে অর্ডার করার সময় আপনি নিম্ন প্রান্ত থেকে 500 নম্বর সারিটি কেন বিয়োগ করবেন? ধন্যবাদ!
গেয়র্গ

যদি আমার ভুল না হয় তবে আমি বিশ্বাস করি যে (জে -১) ঠিক জে হবে। মান জে 0 থেকে 1200
অবধি

6

জিডিএল এসআরটিএমএইচজিটি ড্রাইভারের সাথে এই রাস্টার ফর্ম্যাটগুলি পড়তে / লিখতে পারে । এর অর্থ আপনি কিউজিআইএস, আর্কজিআইএসের সাহায্যে রাস্টারটি দেখতে পারেন বা একটি বিন্দু থেকে মানগুলি পেতে gdallocationinfo এর মতো জিডিএল ইউটিলিটিগুলি ব্যবহার করতে পারেন, যেমন:

ডিএমএসকে ডিডিতে রূপান্তর করুন:

  • ল্যাট: 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

আপনি কিউজিআইএস ব্যবহার করলে পাইথন প্লাগইন "পয়েন্ট স্যাম্পলিং সরঞ্জাম" ইনস্টল করা আছে কিনা তা পরীক্ষা করে দেখুন। আপনি এটি -> বর্ধিতকরণ (পাইথন) -> বিশ্লেষণে পাবেন।

প্রয়োজনীয় পজিশনের আপনার পয়েন্ট লেয়ারটি সিলেক্ট করুন, তারপরে পিএসটি শুরু করুন, এইচজিটি (বা যাইহোক রাস্টার / পলিজোন ফাইল যাই হোক) চয়ন করুন এবং আউটপুট জন্য একটি নতুন পয়েন্ট শেপ চয়ন করুন choose

এখানেই শেষ :-)

  Chris

0

ক্রিসের উত্তরটি নির্দেশ করে যে এটি কিউজিআইএস-এর কোনও স্তর থেকে নমুনা পয়েন্টের জন্য সোজা।

তবে, যেহেতু আমার মন্তব্যে আপনার উত্তরটি স্পষ্ট করে যে আপনি .hgtফাইলগুলি থেকে উচ্চতা মানগুলি পড়তে আপনার নিজের প্রোগ্রাম লিখছেন , তাই এসআরটিএম ডক্সে কুইকস্টার্ট পিডিএফটিতে আরও একবার নজর দিন । এটি ব্যাখ্যা করে যে কীভাবে উন্নয়নের ডেটা সংরক্ষণ করা হয়। সংক্ষেপ:

  • এসআরটিএম 3 ফাইলগুলিতে বিগ-এন্ডিয়ান পূর্ণসংখ্যার মানগুলির ক্রম থাকে।
  • প্রতিটি পূর্ণসংখ্যার মান "WGS84 / EGM96 জিওডের সাথে সম্পর্কিত মিটারগুলিতে" একটি উচ্চতা উপস্থাপন করে, এর মান বাদে -32768, যা কোনও ডেটা পিক্সেল নির্দেশ করে।
  • 1201 নমুনার 1201 লাইন রয়েছে, সুতরাং সম্পূর্ণরূপে 1442401 পূর্ণসংখ্যার মান হওয়া উচিত।

আপনি বলছেন যে আপনি লম্ব / ল্যাট স্থানাঙ্ক এবং পিক্সেলের মধ্যে রূপান্তর করতে পারেন, সুতরাং উচ্চতা পাওয়া ফাইলটিতে উপযুক্ত অফসেট থেকে পূর্ণসংখ্যার মান পড়ার বিষয়। পিক্সেল স্থানাঙ্ক xএবং yদৃশ্যের উপরের বাম কোণে আপেক্ষিক, এটি মূলত offset = (y * 1201) + x। পিক্সেল 0,0ফাইলের প্রথম পূর্ণসংখ্যা এবং পিক্সেলটি ফাইলের 1200,1200সর্বশেষ পূর্ণসংখ্যা হয়।


1
এটি সঠিক, তবে স্থানাঙ্কগুলি সেল কেন্দ্রগুলির সাথে যুক্ত রয়েছে এমন সহ ভেলের উত্তর দ্বারা সরবরাহ করা কয়েকটি গুরুত্বপূর্ণ বিবরণ অনুপস্থিত । সুতরাং, উদাহরণস্বরূপ, N50E014.hgt এর উপরের বাম কোণটি দীর্ঘস্থায়ী 13.99958 ই, অক্ষাংশে 51.00042 এন অবস্থিত
শুকনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.