GDALとPythonを使用してラスタをジオリファレンスしますか?


10

pythonおよびを使用してラスターを地理参照したいGDAL。私の現在のアプローチは、地上管制点の醜いリストを呼び出しgdal_translategdalwarp使用os.systemすることです。私はこれを内でネイティブに行う方法を本当に望んでいますpython

これは私が使用している現在のプロセスです:

import os

os.system('gdal_translate -of GTiff -gcp 1251.92 414.538 -7.9164e+06 5.21094e+06 -gcp 865.827 107.699 -7.91651e+06 5.21104e+06  "inraster.tif" "outraster1.tif"')
os.system('gdalwarp -r bilinear -tps -co COMPRESS=NONE "outraster2.tif" "outraster3.tif"')

インポート後にアクセスできると述べている2012年からの以前の質問回答gdal_translateがありますgdal。が廃止されているのか、それが間違っているのかfrom osgeo import gdalはわかりませんが、実行しgdal.gdal_translateてもオプションとして表示されません。

それが存在するかどうかはわかりませんが、ラスタをpythonicの方法で変換および再投影できたら嬉しいです。例えば:

# translate
gcp_points = [(1251.92, 414.538), (-7.9164e+06, 5.21094e+06)]
gdal.gdal_translate(in_raster, gcp_points, out_raster1)

# warp
gdal.gdalwarp(out_raster1, out_raster2, 'bilinear', args*)

そのようなアプローチは可能ですか?


1
gdal_translateとgdalwarpおよびその他のgdalユーティリティは、pythonパッケージ/モジュールではなく、スタンドアロンの実行可能ファイルです。os.systemまたは(できれば)subprocess.Popenを使用して呼び出すことができます。
user2856 2014年

@ルークそう、これらのgdalユーティリティと対話する方法はありませんか?存在しない場合は、これらのpythonラッパーを作成する方法を探りたいと思います。
djq 2014年

gdal python APIを使用して、gdal_translateおよびgdalwarpユーティリティで実行できるほぼすべてのことを実行できます。これは少し複雑です。gdal.AutoCreateWarpedVRTとgdal Driver.CreateCopyをチェックしてください。
user2856 2014年

回答:


17

これは、大体あなたが求めていることをする例です。主なパラメーターは、geotransformgdalがラスターの位置(位置、ピクセルスケール、スキュー)とepsg投影のコードを記述するために使用する配列です。これにより、次のコードはラスタを適切に地理参照し、その投影を指定する必要があります。

私はこれをあまりテストしませんでしたが、私にはうまくいくようでした。私が入力した座標が正しいことを確認し、投影法とピクセルのスケール/サイズを変更する必要があります。それが役に立てば幸い。

from osgeo import gdal, osr

src_filename ='/path/to/source.tif'
dst_filename = '/path/to/destination.tif'

# Opens source dataset
src_ds = gdal.Open(src_filename)
format = "GTiff"
driver = gdal.GetDriverByName(format)

# Open destination dataset
dst_ds = driver.CreateCopy(dst_filename, src_ds, 0)

# Specify raster location through geotransform array
# (uperleftx, scalex, skewx, uperlefty, skewy, scaley)
# Scale = size of one pixel in units of raster projection
# this example below assumes 100x100
gt = [-7916400, 100, 0, 5210940, 0, -100]

# Set location
dst_ds.SetGeoTransform(gt)

# Get raster projection
epsg = 3857
srs = osr.SpatialReference()
srs.ImportFromEPSG(epsg)
dest_wkt = srs.ExportToWkt()

# Set projection
dst_ds.SetProjection(dest_wkt)

# Close files
dst_ds = None
src_ds = None

2
それは正しいですが、より正確にしたい場合は、回転の場合、アフィン変換を使用して、アフィンパッケージで適切なパラメーターを計算する必要があります(ここからダウンロード)。使用法: 'Affine.scale(PARAMETER)* Affine.rotation(ANGLE)'。PARAMETERは2つの画像のピクセル比からのものです。「gdalinfo」またはPILを使用してピクセルサイズを知ることができます。ANGLEは角度です。
CaMa 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.