Daha çox

GDAL istifadə edərək rasteri daha kiçik hissələrə ayırırsınız?

GDAL istifadə edərək rasteri daha kiçik hissələrə ayırırsınız?


Bir rasterim var (əslində USGS DEM) və onu aşağıda göstərilən şəkildəki kimi daha kiçik hissələrə bölmək lazımdır. Bu, ArcGIS 10.0 -da Split Raster alətindən istifadə etməklə həyata keçirildi. Bunu etmək üçün bir FOSS metodundan istifadə etmək istərdim. GDAL -a baxdım, bunu edəcəyini düşünürdüm (birtəhər gdal_translate ilə), amma heç nə tapa bilmirəm. Nəticədə, rasteri götürüb nə qədər böyük olduğunu (4KM -dən 4KM -ə qədər) bölünməsini istərdim.


gdal_translate -srcwin və ya -projwin seçimlərindən istifadə edərək işləyəcək.

-srcwin xoff yoff xsize ysize: Piksel/xətt mövqeyinə əsasən kopyalamaq üçün mənbə şəklindən bir alt pəncərə seçir.

-projwin ulx uly lrx lry: Kopyalamaq üçün (-srcwin kimi), lakin küncləri coğrafi istinad koordinatlarında verilmiş mənbə görüntüsündən bir alt pəncərə seçir.

Piksel/xətt yerlərini və ya künc koordinatlarını ortaya qoymalı və sonra gdal_translate ilə dəyərlərin üzərinə keçməlisiniz. Aşağıdakı sürətli və çirkli python kimi bir şey, piksel dəyərləri və -srcwin istifadə etmək sizin üçün uyğundursa işləyəcək, koordinatlarla həll etmək bir az daha iş olacaq.

gdalconst -dan idxal os, gdal idxal * eni = 512 hündürlük = 512 plitənin ölçüsü = aralığa görə 64 (0, en, plitələrin ölçüsü): j aralığında (0, hündürlük, plitələrin ölçüsü): gdaltranString = "gdal_translate -of GTIFF -srcwin "+str (i)+", "+str (j)+", "+str (plitələr ölçüsü)+", "+str (plitələr ölçüsü)+" utm.tif utm _ "+str (i)+" _ " +str (j)+". tif" os.system (gdaltranString)

@Wwnick -ə əsaslanan həllim, faylın özündən raster ölçülərini oxuyur və lazım gələrsə kənar plitələri kiçildərək bütün görüntünü əhatə edir:

os osdan idxal edin, osgeo -dan sys idxal edin gdal dset = gdal.Open (sys.argv [1]) genişlik = dset.RasterXSize hündürlük = dset.RasterYSize çap genişliyi, 'x', hündürlük plitələrinin ölçüsü = 5000 aralığında (0, en) , plitələr ölçüsü): j aralığında (0, hündürlük, plitələr ölçüsü): w = min (i+plitələr ölçüsü, en) - ih = min (j+plitələr ölçüsü, hündürlük) - 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)

Xüsusilə, gdal_retile retters üçün retiling üçün bir paket python skript var:

gdal_retile. /CInt32/CFloat32/CFloat64}] '[-tileIndex tileIndexName [-tileIndexField tileIndexFieldName]] [-csv fileName [-csvDelim ayırıcı]] [-s_srs srs_def] [-pyramid {//kublar/yaxın] lanczos}] -səviyyə sayı səviyyələri [-useDirForEachRow] -targetDir TileDirectory input_files

məsələn:

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


GRASS GIS -dən r.tile istifadə edə bilərsiniz. r.tile, istifadəçi tərəfindən təyin olunan prefiksə əsaslanaraq nömrələnmiş xəritə adları olan hər bir kafel üçün ayrı bir raster xəritəsi yaradır. Plitələrin (sütunların) genişliyi və plitələrin hündürlüyü (satır) müəyyən edilə bilər.

Python API-dən istifadə edərək r.tile funksiyasını kənardan çağırmaq, yəni müstəqil bir skript yazmaq üçün Python kodunun yalnız bir neçə sətrinə ehtiyac var. R.external və r.external.out istifadə edərək GRASS GIS işləmə mərhələsində heç bir məlumatın təkrarlanması baş vermir.

Yalan kod:

  1. ot sessiyasını başladın
  2. r.external.out ilə çıxış formatını təyin edin
  3. giriş faylını r.external ilə əlaqələndirin
  4. plitələri yuxarıda göstərilən formatda yaradan r.tile işləyin
  5. r.external.out bağlantısını kəsin
  6. yaxın ot sessiyası

Soruşan @Aaron üçün:

İnkişaf etmiş çox nüvəli və çox işlənmiş əməliyyatlar üçün -multi seçimindən istifadə edən @wwnickin cavabının gdalwarp versiyasını tapacağına ümid edirəm.

Yüngül İmtina

Bu istifadə edirgdalwarpamma tam əmin deyiləm ki, çox performans qazanacaq. İndiyə qədər I/O bağlı idim - bu skriptin bir çox kiçik hissələrə kəsilməsi böyük bir raster üzərində işlədilməsi CPU sıx görünmür, buna görə də darboğazın diske yazdığını düşünürəm. Plitələri və ya bənzər bir şeyi eyni vaxtda yenidən proyeksiya etməyi planlaşdırırsınızsa, bu dəyişə bilər. Burada tənzimləmə məsləhətləri var. Qısa bir oyun mənim üçün heç bir inkişaf gətirmədi və CPU heç vaxt məhdudlaşdırıcı amil kimi görünmədi.

İmtina bir yana, burada istifadə edəcək bir skript vargdalwarpbir rasteri bir neçə kiçik plitəyə bölmək. Döşəmə bölgüsü səbəbiylə bir az itki ola bilər, ancaq istədiyiniz kafel sayını seçərək buna diqqət yetirilə bilər. Bu olacaqn+1haradanalmaq üçün bölüşdürdüyünüz rəqəmdirkafel_ genişliyikafel_yüksəkliyidəyişənlər.

idxal alt prosesi idxal gdal idxal sys def gdalwarp (*args): subprocess.check_call (['gdalwarp'] + siyahı (args)) src_path = sys.argv [1] ds = gdal.Open (src_path) cəhd edin: out_base = sys .argv [2] IndexError istisna olmaqla: out_base = '/tmp/test_' gt = ds.GetGeoTransform () width_px = ds.RasterXSize height_px = ds.RasterYSize # Sol alt künc üçün koordinatlar alın xmin = int (gt [0]) xmax = int (gt [0] + (gt [1] * width_px)) # gt [5]> 0 olarsa yuxarı sağ künc üçün koordinatlar alın: ymin = int (gt [3] - (gt [5] * height_px)) başqa: ymin = int (gt [3] + (gt [5] * hündürlük_px)) ymax = int (gt [3]) # hündürlüyü və eni dördə bölün - yəni 25 kafel kafel_ genişliyi = (xmax - xmin) // 4 tile_height = (ymax - ymin) // 4 aralığında x üçün (xmin, xmax, tile_width): y aralığında (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))

import gdal import os def create_tiles (tile_size, input_filename, in_path = "/media/Data/avinash/input/", out_path = "/home/nesac/PycharmProjects/GIS_Data_Automation/data/tile/"): ds = gdal.Open ( in_path + input_filename) band = ds.GetRasterBand (1) output_filename = 'tile_' xsize, ysize = (band.XSize, band.YSize) tile_size_x, tile_size_y = tile_size tile_list = {} complete_x = xsize // tile_size_x complete_y tile_size_y residue_x = xsize % tile_size_x residue_y = ysize % tile_size_y # aralığında i üçün A hissəsi üçün (tam_x): aralığında j üçün (tam_y): Xmin = i * kafel_size_x Xmax = i * kafel_size_x + kafel_size_y - 1 Ymin = j * Ymax = j * tile_size_y + tile_size_y -1 # burada yamaq yaradın com_string = "gdal_translate -of GTIFF -srcwin" + str (Xmin) + "," + str (Ymin) + "," + str (tile_size_x) + ", " + str (tile_size_y) +" " +  str (in_path) + str (input_filename) +" " + str (out_path) + str (output_filename) + str (Xmin) +" _ " + str (Ymin) +". tif "os.system (com_string ) x_residue_count = 1 y_residue_count = 1 # aralığında j üçün B hissəsi üçün (tam_y): Xmin = kafel_size_x * tam_x Xmax = kafel_size_x * tam_x + qalıq_x - 1 Ymin = j * kafel_size_y Ymax = j * kafel_size_y + 1 ədəd burada yaratmaq com_string = "gdal_translate -of GTIFF -srcwin" + str (Xmin) + "," + str (Ymin) + "," + str (artık_x) + "," + str (kafel_size_y) + "" +  str (in_path) + str (input_filename) + "" + str (out_path) + str (output_filename) + str (Xmin) + "_" + str (Ymin) + ".tif" os.system (com_string) # C hissəsi üçün i aralığında (tam_x): Xmin = i * kafel_size_x Xmax = i * kafel_size_x + kafel_size_x - 1 Ymin = kafel_size_y * tam_y Ymax = kafel_size_y * tam_y + qalıq_y - 1 com_string = "gdal_translate -of GTIFF -src" ) + "," + str (Ymin) + "," + str (kafel_size_x) + "," + str (qalıq_y) + "" +  str (yolda) + str (giriş_filin adı) + "" + str (çıxış yolu) + str (çıxış_filenadı) + str (Xmin) + "_" + str (Ymin) + ".tif" os.system (com_strin g) # D hissəsi üçün Xmin = tam_x * kafel_size_x Ymin = tamamlandı_y * kafel_size_y com_string = "GTIFF -srcwin" + str (Xmin) + "," + str (Ymin) + "," + str (qalıq_x) + "," + str (qalıq_y) + "" +  str (yol daxilində) + str (giriş_film adı) + "" + str (çıxış_yolu) + str (çıxış_filenadı) + str (Xmin) + "_" + str (Ymin) + ".tif" os.system (com_string)

Videoya baxın: GDAL Tutorial #2: Converting, Resampling, Reprojecting, Clipping