Pythonを使用したGeoTiffへの緯度、経度およびデータを含むASCIIファイル

経度、緯度、データ値の3つのデータ列を持つ .asc ファイルがあります。それぞれの緯度と経度の点は、1/8度の投影されていないグリッドの重心の位置を表します。 Pythonで gdal を使用してこのファイルをラスター( .tif )に変換したいと思います。次に、この大きなデータをサブセット化するために投影データセットを使用します。グリッド。ここから始める方法について何か考えがありますか?

1
あなたのテキストファイルから仮想ソースを作成する(vrtファイルを作成する)、gdal_gridは散在した点からグリッドを作成することができ、gdalwarpはあなたのグリッドを再投影することができます。これらのコマンドはGDALユーティリティにあります。Pythonバインディングを探す必要があります。
追加された 著者 SHIVAM TEJ SINGLA,

4 答え

ASCIIファイルを経度、緯度、およびデータ値で変換するには、次のような関数を使用します。

from osgeo import gdal

def csv2tif(source, target):
    cvs = gdal.Open(source)
    if cvs is None:
        print 'ERROR: Unable to open %s' % source
        return

    geotiff = gdal.GetDriverByName("GTiff")
    if geotiff is None:
        print 'ERROR: GeoTIFF driver not available.'
        return

    options = []
    geotiff.CreateCopy(target, cvs, 0, options)

source = 'E:\\test.csv'
target = 'E:\\test.tif'

csv2tif(source, target)

次の関数はCSVをインポートして再投影し、それをジオティフファイルとして保存します。関数に他のフォーマットも処理させたい場合は、さらにいくつかのパラメーターが必要です。投影されたラスタのセル値を計算するためにアルゴリズム( gdal.GRA_Bilinear )を変更したり、その解像度( xsize、ysize )を変更することもできます。

from osgeo import gdal, osr

def csv2tif_projected(source, target, destEPSG, srcEPSG=4326):

    # open CSV source file
    cvs = gdal.Open(source)
    if cvs is None:
        print 'ERROR: Unable to open %s' % source
        return

    # get GeoTIFF driver
    geotiff = gdal.GetDriverByName("GTiff")
    if geotiff is None:
        print 'ERROR: GeoTIFF driver not available.'
        return

    # set source coordinate system of coordinates in CSV file
    src_crs = osr.SpatialReference()
    src_crs.ImportFromEPSG(srcEPSG)

    # set destination projection parameters
    dest_crs = osr.SpatialReference()
    dest_crs.ImportFromEPSG(destEPSG)

    # set coordinate transformation
    tx = osr.CoordinateTransformation(src_crs, dest_crs)

    # get raster dimension related parameters of source dataset
    xo, xs, xr, yo, yr, ys = cvs.GetGeoTransform()
    xsize = cvs.RasterXSize
    ysize = cvs.RasterYSize

    # convert corner coordinates from old to new coordinate system
    (ulx, uly, ulz) = tx.TransformPoint(xo, yo)
    (lrx, lry, lrz) = tx.TransformPoint(xo + xs * xsize + xr * ysize,\
                                        yo + yr * xsize + ys * ysize)

    # create blank in-memory raster file with same dimension as CSV raster
    mem = gdal.GetDriverByName('MEM')
    dest_ds = mem.Create('', xsize, ysize, 1, gdal.GDT_Float32)

    # get new transformation
    dest_geo = (ulx, (lrx - ulx)/xsize, xr,\
                uly, yr, (lry - uly)/ysize)

    # set the geotransformation
    dest_ds.SetGeoTransform(dest_geo)
    dest_ds.SetProjection(dest_crs.ExportToWkt())

    # project the source raster to destination coordinate system
    gdal.ReprojectImage(cvs, dest_ds, \
                        src_crs.ExportToWkt(), dest_crs.ExportToWkt(),\
                        gdal.GRA_Bilinear, 0.0, 0.0)

    # save projected in-memory raster to disk
    geotiff.CreateCopy(target, dest_ds, 0 )

シェイプファイルでラスタをクリッピングするには、Python GDAL/OGR Cookbookの説明とコードを参照してください。 "rel =" nofollow noreferrer ">シェイプファイルでGeoTiffをクリップするおよびディスカッション GDALを使用してラスターをベクトルレイヤーでクリッピングする

4
追加された

XYZ ASCIIファイルをGeoTiffに変換するために、正しい投影法と範囲で参照画像を使用する関数を作成しました。私のASCIIファイルにはヘッダがないので、 gdal_translate は機能しませんでした。これが関数です:

def ascii_to_tiff(infile, outfile, refIm):
    """
    Transform an XYZ ascii file without a header to a projected GeoTiff

    :param infile (str): path to infile ascii location
    :param outfile (str): path to final GTiff
    :param refIm (str): path to a reference image made from the lat lon pair centriods

    """

    im = gdal.Open(refIm)
    ima = gdal.Open(refIm).ReadAsArray()
    row = ima.shape[0];
    col = ima.shape[1]

    indata = np.genfromtxt(infile, delimiter=",", skip_header=True, dtype=None)
    lon = indata[:, 0]  # x
    lat = indata[:, 1]  # y
    data = indata[:, 2]

    # create grid
    xmin, xmax, ymin, ymax = [min(lon), max(lon), min(lat), max(lat)]
    xi = np.linspace(xmin, xmax, col)
    yi = np.linspace(ymin, ymax, row)
    xi, yi = np.meshgrid(xi, yi)

    # linear interpolation
    zi = ml.griddata(lon, lat, data, xi, yi, interp='linear')
    final_array = np.asarray(np.rot90(np.transpose(zi)))

    # projection
    driver = gdal.GetDriverByName("GTiff")
    dst_ds = driver.Create(outfile, col, row, 1, gdal.GDT_Float32)
    dst_ds.GetRasterBand(1).WriteArray(final_array)
    prj = im.GetProjection()
    dst_ds.SetProjection(prj)

    gt = im.GetGeoTransform()
    dst_ds.SetGeoTransform(gt)
    dst_ds = None

    final_tif = gdal.Open(outfile, GA_ReadOnly).ReadAsArray()
    return final_tif
2
追加された

Wrap up another answer with Python using os.system or subprocess. Although subprocess should be preferred for various reasons, see here

import os, subprocess

os.system("gdal_translate -of 'GTiff' input.asc output.tiff")

# or
subprocess.check_ouput(["gdal_translate", "-of GTiff", "input.asc", "output.tif"])
0
追加された