जीडीएएल और पायथन के साथ डब्ल्यूजीएस84 को भू-आकृति परिवर्तित करने का अनुमान


16

क्षमा याचना यदि निम्न प्रश्न कुछ हद तक मूर्खतापूर्ण है, लेकिन मैं इस पूरी जीआईएस बात के लिए केवल बहुत ही नया हूं।

मैं अजगर में गदल का उपयोग करके कुछ अनुमानित भू-आकृति छवियों को WGS84 में बदलने की कोशिश कर रहा हूं। मैंने एक पोस्ट पाया है जो अनुमानित GeoTiffs के भीतर निम्नलिखित के समान कुछ का उपयोग करके बिंदुओं को बदलने की प्रक्रिया को रेखांकित करता है:

from osgeo import osr, gdal

# get the existing coordinate system
ds = gdal.Open('path/to/file')
old_cs= osr.SpatialReference()
old_cs.ImportFromWkt(ds.GetProjectionRef())

# create the new coordinate system
wgs84_wkt = """
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]"""
new_cs = osr.SpatialReference()
new_cs .ImportFromWkt(wgs84_wkt)

# create a transform object to convert between coordinate systems
transform = osr.CoordinateTransformation(old_cs,new_cs) 

#get the point to transform, pixel (0,0) in this case
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 

#get the coordinates in lat long
latlong = transform.TransformPoint(x,y) 

मेरा सवाल है, अगर मैं इन बिंदुओं को परिवर्तित करना चाहता हूं और एक नई WGS84 जियोफाई फाइल बनाना चाहता हूं, तो क्या इसके बारे में जाने का सबसे अच्छा तरीका है? क्या कोई फ़ंक्शन मौजूद है जो 1 चरण में कार्य जैसे करेगा?

धन्यवाद!

जवाबों:


21

GDAL कमांड लाइन टूल का उपयोग करने का एक सरल तरीका होगा:

gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"

कि बैच नौकरियों के लिए स्क्रिप्टिंग के माध्यम से आसानी से पर्याप्त आह्वान किया जा सकता है। यह रेखापुंज को एक नए ग्रिड में बदल देगा, और विवरण को नियंत्रित करने के लिए अन्य विकल्प हैं।

http://www.gdal.org/gdalwarp.html

लक्ष्य (t_srs) समन्वय प्रणाली को PROJ.4 दिखाया जा सकता है, या अन्य विकल्पों के साथ, WKT के साथ एक वास्तविक फ़ाइल। स्रोत (-s_srs) समन्वय प्रणाली ज्ञात है, लेकिन लक्ष्य की तरह स्पष्ट रूप से सेट की जा सकती है।

यदि आप पायथन के माध्यम से GDAL API का उपयोग नहीं करना चाहते हैं, तो यह काम आसान हो सकता है।

यहाँ एपीआई के साथ युद्ध करने के लिए एक ट्यूटोरियल है, यह कहता है कि पायथन के लिए समर्थन अधूरा है (मुझे विवरण नहीं पता): http://www.gdal.org/warptut.html


1
बढ़िया उत्तर माडसमनर के लिए धन्यवाद! जबकि मेरे बाद का समाधान अजगर में लिखा जाना चाहिए था, शायद मैं अजगर की स्क्रिप्ट में इस आदेश को पूरा करने के साथ दूर हो सकता हूं।
२०:५० पर JT.WK

16

Mdsumner के रूप में कहा, यह जब तक आप पर अमल करना चाहते हैं अजगर बाइंडिंग से कमांड लाइन का उपयोग करने के लिए बहुत आसान है बहुत जटिल कार्य।

तो, अगर आपको अजगर पसंद है, जैसे मैं करता हूं, तो आप कमांड लाइन टूल को इसके साथ चला सकते हैं:

import os  
os.sys('gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"')

या फ़ाइलों की सूची के माध्यम से पुनरावृति:

listoffiles=['file1, file2, file3, filen']  
for file in listoffiles:
    os.system('gdalwarp %s %s -t_srs "+proj=longlat +ellps=WGS84"' %(file,'new_'+file))  

और यहां तक ​​कि मल्टीप्रोसेसिंग टूल का उपयोग बड़े कार्यों को निष्पादित करने के लिए आपकी मशीन की पूरी शक्ति का उपयोग करें।


धन्यवाद पाब्लो। मल्टीप्रोसेसिंग टूल कुछ ऐसा है जिसे मैं निश्चित रूप से देखूंगा!
JT.WK

गाल्ड 2.0 पर मल्टीप्रोसेसिंग के लिए मूल समर्थन है - बस अपने galdwarp कमांड में nend_THREADS = ALL_CPUS जोड़ें।
वाल्वलोनडॉन

3
os.sysएक अंतर्निहित मॉड्यूल है; आप os.systemकमांड चाहते हैं
माइक टी

1
मेरा उत्तर पुराना है, subprocess.call एक बेहतर तरीका है।
पाब्लो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.