Existe-t-il un moyen d'obtenir les coordonnées des coins (en degrés lat / long) à partir d'un fichier raster en utilisant les liaisons Python de gdal?
Quelques recherches en ligne m'ont convaincu qu'il n'y en avait pas, j'ai donc développé un moyen de contourner la sortie de gdalinfo, c'est un peu basique mais je pensais que cela pourrait faire gagner du temps aux personnes qui seraient moins à l'aise avec python. Cela ne fonctionne également que si gdalinfo contient les coordonnées géographiques ainsi que les coordonnées des coins, ce qui, je pense, n'est pas toujours le cas.
Voici ma solution, quelqu'un a-t-il de meilleures solutions?
gdalinfo sur un raster approprié se traduit par quelque chose comme ceci à mi-chemin de la sortie:
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)
Ce code fonctionnera sur les fichiers qui ressemblent à gdalinfo. Je crois que parfois les coordonnées seront en degrés et décimales, plutôt qu'en degrés, minutes et secondes; il devrait être trivial d'ajuster le code pour cette situation.
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
Et cela me donne:
[-4.33429444 -5.82895833 -4.33429444 -5.82895833 -5.081625 ]
[ 137.12275833 137.12203333 137.74633889 137.74706111 137.43454722]
Réponses:
Voici une autre façon de le faire sans appeler un programme externe.
Cela permet d'obtenir les coordonnées des quatre coins de la géotransformation et de les reprojeter en lon / lat en utilisant osr.CoordinateTransformation.
Du code du projet metageta, idée de transformation osr.CoordinateTransformation de cette réponse
la source
Cela peut être fait en beaucoup moins de lignes de code
ulx
,uly
Est le coin supérieur gauche,lrx
,lry
est le coin inférieur droitLa bibliothèque osr (partie de gdal) peut être utilisée pour transformer les points en n'importe quel système de coordonnées. Pour un seul point:
Pour reprojeter une image entière de trame serait une question beaucoup plus compliquée, mais GDAL> = 2.0 offre une solution simple pour cela aussi:
gdal.Warp
.la source
ST_Transform(ST_SetSRID(ST_MakeBox2D(
[les résultats]),28355),4283)
. (Un petit problème - le «T»src.GetGeoTransform()
doit être en majuscule).Je l'ai fait de cette façon ... c'est un peu codé en dur mais si rien ne change avec gdalinfo, cela fonctionnera pour les images projetées UTM!
la source
gdalinfo
être disponible sur le chemin d'un utilisateur (pas toujours le cas, en particulier sur Windows) et d'analyser une sortie imprimée qui n'a pas d'interface stricte - c'est-à-dire de s'appuyer sur ces `` nombres magiques '' pour un espacement correct. Il n'est pas nécessaire lorsque gdal fournit des liaisons python complètes qui peuvent le faire de manière plus explicite et robusteSi votre raster est pivoté, les calculs deviennent un peu plus compliqués, car vous devez considérer chacun des six coefficients de transformation affine. Envisagez d'utiliser l' affine pour transformer une transformation / géotransformation affine tournée:
Vous pouvez maintenant générer les quatre paires de coordonnées de coin:
Et si vous avez également besoin des limites basées sur la grille (xmin, ymin, xmax, ymax):
la source
Je crois que dans les versions plus récentes du module OSGEO / GDAL pour python, on peut appeler directement les utilitaires GDAL à partir du code sans impliquer d'appels système. par exemple au lieu d'utiliser un sous-processus pour appeler:
gdalinfo on peut appeler gdal.Info (the_name_of_the_file) pour avoir une exposition des métadonnées / annotations du fichier
ou au lieu d'utiliser un sous-processus pour appeler: gdalwarp on peut appeler gdal.Warp pour effectuer la déformation sur un raster.
La liste des utilitaires GDAL actuellement disponibles en tant que fonction interne: http://erouault.blogspot.com/2015/10/gdal-and-ogr-utilities-as-library.html
la source