Sunt foarte încântat să anunț {geotargets} versiunea 0.2.0! Pachetul {geotargets} extinde {targets} pentru a lucra cu formate de date geospațiale.
Aș dori în primul rând să recunosc munca puternică a lui Eric Scott pentru pregătirea acestei versiuni. Vreau să subliniez că, deși postarea este pe site-ul meu, acest proiect este foarte mult un efort de echipă.
Puteți descărca {geotargets} din universul R astfel:
install.packages("geotargets", repos = c("https://njtierney.r-universe.dev", "https://cran.r-project.org"))
Ați putea beneficia de utilizarea țintelor și a țintelor geografice dacă faceți analize de date geospațiale care implică rastere sau fișiere de formă, în special cu pachete terra sau stars R. De exemplu, dacă efectuați descărcări mari de rastere, atunci operațiuni precum decuparea, reproiectarea, reeșantionarea și mascarea.
Principalul avantaj al utilizării țintelor și a țintelor geografice este că analiza dvs. se va relua numai atunci când modificați părți relevante ale analizei datelor. De exemplu, ați putea face o mulțime de procesare a datelor geospațiale care se alimentează în aval într-un model de învățare automată pentru a face predicții privind riscul de incendiu. Scrierea cu ținte și obiective geografice înseamnă că dacă modificați părțile codului care se referă la componentele de învățare automată, atunci s-ar schimba numai părțile relevante cu învățare automată. Acest lucru înseamnă că puteți economisi timp evitând rularea procesării de date spațiale costisitoare.
Pentru mai multe detalii despre ce sunt ținte și de ce avem nevoie de ținte geografice, aș recomanda să citiți postarea de blog pentru versiunea 0.1.0, precum și să citiți manualul {ținte}. Ghidul „Începeți în 4 minute” pentru obiective este, de asemenea, excelent.
Pe lângă modificările și îmbunătățirile mai mici, există trei completări principale în această versiune:
- Suport pentru ramificare dinamică.
- Păstrarea metadatelor spatRaster.
- Sprijin al
stars
şistars_proxy
.
Și foarte în știri foarte interesante, avem un nou autocolant hexagonal!
Mulțumim lui Hubert Hałun pentru munca depusă în realizarea acestui lucru împreună, suntem foarte mulțumiți de noul autocolant!
Ramificare dinamică
Principalul plus în această versiune este o demonstrație a utilizării ramificării dinamice folosind o nouă funcție „fabrică țintă”, tar_terra_tiles()
. Acest lucru vă permite să împărțiți operațiunile raster în plăci, apoi să efectuați aceste operațiuni pe plăci și să le combinați împreună. Aceasta înseamnă că putem întrerupe operațiunile raster intensive din punct de vedere computațional, care funcționează în mod pixelat, peste subseturile rasterului. Acest lucru este util atunci când, de exemplu, încărcarea unui întreg raster în memorie și efectuarea de calcule pe acesta are ca rezultat erori de lipsă de memorie.
Ca parte a acestei adăugări, am creat funcții de ajutor:
Acestea ne ajută să definim diferite întinderi pe care le putem transmite ca părți diferite ale ramurilor dinamice. Puteți să vă gândiți la acestea ca pe instrumente pe care le putem folosi pentru a specifica cum să tăiem sau să împărțim un raster în bucăți mai mici pe care apoi să le facem analize separat și să le combinăm mai târziu.
Să le despachetăm pe scurt și apoi să arătăm cum ar fi acestea utilizate în ramificarea dinamică. Mai întâi să citim câteva exemple de date de altitudine din terra și să le trasăm:
f <- system.file("ex/elev.tif", package="terra")
r <- rast(f)
plot(r)
tile_n()
Putem folosi tile_n()
care este cel mai simplu dintre cele trei. Se produce despre n
plăci într-o grilă.
r_tile_4 <- tile_n(r, 4)
#> creating 2 * 2 = 4 tile extents
r_tile_4
#> ((1))
#> xmin xmax ymin ymax
#> 5.741667 6.141667 49.816667 50.191667
#>
#> ((2))
#> xmin xmax ymin ymax
#> 6.141667 6.533333 49.816667 50.191667
#>
#> ((3))
#> xmin xmax ymin ymax
#> 5.741667 6.141667 49.441667 49.816667
#>
#> ((4))
#> xmin xmax ymin ymax
#> 6.141667 6.533333 49.441667 49.816667
# some plot helpers
rect_extent <- function(x, ...) {
rect(x(1), x(3), x(2), x(4), ...)
}
plot_extents <- function(x, ...) {
invisible(lapply(x, rect_extent, border = "hotpink", lwd = 2))
}
plot(r)
plot_extents(r_tile_4)
plot(r)
tile_n(r, 6) |> plot_extents()
#> creating 2 * 3 = 6 tile extents
tile_grid()
Pentru mai mult control, utilizați tile_grid()
care permite specificarea numărului de rânduri și coloane în care să împărțiți rasterul. Aici precizăm că vrem trei coloane și 1 rând:
r_grid_3x1 <- tile_grid(r, ncol = 3, nrow = 1)
r_grid_3x1
#> ((1))
#> xmin xmax ymin ymax
#> 5.741667 6.008333 49.441667 50.191667
#>
#> ((2))
#> xmin xmax ymin ymax
#> 6.008333 6.266667 49.441667 50.191667
#>
#> ((3))
#> xmin xmax ymin ymax
#> 6.266667 6.533333 49.441667 50.191667
plot(r)
plot_extents(r_grid_3x1)
plot(r)
tile_grid(r, ncol = 2, nrow = 3) |> plot_extents()
tile_blocksize()
Al treilea ajutor inclus este tile_blocksize()
care plăci după dosar dimensiunea blocului. The dimensiunea blocului este o proprietate a fișierelor raster și este numărul de pixeli (în direcția x și y) care sunt citiți în memorie odată. Așadar, aranjarea prin multipli de dimensiunea blocului poate fi mai eficientă, deoarece ar trebui să fie încărcat un singur bloc pentru a crea fiecare țintă de plăci. Puteți găsi dimensiunea blocului cu fileBlocksize
:
fileBlocksize(r)
#> rows cols
#> (1,) 43 95
Acest lucru ne spune că se citește în raster în dimensiuni de 43×95 pixeli.
The tile_blocksize
funcția este similară cu tile_grid
cu excepția faptului că în loc să spunem câte rânduri și coloane, specificăm în unități de dimensiune bloc.
Dacă pur și simplu alergăm tile_blocksize()
pe r
obținem extinderile blocului specificat:
tile_blocksize(r)
#> ((1))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.833333 50.191667
#>
#> ((2))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.475000 49.833333
#>
#> ((3))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.441667 49.475000
Care este același lucru cu specificarea dimensiunii blocului pentru rând și coloană la unitatea 1:
r_block_size_1x1 <- tile_blocksize(r, n_blocks_row = 1, n_blocks_col = 1)
r_block_size_1x1
#> ((1))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.833333 50.191667
#>
#> ((2))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.475000 49.833333
#>
#> ((3))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.441667 49.475000
plot(r)
plot_extents(r_block_size_1x1)
Aici dimensiunea blocului este aceeași dimensiune pentru primele două blocuri și apoi un bloc mult mai îngust. Aceasta este diferită de celelalte două metode de plăci.
Aici dimensiunea blocului de coloane este lățimea completă a rasterului.
Deci, am putea avea în schimb ca dimensiunea blocului să fie scrisă în 2 blocuri la rând și 1 dimensiune a blocului pentru coloane:
r_block_size_2x1 <- tile_blocksize(r, n_blocks_row = 2, n_blocks_col = 1)
r_block_size_2x1
#> ((1))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.475000 50.191667
#>
#> ((2))
#> xmin xmax ymin ymax
#> 5.741667 6.533333 49.441667 49.475000
plot(r)
plot_extents(r_block_size_2x1)
Acest lucru funcționează numai atunci când SpatRaster
indică către un fișier — rasterele din memorie nu au o dimensiune inerentă a blocului.
sources(r)
#> (1) "/Users/nick/Library/R/arm64/4.4/library/terra/ex/elev.tif"
#force into memory
r2 <- r + 0
sources(r2)
#> (1) ""
#this now errors
tile_blocksize(r2)
#> Error: (aggregate) values in argument 'fact' should be > 0
Pentru mai multe detalii despre utilizarea acestui lucru în ținte, consultați vigneta țintelor geografice, „Bramificare dinamică cu plăci raster”
tar_terra_rast()
câștiguri a preserve_metadata
opțiunea care atunci când este setată la "zip"
citește/scrie ținte ca arhive zip care includ fișiere „sidecar” aux.json, uneori scrise de terra
(#58).
Sprijin al stars
şi stars_proxy
Noi am creat tar_stars()
şi tar_stars_proxy()
care creează stars
şi stars_proxy
obiecte, respectiv. Acestea sunt în prezent experimentale.
Alte modificări includ:
- Funcție de utilitate creată
set_window()
mai ales pentru uz intern în interiortar_terra_tiles()
. - Îndepărtează
iteration
argument din toatetar_*()
funcții.iteration
acum hard-coded ca"list"
deoarece este singura opțiune care funcționează (deocamdată cel puțin). - A adăugat
description
argument tuturortar_*()
funcții cărora le este transmistar_target()
. - S-a suprimat avertismentul „(rast) ignorate sub-seturi de date” de la
tar_terra_sprc()
ceea ce este înșelător în acest context (#92, #104). - Necesită GDAL 3.1 sau mai mare pentru a utiliza driverul „ESRI Shapefile”.
tar_terra_vect()
(#71, #97) geotargets
cere acumtargets
versiunea 1.8.0 sau mai recentăterra
(>= 1,7,71),withr
(>= 3.0.0) șizip
sunt acum necesare dependențe alegeotargets
(mutat dinSuggests
laImports
)
Am terminat de dezvoltat principalele repere pentru obiectivele geografice, dar vom continua să le dezvoltăm în mod activ. În curând, vom trimite pachetul pentru revizuire de către rOpenSci și, ulterior, vom trimite lucrarea la Jurnalul de Software cu sursă deschisă (JOSS) și apoi vom trimite la CRAN.
În prezent, următoarea versiune se va concentra pe adăugarea de suport pentru:
Puteți vedea lista completă a problemelor pentru mai multe detalii despre ceea ce lucrăm.
Dorim să mulțumim Consorțiului R pentru sprijinul generos al acestui proiect, „{geotargets}: Enabling geospatial workflow management with {targets}”.
De asemenea, am dori să le mulțumim lui Michael Sumner, Anthony North și Miles McBain pentru discuțiile lor utile de-a lungul timpului, precum și lui Will Landau pentru că a scris ținte și că a fost incredibil de receptiv și de ajutor la problemele și întrebările pe care le-am adresat în timp ce am scris {geotargets} .