Vairāk

Vai rastra sadalīšana mazākos gabalos, izmantojot GDAL?


Man ir rastrs (faktiski USGS DEM), un man tas jāsadala mazākos gabalos, kā redzams attēlā zemāk. Tas tika paveikts ArcGIS 10.0, izmantojot rīku Split Raster. Es gribētu FOSS metodi, lai to izdarītu. Es paskatījos uz GDAL, domāju, ka tas noteikti to izdarīs (kaut kā ar gdal_translate), bet neko nevaru atrast. Galu galā es gribētu paņemt rastru un pateikt, cik lielos (4KM līdz 4KM gabalos) es vēlētos, lai tas tiktu sadalīts.


gdal_translate darbosies, izmantojot opcijas -srcwin vai -projwin.

-srcwin xoff yoff xsize ysize: Atlasa apakšlogu no avota attēla kopēšanai, pamatojoties uz pikseļu/līniju atrašanās vietu.

-projwin ulx uly lrx lry: Atlasa apakšlogu no avota attēla kopēšanai (piemēram, -srcwin), bet ar stūriem, kas norādīti ģeogrāfiski norādītajās koordinātās.

Jums vajadzētu izdomāt pikseļu/līniju atrašanās vietas vai stūra koordinātas un pēc tam pārvērst vērtības, izmantojot gdal_translate. Kaut kas līdzīgs zemāk esošajam ātrajam un netīrajam pitonam, darbosies, ja jums būs piemērota pikseļu vērtību un -srcwin izmantošana, būs nedaudz vairāk jāstrādā, lai sakārtotu ar koordinātām.

importēt os, gdal no gdalconst importa * platums = 512 augstums = 512 tileize = 64 priekš i diapazonā (0, platums, tileize): j diapazonā (0, augstums, tileize): gdaltranString = "gdal_translate -of GTIFF -rcwin "+str (i)+", "+str (j)+", "+str (tileize)+", "+str (tileize)+" utm.tif utm _ "+str (i)+" _ " +str (j)+". tif" os.system (gdaltranString)

Mans risinājums, pamatojoties uz @wwnick, nolasa rastra izmērus no paša faila un aptver visu attēlu, vajadzības gadījumā samazinot malu flīzes:

importēt os, sys no osgeo importēt gdal dset = gdal.Open (sys.argv [1]) width = dset.RasterXSize height = dset.RasterYSize drukas platums, 'x', augstums tileize = 5000 i diapazonā (0, width , tilees): j diapazonā (0, augstums, flīžu izmērs): w = min (i+tileize, width) - ih = min (j+tileize, 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)

Ir komplektā iekļauts python skripts, kas īpaši paredzēts rasteru retaling, gdal_retile:

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] [-piramidOnly] [-r {near/bilinear/cubilinep/ lanczos}] -līmeņu skaitslīmeņu [-izmantotDirForEachRow] -targetDir TileDirectory input_files

piemēram:

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


Jūs varat izmantot GRASS GIS r.tile. r.tile ģenerē atsevišķu rastra karti katrai flīzei ar numurētiem karšu nosaukumiem, pamatojoties uz lietotāja definētu prefiksu. Var noteikt flīžu platumu (kolonnas) un flīžu augstumu (rindas).

Izmantojot zāles sesijas Python API, ir nepieciešamas tikai dažas Python koda rindas, lai izsauktu r.tile funkcionalitāti no ārpuses, t.i., lai rakstītu atsevišķu skriptu. Izmantojot arī r.external un r.external.out, GRASS ĢIS apstrādes posmā nenotiek datu dublēšanās.

Pseido kods:

  1. inicializēt zāles sesiju
  2. definējiet izvades formātu ar r.external.out
  3. saites ievades fails ar r.external
  4. palaist r.tile, kas ģenerē flīzes iepriekš definētajā formātā
  5. atsaistīt r.external.out
  6. slēgt zāles sesiju

@Aaronam, kurš jautāja:

Es ceru atrast @wwnick atbildes gdalwarp versiju, kurā tiek izmantota opcija -multi, lai uzlabotu daudzkodolu un daudzpavedienu darbības

Neliela atruna

Tas izmantogdalwarp, lai gan es neesmu pilnīgi pārliecināts, ka sniegums ievērojami palielināsies. Līdz šim esmu bijis saistīts ar I/O - šī skripta palaišana uz liela rastra, sagriežot to daudzās mazākās daļās, nešķiet intensīva CPU, tāpēc es pieņemu, ka sašaurinājums raksta uz diska. Ja plānojat vienlaicīgi pārprojektēt flīzes vai kaut ko līdzīgu, tas var mainīties. Šeit ir padomi par tūningu. Īsa spēle man nedeva nekādus uzlabojumus, un CPU nekad nešķita ierobežojošs faktors.

Atruna malā, šeit tiks izmantots skriptsgdalwarplai sadalītu rastru vairākās mazākās flīzēs. Grīdas sadalīšanas dēļ var būt daži zaudējumi, taču to var novērst, izvēloties vajadzīgo flīžu skaitu. Tas būsn+1kurnir skaitlis, ar kuru jūs dalāties, lai iegūtutile_widthuntile_heightmainīgie.

importēt apakšprocesu importēt gdal importēt sys def gdalwarp (*args): atgriezt apakšprocesu.check_call (['gdalwarp'] + saraksts (args)) src_path = sys.argv [1] ds = gdal.Open (src_path) try: out_base = sys .argv [2], izņemot IndexError: out_base = '/tmp/test_' gt = ds.GetGeoTransform () width_px = ds.RasterXSize height_px = ds.RasterYSize # Iegūt koordinātas apakšējam kreisajam stūrim xmin = int (gt [0]) xmax = int (gt [0] + (gt [1] * width_px)) # iegūt koordinātas augšējā labajā stūrī, ja gt [5]> 0: ymin = int (gt [3] - (gt [5] * height_px)) cits: ymin = int (gt [3] + (gt [5] * height_px)) ymax = int (gt [3]) # sadalīt augstumu un platumu četrās - ti, tiks iegūtas 25 flīzes tile_width = (xmax - xmin) // 4 tile_height = (ymax - ymin) // 4 x x diapazonā (xmin, xmax, tile_width): y diapazonā (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ēt gdal importēt 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 resid_x = xsize % tile_size_x resid_y = ysize % tile_size_y # A daļai i diapazonā (complete_x): j diapazonā (complete_y): Xmin = i * tile_size_x Xmax = i * tile_size_x + tile_size_x - 1 Ymin = j * flīze Ymax = j * tile_size_y + tile_size_y -1 # do plākstera izveide šeit 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 # B daļai j diapazonā (pilnīgs_y): Xmin = tile_size_x * complete_x Xmax = tile_size_x * complete_x + resid_x - 1 Ymin = j * tile_size_y Ymax = j * tile_size_y - tile_size_ch izveide šeit com_string = "gdal_translate -of GTIFF -srcwin" + str (Xmin) + "," + str (Ymin) + "," + str (resid_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) # C daļai i diapazonā (pilnīgs_x): Xmin = i * tile_size_x Xmax = i * tile_size_x + tile_size_x - 1 Ymin = tile_size_y * complete_y Ymax = tile_size_y * complete_y + resid_y - 1 com_string = "gdal_translate -of GTIFF -srcwin" ) + "," + str (Ymin) + "," + str (tile_size_x) + "," + str (atlikums_y) + "" +  str (ceļā) + str (ievades_faila nosaukums) + "" + str (izejas ceļš) + str (izejas_faila nosaukums) + str (Xmin) + "_" + str (Ymin) + ".tif" os.system (com_strin g. "," + str (atlikums_y) + "" +  str (ceļā) + str (ievades_faila nosaukums) + "" + str (izejas_ceļš) + str (izejas_faila nosaukums) + str (Xmin) + "_" + str (Ymin) + ".tif" os.system (com_string)


Skatīties video: Python Scripting for Exporting Multiple Rasters into Time Series (Oktobris 2021).