GDAL ve Python kullanarak coğrafi referans tarama?


10

Ben kullanarak raster coğrafi olarak tanımlanmasına istiyorum pythonve GDAL. Benim şu anki yaklaşımı çağrısına olduğunu gdal_translateve gdalwarpkullanma os.systemve yer kontrol noktalarının çirkin listesinde. Bunu yerel olarak yapmanın bir yolunu gerçekten istiyorum python.

Bu şu anda kullandığım işlem:

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'den , içe aktarma işleminden sonra erişilebileceğini belirten önceki bir soru ve cevap var . Eski olup olmadığından ya da yanlış olup olmadığından emin değilim ama çalıştırdığımda bir seçenek olarak görmüyorum .gdal_translategdalfrom osgeo import gdalgdal.gdal_translate

Var olup olmadığını bilmiyorum ama rasterleri pythonic bir şekilde tercüme edip yeniden yazdırabilseydim çok isterdim. Örneğin:

# 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*)

Böyle bir yaklaşım mümkün mü?


1
gdal_translate ve gdalwarp ve diğer gdal yardımcı programları python paketleri / modülleri değildir, bağımsız çalıştırılabilirlerdir. Sistem veya (tercihen) alt süreci kullanabilirsiniz.
user2856

@ Luke öyleyse bu gdal yardımcı programları ile etkileşim kurmanın bir yolu yok mu? Varsa, bunlar için bir python sarıcısının nasıl yazıldığını araştırmaktan mutluluk duyarım.
djq

Gdal_translate ve gdalwarp yardımcı programlarının yapabileceği neredeyse her şeyi yapmak için gdal python API'sini kullanabilirsiniz, bu biraz daha karmaşıktır. Gdal.AutoCreateWarpedVRT ve gdal Driver.CreateCopy'yi kontrol edin.
user2856

Yanıtlar:


17

İşte size kabaca ne istediğinizi gösteren bir örnek. Ana parametreler, geotransformgdal'ın bir raster konumunu (konum, piksel ölçeği ve eğriltme) ve epsgprojeksiyon kodunu tanımlamak için kullandığı dizidir . Bununla birlikte, aşağıdaki kod rastere uygun şekilde başvurmalı ve projeksiyonunu belirtmelidir.

Bunu fazla test etmedim, ama benim için işe yarıyor gibiydi. Koyduğum koordinatların doğru olduğundan emin olmanız ve muhtemelen projeksiyonu ve piksel ölçeğini / boyutunu değiştirmeniz gerekir. Umarım yardımcı olur.

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
Doğru ama daha doğru olmak istiyorsanız, rotasyon durumunda, Afin Dönüşümünü kullanmanız ve Afin paketi ile doğru parametreleri hesaplamanız gerekir ( buradan indirin ). Kullanımı: 'Affine.scale (PARAMETER) * Affine.rotation (ANGLE)'. PARAMETRE iki görüntünün piksel oranından, piksel boyutunu bilmek için 'gdalinfo' veya PIL kullanabilirsiniz, ANGLE açıdır.
CaMa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.