Konvertieren einer ASCII-Grid-Datei mit Python in GeoTIFF?

11

Ich habe eine Datei im ASCII-Rasterformat. Beispielsweise:

ncols 480
nrows 450
xllcorner 378923
yllcorner 4072345
cellsize 30
nodata_value -32768
43 2 45 7 3 56 2 5 23 65 34 6 32 54 57 34 2 2 54 6 
35 45 65 34 2 6 78 4 2 6 89 3 2 7 45 23 5 8 4 1 62 ...

Wie kann ich es mit Python in TIFF oder ein anderes Raster konvertieren?

voimak
quelle
GIS-Software kann ASCI in Geotiff konvertieren. Keine Codierung erforderlich. Ich benutze QGIS. Es ist kostenlos.
Saul Sheard

Antworten:

13

Die Pseudocode-Version:

import gdal
import numpy

create the gdal output file as geotiff
set the no data value
set the geotransform 

numpy.genfromtxt('your file', numpy.int8) #looks like int from you example
reshape your array to the shape you need

write out the array.

Ein Beispiel, das Ihnen weiterhelfen wird - von hier aus :

if __name__ == '__main__':
    # Import libs
    import numpy, os
    from osgeo import osr, gdal

    # Set file vars
    output_file = "out.tif"

    # Create gtif
    driver = gdal.GetDriverByName("GTiff")
    dst_ds = driver.Create(output_file, 174, 115, 1, gdal.GDT_Byte )
    raster = numpy.zeros( (174, 115) )

    # top left x, w-e pixel resolution, rotation, top left y, rotation, n-s pixel resolution
    dst_ds.SetGeoTransform( [ 14.97, 0.11, 0, -34.54, 0, 0.11 ] )

    # set the reference info 
    srs = osr.SpatialReference()
    srs.SetWellKnownGeogCS("WGS84")
    dst_ds.SetProjection( srs.ExportToWkt() )

    # write the band
    dst_ds.GetRasterBand(1).WriteArray(raster)
Jay Laura
quelle
und die Werte 14.97 und -34.54 sind die Koordinaten der oberen linken Ecke in WGS84-Cooridanaten?
Slava
9

Alternative mit gdal_translate :

gdal_translate -of "GTiff" fname.asc outname.tif
Bananenfisch
quelle
7

Es ist möglicherweise einfacher, eine Kopie zu erstellen, da Ihre Datei ein AAIGrid ist und GTiff CreateCopy () unterstützt:

from osgeo import gdal, osr
drv = gdal.GetDriverByName('GTiff')
ds_in = gdal.Open('in.asc')
ds_out = drv.CreateCopy('out.tif', ds_in)
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
ds_out.SetProjection(srs.ExportToWkt())
ds_in = None
ds_out = None

Jeder Treiber, der CreateCopy unterstützt, kann dies verwenden.


quelle
Wenn Sie keine Python benötigen, ist Bananenfisch definitiv richtig.
super, danke! Meine .asc-Eingabedatei wird ohne CRS geliefert. Gibt es eine Möglichkeit, dieses CRS (GCS WGS 84) vor dem Schreiben des Rasters anzugeben?
RutgerH
Verwenden Sie SetProjection und einen String. Sie können den String von osr erhalten. Siehe Antwort bearbeiten.