How to get raster corner coordinates using Python GDAL bindings?

المشرف العام

Administrator
طاقم الإدارة
Is there a way to get the corner coordinates (in degrees lat/long) from a raster file using gdal's Python bindings?

A few searches online have convinced me that there is not, so I have developed a work around by parsing the gdalinfo output, it's somewhat basic but I thought it might save some time for people who might be less comfortable with python. It also only works if gdalinfo contains the geographic coordinates along with the corner coordinates, which I don't believe is always the case.

Here's my workaround, does anyone have any better solutions?

gdalinfo on an appropriate raster results in something like this midway through the output:

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)This code will work on files who's gdalinfo look like that. I believe sometimes the coordinates will be in degrees and decimals, rather than degrees, minutes and seconds; it ought to be trivial to adjust the code for that situation.

import numpy as npimport subprocessdef 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, LonFileName = Image.cub# Mine's an ISIS3 cube file.CornerLats, CornerLons = GetCornerCoordinates(FileName)# UpperLeft, LowerLeft, UpperRight, LowerRight, Centreprint CornerLatsprint CornerLonsAnd that gives me:

[-4.33429444 -5.82895833 -4.33429444 -5.82895833 -5.081625 ] [ 137.12275833 137.12203333 137.74633889 137.74706111 137.43454722]

أكثر...
 
أعلى