Есть ли способ получить угловые координаты (в градусах широта / длина) из растрового файла, используя привязки Python от gdal?
Несколько поисковых запросов в Интернете убедили меня, что нет, поэтому я разработал обходной путь, анализируя вывод gdalinfo, он несколько простой, но я подумал, что это может сэкономить время для людей, которые могут быть менее знакомы с python. Это также работает, только если 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]
Ответы:
Вот еще один способ сделать это без вызова внешней программы.
Это позволяет получить координаты четырех углов из геотрансформации и перепроектировать их в lon / lat с помощью osr.CoordinateTransformation.
Некоторый код из metageta проекта, osr.CoordinateTransformation идея от этого ответа
источник
Это может быть сделано в гораздо меньшем количестве строк кода
ulx
,uly
верхний левый уголlrx
,lry
нижний правый уголБиблиотека osr (часть gdal) может использоваться для преобразования точек в любую систему координат. Для одной точки:
Чтобы перепроецировать все растровое изображение будет гораздо более сложным делом, но GDAL> = 2.0 предлагает простое решение для этого тоже:
gdal.Warp
.источник
ST_Transform(ST_SetSRID(ST_MakeBox2D(
[результаты]),28355),4283)
его. (Одно замечание - буква «Т»src.GetGeoTransform()
должна быть написана заглавными буквами).Я сделал это ... это немного жестко запрограммировано, но если с gdalinfo ничего не изменится, это сработает для проецируемых изображений UTM!
источник
gdalinfo
от доступности пути пользователя (не всегда так, особенно в окнах), так и от анализа печатного вывода, который не имеет строгого интерфейса - то есть полагается на эти «магические числа» для правильного интервала. Это не нужно, когда gdal предоставляет всеобъемлющие привязки Python, которые могут сделать это более явным и надежным способомЕсли ваш растр вращается, математика становится немного сложнее, так как вам необходимо учитывать каждый из шести коэффициентов аффинного преобразования. Рассмотрите возможность использования аффинного для преобразования повернутого аффинного преобразования / геотрансформации:
Теперь вы можете сгенерировать четыре пары угловых координат:
И если вам также нужны сеточные границы (xmin, ymin, xmax, ymax):
источник
Я полагаю, что в более поздних версиях модуля OSGEO / GDAL для python можно напрямую вызывать утилиты GDAL из кода без привлечения системных вызовов. например, вместо использования подпроцесса для вызова:
gdalinfo можно вызвать gdal.Info (the_name_of_the_file), чтобы получить доступ к метаданным / аннотации файла
или вместо использования подпроцесса для вызова: gdalwarp можно вызвать gdal.Warp, чтобы сделать деформацию растра.
Список утилит GDAL, доступных в настоящее время как внутренняя функция: http://erouault.blogspot.com/2015/10/gdal-and-ogr-utilities-as-library.html
источник