GDAL और पायथन का उपयोग करके जियोफेरफेरेंसिंग रैस्टर?


10

मैं एक रेखापुंज का उपयोग कर रेखांकन करना चाहता हूं 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एक विकल्प के रूप में नहीं देखता हूं ।

मुझे नहीं पता कि यह मौजूद है लेकिन मुझे अच्छा लगेगा अगर मैं पाइथोनिक तरीके से चूहों को अनुवाद कर पाऊं या उन्हें हटा दूं। उदाहरण के लिए:

# 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 या (अधिमानतः) उपप्रकार का उपयोग कर सकते हैं।
user2856

@ तो क्या इन गदल उपयोगिताओं के साथ बातचीत करने का कोई तरीका नहीं है? अगर एक मौजूद नहीं है, तो मुझे उनके लिए एक अजगर आवरण लिखने का पता लगाने में खुशी होगी।
djq

आप gdal python API का उपयोग लगभग सब कुछ करने के लिए कर सकते हैं gdal_translate और gdalwarp उपयोगिताओं, यह बस थोड़ा और अधिक जटिल हो सकता है। Gdal.AutoCreateWarpedVRT और gdal Driver.CreateCopy देखें।
user2856

जवाबों:


17

यहाँ एक उदाहरण है जो मोटे तौर पर वही करता है जो आप मांगते हैं। मुख्य पैरामीटर वह geotransformसरणी है जो गाल्ड एक रेखापुंज स्थान (स्थिति, पिक्सेल स्केल, और तिरछा) और 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 package ( यहाँ से डाउनलोड करें ) के साथ सही मापदंडों की गणना करनी होगी । उपयोग: 'Affine.scale (PARAMETER) * Affine.rotation (ANGLE)'। PARAMETER दो छवि के पिक्सेल अनुपात से हैं, आप पिक्सेल आकार जानने के लिए 'gdalinfo' या PIL का उपयोग कर सकते हैं, कोण कोण है।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.