การอ้างอิงทางภูมิศาสตร์โดยใช้ GDAL และ Python?


10

ฉันต้องการที่จะ georeference แรสเตอร์ที่ใช้และpython GDALแนวทางปัจจุบันของฉันคือการโทรgdal_translateและgdalwarpใช้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ตัวเลือก

ฉันไม่รู้ว่ามันมีอยู่หรือไม่ แต่ฉันจะรักถ้าฉันสามารถแปลและปฏิเสธ rasters ในแบบ 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อื่น ๆไม่ได้เป็นแพคเกจ / โมดูลหลามพวกเขาเป็นปฏิบัติการแบบสแตนด์อโลน คุณสามารถใช้ระบบปฏิบัติการ os.system หรือ subprocess.Popen เพื่อให้เรียกใช้ได้
2856

@Luke ไม่มีทางที่จะโต้ตอบกับโปรแกรมอรรถประโยชน์ gdal เหล่านี้ได้อย่างไร ฉันยินดีที่จะสำรวจวิธีการเขียนเสื้อคลุมหลามสำหรับสิ่งเหล่านี้หากไม่มีอยู่
djq

คุณสามารถใช้ gdal python API เพื่อทำเกือบทุกอย่างที่สาธารณูปโภค gdal_translate และ gdalwarp สามารถทำได้มันซับซ้อนกว่านี้เล็กน้อย ตรวจสอบ gdal.AutoCreateWarpedVRT และ gdal Driver สร้าง CreCopy
2856

คำตอบ:


17

นี่คือตัวอย่างที่ไม่เกี่ยวกับสิ่งที่คุณขอ พารามิเตอร์หลักคือgeotransformอาร์เรย์ที่ gdal ใช้เพื่ออธิบายตำแหน่งแรสเตอร์ (ตำแหน่ง, ขนาดพิกเซลและความเบ้) และ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 Transformation และคำนวณพารามิเตอร์ที่ถูกต้องด้วยแพ็คเกจ Affine ( ดาวน์โหลดจากที่นี่ ) การใช้งาน: 'Affine.scale (พารามิเตอร์) * Affine.rotation (ANGLE)' PARAMETER มาจากอัตราส่วนพิกเซลของภาพสองภาพคุณสามารถใช้ 'gdalinfo' หรือ PIL เพื่อทราบขนาดพิกเซล ANGLE คือมุม
CaMa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.