Mehr

Gdal-Treiber.Create TypeError

Gdal-Treiber.Create TypeError


Ich habe ein Python-Skript geschrieben, um ein ASCII-Raster in eine Geotiff-Datei zu konvertieren, und beim Ausführen der Create-Methode in gdal erhalte ich die folgende Fehlermeldung:

[email protected]:~/Smells$ python SmellsGeoTag.py ./SmellsTestData/test3/input/tile_1 ./output Traceback (letzter Aufruf zuletzt): Datei "SmellsGeoTag.py", Zeile 47, im  dst_ds = driver.Create(out , ncols, nrows, 1, gdal.GDT_Float32 ) Datei "/usr/local/lib/python2.7/dist-packages/GDAL-1.11.0-py2.7-linux-x86_64.egg /osgeo/gdal.py", Zeile 394, in Create return _gdal.Driver_Create(self, *args, **kwargs) TypeError: in Methode 'Driver_Create', Argument 3 vom Typ 'int'

Im Gegensatz zum Problem hier sind meine ncols- und nrows-Werte jedoch nicht null Ints, daher bin ich ziemlich ratlos, was das Problem ist

Quellcode:

#!/usr/bin/python import sys, getopt, os, numpy from osgeo import osr, gdal if len(sys.argv) != 3: print ("Bitte verwenden Sie die folgenden Argumente: Eingabepfad, Ausgabepfad"); Ausfahrt(); inRoot = sys.argv[1] outRoot = sys.argv[2] #Gültige Dateien finden potentialDates = os.listdir(inRoot) date = [] für i in potentialDates: if os.path.isdir(os.path.join( inRoot, i)): date.append(i) für i in date: potentialFiles = [] files = [] potentialFiles = os.listdir(os.path.join(inRoot, i)) für x in potentialFiles: if x. endwith(".asc"): files.append(x) #Verarbeiten jeder für y gefundenen gültigen Datei in files: with open(os.path.join(inRoot, i, y), "r") as f: linelist = [Zeile für Zeile in f] Junk, xllcorner = linelist.pop(0).split() float(xllcorner) Junk, yllcorner = linelist.pop(0).split() float(yllcorner) Junk, ncols = linelist.pop (0).split() int(ncols) Junk, nrows = linelist.pop(0).split() int(nrows) Junk, cellsize = linelist.pop(0).split() float(cellsize) Junk, nodataval = linelist.pop(0).split() float(nodataval) data = [[float(digit) for digit in line.split()]for line in linelist] driver = gdal.GetDriverByName("GTiff") wenn nicht os .path.exists(os.path.join(outRoot,i)): os.makedirs(os.path.j oin(outRoot,i)) out = os.path.join(outRoot,i,y+".tif") dst_ds = driver.Create(out , ncols, nrows, 1, gdal.GDT_Float32 ) dst_ds.SetGeoTransform( [xllcorner, cellsize,0,yllcorner,0,cellsize] ) # setze die Referenzinfo srs = osr.SpatialReference() srs.SetWellKnownGeogCS("WGS84") dst_ds.SetProjection( srs.ExportToWkt() ) # schreibe das Band dst_ds.GetRasterBand(1 ).WriteArray(Daten) exit()

Die Wertencols,nrowsdu gehst zuTreiber.Erstellensind immer noch Strings und keine Integer-Werte. Nach dem Lesen imncolsvariabel in

Junk, ncols = linelist.pop(0).split()

dasncolsenthält eine Zeichenfolge mit Ihrem Wert. Die Linie danachint(ncols)wandelt es in ein umintaber Sie speichern das Ergebnis nicht (int()Funktion ändert den Wert an Ort und Stelle nicht), also müssen Sie diese Zeile wie folgt schreiben:

ncols = int(ncols)

Im Zweifelsfall können Sie den Typ jeder Variablen vor demTreiber.Erstellen(… )rufen Sie zum Beispiel an mit:

print 'ncols:', type(ncols), ' - nrows:', type(nrows)

Hoffe das hilft.

PS Als Randnotiz: Nur für den Fall, ich weiß nicht, ob das Programm gdal_translate Ihnen bei der Konvertierung von ASCII-Raster in GeoTiff helfen könnte. Es wurde zum Konvertieren einer Raster-Datei in eine andere entwickelt und kann unter anderem für einfache Formatübersetzungen verwendet werden. Verfügbare Rasterformate finden Sie hier.


Da GDAL ASCII-Raster nativ lesen kann, müssen Sie es nicht parsen. Verwenden Sie einfach GDAL, um es zu öffnen, und verwenden Sie dann die Methode CreateCopy des GeoTIFF-Treibers.

#!/usr/bin/python import sys, getopt, os, numpy from osgeo import osr, gdal if len(sys.argv) != 3: print ("Bitte verwenden Sie die folgenden Argumente: Eingabepfad, Ausgabepfad"); Ausfahrt(); inRoot = sys.argv[1] outRoot = sys.argv[2] #Sparen Sie etwas Zeit, indem Sie diese Objekte nur einmal erstellen. driver = gdal.GetDriverByName("GTiff") # setze die Referenzinfo srs = osr.SpatialReference() srs.SetWellKnownGeogCS("WGS84") #finde gültige Dateien potentialDates = os.listdir(inRoot) date = [] für i in potentialDates : if os.path.isdir(os.path.join(inRoot, i)): date.append(i) for i in date: potentialFiles = [] files = [] potentialFiles = os.listdir(os.path.join (inRoot, i)) for x in potentialFiles: if x.endswith(".asc"): files.append(x) #Verarbeitung jeder für y in Dateien gefundenen gültigen Datei: ds = gdal.Open(os.path.join (inRoot, i, y)) if not os.path.exists(os.path.join(outRoot,i)): os.makedirs(os.path.join(outRoot,i)) out = os.path.join (outRoot,i,y+".tif") dst_ds = driver.CreateCopy(out, ds) dst_ds.SetProjection( srs.ExportToWkt() ) del dst_ds #Schließe den Datensatz, um den Schreibvorgang abzuschließen

Schau das Video: GDALOGR Installation on Windows