জিডএল এবং পাইথনের সাথে ডাব্লু জিএস 84 তে অনুমিত জিওটিফকে রূপান্তর করা


16

নিম্নলিখিত প্রশ্নটি কিছুটা বোকা হলে দুঃখিত, তবে আমি এই পুরো জিআইএস জিনিসটিতে কেবলমাত্র খুব নতুন।

আমি পাইথনের জিডিএল ব্যবহার করে কিছু প্রত্যাশিত জিওটিফ চিত্রগুলি WGS84 এ রূপান্তর করার চেষ্টা করছি। আমি একটি পোস্ট পেয়েছি যা নীচের মতো কিছু ব্যবহার করে অনুমিত জিওটিফগুলির মধ্যে পয়েন্টগুলি রূপান্তর করার প্রক্রিয়াটির রূপরেখা দেয়:

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) 

আমার প্রশ্ন হ'ল আমি যদি এই পয়েন্টগুলি রূপান্তর করতে এবং একটি নতুন ডাব্লু জিএস 84 জিওটিফ ফাইল তৈরি করতে চাই তবে এটি কি সবচেয়ে ভাল উপায়? এমন কোনও ফাংশন আছে যা 1 টি পদক্ষেপে যেমন কাজ করবে?

ধন্যবাদ!

উত্তর:


21

এর একটি সহজ উপায় হ'ল জিডিএল কমান্ড লাইন সরঞ্জামগুলি ব্যবহার করা:

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

এটি ব্যাচের কাজের জন্য স্ক্রিপ্টিংয়ের মাধ্যমে সহজেই প্রচলিত হতে পারে। এটি রাস্টারটিকে একটি নতুন গ্রিডে ছড়িয়ে দেবে এবং বিশদটি নিয়ন্ত্রণ করার জন্য অন্যান্য বিকল্প রয়েছে।

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

টার্গেট (t_srs) সমন্বিত সিস্টেমটি দেখানো যেমন PROJ.4 হতে পারে বা অন্যান্য বিকল্পের মধ্যে ডাব্লুকেটি-র সাথে একটি আসল ফাইল। উত্স (-s_srs) সমন্বয় সিস্টেমটি জ্ঞাত হিসাবে ধরে নেওয়া হয়, তবে লক্ষ্য হিসাবে স্পষ্টভাবে সেট করা যেতে পারে।

পাইথনের মাধ্যমে আপনাকে জিডিএল এপিআই ব্যবহার না করতে হলে কাজটি করা সহজ হতে পারে।

এখানে এপিআইয়ের সাথে যুদ্ধের জন্য একটি টিউটোরিয়াল রয়েছে, এতে বলা হয়েছে পাইথনের সমর্থন অসম্পূর্ণ (আমি বিস্তারিত জানি না): http://www.gdal.org/warptut.html


1
এমডস্মনারের দুর্দান্ত উত্তরের জন্য ধন্যবাদ! আমি যে সমাধানটি পরে আছি তা অজগরে লেখা হওয়ার কথা রয়েছে, সম্ভবত আমি অজগর স্ক্রিপ্টে কেবল এই আদেশটি লুপ করেই পালাতে পারি।
JT.WK

16

এমডসুমনার যেমন বলেছিলেন, অজগর বাইন্ডিংয়ের চেয়ে কমান্ড লাইনটি ব্যবহার করা আরও সহজ, যদি না আপনি খুব জটিল কাজগুলি সম্পাদন করতে চান ।

সুতরাং, আপনি যদি আমার মতো পাইথন পছন্দ করেন তবে আপনি কমান্ড লাইন সরঞ্জামটি চালাতে পারেন:

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

জিডিএল ২.০ এ মাল্টিপ্রসেসিংয়ের জন্য স্থানীয় সমর্থন রয়েছে - আপনার জিডালওয়ার্প কমান্ডে কেবলমাত্র NUM_THREADS = ALL_CPUS যুক্ত করুন।
ভালভ লন্ডন

3
os.sysএকটি অন্তর্নির্মিত মডিউল; আপনি os.systemকমান্ডটি চান
মাইক টি

1
আমার উত্তর পুরানো, subprocess.call একটি ভাল পদ্ধতির।
পাবলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.