มีวิธีการรับพิกัดมุม (เป็นองศา lat / ยาว) จากไฟล์แรสเตอร์โดยใช้การผูก Python ของ gdal หรือไม่?
การค้นหาออนไลน์ไม่กี่ทำให้ฉันมั่นใจว่าไม่มีดังนั้นฉันได้พัฒนาแก้ไขโดยการแยกวิเคราะห์ผลลัพธ์ gdalinfo มันค่อนข้างพื้นฐาน แต่ฉันคิดว่ามันอาจประหยัดเวลาสำหรับผู้ที่อาจไม่สะดวกกับงูหลาม นอกจากนี้ยังใช้งานได้ถ้า gdalinfo มีพิกัดทางภูมิศาสตร์พร้อมกับพิกัดมุมซึ่งฉันไม่เชื่อว่าเป็นกรณี
นี่คือวิธีแก้ปัญหาของฉันไม่มีใครมีวิธีแก้ปัญหาที่ดีกว่านี้หรือไม่
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)
รหัสนี้จะทำงานกับไฟล์ที่ gdalinfo มีลักษณะเช่นนั้น ฉันเชื่อว่าบางครั้งพิกัดจะเป็นองศาและทศนิยมแทนที่จะเป็นองศานาทีและวินาที มันควรจะเป็นเรื่องเล็กน้อยที่จะปรับรหัสสำหรับสถานการณ์นั้น
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]