জিডালের পাইথন বাইন্ডিং ব্যবহার করে কোনও রাস্টার ফাইল থেকে কর্নার স্থানাঙ্কগুলি (ডিগ্রি ল্যাট / লম্বায়) পাওয়ার কোনও উপায় আছে কি?
অনলাইনে কয়েকটি অনুসন্ধান আমাকে নিশ্চিত করেছে যে সেখানে নেই, তাই আমি জিডালিনফো আউটপুটকে বিশ্লেষণ করে একটি কাজ গড়ে তুলেছি, এটি কিছুটা মৌলিক তবে আমি ভেবেছিলাম যে এটি অজগর নিয়ে কম আরামদায়ক লোকদের জন্য কিছুটা সময় সাশ্রয় করতে পারে। এটি কেবল তখনই কাজ করে যদি জিডালিনফোতে কোণার স্থানাঙ্কের সাথে ভৌগলিক স্থানাঙ্ক থাকে, যা আমি বিশ্বাস করি না যে সবসময় এটি হয়।
এখানে আমার কর্মসংস্থান, কারও কি আরও ভাল সমাধান আছে?
একটি উপযুক্ত রাস্টার উপর gdalinfo ফলাফল আউটপুট মাধ্যমে এই মিডওয়ের মতো কিছু:
Corner Coordinates:
Upper Left ( -18449.521, -256913.934) (137d 7'21.93"E, 4d20'3.46"S)
Lower Left ( -18449.521, -345509.683) (137d 7'19.32"E, 5d49'44.25"S)
Upper Right ( 18407.241, -256913.934) (137d44'46.82"E, 4d20'3.46"S)
Lower Right ( 18407.241, -345509.683) (137d44'49.42"E, 5d49'44.25"S)
Center ( -21.140, -301211.809) (137d26'4.37"E, 5d 4'53.85"S)
এই কোডটি জিডালিনফোর মতো দেখতে ফাইলগুলিতে কাজ করবে। আমি বিশ্বাস করি যে কখনও কখনও স্থানাঙ্কগুলি ডিগ্রি, মিনিট এবং সেকেন্ডের পরিবর্তে ডিগ্রি এবং দশমিক দশকে থাকবে; এই পরিস্থিতির জন্য কোড সামঞ্জস্য করার জন্য এটি তুচ্ছ হওয়া উচিত।
import numpy as np
import subprocess
def GetCornerCoordinates(FileName):
GdalInfo = subprocess.check_output('gdalinfo {}'.format(FileName), shell=True)
GdalInfo = GdalInfo.split('/n') # Creates a line by line list.
CornerLats, CornerLons = np.zeros(5), np.zeros(5)
GotUL, GotUR, GotLL, GotLR, GotC = False, False, False, False, False
for line in GdalInfo:
if line[:10] == 'Upper Left':
CornerLats[0], CornerLons[0] = GetLatLon(line)
GotUL = True
if line[:10] == 'Lower Left':
CornerLats[1], CornerLons[1] = GetLatLon(line)
GotLL = True
if line[:11] == 'Upper Right':
CornerLats[2], CornerLons[2] = GetLatLon(line)
GotUR = True
if line[:11] == 'Lower Right':
CornerLats[3], CornerLons[3] = GetLatLon(line)
GotLR = True
if line[:6] == 'Center':
CornerLats[4], CornerLons[4] = GetLatLon(line)
GotC = True
if GotUL and GotUR and GotLL and GotLR and GotC:
break
return CornerLats, CornerLons
def GetLatLon(line):
coords = line.split(') (')[1]
coords = coords[:-1]
LonStr, LatStr = coords.split(',')
# Longitude
LonStr = LonStr.split('d') # Get the degrees, and the rest
LonD = int(LonStr[0])
LonStr = LonStr[1].split('\'')# Get the arc-m, and the rest
LonM = int(LonStr[0])
LonStr = LonStr[1].split('"') # Get the arc-s, and the rest
LonS = float(LonStr[0])
Lon = LonD + LonM/60. + LonS/3600.
if LonStr[1] in ['W', 'w']:
Lon = -1*Lon
# Same for Latitude
LatStr = LatStr.split('d')
LatD = int(LatStr[0])
LatStr = LatStr[1].split('\'')
LatM = int(LatStr[0])
LatStr = LatStr[1].split('"')
LatS = float(LatStr[0])
Lat = LatD + LatM/60. + LatS/3600.
if LatStr[1] in ['S', 's']:
Lat = -1*Lat
return Lat, Lon
FileName = Image.cub
# Mine's an ISIS3 cube file.
CornerLats, CornerLons = GetCornerCoordinates(FileName)
# UpperLeft, LowerLeft, UpperRight, LowerRight, Centre
print CornerLats
print CornerLons
এবং এটি আমাকে দেয়:
[-4.33429444 -5.82895833 -4.33429444 -5.82895833 -5.081625 ]
[ 137.12275833 137.12203333 137.74633889 137.74706111 137.43454722]