GDAL과 Python을 사용한 지리 참조 래스터?


10

pythonand를 사용하여 래스터를 지리 참조하고 싶습니다 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하면 옵션으로 표시되지 않습니다 .

나는 그것이 존재하는지 모르겠지만, 파이썬 방식으로 래스터를 번역하고 재 투영 할 수 있으면 좋을 것입니다. 예를 들면 다음과 같습니다.

# 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 유틸리티 는 파이썬 패키지 / 모듈이 아니며 독립형 실행 파일입니다. os.system 또는 (바람직하게는) subprocess.Popen을 사용하여 호출 할 수 있습니다.
user2856

@Luke 그래서이 gdal 유틸리티와 상호 작용하는 방법이 없습니까? 존재하지 않는 경우 파이썬 래퍼를 작성하는 방법을 탐색하게되어 기쁩니다.
djq

gdal python API를 사용하여 gdal_translate 및 gdalwarp 유틸리티가 할 수있는 거의 모든 작업을 수행 할 수 있습니다. 조금 더 복잡합니다. gdal.AutoCreateWarpedVRT 및 gdal Driver.CreateCopy를 확인하십시오.
user2856

답변:


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 변환을 사용하고 Affine 패키지로 올바른 매개 변수를 계산해야합니다 ( 여기에서 다운로드 ). 사용법 : 'Affine.scale (PARAMETER) * Affine.rotation (ANGLE)'. PARAMETER는 두 이미지의 픽셀 비율에서 가져온 것입니다. 'gdalinfo'또는 PIL을 사용하여 픽셀 크기를 알 수 있습니다. ANGLE은 각도입니다.
CaMa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.