জিডিএল ব্যবহার করে ছোট খণ্ডগুলিতে রাস্টার বিভাজন?


18

আমার কাছে একজন রাস্টার রয়েছে (ইউএসজিএস ডেম আসলে) এবং আমার এটি নীচের চিত্রগুলির মতো ছোট ছোট খণ্ডে বিভক্ত করতে হবে। এটি স্প্লিট রাস্টার সরঞ্জামটি ব্যবহার করে আরকজিআইএস 10.0 এ সম্পন্ন হয়েছিল। আমি এটি করতে একটি FOSS পদ্ধতি চাই। আমি জিডিএল-এর দিকে নজর রেখেছি, ভেবে দেখে নিশ্চয়ই এটি হবে (কোনওভাবে gdal_translate সহ) তবে কিছুই খুঁজে পাচ্ছি না। শেষ পর্যন্ত, আমি রাস্টারটি নিতে সক্ষম হতে চাই এবং বলতে চাই যে কত বড় (4KM দ্বারা 4KM অংশ) আমি এটির মধ্যে বিভক্ত হয়ে যেতে চাই।

এখানে চিত্র বর্ণনা লিখুন


আমার একটি ইউটিলিটি রয়েছে যা সাবপ্রসেস ব্যবহার করে multiple একাধিক জিডিাল চালানোর জন্য পোপেন একই সাথে ফিশনেট ব্যবহার করে টাইলগুলিতে বড় রাস্টার বের করার জন্য ব্যবহার করি, বিশেষত দরকারী যদি ইনপুট এবং / অথবা আউটপুট অত্যন্ত সংকুচিত থাকে (যেমন এলজেডাব্লু বা ডিফল্ট জিওটিফ ), যদি না এইচডিডি অ্যাক্সেসের প্রক্রিয়াটি চূড়ান্তভাবে সঙ্কুচিত হয় এবং একসাথে চালানোর চেয়ে দ্রুত না হয়। দুর্ভাগ্যক্রমে কঠোর নামকরণের কনভেনশনের কারণে ভাগ করে নেওয়া যথেষ্ট জেনারিক নয় তবে যাইহোক চিন্তার জন্য খাবার। জিডিএলওয়ার্পের জন্য-মাল্টি বিকল্পটি প্রায়শই সমস্যার কারণ হয় এবং কেবলমাত্র দুটি থ্রেড ব্যবহার করে (একটি পঠন, একটি লেখা) সমস্ত উপলভ্য নয়।
মাইকেল সিলিমসন

উত্তর:


18

gdal_translate -srcwin বা -প্রজুইন বিকল্পগুলি ব্যবহার করে কাজ করবে।

-srcwin xoff yoff xsize ysize: পিক্সেল / লাইন অবস্থানের উপর ভিত্তি করে অনুলিপি করার জন্য উত্স চিত্র থেকে একটি সাবউইন্ডো নির্বাচন করে।

-প্রজুইন উল্স ইউলি এলআরএক্স ল্রি: অনুলিপি করার জন্য উত্স চিত্র থেকে একটি সাবউইন্ডো নির্বাচন করে (যেমন -স্ক্রিনউইন) তবে জিওরিফারেন্সযুক্ত স্থানাঙ্কগুলিতে দেওয়া কোণগুলি সহ।

আপনাকে পিক্সেল / লাইন অবস্থানগুলি বা কোণার স্থানাঙ্কগুলি নিয়ে আসতে হবে এবং তারপরে gdal_translate সহ মানগুলি লুপ করতে হবে। নীচে দ্রুত এবং নোংরা অজগরটির মতো কিছু কাজ করবে যদি পিক্সেল মানগুলি ব্যবহার করা হয় এবং -সিসক্রুইন আপনার জন্য উপযুক্ত হয় তবে স্থানাঙ্কগুলির সাথে বাছাইয়ের জন্য এটি আরও কিছু কাজ হবে।

import os, gdal
from gdalconst import *

width = 512
height = 512
tilesize = 64

for i in range(0, width, tilesize):
    for j in range(0, height, tilesize):
        gdaltranString = "gdal_translate -of GTIFF -srcwin "+str(i)+", "+str(j)+", "+str(tilesize)+", " \
            +str(tilesize)+" utm.tif utm_"+str(i)+"_"+str(j)+".tif"
        os.system(gdaltranString)

1
হাই যখন আমি জিওটিফ চিত্র সহ প্রজ্বিন বিকল্পটি চেষ্টা করি তখন আমি সতর্কতা পেয়ে বলি "সতর্কতা: গণিত -সক্রুইন -3005000 1879300 50 650 পুরোপুরি রাস্টার সীমার বাইরে পড়ে। যাইহোক" আমি নিশ্চিত নই আমি কোথায় ভুল করছি মনে হচ্ছে এটির মতো নয় এর জিওরিফারেন্সযুক্ত সমন্বয়গুলি ব্যবহার করে।
ncelik

@ আনলিক সম্ভবত এটি কারণ আপনি আপনার প্রজভিনে সেল স্থানাঙ্ক ব্যবহার করছেন এবং এর পরিবর্তে এসসিআরউইন ব্যবহার করা উচিত। আপনি যদি সমস্যায় পড়তে থাকেন তবে দয়া করে সমস্ত প্রাসঙ্গিক তথ্য সহ একটি নতুন প্রশ্ন পোস্ট করুন যাতে আমরা আপনার নির্দিষ্ট সমস্যা সম্পর্কে পরামর্শ দিতে পারি।
মাইকেল সিলিমসন

15

@ দ্রষ্টব্য থেকে প্রাপ্ত সমাধানের ভিত্তিতে আমার সমাধান ফাইলটি থেকে রাস্টার মাত্রাগুলি পড়ে এবং প্রয়োজনে প্রান্তের টাইলগুলি আরও ছোট করে পুরো চিত্রটি কভার করে:

import os, sys
from osgeo import gdal

dset = gdal.Open(sys.argv[1])

width = dset.RasterXSize
height = dset.RasterYSize

print width, 'x', height

tilesize = 5000

for i in range(0, width, tilesize):
    for j in range(0, height, tilesize):
        w = min(i+tilesize, width) - i
        h = min(j+tilesize, height) - j
        gdaltranString = "gdal_translate -of GTIFF -srcwin "+str(i)+", "+str(j)+", "+str(w)+", " \
            +str(h)+" " + sys.argv[1] + " " + sys.argv[2] + "_"+str(i)+"_"+str(j)+".tif"
        os.system(gdaltranString)

আমি মনে করি এটি sys.argv [1] হওয়া উচিত যেখানে এটি sys.argv [2] বলে?
oskarlin

3
sys.argv [2] আউটপুট ফাইলগুলির উপসর্গ হিসাবে ব্যবহৃত হয়, আমি বিশ্বাস করি। সুপার সহায়ক - ধন্যবাদ @ রেইস!
চার্লি হফম্যান

4

রাস্টারদের অবসর নেওয়ার জন্য বিশেষত একটি বান্ডিল অজগর স্ক্রিপ্ট রয়েছে, জিডাল_টাইল :

gdal_retile.py [-v] [-co NAME=VALUE]* [-of out_format] [-ps pixelWidth pixelHeight]
               [-overlap val_in_pixel]
               [-ot  {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/
                      CInt16/CInt32/CFloat32/CFloat64}]'
               [ -tileIndex tileIndexName [-tileIndexField tileIndexFieldName]]
               [ -csv fileName [-csvDelim delimiter]]
               [-s_srs srs_def]  [-pyramidOnly]
               [-r {near/bilinear/cubic/cubicspline/lanczos}]
               -levels numberoflevels
               [-useDirForEachRow]
               -targetDir TileDirectory input_files

উদাহরণ:

gdal_retile.py -ps 512 512 -targetDir C:\example\dir some_dem.tif


4

@ অ্যারনের জন্য যারা জিজ্ঞাসা করেছেন:

আমি @ wwnick এর উত্তরের একটি gdalwarp সংস্করণটি খুঁজে পেতে আশা করছি যা বর্ধিত মাল্টিকোর এবং মাল্টিথ্রেডেড ক্রিয়াকলাপের জন্য-মাল্টি বিকল্পটি ব্যবহার করে

সামান্য অস্বীকৃতি

এটি ব্যবহার করে gdalwarp, যদিও আমি পুরোপুরি নিশ্চিত নই যে এখানে অনেক বেশি পারফরম্যান্স লাভ হবে। আমি এখনও অবধি আমি / ও আবদ্ধ হয়েছি - এই স্ক্রিপ্টটি একটি বড় রাস্টার এটিকে অনেক ছোট ছোট অংশে কাটাতে সিপিইউ নিবিড় বলে মনে হয় না, তাই আমি ধরে নিই যে বাধাটি ডিস্কে লিখছে writing আপনি যদি একই সাথে টাইলস বা অনুরূপ কিছু পুনরায় প্রজেক্ট করার পরিকল্পনা করে থাকেন তবে এটি পরিবর্তন হতে পারে। এখানে টিউন করার টিপস রয়েছে । একটি সংক্ষিপ্ত নাটক আমার পক্ষে কোনও উন্নতি করতে পারেনি এবং সিপিইউ কখনও সীমাবদ্ধ ফ্যাক্টর বলে মনে হয় নি।

একচেটিয়া দাবি অস্বীকার করুন, এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা gdalwarpকোনও রাস্টারকে কয়েকটি ছোট টাইলগুলিতে বিভক্ত করতে ব্যবহার করবে । মেঝে বিভাজনের কারণে কিছুটা ক্ষতি হতে পারে তবে আপনি যে টাইলস চান তার সংখ্যা বাছাই করে এটি যত্ন নেওয়া যেতে পারে। এটা হতে হবে n+1যেখানে nআপনি যে নম্বরে দ্বারা বিভক্ত করা পেতে হয় tile_widthএবং tile_heightভেরিয়েবল।

import subprocess
import gdal
import sys


def gdalwarp(*args):
    return subprocess.check_call(['gdalwarp'] + list(args))


src_path = sys.argv[1]
ds = gdal.Open(src_path)

try:
    out_base = sys.argv[2]
except IndexError:
    out_base = '/tmp/test_'

gt = ds.GetGeoTransform()

width_px = ds.RasterXSize
height_px = ds.RasterYSize

# Get coords for lower left corner
xmin = int(gt[0])
xmax = int(gt[0] + (gt[1] * width_px))

# get coords for upper right corner
if gt[5] > 0:
    ymin = int(gt[3] - (gt[5] * height_px))
else:
    ymin = int(gt[3] + (gt[5] * height_px))

ymax = int(gt[3])

# split height and width into four - i.e. this will produce 25 tiles
tile_width = (xmax - xmin) // 4
tile_height = (ymax - ymin) // 4

for x in range(xmin, xmax, tile_width):
    for y in range(ymin, ymax, tile_height):
        gdalwarp('-te', str(x), str(y), str(x + tile_width),
                 str(y + tile_height), '-multi', '-wo', 'NUM_THREADS=ALL_CPUS',
                 '-wm', '500', src_path, out_base + '{}_{}.tif'.format(x, y))

3

আপনি গ্রাস জিআইএস এর আর.টাইল ব্যবহার করতে পারেন । ব্যবহারকারীর সংজ্ঞায়িত উপসর্গের ভিত্তিতে নম্বরযুক্ত মানচিত্রের নাম সহ প্রতিটি টাইলের জন্য আর.টিাইল একটি পৃথক রাস্টার মানচিত্র উত্পন্ন করে। টাইলসের প্রস্থ (কলাম) এবং টাইলের উচ্চতা (সারি) সংজ্ঞায়িত করা যায়।

গ্রাস-সেশন পাইথন এপিআই ব্যবহার করে পাইথন কোডের কয়েকটি লাইন বাইরে থেকে r.tile কার্যকারিতা কল করার জন্য, অর্থাৎ স্ট্যান্ডেলোন স্ক্রিপ্ট লেখার প্রয়োজন। আর.এসটার্নাল এবং আর এক্সটার্নাল.আউট ব্যবহার করে গ্রাস জিআইএস প্রসেসিং পদক্ষেপের সময় কোনও ডেটা অনুলিপি হয় না।

সুডোকোড:

  1. গ্রাস-সেশন শুরু করুন
  2. r.extern.out দিয়ে আউটপুট ফর্ম্যাট নির্ধারণ করুন
  3. r. বহিরাগত সঙ্গে ইনপুট ফাইল লিঙ্ক করুন
  4. উপরের সংজ্ঞায়িত ফর্ম্যাটে টাইলস তৈরি করে যা r.tile চালান
  5. আনলিংক r.extern.out
  6. ঘাস অধিবেশন বন্ধ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.