From 75c48a29fedc2c833e9e35e16cb36b1eebb500ea Mon Sep 17 00:00:00 2001 From: edzer Date: Tue, 27 Aug 2024 15:41:25 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20r-spatia?= =?UTF-8?q?l/stars@b4e0501cd59161721cdba7082ce75447acacb448=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/stars2.html | 10 +++++----- articles/stars5.html | 12 ++++++------ .../figure-html/unnamed-chunk-1-1.png | Bin 19346 -> 18481 bytes .../figure-html/unnamed-chunk-10-1.png | Bin 115582 -> 114760 bytes .../figure-html/unnamed-chunk-12-1.png | Bin 23928 -> 23141 bytes pkgdown.yml | 2 +- reference/read_stars.html | 8 ++++---- reference/st_rasterize-3.png | Bin 22653 -> 22353 bytes reference/st_rasterize-4.png | Bin 22443 -> 22080 bytes reference/st_rasterize-5.png | Bin 23013 -> 22627 bytes search.json | 2 +- 11 files changed, 17 insertions(+), 17 deletions(-) diff --git a/articles/stars2.html b/articles/stars2.html index c04b52e8..4b8912fe 100644 --- a/articles/stars2.html +++ b/articles/stars2.html @@ -282,7 +282,7 @@

Stars proxy objects## downsample set to 18

##    user  system elapsed 
-##   0.997   0.172   0.665
+## 0.958 0.210 0.678

This takes only around 1 second, since only those pixels are read that can be seen on the plot. If we read the entire image in memory first, as we would do with

@@ -390,12 +390,12 @@

Lazy evaluation, changing eva ## [[1]] ## adrop(x = x, drop = drop) ## attr(,".Environment") -## <environment: 0x5626b33711b8> +## <environment: 0x561d51ed51d0> ## ## [[2]] ## x[i = i, 1:10, 1:10, , drop = drop, crop = crop] ## attr(,".Environment") -## <environment: 0x5626b77352b0> +## <environment: 0x561d51e2f4b0>

Doing this allows for optimizing the order in which operations are done. As an example, for st_apply, reading can be done sequentially over the dimensions over which the function is applied:

@@ -458,14 +458,14 @@

Plotting with changed evaluation ## st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, ## PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname) ## attr(,".Environment") -## <environment: 0x5626b71d7eb8> +## <environment: 0x561d518a57d0> ## ## This object has pending lazy operations: dimensions as printed may not reflect this. system.time(plot(s2.ndvi)) # read - compute ndvi - plot ## downsample set to 18

##    user  system elapsed 
-##   0.707   0.174   0.383
+## 0.693 0.158 0.367 diff --git a/articles/stars5.html b/articles/stars5.html index 68ee39ec..4a9f6b29 100644 --- a/articles/stars5.html +++ b/articles/stars5.html @@ -90,9 +90,9 @@

Rasterizing an sf vector o ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. -## file281874a3fb9 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 +## file27f483a3a2a [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 ## NA's -## file281874a3fb9 [1/km^2] 4808 +## file27f483a3a2a [1/km^2] 4808 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 162 123829 5000 NAD83 / North Carolina FALSE [x] @@ -261,9 +261,9 @@

Reprojecting a raster## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. -## file281874a3fb9 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 +## file27f483a3a2a [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 ## NA's -## file281874a3fb9 [1/km^2] 4808 +## file27f483a3a2a [1/km^2] 4808 ## dimension(s): ## from to refsys point values ## x 1 162 +proj=laea +lat_0=34 +lon... FALSE [162x61] -2210936,...,-1371611 @@ -295,9 +295,9 @@

Warping a raster## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. -## file281874a3fb9 [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 21.24828 +## file27f483a3a2a [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 21.24828 ## NA's -## file281874a3fb9 [1/km^2] 36155 +## file27f483a3a2a [1/km^2] 36155 ## dimension(s): ## from to offset delta refsys x/y ## x 1 380 -2188110 2098 +proj=laea +lat_0=34 +lon... [x] diff --git a/articles/stars5_files/figure-html/unnamed-chunk-1-1.png b/articles/stars5_files/figure-html/unnamed-chunk-1-1.png index 8fda78673130a30cf4d528d9527b409504395d50..2f711387268ff04f5d5d53ac3f5a8957823dad38 100644 GIT binary patch literal 18481 zcmeHv2~?A3w{9G%Vzss^DpOm7R6r0!fiO8#F)~$VltE=uW(Z*>ai(`Dyl(rQ zd!IK{974N{j@y(xQ!B~m<~c5kTHakQ8EcQhmm^h@m8y_ItASzCkM7t$I7)-2yf-QU zgWW5jLGkarzmxprX9H5wM8VYjixgf6DPBeJE@L^e>Hv+AsYA8J#x4&s5Skx0Lm+cy z1suuc8Qmmk6t6}|H!r!!H^vxg)3`NMQy7h;r~J9(=a*VJPBrH+<8U|Zn6}_Cv@>DX zOgnj|%y{}nRPMmKE9L`bs=%n%?WO6y_8*@(>M61|En8s=2| zxQQuEK5^H~J@|4bbn-rH0~|Gys!hr83~r)QjA;FND*GhM1rG+YKi+QEx_qd)O2FTz zCv-M8ZjXzb#)N3;@8qxX$q)-(UXz2|zOYUUT)fL)X-O!X_xw`BWR@;m=`-=DbY!vJS1FBqM7B-8j;)*-SNxa-HuU`S>#AibG##I9T)w0_IXB zyk^JFsv2XO()fy%rk1=t`@L5|G*iK1knj4aic7+44z{l*_hXhCp%l!sBvxWltPOGI z<7x=@A-JZa|9Dcb1XQ=EhVadO%kpw5v!M$Qp{BU8jAV2& zi#-{VNwVS<*$J1n&wYRWiLp_8_G-6>tPO`+Dju-lGLy=DQ4mvWq=jEg&(W@fMV`ip zGgAH;g#gMo||B$p(#Nxr8{o|>kX-p|@RiD6~KO|)qhd!sCfPloA9 zOTHMq1Ol!`w> z3oPv4S011hC-s`t#qw1I@9l)5x-BE<9J~4%F_st{WT(eBtX zH!|a&t0}l)pYqvdB-7KarWZ03od#zdqhgx15$N+oM1)d8)Nu?JDoBedqu@&mtLz=8 zOf>9kmfmdVp^szC@(=iEwG*rD=V_e<`s@?msra~3dF5o>({2iDb?I~+V#bu*5EUk>rdpYP7mht5DvdLjuqg*NJbd4}2+ku@qj9NNLY_C!k zytU)cmC@tcHYkhd>mWSewwjb4rcl zBjK9Q2jWg)(3r8<4!JWR3hi&&^$0M_Ivs4*K-~AlwyO%LEs>X+XVfDlf!<3=H>8|5 z9aflmWj|#CGjsH=)*uw<2s0G+Z%1W4SFlb?pXm&Z-Noxect)PERc$S5BSoSs#3k9;$)oW_b6X{gq2#<9r{GsZ(T+#fQs z2?KGLh_c&JQJ6_{9zk}d!*$AJUqp4jV~F!cCfyRLysSZExV&DHWCq9!_~^PxEc+6C z>aluk3u1=}dksD9aT0NDw>2`Pgc4I*HnXELk&c@wT8_f_v^0})2Sgtfs_1{x(MiG_U{< zM=Aq~f8`J8FqxAca-DQI>f$o08qKRdm~q@bLv>Fhu+Sj=Ferxuh-~|O&&MK5@Tw`Lu9we2~p}z+LW{N z>(m4JDsZ<$d~t;H^i0CcF1X3`fC%5%r;fm97z#PXBPPo#2xW27_R^WV(8-voWh)|e zOk)I}q?p-rA&v4V20fiP--(#rwnfYJLUku0I(CckMcRVUhC`V=Wq(RMTBCq|$imui zuG4=VWv|~4(#|wB)YX77&$G)K`oIu}tztymVYZwu!J`IOkBCVI<+qU`$x}=G#CJ7R zrZFv%(6goZxEWlQ83xOhrCUt9xPy!eTv1=t zWaR;|Pr*Xeo$8ptgaVTbO+yGDd<%YZp&o>jMDQQNg%Z9;A&9jjZvn(3T5vObF5zrd z#G`uZiv&c)^3Y8K(~mbo(57ax9RiXbZfe?5RS4s1&R>M z;*Cb+7K&+pXidd&kkfp8<_Zdi+*VCFX15??78U}Y!K|k^9t~XO-gwpFmTWzx%rTe2 zpj7!8IiE5#^2`)aR!1x!X+-uLn>jvMw&OnBMio>l?1yAVz3H-#>pgZ$9J>YK{|ts7 z9#puKgR>6pxW>N|8iuc~ujTmck4$2nQ zsLPFrrtMVPLY8Z4yU^vH=jzBW3*L0Q`MRBMNy-h?C^+5%!c&wRQzIfUOy#p%0-`^r7xgq=6Vu6j6YfC&OeXO|VXx>KIWf-5%4CvzxjKl(p&0U)(bl{i z!reG$;+G3=iRc%S9-za*Rz1@6Ycoeb+^o*fP-QH4CNumNJ!Tx*pE~y8*bHO&I@DUf z&S++2l8tWc-dG4kQy~4Gkesn3GgF)^t&};0_HNlQTF= z)Sx6*kV;e{)Y_tiKH_*tsXD9@amyfarcj~JQJB5)ZDYzoa;k^m+tAFB`P$y`N(m_N zN==9k`{fzxTcA-BZn_BJCg^(dh~rc~Pv+&j-UWLr(}QTExQW|oV;6yX-^M!2SOvLK zGKE4+P7+|G@pQ+fUO`Br^M$387`g?onOu<(V@13;Yp)&{6T(Cr@Wpj^RN6;>%I2xG zn@S6 z%|}&`e?1XBaP&FdaOCl$vo*q-(PzMmU24e;+|% zP?G5K@WFfh~7(}kR0*$)!Xe6p@A1Tg?h_FH}^iomk_Hf<}sF-d* zGDg39soYeRx7y8nxfU^Vb1Ec=o+>YVag*V8FoI#)^iD*XSRE8!?Zp+{gW}6RuyNkY z3Qsyi!@T&9gHH24*rB&YCXy2;RRu#(Q@rm@j@H&yX+Rzk1OhYR=&`x=9W43eqDUlz>*Oj$Lia{#6MH3bev9?6{E2?#pnPc zwnTaHshwO*%o*a$;BtHI0?DTbeLGb(mx0dSkpS3Khc@1v-eIE`NxM6`$vdwwU}H@zLEgY8QFp$@wgn z#h7V|mKxj3kv+Q0Eux8Q&q#VKLzGMk%S(go>kRL0xERpqs zAS>QFvhd9m9&5=NsA!vVfn*FbP}sm^Sr#=XgCI+Ar$)%%75;-Yyzs$XX4O=>i0{O=P&|C zg79TR6X^lV&jzP6_!fZ(J24u@6$vp$m*EZQ4Av;s-^XpAfz}77>K`+(eNS!Tf}-Ov z?q#nzOAZO#@hxy(yaTMij+oox&dpBs7SXLrj?JFKfEE)0 zH9g!uDqsDz8GpzxDfR-_WPkk{ctiG^I+B%rEczTq`7|=5lyZtkvfWN}&m{f=n>B-1 zqb^kUn=E9IfcILCrYO^J7sU@`W|ne5r5HhhR>>Vwa3e!5M8p04a%Gdr;r7!#_~v@| zg$a3^xX+c`DyPPimVy&93lu=!JD=TeY2V8sltbF!N~!V@=ans?y)XO>>utb+_j5J0fyWPzh>s{ol0Tq@s-58@nia5z9xW3T*N= zp?xtC7RXH^s|yBNJits*RJV~PEoQHvQ8y-&BV&_19#3eEbRf3p75E-l1JD9_ogK)& zX#FnO4WFdexusN*bvqbr>boB$bpSHXotoX0lkXw}DbtbUJ&4mR9~0Z5tt`&8BZORT zJxP?!RB6Vc`NT*UjH=SiG*wqo(xXAjB1ni?6@hA%G4ZB#`pVfgj_k4C7G>sbl<@&VWIsU;a^DZ@;{&d`yOzTl@E}CTsa{^ ziDeiqKMwZ3TM-}_ko?S6ff+zB(#<8(e>5c9qk-u z|Cz@1nx8qJ!7=YHy$`?f?VQAK!MCR)W5+m_#;7Ek=V&Snm6Fdh?2R;H>Q9D`r4FeT z{W&Tt{`kwV{rQ6TC8Z#V(B{TFu?gJ_hT+^iisJ5=VSA4{bQ1i;vHkpkONPht9LT0m z-@UjB9eFms* zj=Xb+pqEdQ7_K={Ejj&@T8anLo2{y<+D6}R2N*}}+_WBCwTm9v&`_j}v+@!5$`j#m z`U&dLbT+Ag*Bh&o_I^9tuF5TFG!;cbkA)miO2jIeH;y??0S@+G(4|L{53^R`jl`)eUrX3C>xy!TVg?w)+=#mM$JXih4=U2{Ho zkl_R_V>lg_T*r%HMjE+2%IcrQ8#byj{%tPQ^*FF|f`of~8F-SwM2&akWg)^U`pQ2X zAOK1zu7Wu20f2kJ0k)kiZJXrFcei)}=N?YkL=L62X&g+mNZ}^A6_ETXn(d=uzTNzx zX)uc^OW!V;3H^5f|7S+LxCa3B_HNDjLW;iyi4pMa=`-HN&Wx>P#{!v^-QjCBueMeP zeZKy>ZP4Ug^yeyrZvFuQhl+50eSIfOi*M6BL%9YiihP$02|w0aouPI%c*WdJFE_1n zo9tD*KxlJbG-Uf9Hbfdq5{tsnbmZlZKvK+@QQPRO4f2V@KjY`0&HV?4O9?!ty>rt% z-H;jvbA>%;a55tfLZ*J^a5$xVa&tS!fw_ahUB8BR)N{FkjIAxtvWKqR0l$%wuB(_v&SSIzh>?E16@Ieb;OfT-vL6X z^xvUtDFj{xCgbw*@+8?AhRckO0U_};%-SVkl!xx_ z_WNs7#^<8V(Rd9Sz-KgiQMBCJpXivz){z_%g3sS57AyRbr0Jg(08i1~sonnJgZ+-> zecV=soR4$SNQ*k-uHIgM!`e5`+b#oCKz~C;{*T@M9pN`*fR9TQA3InYN9^1jf6qVu z&dZXL_V62L56u~S;i@C{AKZPfCn5MUs6e)8d@qxkKO9j5+Z2Bsceci1bbE?o;`pc2 z{g2|;*|Qm<`?PHo@ajUJ#onafp-Of+tf$9F_#r2dR1ww`1`GI_w&>)Af9QEQy<5zk>BZfyC*X;6kn%kZ zEjdYz;Tm~&kg(_c`T3rN!Xganc|j6@cleElfPerHjKkxzq9>bkdhw%SJx4H}I%&E^ zxEya7ZtUg2&QGSBo?hXPE6)Nv&M#4f=(`fyx`PbYsHR)&HKzgvu^#i@1A!>!eD->u zG=Dg)Nm$cCo1dR2vjH>?L9?kH9S)4G`teqTHUOOcLdEmR{d@AC0H=oZaDXbZ5uswc z6RraQjtx=kKON00MfUwk#;O70co<9=;PV{-;AO+wG+^h+Qd=r&G`!*v^uoJ899-!y zL~R$LC?F8h{X7gqKeA~JsUnd&!*3)XnwxnPb5LP3$i-j}dl=4gDsiTlTl3D5dJ=v} zw?}p4CyjR&kbvv6I6_#HcX5`n2dIsAHhaQwZbYm1pIp%X6T*YrkuV&n37l~G?#;t~ zW2vl(MG=azb+?{UA|s(NJi5w_vDG15v^baL0o=a()Ui=e39$)4ToIVnB_;Nb85eI!I_C~PP2jkc422}e75P*0le+y&UrI_qU(mO*5yhXJO(aU;?X7gZAT9|v z_!cNQ!(&eyhC&!ym2`J*+T9Jpf7#QpFOc+r^A^Z1G}oYG)UR*@a-#TIrpUo@2LMZe z*}yhKL&E^GvLdhp>#8__;fK$5br!f6cs1!@11N{Up~gN?U~B@|I%I!$!(2V->FfVV z7_a2I6?FXJ+Lho)lygRVbGjbT4nGip92nyOZS@%12sD>O@{NW?k8yz6kD-p%Qla_= zhO=U9y$#eY-I%J@e|)@ab8tv_csS6H`%;X9+z9Mrz~UgoV-FrhD;1ZNAh`zN5fOf; zRu}I6cUgN$7dAIvbN=lQ81K6hD_zbuCS-Y$uz>BFiV~olI+h+?#cb71qCL9`opTyq z&b@;ILU-+zl2=xAa=tr-8Gb`OM%B?0FyOfsAb3C%;>?L^0jgL2lue3#rtJQhz_+7e zW4G%boh48sjg&}=gKr)+dxJ`dOUU{cME`%R&iO@FgyQ~R!a*@^h+~efNCmd-f`{}wn;FaRfcAzAKHmB8^9#!o3h(RbL$n5pg;qX zyxN-tXKckp-tFuwS5VFB?&}KxlmpE1OY_lJ$cz@Yv{>zD?E8rg<3I18l%y$3#Wg^F z-t%V{k$w9oJAsl21dZ3B^yaW+{_7P&{8PsK2){f>NR3Db{ZKpy{{Pd16t zSd(^2W4{`vS+p1f%8FzD4?h)Q0`!lwGvX7Bkp^H0Z)B$egn{O^R- zc<(29zR0J9hEKm@rHG_bVtSWfN}(7)->{SW7ODP4L4%(SZN zn>6BkgSmn3OB`qr087RIA8*q(u4th86(;>8jFxtHIQ)Ez{j-HEP4_k*bZPho4KGwvwt-ab;*?;;p~3B<~-#m zN#}GA){uJ#z>J#ICgB;L3XUYMADj9=BM36Y2mH3XaQSe8LyCS-) z4|mji36;)b8)uDx%S#joj{=Scn0?pkC3G%tx}>W{q@I-n86nxExq5%Eq5_Un-q zeWE*?ZLm_f0;rP_8tESGQJSE!1bU|-FI3^7r*tv{$4HgsS;Dc@;=a7-F`LU(`zp*|E?Jpx5ag&$XM)DFXi{8Zm^4r+wU&Dvguqm ze$jan#1gC2_Q`tmj{y&8|E`n+VI-*?`>7x*U&Eb&ylK_0aw`By*$uQ@t=gcYz6x!W z&Te!AyZJLnLHAlqsokq@I?W%8zz3nF=c+fP zH~cXPh&cc;2zpI)x)s5k3T6fCF@-Hs<)@^puvwBIsd2U)m-}nIKz_BZs>&~*crmUb zb%2Azzq0&v9bNK{6V7LBei(f|&lGu>m3#)Ycq%y}*o^1RM^x z8{?vhoajXAq&F{FMbp4aSroQw$>A~Fe>B!#j8z(tjZs`gWFFj-vf2*KZ%`fUJlqxHR-V<2eAoJ16O5spThK(g*<)0dH*;e z7YJ)fGp6QzIy%-VsJPogCUn)O8wX?xIFyJ6p`0I2^)XWF)NW2L1{xB$PHN8MGsWGx zAW2k!i5p{UM@z6i7$syO+p8OtA_uM_=pn#!yD`BTApGEe#3H^H=N3o}`{{j;4gfjg z>SFM3NfF>VurV@9v9KRGMe&5ez6bV2+hD5=D<;E*EL@`_bZt%OtvYv29RLD{z0SuvpW9 z22D^yc{prT6z)d>4zcMrdK44t=y;LqZ8A?mi3ww#?k;)=K4vQ2;8IWurLx-iU zo0GXT;`QC#-Qb#`M~j)E+xZ+F6;bT&&GFF&zS76o|JI29zsi|l(4{6FoSf+C?KR>n zNC)w51rc1%L(iC)n9)>Fw~l=I9ldCBpCd;Ica;vW&hK~rt7CvaukpvIX5}D3I%b4i zN%EJFZ1CvHdShU6LCM#zcPh2+ph?FG52P(%uvZ@d&3i@=n4$jg<&Mwe>+X4Z0J!kS zQ)T{5v4NDSfu-g_w~CdHR7yZK07@g{w>;e}>GZc<_VEG3C2Xst3tvqD@gao!f?<|9 zdPFOIjf2;}UcMy5V+bS}&{vW)iPBE;6d(lXQKZU$@Te3GCwe4ksLcwK=r~;S{Cv2! zsa^*ySpR)|NcN{sS$i&lgEK%J$?|(kLErVLYZLW16dD3Zaz5L#JCO>;YKBs!f^7wz zCGzm=(|;=fSHzU6io}-_x#N)Ks=mjJn>&8kJ%8=&_MeWP>HMtgyzbXEt|x}f-=6>R zi=#rB+n0Xr6Cc^&d-wMDpTGO!#{Gb=zd3S!;Ti(FHt)Ie$BEpp>Cm zShXDDoyI^$jI{J(eNYGS);itA2)qHGF=0HziWO#nH*u~!`5k{Jey8Q_vwk4qLQ?x= z-4|+^;RSdDgm+P!NrJLzb=i^ND?oX6Y&{JN`S43=L6E0!NUV~29Q~LX-`I}!~@cf;Se>+BY1xT=ofvL0Z z?)X4C+`taeyrE#KPe)>wCrmd8S+yXKG z7dLn%Di?rnq>l;~mD_sr0}%J8nLZvK9{HV)qhKAw1aRP4zV6Dc6^8#A!~b-1D-bQ| zfJwk^WQBvZGcGrsKaiUHt!&dp509tF8);x7sF3HU4&Wimr~;ER9JO^|ca5Zr=-13?K_>IUDEVUU9>L-4=t{1x2& z7GQ|C-p);Xb0YDe)3{9<+<2?*F#-wkUg;kHHrxMjzceF5G&%r0Cv?HkAn)6aF$WYj z<8synuuO6gEMhd2~zSJ>;HWI#{(-KxN@8TGT;%69#lYHz=4P7 z-cJuhgRDZ$hZJ6a6JZIo3_NrDuqJqDsPSw$V%L@D9cRJQc&rBbpr!|V%uGOfAgyX5MkxnH5k0y0m%5xe2(`RWNDTWv%H}nHn=$rPt|> zuIk4r_{wRz{91oUZf2HXYV7AXNBn7qO(!KlrnWa;wtWD`PTujR!D=YF8@4vM49N2HY86Bkc>so?m(hBeSC0Vp4R|cnwj+A>`=z@KwJ3kgityMoKbG2a^ z*7tJiZi4~j&CLBn57P^E!Fx}0@che)Yj=lA9{E0Up}eh)o#X1CVFxch@Q=%nu$^LJSh4x2yRrH-Jx$$x8g#dWH8bnmjbSvy;u#;l1%^6N zsD)VlS}9jj=wzC{(i2ze^=(YS^^$(kC{#;4#bd-QklCtHaTw-Ee~>k=1`3khOQ;BH zZN+0kt--6ax`b|$l`5; zibp+IEu+Dxq#nJ<{JB)sGC<7PG$d9zSI-?HR0ml>Qj$X?(acNaui>28dbk~K6?`Wb?E@gqG*ift19HRgo`P?_gt~}7V7cr4JlZlK{VPECxS`T8?50d>UJ-N%ys;CmY!T{*DF}SHHD%a1P1HJD^S(>n z*qOFP{KqmuW8PM^*x%$fl6~T3AVpVOb z8wL;OJ%G}k&S-W8J-43laZZc8Y@u~pbMuaw_3`yz(>enK`%}0_{jjOPW6!`#+w~t+ z1kbZ6{W$K1aXqhbomx3UOiy%c-bA!HM&2QH>-?Q@Lg{4sg(X4Gl7^i(bD(gc9!epT zGO>i((42TW$6;3zX9FfPT_i*V4P|;1s;P>oP^}6UvX{>-c>x!@E+xU*yp5EX`h0OW~V)#zq$I_Ezm{4O*b% zl$*|}h-^-K0@jfC_L}T`ah1e(#KjzcF}aUB{)_$m<==i;9#g4H>xPQcSjWok_fA^# zZiivNsXbcUc};KBYStakRZ8F!4Bbrbvm9IdhPD#B#wA;RV!mbhoM%lspy@cW8Uvf^&Ico__puDP!BdoG{zbAG#tocxf%k2tc9OBbshp)?gxR0TwS>W{KRT$i#7ObmHU~?NC;#{sNm0%$ieS7AdsC9 z_^IOvzofBlRGhPumCU@G%+ZIdA3to<+x5qiM-Dk3c1dntUo^Tke51pY&Y~UtV}y~8 z9pQx@6-U*VWuE$a{ZgI!Zk?3U=@p`1&m^6RO}W$C-P?M9^_||Uupqv9cjl{6FKW(s zp7pDqaqd2?Md1K>x(kO9a1a zERDYI8_^7cxE-nt=8uC~U3Hex(%UlZ1Rxe<|Cm#h2 z;joS$#`j=gyNHaQ!AO(IJ&myfKR{H5FFxr#M5I97&U)h(EHMZ5-*FyDb-9_SXUOdF zThhB!eIy*5=3eTOA-P$TIb$T@xs)$Yq{?z;p~20bhlZF@W=2gDZBU!%1Bbw8BcS|C z7*Sc2CB{ZOrO{1po0JEK3PrK*BLsnfB$Z#$fL)t9XpzhCLhl=FL!YN(N6IR*GP;rM zPF}+*Zm{u_-sK_Jw$_M2AePHs1q25dQVt}1{}b`jsr$?z_&uzm@o6WY5R0x@8} zfkvL4WW&)_gBA%B(}Wgzu(UYBRFzL21p>(}`{4tUL-6!C(yY-ipo3t7!F6is8ca?d zYFi3PQeL76ft)Lg?BQ~|F1~W0)1aJnaI_p;j%c%&a}P1~Z7D?Jd58oghE9mGG?~1E z(A8a}LFrl)Mue2qnjyyepunCFle+4~28wyyjQK}XQ)WBD7mt($V`9@gL#?}kfBK@L z77TJq4fwl=Zf6e#dy7k-jC8}l6YH;#);|c>@nkKSl7pkr2SwTa5(;k~+?Ys%1}6<@ zo$qcV8%@51Tld^Fg;aBtMHM0P#kBMHjb)B{b52@h-B>T3FkprW48#Ou25PeJ#8eqg zmc!Bei6&4~|El>wD%2)TGyz3 zvaZGNB&JyVqrZvKq_kN3;_j}Pfk)Z1sq2irX_Y}af6Vd?H}BL@B_3pqvC5-fn^?_0 zypQld(hbEub1b_Zx)&7+)q*d|6Unk1A~cwK!Yb_T!@4HZ9yMZln!h~3>ozau&l)%y zN;%V=CRxN?3tx14(gk7{(iY?)u9wK%iweR>q*tu3U>k2%uQ(i?__mTd z6iI5DO$qPiwM&g9<{M5HX>?1dwuAU49jWJyBxZV{#d4g%Y#%q{NyW(FscbVBP{{UjD6gDzGtc0QMi|{BM>bL} zi)#(nQKkgG&Rmz zP~GT(XtPnQN}OiCrpX9=W6&bnc*`;-e>zBwn7Efzyne#iW5=bguZ5_afHEL3?OGMcLcqJ{X0dA7lfUni_;gUOAi$W%=k0-LR|))l#JjQnvy4lb>x&%Km}$Z0!FrBTj#rHrviTCSsP?5J8o2?Ps~6e4X{pf#y_{#|T$ZnlYO2e29Ticw z(fJ+sCQ96W=`tDf8wSGIi~J|@Hr2FuH`e;mk5anG`J@G#oTLwniwjrb$*THX8Db4u z1Y)UFOi^0`kpza}J{n6;4BN{o@Z+<+N5tRyNV1X!>dzbPa6d??30yovoI2llh#RLd z@5g#HMb^est}4P+>E9|tjSt}h`EPYyj$wo2)PuVuy7CP+$DGA2Qlxk?!0$=aOgYXR zVTxQoHY}QOEf=Xs=l;d)jK_XGJ@}ruyLF#0u_!@FZ0vk+Pg5t~ z>CXknoSh!=^79@l^&*%Gn;h=E8u=xkRo{1Ob!C7fX8^6zRX(PTS-6%%yIOIHMo*VS z@rnXeP5h7L49iH0UHpZ%Jt4+tXD6?XW_VLQ9cym^HMvRd)wHwM$%K)~cYEN-l8pn6Qy&?H64Ldr$ zuu;-+2P`{{HcRR*EE`34om#7C;?0YyrP}vs`04JvV1A)khPjvX3d*04Lu+P>ix&s` zPe{=!F#|Gk^L+Nk`n`8c`;A+cu%@LdK>iyKUk<7`O0gT>2cqn19f|GyWM}ebT)sGC z-m3L@+bnh#xM6Xjc?yks-k>YWVh_0!=%`bP!y)WiIbogvd)gPaSAk!dy|`DTN6|o)sb_Vj zA~->s6OTyMkfWWA9D|Xnk}cd^NHZf{2_wb#LVWp$r;6mv?UO^;x`Xbybf2^3AZBV& z3(OCE-}L#Vy)vF;ULQLu@T|D5&Ulv-KW0y7@ZhREdJ3ph0X*)l&6I0&D9#FD`-=x> z@kbH6KI@vO%8Z^oA3hN{izttkLvc0o&9Hp?6nZh^Td4!TyLA?a9pE9Anq6csd|Oa9 zV^$7snn{w4b9_q*l6iht2`xwD8NV4X-0RpLXW@ehVfSRu7V>7@j8#v6utO^Cp2N;M z@@`8lPWD1m4@Y`l!H^sJY+c$mZH&4)_xhGRSh|)RiGL=i?!(>lR+(~8)J<_ZPG1|X zi*)3KHllcy9*%_5%L|H0+4P{H^%LW|y6E0jZP{Xe!8=1olV;3ej?g*Xw1iQgU|k!y zs>wv|p3d=ctI)`XnoY87BUPK(M7hp|?*GjP32Xf5dqVY-7CpsJJWdU~DlQ5!iEr|; zmeIaY8;on3wHW6hzp153E?3j`oL&pB9C@yaRgH7ZA*HR3vQ}!MPoH63u2czSKP!&6 zK!f$3^qlh#ay8=4Ji_NU6496*6IJZTmh((*ethSwV#eym2xLNtuNrX_6FBl@)+V}k zSGUdJ1gsV-C5{jF(6fmet?HKY&k)5|&s_yt*jo>e3>^F0F~H(o_?i#p09f zL7O9~`M$<8?a7tNEl32eEjJq-tKG|6AfS!?A=Rl%d!nJbDi`Rm8je@>6}9O14k^ql zW{v%UN%|%;ygp=W;hCk@kbP&iZ=4l@)Z5EalG3@A%2Pb~x$SZ!y4)1MA+Wg?111mt zv%5{s`6k}WII+@&q#z7TgJ?o74VQsW+IYSlUcKcdQ8ORPVLakj>0J1Hc}NG2-Ywd< zK$Yvz`8X@5txV*OVRiOhIHpqXh4sEY0n1BENSzVIRMak=Pn=c@;I(mP5!}hj;k%!C zq1l7FagGU3f};msW{)hsK-BbwnT5OKW-~YjmF}}{VTH!S1v2C4?;md1#P$z$V+S)G zWB9`#IJ(A@<;tCv@)uTCxb-MHK|&1AREt5N7yeMwxW>N3uw-2nk7O)--RL~E2(R2j z#HC60m9fZX%Pp(C8~oYEs`kts8gsX1`35scPF-4p*jy7_XFsv6XEGWw)wk%mMeUM1 zHe+<*H8iqas|q_HH)P48A>EG^57{3!bE!B&SyFHP+)*ZeP)CFIZqxQ`#sl>AoYJ$p zx)hbo@JXNSjO4i)M9X&hFUp?kaoVJV$hlsBnIlCDAG7tWOdhc_mgA>RzmKd6<|Myr{R1(=aaqAW%HO2=_NHH&+zyFLL9q_=_#BlS&N}o^jbnL*! zy^H*2#GZ-0gzKznF~Bi%nrey#!=X%LU(=VNbfV^^^WiJHi-TWeX_}nz4v?cvZ>1jL z^U&wnCX-oEz6!C{EW8Wtl_PSU(6Vhl$VGfMHddBHftr|1YQWLXtVy!8?P95ZUH;mT^j=zrca(KST|Nk`QpZO3uRxPS;(*q8Fm z)n&8PfO)A=D21HMrj{Ng>f(@u0WW0eQ7il4YXqwO;{H|Engu=f)OXrMsS0k7@`arm zrC5~ly2L`hrmkkwP$Fo}>s^eMMOkvV7Z1pv`$m2EcAec?#GRCHy|HqoNVmjP#O?mY zZ)3i=5!NI2w_z_=qnYvs_(=pW5jIOb#YL35BEz#LZGO`Y>z%%ejleKlM<)^Yxhrc6|A5oz_n z-XQV^PBc_TcgR1J0vf%jJ-4GldWrTePm2iRi>a)ZD7j7@TgMKp{xlDpo#8Ntk-8Vv z;lz)HqxVo&(i9t;M7^)vBWjrD4@{hyDU7rCnyyr9Tc~0+W-qOl%UE3kTKs2*YtFL_ zMVb>k*=&^XZCR1!ChinV$9_o=VJ}4jN>6ZH#;Y_jQngwEscu$2EdqHewOBgwDhlRa z!wWVPmwC#RF$<65E=uV6io0yVw%h49y@kMj|6Y{93bC+caB4Bd*d`>%v3rNZq7){!3)urJ?mRM&q;J9!=%f zcdUDSblZcf{h~Fj8y+|WGKh6^vGjf9)QDho!V>sZM<}t%T(buYwiuiG!K4);z{5Zu zIFloi$PCCt=?DNftfor|cQV_h3Y4$566H1_Vq^%Wa$(3ICtGorM@^DHhdzVh zHlpUs9?e)Q7dcO&gZT(5iXNM()0M0Bxf6Fb3ApC?>K5eIs%wD61bT|w)b+!ZLiI24 zKebNUr%QJ8>NEm--}S>(i2BA0x^7>Cp2>UqKS<4}_p=bEo7g-XC=hGk0;w)tKd}@7 zpV>G-tR6^Irk`ofKkE(2Vi`<+EFF5*SEVG1Y>EIF5Y)YGWC3T!52hrI8p$Y)#FEd| z!V+?(L_C$ek7Hl~B<5HEZ)%NlA^=uuXo_uAWJ9?O->kq2 z01#9a_7$$`>yC9hqiXZLl7F~pAriAtNN9;o(TS8|Vfk|A?xuCko;M|@qm znd3CMp^0xTbW$Jg1}^ls6u)8wi_`OCp{GL$VV;G zd=a&=o^PwCTl>g|>mr(+VPOuRDV$~-dRMlix_6xXLjm1u`~&GIi)vs z)rky5q789O(Z;yHt@UVzeiV*!OGZB``Caiil6Krk&3$=7n}m?F_=H z7X&6h8;K(4|L*`gog`IRmE1Nl3;1>Kdk4*4f=v#tR%UY*<#e5@h3XmK&8E zA<3DaL!?TWG?TF!R#{##wj;37z;ihv9>D}R&Er;?hux|Z5xZumXZ(Y5O1*3jdvmO^ zGnU1#Y3Tu&H&vB5!XAzIRy;oar9qk*&>X@JFSQSWjZSAkahj=g-?*}I?@Uv16YiUR z#Tod*CreoCSh?IH`z*U2Fp=xwOxhO2%<7j{K&sCx0n}6)_J+@A>&Y7PlXzL25;IthC_0$Dq!Fb>)|A23nr(yeucu>Q*=MZ2CpW|Z;>#Xq zIsN06DwLHBpcW}_jHSm6h(uKkA*$%fj?zPAAt-twW*W25m&6?Uo`FbptkMykdM7<} zF(>;h`lenYH6!7YPcnBQl#S=Hk?#l(XNTz8BZjZ1CJw?~&o1y+W$QVJK;)xQk;m3R zET!EHRI%^ba+eJ~12Dk}j;kMF5vgl!k{k#6S&iR@tjNU;6)G1#b9QCxozc;uz%tgI z*_^<;k@IzG2#Lpe;V38yXZ^+@I%Z(GSeEy*N;%5$k9l$^=bSgQ$Fs%p?DtS|`;|)m z>G#2BRqrgAVJZxBf|wsc=C!~V>4?;OxaW=sp1jJ=Q1-i!qqse}n9Bb4a7LmpH~T#U zROV}h&0_#!JTt2*30Y1lRQH+VrkmJHX=OSxQ3tBgEGR45(Rwg8Q__gjpRG4-b8(&F zmPZZLK{%pkXA#cA!a>B@BiSv|<2q;5{;n+oz@8buB^9u-Xo-^&f<%SFgNXVVI z6p&`-K0rlyry(f=vE3gp_(9yPA|`NleJuaf$dI)4yJ&oNQ>O15L-CF zGDygc*##(HnYa#bwNh}E|2h8OdqDnvG+qo6a*K!N+tc!{KEvbjI_XSFU`R=vkZMcy z!CfQ-cFF$S(gD%lA(VX~$6gAjLkQ&l2GB&ovB?0;Bj7l<@4uc<*6gzc;@;$4-rbFN zGCz8^<^^*@OtXWEWBEP3wV}1qcqfR$y8Jr%D0CIwXO-`E@lco8>NN!GeC7rW^vabh zMJ(Dp56zq!gYn!w_5R)6{;fF{x5`0sx3Sp1w7i$Mw6wHbV&9w-8ueI3GQ3ma>hSB_ z+#;(J9&J=AP2r`7&=7^(4C&NZkE%RnvJ=x?-TB3a&Q=zi+!e|jNCs|mq{;t@x4D;L zEmDlfOA`MW;>fon4#^(ABlO;jb6^YwN5~05=7VFktY8ZX0@)|n-~q=!pWvMiw$Mrf z=Xr~+G*!sC2iEyipH=d=!^6WnkB*Lxu0@=Wsj>a)vkH#sb8q)qb$W!&6*vueOF34} zoA2W0M#W$L;4}=w^#SuPlFG2Br#-f96Krk$pF;F+o%ZX55d#{qoJe_f$%!^LHr8O- z!(vNZAe{v_4tExXD7+F{C8kQA*(M&k7V#FA;7|WF+<@e_66CB~0~nauXmnN873xhV zC#UpB77E+JMxVf>fA5ih=`t%pJQZ*h3PqXiF~w+Hj%a@3T3n9cC0(eZ=esCNN7^f} zyfniOh(bb?x2{=XKi*F?K~EZ3B^qZI1~AqhIs<2&24TCYfEyxkW@l$pzQku!M=AJW zHdmQ_H#ax8GblSR62&b&1NH|6#{TQD{ojp@sr&Tl6NqPnlec#fzOgY;ZF| zMJ}3HW07dE*LjheZ)5X$=wY9`c`^31bB2%B6fk+HG92}!u0Oi$DAqXh85t!gilS*Q zPnmjz?DMzzFyZjlH9mrxc=hU)axA?9RfvxSj?D6m`#S8^sjviMz8jRuGv=DmT0MLV zi@m*rbQ*Z~l4F8p8Ck^}UtH|u7G<4($+x_1#7k4GlnIaiE{{ws(;-;18n#`{Y{}*|Xn^!^&7`xavjs&( z7p^!J)36<62bHpO@mcEy^4EU{;C`9=PY5Uk(J+Bq$(?l$DmgA-5#+LMkP_ObPkJ=j zhFt2X>Ras0%#0qsQ2wZz8cm_^R6=J*`|?e{o&{K^E(3gyZxlifsUDagKYBt{cXE0) zI}g&elUz47jeI8DVE-)?5%*gr=EB{jz|0g)O)Tsb*(93M;a4COqqmV$*Mxyem zPFa|+8vqfQ8@A-om~HrN;d%n(WRw~i9FdNcXkM|8c7!nQ=IoqQ8VPJ)j(Bg{*4Eak z(02lqS&>VEzjmcFi)rw-va<3#^`@O&t-Xz7xLztiE$H9VEnjRCxST1;pa^i_s;jUg zGVo<(7BmKjLd`33o~TbvwKMhM?E^`HF&H3sPbk=|#)%JFEBI zBRV1tQyPCBkqp;6SQx|R^2BC1b16(wP;(4k9q0F(`>(WU1k_$|_*y{a>=;^H$4#hke;6VU3T!brvQ#1F=GO0gZn_-==@e@h# z__ohJF{j~VIioVv)J>YKd;=`MsD5CC@(RRADZP6(Oi4P@3Hb?t`=)K5|4y(It_Fl& zhy~B{vx6{EqXK5~wFI5s=ca4@Rl^EWA~1 zrLaMScXoCHPFfBc3g~acUcc7y4zvecY2*$6HAkIE zJKNjiN&`V$UK%8LfYsf9myK+4EzamkR74^bd`9d zGB?D%91og0LXar)pK%nNlFdF0ARPcW5{X>kUEOJJP($yH^}|X#{cu-#9z#BN8qD2}ZTQ3_1qh5MpjnKb<@(%w6|e-kMmD zMOj5fMe+4&YHHiT<%ICAZvO+J)RTX^X=fdDk*NOIBrL`y>WNJb2wDb>dGs7{^4pBR zAcMkI+A1Y8`|BSs;peG{}Ub@yI+N8n@&PbbbzFIXpzf`yT?VMt3S4k&U7lgJTukh z3h2RF#L{Cl1}fhIBVe#cdFZO!1~GLo_VKK~GaZ2=Tq09i&%5x_}7pGhfoCbR1Wgo3$2A@{qV z{43bRQAR+;=}15|!C5{lWr6R1gaBcd&y~G3 zqB@?UeKh9d=>T!7=V8-2H`S%^fHnzP_{%dA%%XQBcXjy#brxFyG9<$qU9Kqoeytvy zQUM@UK4kSdMVPaoKa(u=tz@QVkl!g&C&X4i*f+tKC8kzg}`$kT-7D^Tv{2mq<*$!U*i$&(6&+smM)_}I54~$OChw8 zz&t~W_O5xGRd1!AYRc4c`RzpiH6jYS%^L?{C1M&b)%n3(Utr!k3sjro8GiuX^*7X| zz$CC{1?VpMf?%BJA4w+14i>FScn2!bXVs>Zan(G~pAf5Bew1hYIIez9df5mNuMVZ* zFxFHpENT2Q7pMyd!?Ny&<ujelYfF&7MEcq2dwUu=lETt#;S6e~ABA22G^EH^{G#YIe_5rnN_ zFwB2};vyPD1cP$p-h|%=6UTI52;S<$kD;V`n=m~}u7I*CzxU~f;207FI;7!uN#AWa zF@;1SaZ-QwtCC|RmjXvAarD<$%9D{bRw@GL#0^Jk7?4I*;xccr~Xgj z%MqRh@_+hR?d|{GZr?1H*D~CSCY3vLZ~yfI1|q_-763J%E0F{m3k|GC*)6kW7>t8A zj!21L>dafR1t882ZaxE}{>8)Q`K zcu9YRpm2(usHCnsz+|_aTQ!spOs|aH5m~1r_bzRGF@C7hgWnzXw=APNCA_X5Z`gYW z5G5efs7vLkyxj$fcvnzFi*rBGG~->vUZ! z?9D?90XqmW*kYG#VNe!q?%My|e1)g@?~jVPf=5c+IY7%CQ%J#qOgQa@9Cmhf#RLER zKr&My!<6*p&CduX7-1r~U$w&5weJANF?8~*%JCrv>R*8WfEPh2SSPLpz7WT zC6`vf1;zr_-(WU6KR@5xg_l?S{ciC~Zx=?l+SC=~43Gk3e?WeEp|BvtglfhvIGFFj z1b1p=_AY3Q=VS-XZEOHUrKgG-U}o0K4i3%~$?)B7XS57f`D_7ce*6RA8~WVFxm|dKVLq2*sRpY1`FYfeex^0J-@3d?2`OVwsj#4+p!^}a`nR*?ACwBTL69}EA3^Z|5#*|=a8#8~2Xg@4aG$YoU?>-Y#=hns zllBQP@CbG~Kp8447YX)5s0(E}w$}fL*@Yh*;45R-ahbYgA)x#u?f#Z?l8ieRn;#uF zty|e{tFp7k>U6*1SKEhw9OsHYcKF;7{9>7^Uf8L%O@G{bdTZydV|VB7AY+&1n*I^4 zDe|(y@!^Spj~6{?E)wn5eDy*s&D)njY9O#ntK!LW@napO^%5S@Z9gyd|@7*ta`?gv0{YgLyM^}moban50dw`BG z>KyXO{9j$~zq@M3Y;Uk?TTeyw_ppF+0#Gk?I-O*|{aeJA>3_CWa@g@QEjl{d%7)(6 zm1Ks|1bbn5RrO0|YyZ19_%|!&0L^A=5y{;WfPPVg`}N${uciEf+HSiVULxSRqbreA z@DS^v>aO2jD#d9BSfV)$KwE0twuls|)&3{yS^;KsO9`W)>WqZ=uJ*z*uxVSV9 z27&#bbu;rYkcML#V3Zo!0+Iaf`}}hBkDx(9Jp@@{Z3hUA{?zBCQNq-_dJXLIko(0# z@UMU3(63MZ6GZ$9&%Xk)A9?4+#oEZdcE!MCiu@d ztrpmxt1NX1NE09#D1aj%X2B*Tc1lD_SptR$Ja3P@*shb#1mv?s?+XAO5BogFYef&37FT24SC2+Nyp@)b`q6j=)HfIEX;C zm*DcVl7*nDMedWT{;S6Syy^m0)7ugF-2(^$Nns*Ns(+Wce`@O zZ+D8KRsjWogxRY|@*GFk2>$&)$NzW$f^nKdLm*=Eg6{?R>5e*M(78gOZU&Rc?^@uc z{jC0j@ScPL#wU#syYU>r0x&SSFJP#B5tHsUbOd5_2vnAP(^|EzryJ#r8?Msftrl`N#XB5<}4*Jz~H-Kx3b*oL3Y{L6o3t^YB| z{?7#J>?oIxFJyiQ*So2Wk357hL$e47Af5f{yZ2Qw0!@;ca+>-u-{4;_(e z08DheiociyLwPb-lrN7q%30{!)`0!}B<+BsR7+%IS1`S1cd2{diE#qE#}YIXw6EuD ztZuN5go5Q~WgMqL{t)HWUJ_P|s=2iKgKisJd$~wu#3pd zJt_4*2)>x&y|UNOY+`A(vlVtA5R(r@UG10u+UyHOUBKi*tD4ls-c8?ul1(Nfpe)y< zfRSh z4ng*jPqqou`JZN?|EF1HihH%Zfy?uowMsxExQ?*BV< zRi8|LIxre#Nzq)XGN2C333+dgyZ$aRKe6+}z3eLnlk{O7YCU(M1ANyZ#$|ywUfeOGQ48i6G$wN|Dj1U~%fX$L zyWgSl&BM0m#oKf!>uj;V+OR?UIw&U;O5MxJgVKw6onaW54so4JWchOqFw;7W=Rnt` zY289y>X%niBpdr~(5Zayh=~rfi5`DTGZkcZjch*d?4-RNcY!ec;eNcIkGPLioLbg6 zV=RzCmP7U2_ykiUV(t2^(eZ~F;Av;uU0re5jgfT6q~$k*ssRtoeBQV z3x_Ukor)WKzSJh!y-G>3MICq$!3O?$fUBx6F@sBYN&EU@HpW)C8Uz1rd5?UH^qg$| zblEmW=V>>qP@M>8>lY$1i}$QP5pFtHDQdZ2i>tgPCCXTPfC~<I2KU_Z566mkg*P z0oN!2FC3pGN7dnVJLH!)^w6RLzhPK}ol&}Tj89%{)3aq87qxu1apmA>mjG^P)I!re z){;V>_WqrR-Oka>KH>Q{?|kPcVXv_t+0oVHAW|4WJTvSUPVvl!rAwx!y$)LD8BTJ% z*bZIH56chuwcMy=W8*8@=kW#1D!Sd+MGUv4JNSEcz?1tZ%`uOsz-`RK!{fWKP`+l( zT$CM+uYq?FF7%Vju);Q2?7(LD0}elSOebytd}T}bzC8_JxJNkY!>{b@6xnaEhCwi` zI`W=%&(_~`(XBgvt*3X+?-T|I9rp7ccKPueA>zY==GMEiv}D8Rbqw8Pa<2Z#uq-DY zDq}eLT4V6eX=U^^UE-GyVRrteo*wVw)YKI&Mg=lwXI+M+-}yWP$@dh@FG@QIP`b)2 zySzpFD(};nrQTe#m&p~AvS=$eLrqX6Pg%q5IjTF=EpZG7*0fcJ1}3JTof3^n5jJj;YdMnM5xx296j`jd`ob#4vD@s8A?i@jSZy`O4LoaSsb($R_T!$5a>V-PZZ!qCt1@m$rAahfSqJz^ zqf&rIF|+aDBu~8x>k4RfL8hC@4i1OV7j&2IV*Ob%)|^#!54kE+S`ju<0CzQ+ zWYU7GNh^A zvI`jF4POklA|9-p_cS(NRDI3 zNMqmN4`Fh0`6j*{f0kHd5?i#tqn?kaIbe3LIneG_!!7Y*8%w2Y?M?O}juN23N_euG z@gV@2Xdz@0pjtRO<>YvM62yI_K%47b$@vatHIN1$;S47inYwOgC#Rt%+qUyDP&cfd zPFy-$mQ%xIqNNv)WgSGpF~!bq;6w(LA2)Cqj@BfyovUWuh83>z^Kae1zpaBML{Qzc z#bvPJ@z4Oa4tjPdDv*I;ff9p++@DB=k2jE3N7V-f9VUiZEWZanvAQShVvChyKzjdR z1gxU>&S{^g{nZu6F9gST>lT*>WyqOcpPo=tQS P>Y?z{#;5X5*xvbHzP;mX diff --git a/articles/stars5_files/figure-html/unnamed-chunk-10-1.png b/articles/stars5_files/figure-html/unnamed-chunk-10-1.png index 05b52d65fea1a7807aa88e59d6ae79cf476688fe..df3226e0a9c62ef07106f997b40402f1321bb7a6 100644 GIT binary patch literal 114760 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�O{d<7lj87?D-f{>B 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

spuK;zDiK0Q4bLw-8U`y2vm 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 j|Nr;@l~3Su;%bQUy@vkLuXATH@b9F)v0kB$Pg} literal 115582 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 uHCM8|KG+}Q-H6)Jescx%t7r>>GA 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 diff --git a/articles/stars5_files/figure-html/unnamed-chunk-12-1.png b/articles/stars5_files/figure-html/unnamed-chunk-12-1.png index 7504d9e09878414e474f574467a6536e12db8a56..d544519c9394b7bf4f0ffde14840ae5c5e25c18a 100644 GIT binary patch literal 23141 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 literal 23928 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 BcbNbH diff --git a/pkgdown.yml b/pkgdown.yml index 72212b4d..7bd9f30e 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -10,4 +10,4 @@ articles: stars6: stars6.html stars7: stars7.html stars8: stars8.html -last_built: 2024-08-27T08:39Z +last_built: 2024-08-27T15:38Z diff --git a/reference/read_stars.html b/reference/read_stars.html index 2dd6f06b..59a0a668 100644 --- a/reference/read_stars.html +++ b/reference/read_stars.html @@ -239,8 +239,8 @@

Examples(red <- read_stars(tmp)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): -#> Min. 1st Qu. Median Mean 3rd Qu. Max. -#> file2294b73d7d8.tif 1 30.75 60.5 60.5 90.25 120 +#> Min. 1st Qu. Median Mean 3rd Qu. Max. +#> file227966b83ae9.tif 1 30.75 60.5 60.5 90.25 120 #> dimension(s): #> from to offset delta x/y #> x 1 10 0 1 [x] @@ -254,8 +254,8 @@

Examples nBufXSize = 2, nBufYSize = 2))) #> stars object with 2 dimensions and 1 attribute #> attribute(s): -#> Min. 1st Qu. Median Mean 3rd Qu. Max. -#> file2294b73d7d8.tif 33 36.75 65.5 65.5 94.25 98 +#> Min. 1st Qu. Median Mean 3rd Qu. Max. +#> file227966b83ae9.tif 33 36.75 65.5 65.5 94.25 98 #> dimension(s): #> from to offset delta x/y #> x 1 2 0 5 [x] diff --git a/reference/st_rasterize-3.png b/reference/st_rasterize-3.png index 12e643f58b145e0e159aa706b82eac3fcaa6ef2a..c27409a9376b26f61053d9491f6e9bb345b6208c 100644 GIT binary patch literal 22353 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 literal 22653 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 diff --git a/reference/st_rasterize-4.png b/reference/st_rasterize-4.png index 4727f630a5b3aacdcc641a0869e08e22ca9a2487..d08b38585034df5625c38132688b3edc4c87c8dc 100644 GIT binary patch literal 22080 zcmeIadsLHG*Dw0u4K1RzUJwv?{b;3D6co7#B-C1=3W5p=0R)056uByfa0{efpcRC+ zSVRy|QGoC3!31^!tR@qn-b_fq;UCR*-zhpzi!#3D|h}evT5`2J1kGz zJwKKnRQp{4`i?x@a8Bxt1v)ZBG#8HWbOks4i1VFkmVhM#N1U8D0kWx-=Qd zZjFx%2GNXWyE3I0<>pr(0^7#o_1(EP(0%M-w{EE7AJS$mI#^(+6+I+obY8eo|?OEf;cWUpQnVY5(2u%~OnpQmMCJx0r znG3Y1@YS_5pUZt+Y2$c1X=R*6tJ2nKD6i6`zPT##Z_CR1M%g8Qk)VVps9Qc5bGy4K z!F@s?bvfzC)c}GczI6$+CC9i?QiK+qURAW@p?9B|gK&@aa6PSw#dF!1>EorC^)EWW zqD#XxgYW5AzA#5`iel`OwQs8eUnz0t?hnT3;ji=$?gy$n8H}C~qffng)%7TK_F@YOrYf>?Y;? zjp0QUqNL9-w2GnLUNh!5P$%p2mf$@UEqbBK=lacxpMHz=eKT+TR%P{i?kB@ZeE+;> zx%9`?IBHenP?`mGupr+>r-q(y%M9Hdy7`Q_vWI zd46Ja7c>7>NMhG7Bd_cx=NAJRx)Xe;;&impU8c20_w#`5VQI&?YKW zAevvCHk9~OxYP^MpCrnE;CM(QeFTw>bmMaAiyn7J3DamGH1oXc-yw>cTG@l73Sx8W)l*`tmydic zAM>t8mc?v!*;Xu>`7J7ZTaa|ps2EpSHq|~X8}qiy>dUShtgn0OXM6Ttmdik)B2ha? zCFS(C7Ua)bdVFPM9EDPdOT&THctd<`AWGG`zC_gEpohhqLiu1TLVr(X z2_j>AMA2Vys=)5?m`{=Vf=H8m)YMT?W)vhni|Xn; z8y*-t?-Mw(C}c*}DgT(u_gIUB{KL{?IYRQb49~i5z2)JgK%{BeCVN|EXET3ISjy>b zSopFc%zS3>0Winsg+$)upE-WGgmll&Q(B3q-_>(O)A4=s9qEGo#y?FBmvI*QILskt zUgzM*TNCHX%k!;ejqOvF0#Ph3J)wOxUiAKMvek>-x|tKzUQMZUp|e&j2TFkCi5|-& zJYLfu2K2)SzOGT5|1U|8vhx{vCvZjE|58+;yX<>I%}W$9n+naZ&^Y7D`7hoq4*sTN z(pRYPvhTH%ec4vTs$+2(75V%M9#u5o`h_Oc#^K2ax^yB*JDt;) z(5&CA5*voHibZuU`7Qy*-w!a_y&~HB+}%aJs!>!RF6XgQx6M-IPYgIa`NSq`R-cdU z%z}K5A085SSU$8hq$<(3{)u1ARhR2;;tn=l|0^oT!A@`9gef!nK-Z}wW!>d#oWsP-tbS$udRWN_9|+9PeTZZAJzNu=80gUFLX`GMYW`h^hS>W9 zuFkIoT4@vIaY^qE#)pm`oKV;43dwy@a&EAG`{#WgqlV~i=f^|Zn!&SaR|CSsveXp* znk}}eZMO#pl@ShY-J(vBx8`<5H(>}@Y||xDpl$2s%f(vXhY=FpY0v*knEfEIZ4aE( zo5GXxXD`@~s?BIfdjboCc;l6zNW>46RodCTwqGg}->0mNb}7bNycXR{qEMv0%IGus z>D%Uw^t+lB)6Q#;S25N{y)|w+{3gErhunPpaKq5P$6~*#o8lsAHmgZp>EJh1s-HpC8l7 zOy`G583m}PMEOwL z$lQgdq_0*-u@2WMq#qwPzu|f0@pRTlQ+YFbv-f{f;5&Y4Iefd-uN{~u-hGi@7NzRe zpIlLga0_!SF6&g4=?_ksbWy{rN1A;sFGssHJ#RgXrs#-%U5ju>Qrj4|*Sz+hDx7>j ztyxayZCjYIWH`9rG?>YnEn3KOKDA!5c~VtAIp>`*r;54XRT<0(FVlbXi)Er*uE%5P z^hnn;8wUjQCb!=Vd~}vS8EP>{BbkmmUB3)`3_$%kVF9zY@&hfiH8-VtciQ+W>TS}M)xQs2CxICl8mLZ|MfNQ90XD3SHN5Fd^EbuwFc z3*DX08AT8?_Fvj{RR%$kH$qv+bh&O=gheIKLFZXXQ?^4}Xt-W+jPgcBdr;P~1%amH z;rRO_JgK&(SvoTz_+9kScm}MRImglH~T2Gxz6M)4MR&JFaci^vM^Z3Mf^@$~T^B8>k>}N=XF<8Ul{0P4WJ&}(m zjx)0CLz|}MU;LJxXbpNuCm^u@>`B34&GEyukZVc=3CT{kTr803Mb)bgm@yKao19*H zU5}q@P4alrZG5mTS2_7t94j=T`=)gKPx7<^&55eh*HEXL9Ax+Lbr?1`wdNl>*G>0p z$88JlBYmij^tcrBX_me20$zHd@1-)au31n>@U@vyw$Fk5k06fYoLW(Lf=}%s%QN+-cIgFEj~_wy#AoMjvOF?~qW#hN_uu$8>##HFYy!%q5L3UBf#31*aP95b$R8`!RzIk|$sYVo4u3{IoY1rcvbfmsDFAQ zNOMq!n)tFquXpFX({lzdIBP@9V>)F*(96iHUbsI=lsq>KHQ5?O4U!Nzy}7RSe)lJhbQ8uy`>I6eCj^wYf2PFkUrZVx$rH^5 z3GL(YqRmrb1fKBEq2uvqnv6vQp?3WeUU!w~#B7nEVx7wS{O8o6(RqI}rW)cr<)W#z z-d|;nyKdwx^tLF71-klmsD*1VYI%rE8gxR>^2&REeF%#}@ z)6eOfQ#s=RMg6U`ROv+?lxQUP3tkB~Xl@tyuTv6#xpyI!+XN6}?#{N1heVEi}l=1;?&G>5veM3oelTAj&s%yeI^$+3_9#b16 z|JOCH-Mc#@LYq!%`ZxYwk)K1bBhk*B6l5p)?p=Y9Hn(h=>WY}{O(yWdNTZ*YYj%eu z66){Een}dyRxG~!>ruMSi}r%CuyDN~)vVEihs&5fO0`_^TpW}&9piE6jo#< z;ei~tbcRnaJ7C;FH|%q1x2ENqzVYrw>A1ks^2+T*FYk_sP=zvy`$=Hk-!=wf#N#&a z5nURS!3*t*n@9u z0;5ksw*T(6)vU!ly70VxcVkCy+!k~LWS|owdoQJ{hK0{IAwFZaQuw&Ex0jJpDYQ=!ZRD01$F33wGvvF6s}1r_ zwnU!Z&Ej0C zbZk4eRqDDHp~e3acmP4jp{oJeaEW{gkiTCdzh48$a4{nYF&mK2ERoMbGPQSm-_V^} z)Yf|6wDLd~G;`O_5n97jYGMIVWtyB2VskdF0#3wyd;iL<+oFC+3TCtjI-m{dmp>OR zJ0)P7MVpl3IWnQph#5(ZpOd0}fp1LU=Nng3)dB>q!V0wOjQp49QGwg_(W!E~@D4pF zkWxhugraA?Dk=zCq3HE314i`2HWOcH+R&cJOv;6;fdsBkD;Sh|gI*<+GNo%hKXFRLi*WWE2Y3dr}($R1=?up=0}HB}EQS`}eh zPPzyA$pJvBl@-W12*TbEq$MxeEECvlcnY8}Fz~ZARJDgo;3G z9km9qhm|!(j+g*K%9s3+_D6&kIciDBqYa{Et(h1ax7q@p?AeGt8EMqNG7GjdfMV`| zys#uN(h!hMmdIL=yu@t=xUKY;T=o!*)9ipj>DE-BZ1kFFXvtf^58LdPR5=5leEvB$ zj>Et8uOw|-5@-%gbb5)q7;=EJ`Uo{U)%h=b%DjJ)+LFk}Lz?C=U81pNmlq|5;bv0f5V2)KzU7QY4s$$mR1%7(0;8w{3Wju>#^nMhDS2fsfd_eu~#5pMQyQ%*tvxt#nC zlKmk!F%`}+A{7W}eI3*sU1CF&GVtZK_hV_4w!QiW;6u33xFve#!}T7NMj;;E&1fu6 zsHi>dkmE(<6}7XRd#06}(e*?g{xoDKe*|XFN-kJYx4tybb>LjL+@-kTVXXh5YPlT6 z0XWwx^gu5&9S82tsTs9cNv(LSu#=>=|o>5NbqA+Cg)i1;;E(!Yi+vw>!}n! zinHXMum&AE)&aF69R-FS3(Y?9Uaq^WpCK+)dQ0pWzN`k0toLPL--syKXfkT(_#}@J zo@3kCaUUA3WF;7`*)RLI_xOxv0P65F3x_pZEJNhK(9YG@%0^$#Chk3qP30qW*PhPQ zJpyNaU*FKljN7!MppWivTOC>cax_^Q6!~1A*Bt-jO!VkZ z84M7|L%`bSa{_L}^u3$bm9H$Hk zCxpRFcf!#AAh`po@$dr-Ib)FeK&c3QrD$MUm&fwoNp5lQs#{678pNSl@8d>=Msr0J zf<(+L-6@ANZHDUY%ZhrpK$fs{E)7}|y4|{oi3D7wtlBh-_I&}C4)+M~9En(d>YkrYpj#E#O5;+nQkM$W z4!ae!jqug6(`ns>+d9vO`wm2`qTu6JnFAT5lU|g;KcGzhz2$?4qfbd%wY%#CspCK> zo9spLksJlV(-N|A`Cwv^veKHes-pc|)^quY_8VXW(oR8sqO$9r+|&f7%K$LeXJD*` zhqXg{4Q4l^-T`joC(v02wY>-~Q;mQ&Z-n>~478pQPKto>eCG@BOl&GRNkV=F#zD{A z2V%*iU`de(v!r_?t-`U4=5hv;xr@2pNgt-UAUM;r<*TE^y>WH2Y@rD4L3hSIp}9yh zh4+MqQBGh)Jdlt`?R=QSNI-Ew_!WwFPbCWfk9dSE}!Y7?-{ z_~~rAGzoR&?CGz65*sD?UD$>iNqeL>g#E(ps6UhAB&;i{r5^eg>^cxwjLEr9W|wfa zex(D9o8~Jj?L6y?6+o?0;ag!4iqp-E`tjuG-lY|=&Iu@1dn;g*Jn7}=1JsbQ>!IzO zIl7V2?c!s1;gvOz7y&bHSI2(Co|=s2n-@QQwYid^<&-zH@H0d!W6!W$pqcUEO z{$VC;dY{p3CJluP*%jvZ_J`UXdv4hdQtfH{vRRQf3d})=`BIh>;KuoJW}cg59-aOc zk5;+lsRlO$!%%~jmcODiHNbW@QL9R0);|}J@j*2jxbHrai8rSYk!9}1ID0j+j{UU zVgm>HvU5cpp^-#;5*tfNIg+dHRM}MhIQBb9%hGbf9|MX$Jn-skDHF|Q8WiurziS9* z=AF#VhydQ9Yr_ft@-X))XY!Ed!AVz!jhnPc)Md()mLxsU#{1Cj*OqMO(;Ox3hWgN( zOX950aXFn|WlY}F?gE94PJ?=!v9|@E6ElG=j|D;iPyPy!zl8{c`xyveF82dS>)fMY zt#K)-biiA(7DUFW{1cx85r6!ne)R*1-KhGPxLtAcxz354badWMnST z4U%^P^6pQ zj(`kH9@1%c8gc_{iCF0r>;PnlE$Ibj7XTT@`#cU`vFwwqQ44f!LD%eD7N*5Ee<}%oEU+#bC{o zr=7hn!sY|nPk5PE%y z^lPvVxviu~EhIDjx2-^U2K3;CeLBFeY!f)9iQzsVHVz}3eFMm*(3~y2zu=QFsM$KH z?SSJ{I+zbJd4moR;<6D4Ik)#H;64uhuvxnpm=HuD_u4*BKn$@0l1ug&S^yENFkZ8B zko+|y;|(n#84eh08Vku=A$h%_6(mEC#O}QY$*UpR!0-ShL)o$WvH`i|03@3jf^@*u zfwE)G7?8XZlI;v_AQ{RIFs+4TZ9ooLX9z-?s{>^R?0p5vYam(Q5C_RncEG+~NQQcc z>@ftGk^32x9bhJeWT-d!9dHNfAn@KD41@0ia2yGVgvo{d9WWEuxeWLbAzlGy;Q z=$16T`qy0mC=QH*_@9CZ#Td?jt>q3D0OAO89x@?#;&0tP$&7QiWPzjA3K_@W8k+7X zml2nUm<}#^`2^a~CK^l`8o<6}oz7Fc`~7F;uO*pZq;kY*0z1m@o+b?CnVCfBqUnV;DnM>(!cg_Pd>ahi!A&}1buFk&XHSmp;Kg*F9q1-&s~1sU zZK8oGkz&9=!$l8kF3h*Q96iMBbik`p^mvU^h@|1-%)AJLckJJxUyYq2B~$$`M<*Hi z<9}*bCwh9@#weSN4!kgAnB>{229{VaK-Lnc$d%J?h2|N8p`M8H3X?%}>^xe5DwrA! zaFB0%FShI5LIql02oV^TK#}r`y_@9mj952`Iw~Nn&kji(_ac2Y2OQC`4?sW3T7Qu`8gJJ{23gu0r?K(DOj zAh;v8o$?0nTft@wvD)+B;WVx>42@BE;`kIzq1NHwZ%vCSczHg2|7B0#eKDs##ek)e z$tC7eA3y>2Ia{3)d?mhtr)KN4yFtVgTf3%ID`64@4QhbZZW5#n=iGy(<+=gWKKm|v z0*$)b?Np1Uhoyc#?G1}F7U#!ASG9biw>4f}gG~5?o;K(l>CNsPI!S9vJ%?k&`cQgO zg}_$3USxxr{M&BpVa0Jt(n={Hk-vfS?Kl+!CggMwECl1_?hwl*f7uT@yU%Sif3zyE zU3fQLA`}W=372O$fc*Fe*m)wEFO8QCdbzJ>0e~1siK^(%bsOr8$S6-?Xc5GDPp5(G zw5wo#BnyX{FKRp_<(k_k%^1l0dP_rH$Yu#(H&movtA*P$6aNvto~&Q^2?k4+kgh@k{6cNeCphyCPGhEDn|Y$pQi zB9b|<-+jlBX-wUd*zYONZ#08VqG`~5R7RAUF& zE5TC+#0->bg!p{F``4DYY<&(C;7{RWY$Jz=;G<>$`;n60gUU|+-;o={ya>s>^HlMv z{W0<6CY?Hm^ZCL)BVM8yLxT^&ju|0#?04Vw{{Y>#-GYJ$g~uN8Y#8F=Jo6saOEiOF zNes`5R}Kmpz_Fi_K9^dcdb*isqQ9lQNXxc!tB=WsQ84^9HnE%?!=E$G} zB|p}C@dp5|zIl%!lPg?bOwrfwdm23lYGl6&-yRalD}_7J1E6?<9X~7$<79Bc)`x%d z`5XL$+C!9dVVGulEbkmCdt?-KV6^C58mMv;+rB*yq6V8-*Ygw02Xpt_3ejp~1GK|+ z0;1@Yx8H!}$lnShcA)xqz-s{^6Um`007PX404hk=AG>sbKT0w7F$Q2Kd134|j{$qv z?|_}ZqAU!uL$_L7-36L906t1ndw?(hJVNhb*wF4}Um? z1G9iTVZ>Co><(b}hYLMR&mA<5FffUjw&Vpr={0QTAgN{itg3ZTuVDo{nw_)VFP)KGnCd3p9xq!7^ z)d84ANO;&Q9KH{qY&inA3=@v<$)(}*F!C`-PK9 zW*&yzZg4t;FQF!oxa%k+>Ow!TYoSi;rx-6LSr@`rwhSZx1j*wEF>YuEHXb7%#K@Rr z-R~ed0VAtnWK8Q|Om+iCeu0rO*}<4>B}Pty_S5qQ2YRAx&aMJy31ma)hO7W^ln^iotTB8X4*ce#S+v+4*Jw?hk!7GJ z?gqBp20PQ3cz;Ru&NP5MbzQ)8xs?DlSQ4aV3AM5^;Tz#ow2IIe_dBg>`QQ*sDPCfP z4(B>|8h0F*JQ8x4$pkSg%)S1etVZ~v{3FO9Y`E>D4?NV2u2Mu%Si-ZKmOsRumIyS> z;z2}d!-z5+D^d$b?T9LdUriE|!6C9(O4p_tpaypXRG!}g3S_9({?>lQtnibtnbA$m zw`}qUAKSyn+4&x;>ImUXk-OrIq*$m#eTnI}rq6>lJqgpM)h!S8Izl(m&W(1Mas=G1 znh-vSwAunp{S`1Zz{BZuY9Et13;F{-b|Goa%Rokhwj91QraeXU_Msh;97B@@@y1|b zK`@A{8-*yG<<>}`y?7`2qxs?~@QF6|$$0g$L7jl9?B~GHhS1JV{)3LND{KTMl0BOb zT&A{aqr0Q(5_tElL1sz;yI@co{zE6KX>Yg}uA#PL?YRNkOmx@Ub7~0NuTtpa{u!Lh zCG3EVFLVevHQNs{4nO)oZ0pV+&e-TGq&qR0w!0b zh`?+@;7UYh;c)}~0IXT2CjVJiitLYtUZKZ|I&jIx2aF~K9mX5D-iE?hN6HDwJ>h_v z71%-&=m&YK@Gh#?XVYI=>n%Y+t)#l~O2T5U!0pyam=Geifd)pL zv*eY~nKP&&0k;NG2u(96AEDkmC_ZijobCSrD+&W=!&b-2zi%qg?dmO!^*BV9 z7oa)4cKxNjj6G#}#DQ|ZpyVCq`etw^fwkZet1z$v|A+7f_HF@eblNzTXA={D#KHHZ zA2aspyM^3z5{Q^BFvoz_?#8LXGc(ceQ)LkVF1FIV)DZ3$aMtV}fb5%2`eK^`d`NeU z6e3aXBM1uEKY~xRj_Dil*{j4S`U_=qVB=(S8uSjVEMQ<}J_UO+9(ACX!(-)n4$S>( z4h&6}Fp|D9C@bBQ1<@JS`aq0R{$DkwnvX!u_ucxRp__;hxFC#kf--;P&;2K@Df(u( z7RcJiY%Wv#l65Zi7P?W3L?;GH{fJ@@O-Hl%I@u2tk3(#ErZCsR7R28+T^NNe!Xh=X z^G&D9lmHSa##oOB9Av$Mw-wo4*pN1`)TLr}`V7mxDKI4w;1MES4|0@z0XeXuM>2;s z1)SA@N(0ZXuq_Kx@(pCr#d6&@@T8Fa2zw4Yk<`T|Zw>1b`#eV0z_>yC6yaLKn#bOY zk##XL+!}DLG1+q%c^4!HW3sI=*_9X>(>fTFy#tdS1<4_wVceMP9hhtjjI4u^G1)sX z*)td!(|Z>tdj}@_F-FGp-UVeNaJod$WJZux*josekurz~$YrzE_R~p2qhzNnB*r=G8_{Z+&>~ z*DJ@CdG;LHvE6k0m)rZlw0wC?Y%mmA<+4XQH;JbuMA_*R3LAz*%G*4_070R+?b0ag z%U`~fRkjT^90n6Y96VWt{X0Q`(MK<+1A9B3t|%_25pwhQLb5R?TMrgb?pur-ZorW(5N&Y3$NU%# zgP{_0ZwtgO+)5Y>&XXHTL9fxWqy*%eG(w_rfYnu7Sf_ z!D|BlgmXg>3?WQR_+?Bu1qz>6VeA#~Jv_2T*w>&yjNvepF$a5Zz$IXGu0Gtl(b3BA zqcqzJ>na%wy~*^dnqF)s6kcy{G`$Ln86T@vB@Ma#PdP+z*Q7!ii6%1}i^GcXB;45) z#o|E;wE$GONSJ--1AedR(hX=M6Ktp#e`b{uOhQ)Ee63=FfaT#n1BpsMvV2fgFMHIn z5GyfY0vz$xVM>yJA^BV<=?x zuS4FnN}2H8SrAbWej|L^j+)ET&He(Dk556Ps~*i^x~JpuOqu1z)a3~G1~zqS_Lsx7 zw;!ToB*n*i>kDc_E-GEoa-*#pAcbLG7nvX7%G2$eRZp%~-Xy9!2*QJ+mjggK2Cft! z2&eB$HSx&MYEjR3ed7#O=tX5Z^QN<@K7wq-feVgA$Z%EU;@=!eDKXwSyf zH3-)N8$CSh%VEXDhxsNnvg&W;w~}22v*iq_n|#Ms5Tm;>34?pV_<;qZo{|yaRj=sw z#!|eMb)xg3zc`7P9)XyF8zW>c^T@J66;t;2hsFCz!*d#_4YNCBrq12XcU!J19vma~ zCUIf`^LFUs30y|lA5-9q4h#cr+Tx9l(L7;kb9B2Nn&=KLtvm%_b0`lUYQ0!eG5g)R zK}Mf$rDyb6UF!R==b>o2`3g?eF)LsMc#8#LQzzfGwToDTxLDh}v8O37w&YQ%l3-Mq zkzbbQgR6|~UkAVzKLg{fn*4HDPx`*Y-$ukx{`d)$_Z&#)-uD7%y1U3W zi_+aXJ1QEjgC|CFwh&f>76$2``3A9vx6`F)ax>m1rzs0`Pm8yo8Z355OB*_HwE=9r zD|}pv@i2uT>%1;!M9q4Tp{B* zN(9lz0wN>;G`B)Esht2!VYxlR*2uUPB+3SG8Vh0)mKpBvFhd|-<|(^%oJ;lb)_Fv| z5>ZK*9=K6twFup#GTVb1%0;trJk&^ zvcZ!ym!__D*JagbE_s6T2oItVeldvMd_BGJGJp{Gj_{?#o5XxQ+M?M;aEi^ofJMiC zr!S^_Osx~{=Y|)veH05H7N>0{G{C_aHek>#pyAnzb&*HS`++fQgLVM}!L}9R)CrcS zX2ED@pO6?Nhe zfAN5n&`7{t$f4c#PAipOv70WW<98Y70Dd09Q!91p6}%b2-|_EVozK27ltG z*)ScMc6sb|prL}rZb0boyLHyd%Z1ZuV@cWISR|`-&<(c(49(Vn37sC3^=aK;Q&{lo zb3<;q?zo!RlTF_Bh2|k`5iXKaVP+Cp$`H!*(!eGg0}|Z2iT%TR)TR&Tdp60zbK5gkqh}F0!Feek>uE+|j z6{O9eh|>3B+<(AvusuJQ0bv{LLLo$Wy^BAKsm*|>Ee>{75Yk!j9GM5xI>K}Yx=tLy zWLQEN7za;g5dLnU6gLkRUnC0Z{m+;lu!rnxme`?0P9DZy3faqGwM3%KAbT)2%>hjM zQHV6vdSS}9xCFnt~Osoh2{bj|No$$Pu!GK})7KRnL*J;kJf zPx;K$!6ddLrE81#a-SCLR&Hk&uqq`kGk9y>Sqk`=kUOiP`9NaXS){YZI-;Pf;ql zJ%Io=dke0}#o?;Zs){-8a=q9Ohd6>%vvX}jzpIf6w`CP9Z`Xm!57r1@ADB9>-BU3l zADT{6`FBtzb|g#tz2k<};=noTHQ;=oPxUEfYV^rjaGR8y7JUem2KsYo+l^SBH--o} z3*7btwPG4Ns1k-Uk_o-f-vR@VI|D=63yXHr9(lmuf?~AEp}CWB8O=pY3k(tVCCt?= zfjVm99&oZKAb>BUx(7G^80QKuV0cLG3SaC@UB7fJg^&+Sf;wTwtTMmyq|p`E7<;jK z9hIq1z!k>EQM@H_sA1Ic<%p?278>u(KkC(`7b_XD6C3gyIkk6dYigN(aY-2rS4Jdb zR;Mzo$odgD0C3P1DHX4;fb?vJtuj&=$m2!?gJ8q{`Wl%+Xo&uS-aVGbA$lLjRmGl_ zTsdK9z}Rzc_0MYbuOLuGNC_Ds9aGnm>Z6$W!O!^(cV+Q8$sEEsilSZ&aS*@v?g@jN zPRBt5dO4;TY6{?4dBJEKn!>Qzu}wZGd@U?5NKXuSmVnTAVyUJi4HP&H`{wi~v%5EU zG3^X;?Gj+6vB7c`X*bZYFg1WL9O|9{?qvqR0f)_g_ z>PQH7*@SF<4AeslYdptq{a|jir(~vMp)iWCg_x>geiA}Z8>ky6ZeYnug}?PpjJAUB zmp6v-XGR)?RHGu0f|nT2^;tfREMxk3*9U)E1cVDTB$#Ad? zc{x>bPDRRRvC3}0(?yUSux*NvXh3g*xNMzUIICSpGFt*6UCEwOW%M&^guVvmH6$we z2*4*3JVvv->Tzvs4zIp4)>V=Pf&{zP0k#GHuWh2&b4s@t(OkjhFK}T;lPbyUVw*SN z&?<%(ICNn$#;I0&{xvbt<4!uYU$db3tn0)^B1F#u^usNl>qZhT@4D{vE`V!kJ*=6Co zou4QtDd!{xjKqCcl~EkK;)F`;<2d%PC%u01uF>s?XFKImad>EGhso9Q$aYz*dq0gD zSjv*VOt!tBKh)S5r{%qA>L1df#6;-;)t5uVFUuTKNQZ`=URGakUU#H+sGEM+x_IQ_ z8w2JZ--zA2{5q&pd!7|AA`ANk-maqXDw#4Vzs78f_iFC)^|pU|Qzu0qo<3ot8ejG$NpsiZ=kkobo&BLlcYbCPp3N0o#x8bQT6OWWs{tlQ~0JkjC$-)*VHU( zq;*PzT~%Kdn*gqhZPX|`8z5qad0pJVonAaIv2#I5|>R- z5=o%zo3C}M`4#CRH!kLoj$Js_nCxT`zw6d=Hc5ItZOo9|(dxi`Y*m-h`4f0^y2m3d z2Vn9+qW7a=9gy)s9e(|!5}d|>7r7m{1-^Ej+v2tVwkIzBqHU=)X~1K^8n$Zz;9B`V zN4$WAjtepZ&wA9CZojX{6)vC!Hc{1Hk|N;&fS<-0LrncgmzTz!D>)(_ra4L6QUCP$ z#Q{_kZ9}~^`^;{;<(|xS&FyAW4xzuGCPcg52&wqy4(#g?2-)R-8R!CKxLceaA8y*E zGuK-xiw6D6B;jnRzKB@r?(QC5+)(HjoNP}!weKM46oOY=7XX{Qv@}b16NV@&Vj>QJ zJYE`Jd20>49{^BC#*Q`7CR_FFUbk1dkyy(3i^_RD@EtzzVi$rWkhjlz@W2C|Fatf8 zfhU_G8Cky%Y%H6=#&RbbQJt?__{IQIxp^QR#r1rcpGd+*Q{M)mEe?YGUO!*>84~vj zXkpXGkCW2Sa6)>2fI%R!k*J_FWv&Mx*XIAywP8(Oq_;#U^ezxImdQ}Cuisq2N_uuNRb@u;c0ADo5KvHcU4v zxr|;I|1dAPN>n3*wUE59nzRK(k4IMe*n}S%?xu37Xt>^Nj_T?@^P5ZSWCj}7uBIm~ ze7KdeXW1R=-Lo6m+nkvVi5-U#x55B?Z)U~Lxql{$r;|aNUS|ESG-mCC+R9o+ZNjxt zESxZv{wx35)@I0@Wo`s(m@T-KPJRit!H$$;lsiDrI+*}H;;J)RipnhXdADCzb7!)f z`^$fRL`VI1uP`p4p`n_Q&w9*049QmW86Is8T@I#S-E^Z;CQ<|`sQ*LLb_YxCro$R> zyt=WxnDmt;`oY`D9*St)$Y)QM`-~fsZ34^7uye0xdg{{RVanh7xfy0Lp`aj z9tLWC(-Q%fP|l`BdtEI-xIsaiHriHTAvIq(96!h>h3B!?lc`yPelzebEzAxXj?8p| zCFN71V_uiebJ=REycoSF4}7W7~Lgvn+by3Ju{j{fF^y#n-k; zb8i#xoTjbV1}tSbZpgno-S~U_m{n-Lb=TbJ#x&`xNBD$@XLvel$*Tz*oZZIuEV)WQ z8+oKjFJv@*JUa|N8}i(Ctl%+TW-)l?`ef`3e_?ZTP~2GxwaLdx%h_s>nx3noHLV(O zVdfprCDI=Fx!lY#nlK<~&fbn2!|~LZ&plU@EX4R%f(BM>>!xNlep%&d{n-;91~kyN z?vvbqG&`QwId`0LNRrN&Wx6srl?Mh#QszWS#}-vLg*NFwmiyGRVkwgAp>yj?l49C% zvv~qKdV2SYiNjqE+hgpl#s3~ zpYKYdp0QQG;z$j*f(3`jLxb9>)4C`AyndilWbrcm!zkC$8Cwq-4~S*p)uLq z7b3l?=zla_7R)bE<)VqjqM-R*tp?^3>XNF0sPuFEKXv)u|05v-W>E=mxAf-kk81ei zDz}#7&+&8lm0#-pL4 z{s8Y}ov@0=3U!mO)5gRMUTV7wBd@0I5&gXdaDJY@8nfARH9w^!oqpDjc5%}(pUUyf zN3)T@CUtEkLlslK;6H)3TTFd{V>4s&mTw8aC0GrtNX(28E$6r9kqjom=D_%>wDOV3 z%Z^mlbBUwBARX`A7_6Cd%ANK=HdeW-FOPLSm&J=VCN}`xjc0AujR*JfHgtUlP7P=K z)!DajkMLhioorh5#y$MeB*9Syw{Z{frRnq|PI36hKuV0iu2$!GTF2O*Nr|H#ED^II_|kbFoJD(bdgmO$ zKXl0QDTzCi)7@_-{^yG2fCEVolV3i>!G(U~Hp)(a9owX=)6$y;?cvGLQ{RiN?d{ex zeN5;0iGOxC7WlDlG%4yNUx#)v9PKG3mLbD-r7PF6PmP&Noj@X@KHjn{b0BK@W{`!5 zOF}o*mt0Tz_-&KMf+MVu5Han36Bc>;u^{==#bDA7Ji%ec0M=ePs;uLe{ zwp5#xpF5ep4CUhy6Ek%Of6$ngBqeGsn@fvn!`bL*@DY z|DOP(>i@_d=Z5ZSfJ>6Tve!3jm9lXy?^VWE!xLt6258cO$-cmsNV1;w#UhvZw;OZg zXI`f4S(*6)C++W4D&%p`Hs-NEoFwn;PgE&V_Neg>fd&*fbYJ*M*ne0{&2cQ9;i~1m z0@*bx_~zx7kZP7}>Rt*GWeK}Rw|MSD?g}1iXI#C7v;}-s$r5cW3Ilx;w(+2QE@_gr zZcjD1Yyz%@UprSH`{JI)PhZXC>z1X=YMoLy&WO_~OG(}X!i*nW_Y&I_aIe9(9e9;| z4a9@je+7YkOK#sBr{%fQSgU(wJSUEM2po}_I;{5q(a$}}sjRJ){ZP>`>`C^BuaT`s zeNC#@k#_i&fp3rabzFr?|JT1bL;nJ{#v8h^EsA5fFU70ECl_~FY2a1=p!T8l@qv@x zKHyH#eeG2BPE+Ri+tLDXD>`~?Q*+Xh#ZKXRW-!x+5$={>I_RnxzR^4bj;25ld4AgB z+5I5(It=Pg2_e+A-QmMl8sRBWzJTGy10s5!Hnu4f|sU^Llqnb=QMyWp>8+U%5Y`z#g8B0l& zbUMT<-U&zjM;k(qjy`k7aeBP9FeJPQ={g^Tn~JqDxlW57k}8LIQDKfqxBIrcx0SW(RFk)R z^UQC;M7>L1r~{L-Imq<3x!IIG`%7-u!CkSAG2#(6gBWq@C02?D># zQ~s+)z+`Gt{k`C5*YeQ=;K9bQNMjc0eSv;Jen_qAnzHwivU293O?O%^{&?=btJ8iu z4{6?Riswa*9ENXMLswO}`t-MwLE(t2&c=X`e+nC)Oqa)XS>%f)%aDK%SKu9ml9FlP zsj3S`Z$~VG*HrKa)(t(4yC7jP#kNOtDumBLXK#I5@t&+V!Aw=uMWvQz_>)S#f6a?~ z-&xnjj(v5GsyAB0&M8@f#lqJ~xF6Q5S{7QEIrhGG;M)Qe*|y*-lk-|=cv|~%lBc55Xoj_O2#Ub<3xi}pWUr~^RJF>oUq_2Qs$*Xd* zDr+X@|2V(k9n9Y|@?10SUD(ZT4J2zjNLr@FaWC3k`oEKBylAhQ(ZHA7`zJJB9fd(- z&AT4xSDN83R;5IplRQkav$qZZR1@x|KSNy#G<*6k882Gs4WBQG0G; z@gsn+2X*BsJ{2B^NawW(a@|Xh8hgHzH($>cf7)||U#37E`c_j_G>OJBRbU555}@7x z)JXTcLWyuUBkntB&qNzuxZW(TO}O=e~^$ll0y}uUtF`GMfbE z_55zBd7myFEErHL*0ufHFl`j{KyB=EHtH&I)cRW1b%mavwv)UzT0%-Rz&rQ3ONJvf z$3EUjn%vsOOe}KFn~nw(2XjuY1goMX_9@?Ab)pxbV!OAoO*Xl{7ys-AKl+(|U0!zN zvt;e;Im)!2rd+5mnk{t*Dkplsj%X{fyb{tWE6@l*TYBdY&?eW(mr`XUd*C1A0P=PN z$XhTF{X@i^5v@-*;kl`{yqAI+?l3V3IK8F&xr;?VExNkxIvU3qDjDp1(a11JSbVll zn0!Q$W0A0mRf4a--aMN2p#?Kk>(df&%TlDQ75_XpnjXwBa`v=p{Trm;{Gu=szx&Tv zii6~Ly*KM@rp3LBg2?h_seT8HO>k-XGPo&fzW7X4mQ=q@T-M;D2$k&8jKe+Km;Igs zewWG-^|k1K9>*T3oezW8;AvP|lIV M&fk}PN51sm08hXxVE_OC literal 22443 zcmeFZd05le*Dv~YDq0I@t)h(e$FEW=0xE;dKea-wARjT^UIcUC8Ux<%m&gMXE7-MMw|k2ik3 z@y{0%TA^CeR}v@fq*Kw03wY1&x-Nb~sn~OAWjZ&SdaaEiasev+&wjR#H*ob`M5MB^ zGOCq}Y^++ASl-L4UX^^u5bf;|W!kn!DNXI+#+&QbWckvMUn;^R`8Hn>tQaeRk%$*p zl7-3VKJznC-8fi!_sEcC3Eo5eNI1atHr~wBBCpZ#C&XDziSv|;;$mUo0V8WKPbWr^ zM8sX;1}jiZ#^TeM-D=$HHjDCk&qeF;kGqcr$rE!u2rlAx!fCE8dGf%d+(p(X^lIeg z4fL1b1H@y=Ng|H3Rx#g=;DD3vdoWTmu)v60{47NCRle~+;CSnNkS@@S^{CDT7jK?& zuvv4~>QB7jJNFpLMJ=nM>?Jb4A_Je~C2J*g_B9cDOIU?nr@r(LUKnpK$nLxfB86rOK$BT3&hxjGzoMSN>h z_57%Y#Rtm*pUumQm*zi<(=vFcxj`T5|3zL;+|M8X5*l+gs;A`zT=VL~D(RiMv8)6^ z@a);q908Wl=o32Y0J!kk!IOrP2yir28{AMnr%Hg>{Jbw@b)PgP%& zTTSL)BG`))%scM~vZRXUm1n>VoY^-&LlEiw7HulwPapofBl3U>-8vC9!t$fU+gVQ<@=ZKVz65{_*T z>lX!MyJxfkTXKGAR{r8yl8(vhLw|B0h8mWY6HnHU$ckQ0SClViL>NaeY2J*kv6PSd z^<>D8jZ_0;A-Yxax4&qAsCH;JNQ+M&Vq6^Q_6DJLLMhLsjm!VVtdxTufx{ zx}MMMuaN1ej(s|CRXuvvisDl_p=FpVq*w1>m2i{K3%4&FU%R6%;0Fl~D$aDq#YrCk zEi<+I1}mF6xV6`7TEQaIi=qL8C+x8!_Y60`vfVkG=j>^5VdA(5 zQ6x(tb(`4fTO>8tg~3DO{ek9B@cn1x5;l#*25afd*SST10@Htw9& zT(s<6$O{i&F?Xum0@TKa%g9Q5Hs@B1@(MnS=Dp#@y_&Mg>7rODRC+L_ELAvwEVTOK^qsab2d@>U2FIB<(4Kz?K{-|hxYFGnn{rn z7M+QUuh%#OqxIH?74rP)3OU6pUmo`%>kxe+DbPK)eYyUH_p@*&7&lO?$u(fSUd#`4 zEcy*W#y)&t#BM;a&-YDV3g#QMsf;2Y)!Rq9r{0z+ge9!?3gtaME3$h3{WYhY6>YLqnpiZP?BZ^#;C+#i z(AOa9FX)=K@uE-t9C|K#K!VYx4kV-yIF!7a(Usk49Fh6tBLAigQ3y2<0aMtIWz+w}_mGGHW1zC@LC}RSWigQND z);DWDZ1sF!?``s5WUGJDk5~C9wNK-c7Jd$G2=$X@E*2-Oygp(+uy?AldU`3`y}A{D zD_NvoBJQK@vSYKf}ms%geNR-v#9(20)Rh7s=V8aLYZI>*Yo;zlPaOzV$-YlNixc%5 zyt@*b%W?LuZ@k}U47u{ z7x|pn)Tw#jgi3jlZF_E|L( zmsD(ot4Rs!(E^P&xhU2&K-Xd*G&|K^Wjd-MO=v>OnU3mryk<36)3|si9!TV@c zg_3wjar+%r>+>?7Q*MjeicT8!&vFGsSxdD*UW{M3D^R&gGnoBy#$EO_oa#9+n{s_% zwN%4vF#N_?QgD_+{N$BW?6hY}BhBQq2PUUAO+WU6jM67KSe6?}s}2sE8Fin!+~TA0 zGU4hK_V~x?wa3HJ3ojK-3|BuUTVF_BiJew|y$Lz=!oCY+M)ny+?@9j5iD@h9jA!ie z0Oq;yz4uor=hW3_o06jzI7;Uud$aTJPs!ik!F!usTpS@C&fo;?oqjgq%VqWi<_2Gj z)LE-nan%|esZ~g?kGaSm@5)_`kjhPZW|E9rs0n1@25wJZ^%wCFxfu3*0I z&UAvzy2UMvZpq89Du~ON>HHq=->*0Du{YBG?snCP&KjM5G|#YM4CHxHOy_WJ~3RooYRp_p%7!ST6Ue&QcJkr=J@YJzKmdtd)N zC%@hO+@d*&BLLYb!9MuNq6pU+J=->K*?TpHJ-#$OT|1lAw*gUqdNFl~K@j7(zG`}j zoL~Vpkx)CF^pjqhS5H)pAA&5#Oz!KZ+q0{B&gHqv;@DcE8tEUxGu+(@76RQ6E5^eC zd37!mpGaV1cv{?FOp^N4_g!mF-dUAX7L?UBoM0oIHXLA^#EevK=0tA&BlhEmJBtks z1B2J?`)uEK8T2k6_ZTz?k-SS@iLEiC7@k2NMi8fL!B&25#CyZ(D;XNSt6LOJ zj;ooEbtwMGKcR8Dm2Q&Cl3h=ByqzBrr|8*S^CUX2Q`H|Y{VXE|=OSfUmeH@;>8W082=`D;~TjJiJ}y4i*tyq{cf9kVG5(9o;HbGA}&3+(`{vR zQHv{xrdTdT?ETl3*4NeUMw+wfGPSmMj=;3tzi6|Q%61jK;e|{Uh8Movgq)jQh*+)T zg!U#VQF0&f?U^SRrjG?{Agp#6N-p~QdPFKqLG#)N#5H<@wD5d)W2>92SAO!~mb$ST zOj1L5JXcSeA#<0l-kokVJcNY&5M}Suq1DDPUz}O z#UF)>zIwb04oIDxh}wMvi**iz5BafaQwgJb*46tl zixLJ0?_5vlzEX~HnAo^ zuIXt|A&XWt+0j1}N@niukqckhzTJd`&giS@?a||fHWDO@XBf?a&dSJ8af|s->D-Qq zXhm=FnpDvVYgsQDK9dG&Xz?(4IVYkkO2c>$pF#Keb~y2_mgW2G8s4y=Cur})az*l& zQMw;`gG6f4(_;o3M6#IUixCQ8Z0nwfZ32>aNyAh81-6j{r!6Ja59jU8X$!IN80cRT zbCZJi-YD;||6{N_$~&zzK(<1`k1GiV!`NrlB7%&oWywM-bNSQsY~!I^al*o{P368u zgYL4Ae(@Y7X_&Kojc9F-&<+?gv&H@UxYEE(yl-^S21NI_(_7<2g9fpa=YDL9Xyz)K z)DDCcofrPutgmsol@ys%(Pmp092IjuWm}vH6<4FzjVZEgPxtP5sF83uKeV=FF0r?I zaFj}-s+X8fas-9BHaA377J(^v`hDY}(jKO*wTV9?O*pNwrgjfueSSRtmalQ-=d-`= ztMYl8-X!0EEH1VI^~|K_&APq7`R$b(v@ z5n+!y6>+_dBXej107%js2XWS;Pa^?K*J9C<=xXh3`$9K5eo%Kf2rSZo? zHMI!cS_~spHPJ!iL*W&KrCMiea;_ul6x&%b)&iUMlq@1!S(Zc-*xk<%WKYjOw$vMK zw$31Xbs8v7H>#C&tkvRiVqeAX2>QyvooFrNRLfi0eFGGUilWa%irSbVqkcc}+GVzV z%emf>z(Fc|bG=B@bfzfqZJ|D;f$me*uWa~Pc5UHsUko)QYf{{~sgr(@{kx)m+ zmwCzM*2iP{MyYGEHsPXEhLmWn2y z*S5}??1NumjaovyDoAwKCGt$ij{ZEZfe|}Ub*z_BkB?+q;ItkL$8Ugq|Lq6cqAM86 zebq{zNb9n)peCc=>*hEKuC3W(sJ$Ook8cz-x>$SX8ehLuWZ3`RjDTF!`llvjV>Psz z59Oxl7e{o5u|K4=(e?nMfv+0QODq)L<#HZ4TN?-tY@pm=dWVNyOm99+c5lVT3m*?K z<5EE;L=YuxL0eyOvq^|=fgZm&r%zr#LajXK?$#O?ME90Xz-HLJ(EX=&?2ovpkM(NcABaJy&CJHhlW50;^2M+o?cC;i zKxVz!0mwG%-1ay5b3mTy+%%JP1xGIkdi_^pI?Wh}p`E-z zM--IfL>CA{TYJkV9&1w+0hzLOSdTUIr<0+Fx98XBm(V0`y zHc&CmAuY8QdxEbK9iUH3+kI{hIj!lV?|gWhhei2tp!{XL$!74a>wryejpMz@&Q~^` z^^PVvu{p@tG>{*L!--El4cQ7y>#eD1Qpx7YDA5kjA0>Ob$$g#QqydpL!;K*sXTVu8CeYTyJw9yMZ zV|}*9ZctjcnJ%yy>-n}gAd~nE*v!rrwOI=ggvGCOM}Vh*B8}T4&Mzs(;IIvvn!2fhy^D zi7G(&@y}m)5)0PZ1I~egEY{b|4h)o@fwE-n0|U){KD!aHAKMS4B(6(&3kI6sj}D}C zx^}yP^}6OEK;X(cx6@9rEcxr>7yuzZ>_CMm{G)%1oBBHUAP{o0>)Kj^ z;rC>sZ}Om3F0UI)1Cn!4@?J0>w`=Q~Yz9M)eu-)l0gOfadk)^fw7M#&RnCJK@7_UQ z1g@fc5G7JffleRIaD3=>#M3crD}u-tx}xpGgF|KGBojsnhdxsWd{1H{j|YXR=NzXDH2myY!gEFG;WG6_)K{_(;SseXq#^l!j=v|Q-V$Xy~}K7xl{ z;T8orVjh`*N8*+P{adgmco=tX=K*=~5e6my6OgSJ&|Nqd%wg&tAB>Ic`56eg{`M4j zWc>tWN1exSgKr|>&BBL8@J&;os=;9fjD(gufSdi+7ji!UK73r40bBYlKLYZ_x1gPm zu#Q0PLwGp%<2FD@z(l97MfU(niplr(yu_%gTieTlUq%D>!FDOB&E|PpQt(l@9AOeh zpIX*m!3ig;I14a3;qkIJLMcf_qXK#dZ5HUPeiM{CZ%^4t96g+BO~;3c7n7rwOvw5g zrfc(LunR5AbMs92xf<&60{BgobK$goLlr(;Cz)=P`hnmnzR7jK`PNF;lK-`A%B8xP z*m=oqxl0Z`&=cH(fV%1L47KATJuPFK=ewC#q=5otl&5p*)`H|Z37A} zDlW0qyo-!lNeA3JAjtMJwcA;aIfa;&ykw+CXiiS@kO_oLSNS7JZ&P(^)KY7vta|YL z^b$ET&!VBn4=%RbHaH&J(6afu&ZKo&o^^%nee#5wv5coz#dniYn?{(&PQ%71b{Lvk zuVX<^aIPz|)EG2lW2-F^yEVneHG}@Q(CMB8?h^H&aKfi8k78ZbY=xPbjcd`-nRK^n z-vh_m3&-j+WV9scOzQXe=O;wQU*lK`!)Fp!z6b}7K)m@SSP#v@iD13^6uFm);uVvD zI{f>)0y*~HrJ9npt`Bn}dsI}G`LG@`f7Cv5em+witZ3pS?Q<9QQ}LdsUehNMbf}TB z--~x~OAm08;@4I40PdYt6pVjhf|27sF5f1Z7`HS^o08QEEw5HgpW!}HjGk;@;9bSP z3LgkV$%ADLmn%dfXKL1?!$5Nb6QKFnbmzg01UxQ4T-!8%tR`IkOY)rtEda|BZVMY@ zigEU0eRA5tJ{Ss(AcwO4kyR~N`BrSCctT`Onk1`{fO#(vmi(CAMlFpAG9?_}(UK-% z9|Y}zzu$P26|-4Xxc$Ic?wPcV7qTbG2lwVVTK*|n6>`YlWUqH^!)S3<2Xnvufwn>9 zO1CeM3KqBQ%YzvvJr@MP=>ip?0FeMA^yh_d0hy)%*+cF+8QP7Eal@-ENCo`szz7NG+yPKV~RL`wyCuI2?J_-NI@I@doYoWIk7BrWrtF|2bWv*b1z$h z@5aIk+Q@vkT6ao)S<)Yc4kV|5^OKZh$NK#26ToD|Cs+P0k&c2y`uepea`$=tCccS_ zviVqaLqlD6YKUdI(OeJf&57d|ynFXg1tUVay zx>~%y_~E_>(B}(5<-zu76n2}@B~8h{E^gssFtMS6s2brpt}jV|5mEIh5eYvV16GzZ zP=fMPuJ0Z87vthkGGkOS|3-L1al;YthB~OP2-z=N zbLxy@^t3CZdOuAzEYz6RoN*0zzURy#H&ptBq#Q8Hvse#DSTZTu!T53=yRLgK8Pu`| zAN#v8oMOIN{F>OQ3q}(xpKhl+7W_cOQfFqJz6k^VY|$Xt9}2!@eGSJ8$>vX`Hc3eP zs)lbhNm@LYpz|CAk?!W-u@H3cT$l2FM>XTgYe6<*pyQt)ozWzP6I{JKidK(-g2>0B zR&uv#Wbn8jjFRP0ur^)K4K4c|Vn_Pv`s6(KfjOd4TUi5DGM#)-E23C$J)9tdLMGpL z9!!r<5^Hd`>okHkY#BH(>^snBeZkYo6O-Gu<30ajojd#Y&oYW58lH?jCB>ebM~jau z9Hhx`LnN2uiotNG5ywjAe{Q<61LMLe_B!eh>);R-&fFwrV${oP;Hl)f@V8BxQogW< zI{@keh~`aDM0=%noC%>~e=#8j*DXxs5>#!(>kyyhfVpR~nJyw(#l4;f{459|Xl0;G zMBpa;p2Z~_0sCPwP{@5vP)3MPU>O;hfF^SL9*|LhL%RW1$l$FM@Y0|cMQK}p2^h|v zs@;y5JW&Cq5ep4H^ez4*An(bGQbAr#K%9$~0N#Dgoj~$UAelHYu^W=V1Cn_;c_rE(Z(Fni@X=gd8^p!)G04d<|F{0lY$<7U_U$JoFj} z910q@hb$KW%W*TjGnA4Fq@>^V+6^Y54d5cNpePWqW5?h?77Jy7r3C;cBt1hDlm_B` zP&rt0@0#K2?1EAf@eoui*@J=RAJ)Ku;5-ei@g9I&2+##_<=rIY-VI!-Ww2yE0??7> z!1a`cL>Dc=cm8E8tQRUm#jR2B7BId#&l${$RZD+oit%W#OY3KhKe~M`J5~+B>W~Mv z0|zrWHU@;hY#96M*uUKcD9{1v2wNMa6LiH~nj0pYXVaIriV-T`iB_@WIy1Uy3GH;5<;R=#ZDFfg@vw`GG3-2KrE)Ut(0g^v~E@|3-IcG_Qq^kPKx{+B!h;M#!DF zun5R!q3p@C8Ib%JB=Z*}kPKyyuKFmE0XGUNksJ>|M09t8)ua7E29LzAfR`ZE z(O-dQ+GZevwHE{9eLIvq^%sl))z+*FLLyBvkdX;Gba_fL|Xf)0dcPBKo4F~ zP8s>#E?N&B!Fqb=1em3Iry=Ik!FGcuFKoo)$#?4V`4zHy;ls>E<|P6Kphs{UuqJ211~T~nT78N#TL3^a{UAE4mntOJm37n*%2 zIl-<=#P^Yw)&SgQB@F+hKKA}P2MjaySB4nHdk$SS{XSBiYKw*yD`BqTX=t;%FgG2i z1ed9=1y!sGg_U=vlWIrjHZ3}eBJH}gve#t*@QJj%FvKY9=TSt?GH0E1mW(0%t!YGy zH=>?F)jS@*I*FcDV<(_pFWw*f^t}r==RgLtbT}YXxxbp@1TazxM#VWWy)*ur_(ju* z8c79(d&DQ8VnYyrFnz^C{FktXq)*Z`y2$U?v6@&c2@*f$c94slyhUn z(lL^g>We`KOj1|Wrs^7#7CKlV+B@izj@hSK^od^K;Y^T{u+tz(5DUiMfZR2-6&hk> zNC=*>Fxpv{?~i_=*ijpg%Q?)kUhf>W`~;1EZeA%)%aak(JfE39{JqS07muz~0aI?@CuG0oRXKqu+66nE_+ zdsFoC9f8kco3f&TS&IOG%%|{;1;)UBcAx`*wB#HDX#hnL#M47U5J^KsIJrm1Zyi)^ zqeNI<%y;p`c)Ad-Re%KQb_uA4z0>lKzmLbrQdfbq`M?=5ThYXn{_m)5$PF6nbad9C zJ5R~^VOxW}&l7OCni!>6@{F@(AwE&OCVU~RP6-0zvC3g&+ztY(6ielwAMov)>~_89 z3J;0wI8k_<4K77krs!nioa<^?g?DC;4=&mF>;XE%_6V|vYq&u)!40iD($4@VHlXpA z%MFY*U3@I;7m`Uu&P&;y@&4jJlZl|Ei1u@cr;S@(nleFWuoNGD3M*xE&3i5TOM8p; zO7bv-V0NdHeTc>SJ_JR1wDH1cN8?}k5iWur^qYem0zsTAEX@>nTl;GOCGJBPYsO}i zGoy7TF|o@BcN>#1cAA6pzg7Vg2fzfZdpo%7d|MWUn(e4omPO(8<3M61`T{(T+-)+% z9Q<#A8$`Uw-Bv@)H!2QY8DUx1mkcyL2+benBGoIvyjh)aeU4_2g^U)_FV76zbK#WE z#IaNZF@qRc4EuLwaIp&A!VyoQx(WXuAvbl1PTT@OW^}Q3_w=-6*0nxv(>~CA!o$U~ z0N;cLU{*HdiAi~OB|aX<5h{?+D#cADfO|x-Fo~gie8g=_NBYpfLR0dei#=RVveacM zcrQ1>mEHMSeurb;ee<7@TL3Idl+Q5$b+dY*qmWTrmO;M6rPHkv!Ug!4JXYNI8lz0_<;KjFH>^fc54#$Zi&egY0leM$_{chU_o| zD7!GGkR3{&eDwz`t)HXpSE>NJt|eqI^OytdXHn_LFd(2<@1XR_wm(4hpw$e4eJ$)Z zkT8%>%7|cr(KJ|lhx{cV2ZL}xBHsM512BI9WFtCPi~y3;g_^UDW5CXjbrLStRErBh zj5Hc#p-1~emVZJPzJ~@VsoQOVwlwRqUxDeWB0?6l-jtT z1AE4TU?on}{s1!87&N1SCB`1G_oFP0f9wJ*Dv*U8Ee0d0!(BQntoA3so(>v#2sXy! zG#IrJVhaQJvd7SAVcE}OI0*)THL&9F&Ug%*a6sE`03D+q8-sME26cZL2s_g)?f;gm zog?J>>R4eE@N(XB=jbRwDu?AiVcPRGp#z6hFr09HaG zZ4BzvjH()H2g&^?xez5gKvhG(gJe~djGBRr_LoDyh2%>p`2gf5qfKhquLQ6XCBH|> zsO&?i>|T`o2qmMk523O(QSuLvJc-Iagv$0hXE`=6d*LS|bLB}bf=>|Q9{}AWZq|(& zvxyykvUd2I!7*qWvEMCNFs`7_My*@<)U4<6qUuw*gIOoS!53=i7smE1Y4W}YOOray zF*>b(0;iyC0j5GaK+8bZ;tt#oT^3??#AXqjbk9X_E-$GXe@6TZL0!to6!(!$>@P7moml;Y6~<40^~UnvD^k)H5&2CJ#d3848Whas}eg~o7k`m#br@^Yg`q1-<(}jw0CbAHmTv(-O@||>1sH|$U4E+yA9k#`16Q9H^ZYcDr zOAaL^U?NM`?AZ%IItz_HUX$)dzP*ZJYQOBduu^DCGQoHovO%kpbqQ>o5L(W~PwHJn zrJAmmMc_z#R+vH3;VfH#p+7=%Px*I&-LfM0DM_EISK3DLa%PNeZ3A9*2x2x?qB_JU zY20}3p#vPP*c*b4U=3hYVwvejhf3=n;ZKUwxJBv99zfs%6sZ1JN#oVLd#-YZq`qmM zoIU}4%n<#i^D;O~OdT@11zgkydTZ7zM+cZjry#;*Ri;O87G>pNYI;7dvghHUOUrd= z9X7ZxCLI^LxaZ|x{Y+5rE3Om*fP)(Z4W50S8xd@4Sf`8%(__?DfP@6Y2f4~^wPVkY zl_?;!#WrjCYFd2F@YlJ~qkojT*RI1Cq7p)^sz~1ez&n?#Tb9S9NOZVg9V^~~u(Ayf zgES1z#fVGxTz2}(gCs}UGVDj~A7bEPr^D?sT>OAwaDhOFT+{jtEChO@g0%EDp*u~= zCg@VOXq4MRuV*=${&&y~u?pI8=lm|EV-E! zs#+L$oMBc_cM8{?T%txgN6x!sN%C0`Nejb3i0i`Kg*5tut7r>Cqk+9MUapK{aL(H% zd`eeOxPXfgyKtRI3HHMJ3jFy~{{kiP>{&Ro%h>_9l68z)s@%oB$*e`7d1XSadzGW- z1xqTpP*kFk-5K{0_HT(d(b?95n6dJyXrSP);YNQKG&BH{b~VjY^DC6Va>MQdF+S_S zkY#K|A}%HWf=>bd<%c;-<%>W?c*upY>g{&T<{i1{ZB$_FapYqDvq_N5Xb?goEgb-w zJ;@ZG3g}F3HPgz5IP~})xK?A~U|R2+BzF{}XEk44Cr945SW7$A1zZ`PiXqsYK<3(2 zlQxF5LimiUq3kv?1^W7f5m_IHlZ8JW>;;hso3;?8;%@o!y$QBp12V^v9(D#ktHh>VQ$AN@b0JwP(9t>;2tBtw5%-8dm!L~U}xs& zmt~|pM~2^<7!a%FXsiYm-hbrN(M(QowRZEo!txz-x1`sh$p)UKfDm_F zfvP%hTz;}6BhbjMb@slngFCADe1=X^*8B)UE-DNil*Im|-rdveqF$blJ!tlT13^%K zrVN}6!I0m>szVz`b0})tqp)DGU@r%`dlS}?YFO!Mb|?oL^gXa#eF=r2Cs(XqR0IVw zP#~N_n(aWrVD&$f#@- zWYK0&@>jz%@^I1G^)Tk78OPeZ|3;4YfgN2pXa`nzB=7k4{w(`s;FGIYSB7uxQCr=T zdVcfmecEq6x!udX`01NRHY#^FsGs&Yy|a0XO=8M@mroCw|LjBhd6toe8E0vAGz;Yltyi-d3T z77y0}2R+`8x13gjW>C*GhogNn336-)9Ot-kERaIU+OA(8MQAr_dGoAhkncs0Ub?Qe zI@J3p6u>gvv+Hn7EC;G(1u@Kabo?e%Ti8iP?9RajeF3$_2BOx52nvZo$^B3jtQjQ3 z<89EvgD_$pHe%~g@=cTs@dB#_90V<>kg z%H4pHQQ2cCcRI>_1d^v9Iz#rL+^}bb(A=O255R&b%7mA zBqrs|CcdqUybK>Ge$8&Ec4gG=Um(nVc(MU8*p51-x zftDBHPf1Dc7h4h50&4i!`+mxNEsB?!8M8zZ$n{Pq$ZiOeNQqDP|0~f!{7e{{d2buI zZ-JU)>HY^LJ|-=fNl^gxZpk&W#LHZ=oGKi&Gf)CoO;Otn1ph`{YAP7<=N6d+FSQBZ zwXZn1aB{J_KxYUq5qkGOH;AlNHRK(8dc8abj+rHevejrnZ5>qYfdkv(lw~$iOW<2~ zS!BU{k_Y43Phba@1(Plk!#uN*pJUS)7*Q^BC#l&8B1_vIVC}%NL)d~Ouz_%aO`{fo z5jPhVNZ$K$^BoyAy(Z6V5hM(?++sSAV6CRnP0DcA=f8+v3l~3ZUzt}u$(QX)RYX`Q zdZyLbeLlP9%}uct=ooIU@uu)y7!jEQ21)X6d{sa`L_VuJBLv=)g09(;U7gE|Lu65L zqTj+?hfM~ZT%$2+T7!{$ip#;)SX7pn@B*CO?}Y`9$O!(;JdPX@$_p9hhWGzL-(BNs z-L+$iZ#K+BkW`pCS^TO@6LUHf&l#V4ENtQiyT|c8!TEC}C9w|tFl$-3%^ZLutOM$F z{OU|%Y(K^(W4iXKq@aBh_{{;NBbgBZ%&|7Ybwlq6pj%%g>UCvxP*&%fFtt1*(!+T_ zNc&huUQ7x!?cR%5S<*p_);?)mxRP(8H~0luRD6-9rCFlj3&}==*NL|*l~h8`<9_WM zME|g$O6CqOt#~@kC?mYWe@ja5{$o+%?1!| zuk%1Gv)Xmdh8PsdnrTLSr1<_pF|KPoPX4=O6A}k5Nq|_te_Elw#<<@e1f>tOHmh8{ zW*kf~4$Wq?-5_#_UqQ01ZgIWmp6Pv_*h60K1eQABc)Rl%O&l} z^dzQ*&*8s26o_32h>#n?k?B?jy&2H0&2xY7(&=05JE{Y zSL;jgXK>OR0JnI05F!@lICeZ`xS59D(P40gmB1fgZjWhr@&Ydw6wK?)(DcD}0;Vsd z&>v{{xP31DAUCRSJnmy*DNteqTnz*J%+2-P8R?t{7Zg(@&wRd@fjguqsxSx#-`q=2 z=Y;dF$Latmb>-^XgvR0)gjR_zfG!BA267rBcF|MrRP38P*>4I^V^CvgVKD z8s{h2i^qhQL7Wgh(friHejGcic_kFwd>jK;3`)38Ak;0N_=G0Y$&nZnaNdYy8^#|Dl?@`g< z5hrM?Lh>#&aBm*~wPQWmxqSkidp(|;;k7;*Y!4&Y`>>!@quT1KfwIKfgF2)?ENI6+ zL8AtRf$%`nOM5{>(3@xp&sC8rW0W0L zkPdHp@x<%wuyV$rFp!o5lqGt?tqn321KBaCff7*ZIF#KBN{>PDEA1YX?zt}A2xUj5 zC$u-5204r71aOo&`jX}cB_QlcX?F+7VLOau#%qmwWa^C8GE1RL#dDK+Y%i`G$I0P$ zvPHE8R7=@}jCs%For7l5>Z9f#zSpatJ=uMbrOx>9mHtKdtBOciJ^*UOKdyqe#HW0R zX9hj4oKd(5QiVo`*_Lz>JNgLkPT% zhFR^<4DjR{K)MI;O?Yw*woCBMv#>3Q(9r3YKqo+|A&%2kgigR(gcf;%hBOKWY4G9~ zLWE$DcoVfH3I=uI5%4+~WSvBXpkNT)0j`5V^fdZ!FxZlYazj|d@<6!@Az*6(mluH$ z2nJd3Hsar4uw`8~1cNL)lp6(uc5ruzV69Nh>vkivVJ@vpNz>!%KKi>76F%?h;7Z%M z<57R+T;0=2Nkc8iR6N;b(fzWe8hMwyd&1C;1G1BBk- zs(0@L+Ch4Y@MR;D-K*GRnN}^?8>Dufj(KUg*eB3N1^Hjo2ndL0e5}Y2NhO58A zKiv(i91kwFU~TIkf`DhehqnC%o&O%#YO{mAGlT~3gJS!j_aV)&7ZC<7PlEZ!L+-BODu_{~)|mFmjM<$<^Qs%{Y7=iWxIx(QrEZG#hhasIeq@vt!Y zV5&0Gf}%^T>9pVNzlQ{r9PI6ti?qpFgulJ#&mWn+%-a;>XAVe;xOwy+XBlg_0q&^*Wa2w>kFuEWk zDd0sSII2ROmI4vnyiH?9_59)8U1V#mT;N<&8(uoH&PdZUwVrbkg!a2QH<=tH)dv5H9pGx+&CNY zoA#BWSe^=EfL1`3F#DfF1dLjOsDUXd6}IaxbzO39G`Ue5=#ml6`)$~iyH;*Bc;53!lL^=v!HzpZ zll+eg*)BA%O)33f6*6oY>S*-F|6(D-ZbV&T;6D{IgRjKY`vRKxpP56=Cn8 z{yOE=(f`QjbE(?mq~(WKr+0(%esJ9r_;jqh`|Pql$?E9hoP{txQLMoI#c6!4Gc__a`3vyb4L^V`rGp)MhS<1_yh4A9;ToD4>YNdd$hPHaBmPlX8Na zH8Uw`Nw4nfp%XJq`PvL!)DR=Rwpo`c6)~9!GtUHAcFtodLDB8;F4c(dW#z((E!`EL z?;$7vd|GIh@P@!Q9bJndiz1irn}@gGL@Z`mn+DFz#3O zp*bK~fX^7L5a2_56i|Me-NeYz9mwin$cKWJ;%pc~;~D*)eOaBHxXyJQ$P{kAyc_5l!H;DhCW zAe8mA&lL*4;!f{MCq&{di=VYOS|9VVhTkIz@4!AVzF@?*Z{_Z%lid7_w)|Q)*mHo- z;_o1PWZE>E7do@U3r3o9s!@Xuod6+6)zZi}eWI!)j%LFh2>9@J0kXb^Mt&bnL3GZd z06#ju+F?G0njY(L|Nkx(00~$Q*nR#_=K=5{4FeL9E2GHlJfpzOx04eM_jm<$wUUu- zlh~^Mqh^V|4_%O~4C1Jd)yBIwSGKzC87nYN_*SgOl{=M2j$Fox3zMU=7$cp+i?{VQ z{^?_dUwm{MDL&T(d@IF?B=Wwx6X7=9kfzeUJ(0w?U>pNdNOp566XEM~AQqO7c> zj8c~K9_*a|clg+T90%w6wWn1!PQ{ODyIskk@-KOMY7|G5>5R#2M$6lk z&|p@Dcf`5k62%zq7H+ut-buP`VU5LeYU~Tmv9}$tpxkTo%zR%yW9^w(P--@bi%B?o0`+K3Lcz&-p?s?+EfoVSP)t05~ZHS2TTB~KUG+s(d6bL4-}DgpQv&5n|xq&?(MKex}^ns#$>B&o!5w74`qtQ7x(*H~j% zuRUTKzDnmDQsd{ACo??w-nn(Hmx-hQVWD}qDH%k6AHvnm8@;M0AD7Q3RKHEEZ;kQh zaWvILy~(YTK^NIQ;Y>2~#i}Da@qChb$Wm6aef^IE{y-Uv#*MBSRXb=Z7qvDtzmSY? z-CQ5mJ>V;7jC?5D<|}Z&xHVOJNnG4MvYLEb{9Odu%gNF}vivAnvHHgW-~aymowJx! zvAyPq^e`b|>e?!`*7g{GEIqsnM;msPy5nbmdjH*8nPh5w^@gyg54d~8{DXus(>*ji zY0+b6ZNej}^tJ*Ja7Ktr?6cyUfPy6x3UCvQFr&waeT z$^73{$9}>!^Vv< zIxrf;P0oYh5Aa_X+J30FHcQE{{#Rx_C@oXG?y^!%-0xO-mR%7He9O+>RX?_OqH@)< zhxkZwj$))ztk{RJ`a+4RkA2n}I&;6vjWy$cc(d-)=}*1^kw|Iz!K%XQr-OBm6}-=< zScCI5aPC}F_w({E!b1C37pW0cuj&HPCvLmvvl9xB?4i*wf?y7D-4F@9weJ`i=9I$m z1hqBsn3k$>pWH@V!=*awXpB7TyZG&cOR@{%dx}Z-p9LCrf!|6;F30Z2in6-FlLmJ?@g>utIFLbf!>9RHkX z=@;I<1<}2uRov!vbtlblt=KFctTXLsV%cwD&y%I34Bfh|*jU&q%2_!nCUE5*GWJiQ zKl;y^bCaB8w}oR{x;HkzmvQH~Yr;J64Ca>V;Z=&^T)MiS_U&3U8+Uo;r%9s!l~^`z zZWe$qBq7b@A_|S&96?h9eAZ99z{CFvf^qcVc%0}YnK=5sj+jzcV|E-5el55_gDpSZ zs!$S{l;JwLy==?fml%@#yi5$|^6?MhF0P7-C;TPx|N0M2YFP(xN<{lj*5{W&dkz5q zg+-Sd*GcaEW8?BU&?O<0H*s6J{#MKE<1*m;D`&fRi-vLTSmO`ePP%ltXl>LsIK5=QOs$c zbwSdF+#@&V>b(%w@1^hv8mo7%%*xx+e_`$-x4WowiQ|&g`>O7JMY~&(tG;TQ3oaaY z0@wHZtDCvmqqxg1;1}=H$>#sa7~QS-d{0Y9gV0GaR@AkFmRKms08Rxq#C{YRlbUB8 zVzTXTy#&UqpIauTbXLwdU;CEL>?*@7VXO(fZU>6h5#yOY0N|%OqjLsumpyPx#T;e( z5{Imtw|kdYm__*Kpdxh$3(I4ehQn@N;6xU|s_B(kc@6OH$hX8?I?)xGDqhFJYQrpo zle$`Us8{z(Q(r=Z|M!F!x*k2RIKtbYj{9;q6~xpyE9YR>jYU%g=$7$Ck@)QVz24>1 ztL-_J2_rln_5M2^&2zp^FENh7!JGq%RO?jDMN3{Du9UC3NdwOrMH)wTwSzE{9Zj0I734?OP6~spF3G3`^D3@P^Ot5=^4MihXTlP11yk5>V%MD6 z2>vh?kakk-`3yi$&6A)*^(*M|#uP274@VDnU%gH#O3(F9Os&Q^#~MwQ$E_XdeL-m% zsVi1cs81T44T#_b)%t$?T}W1x$|Lq%c}~ggqG7HoMux=b>ZIq&yTj8*#W1W3hn(z} zyxaBnO-3Gytcz|fp56q0Ke1P<(5JWiG}k*-LVqe56;4`SHUC+G1fcbUcUcB!8!_@H zY54=ks#mUowKF)?h&qUWn*1l`ALcuit1g}`emN5}uEgI(PVyuOb^@%dUs^^=3_6E< z{#dVMt*?E>+pxa9HztmO5ck3J@k}%Ssa4jV-og0a1ur5hTrGX3M%+oa)fT_BT+kO# zDG}-fS&LA{Es3V=tRC@pW}2FTW$)Nb_;(4a@|qqL6Q_CedP>_OMtWE_0nu-V&eZ#W$F^9R+kS~TKi00 zJH#AfeGJu~`fY7-Ip&2P+jVbWSL{35|L*#!QtcJG@M*#PE>a+erpLRL5B~ONA_KoX9<3F; z?EBJt>Q8UfsIWJD!6YL$zY6RZ!W&FSFJWCgkHsV|z93<#(sZFbZ0lua=)yC(vn=Y= zxU@=RQ3O^rAP7`_Q1rX*HMVIbq*jM2Mjmw$bA|3tzuxNlw!5*dTg7!tLeB(9980NI zYXRWTM>u5jIgg>g?gvLd1|^3Y+w$X6s|8i%%<(^RjBf0XJyFHnzgL=bxH9PlZ{?im zw;R*F-ULco)Y2e^`F0^`4+AEA))&`E`>$T2wmrCzkI9hG$>2{%6vPkkcub2YBRub%$mAbKc=R$btJ`72U@UMLt0@Rgbg6Jo@v`H#ymWx^s zTLCK8E;Fg`SlN<7Ae7?&j~&0UQ{{ZZ zY_0vS17Uj?_0GTSU3OzSFgSoYxA`qwG~OO_Zer%$zW}L0Y+Cu#KzQ>G zy}C^g-yL?&&0BFV`fu9TeP;iFy}-xfWdZg+ukLU8Xk6j?b!M*3yn={$NXf*PCi>x8 z!T0O6?OWyRV`6P9FC9v3ODm22<5C*zzF+Oy>f5WQzggn#XQmA^VZ^TunzX%}_YcL%SIU-fU(L%n;|QtP_Uhwi`k tLI3pzjrMyF^6xR`1JgFepdt48e`fnl)p6yw8t;Ql^K|udS?83{1OUqNL+}6q diff --git a/reference/st_rasterize-5.png b/reference/st_rasterize-5.png index 1106a9c18e1b79528c3f831552a10a3cb3a185cf..c574cedfdd4ce1982d3368b9087e7a7ae56e143a 100644 GIT binary patch literal 22627 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 1 Tb) datasets using docker container images. document RESTful API connects R client web service holding (processing) big Earth observation data. also develop discuss migration path raster package (43K lines R, C C++ code), functionality, new infrastructure. publish resulting products open access form, R journal, also journal (conference) directed Earth observation community. Timeline: Month 1-2: work design, decide web service technology, basic web service API design Month 3-6: programming R package, testing smaller data sets Month 7-8: testing larger datasets, develop test cases, deploy docker containers Month 9-12: write tutorials, develop teaching material reproducible examples Month 9-12: experiment different back-ends: file-based, database SciDB Failure modes: can’t get RESTful API work properly; solution path: ask rOpenSci community help (Scott Chamberlain, Jeroen Ooms) downloading large image sets cumbersome (slow) larger tutorial examples; solution path: deploy test server teaching/experimenting purposes Amazon cloud, Landsat Sentinel imagery readily available","code":""},{"path":"/PROPOSAL.html","id":"how-can-the-isc-help","dir":"","previous_headings":"","what":"How Can The ISC Help:","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"use funding develop R package web service API. Total costs 10,000 USD, breaks : workshop: travel costs Etienne Racine Michael Sumner visit Muenster, another venue can meet (USD 2500). Programming, project communication: (USD 7000). Cloud deployment Amazon cloud (USD 500).","code":""},{"path":"/PROPOSAL.html","id":"dissemination","dir":"","previous_headings":"","what":"Dissemination:","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"regularly post blogs project r-spatial.org, use twitter, post r-sig-geo, stackoverflow, communicate github issues gitter discussion. project live GitHub, r-spatial organisation. work permissive open source license, probably LGPL-2.1. Pull requests encouraged. R consortium blogs provided start end. Publications R Journal scientific outlets foreseen.","code":""},{"path":"/articles/stars1.html","id":"reading-a-satellite-image","dir":"Articles","previous_headings":"","what":"Reading a satellite image","title":"1. introduction","text":"can read satellite image GDAL, e.g. GeoTIFF file package: see image geographically referenced (coordinate values along axes), object returned (x) three dimensions called x, y band, one attribute: dimension name; meaning fields single dimension : means index (starting =1i=1) along certain dimension, corresponding dimension value (coordinate, time) offset+(−1)×delta\\mbox{offset} + (-1) \\times \\mbox{delta}. value refers start (edge) cell interval; order get interval middle cell centre, one needs add half offset. Dimension band simple sequence 1 6. Since bands refer colors, one put wavelength values values field. particular dataset (raster datasets), see delta dimension y negative: means consecutive array values decreasing yy values: cell indexes increase top bottom, direction opposite yy axis. read_stars reads bands raster dataset, optionally subset raster datasets, single stars array structure. , raster values (often UINT8 UINT16) converted double (numeric) values, scaled back original values needed file encodes scaling parameters. data structure stars generalization tbl_cube found cubelyr; can convert cause loss certain properties (cell size, reference system, vector geometries)","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) plot(x, axes = TRUE) x ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA library(cubelyr) as.tbl_cube(x) ## Source: local array [737,088 x 3] ## D: x [dbl, 349] ## D: y [dbl, 352] ## D: band [int, 6] ## M: L7_ETMs.tif [dbl[,352,6]]"},{"path":"/articles/stars1.html","id":"switching-attributes-to-dimensions-and-back","dir":"Articles","previous_headings":"Reading a satellite image","what":"Switching attributes to dimensions and back","title":"1. introduction","text":"see newly created dimension lost name, single attribute got default name. can set attribute names setNames, dimension names values st_set_dimensions:","code":"(x.spl = split(x, \"band\")) ## stars object with 2 dimensions and 6 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## X1 47 67 78 79.14772 89 255 ## X2 32 55 66 67.57465 79 255 ## X3 21 49 63 64.35886 77 255 ## X4 9 52 63 59.23541 75 255 ## X5 1 63 89 83.18266 112 255 ## X6 1 32 60 59.97521 88 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] merge(x.spl) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## X1.X2.X3.X4.X5.X6 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point values ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## attributes 1 6 NA NA NA NA X1,...,X6 ## x/y ## x [x] ## y [y] ## attributes merge(x.spl) |> setNames(names(x)) |> st_set_dimensions(3, values = paste0(\"band\", 1:6)) |> st_set_dimensions(names = c(\"x\", \"y\", \"band\")) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point values ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## band 1 6 NA NA NA NA band1,...,band6 ## x/y ## x [x] ## y [y] ## band"},{"path":"/articles/stars1.html","id":"subsetting","dir":"Articles","previous_headings":"Reading a satellite image","what":"Subsetting","title":"1. introduction","text":"Besides tidyverse subsetting selection operators explained vignette, can also use [ [[. Since stars objects list arrays metadata table describing dimensions, list extraction (assignment) works expected: level, can work array objects directly. stars subset operator [ works bit different: first argument selects attributes second argument selects first dimension third argument selects second dimension, etc Thus, selects second attribute, first 10 columns (x-coordinate), rows, bands 2-4. Alternatively, [ given single argument class sf, sfc bbox, [ work crop operator:","code":"class(x[[1]]) ## [1] \"array\" dim(x[[1]]) ## x y band ## 349 352 6 x$two = 2 * x[[1]] x ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## two 2 108 138 137.82484 172 510 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA x[\"two\", 1:10, , 2:4] ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## two 36 100 116 119.7326 136 470 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 2 4 NA NA NA NA circle = st_sfc(st_buffer(st_point(c(293749.5, 9115745)), 400), crs = st_crs(x)) plot(x[circle][, , , 1], reset = FALSE) plot(circle, col = NA, border = 'red', add = TRUE, lwd = 2)"},{"path":"/articles/stars1.html","id":"overviews","dir":"Articles","previous_headings":"Reading a satellite image","what":"Overviews","title":"1. introduction","text":"can read rasters lower resolution contain -called overviews. GeoTIFF file, created gdaladdo utility, particular adds coarse resolution versions using average resampling method compute values based blocks pixels. can read ","code":"gdaladdo -r average L7_ETMs.tif 2 4 8 16 x1 = read_stars(tif, options = c(\"OVERVIEW_LEVEL=1\")) x2 = read_stars(tif, options = c(\"OVERVIEW_LEVEL=2\")) x3 = read_stars(tif, options = c(\"OVERVIEW_LEVEL=3\")) dim(x1) ## x y band ## 88 88 6 dim(x2) ## x y band ## 44 44 6 dim(x3) ## x y band ## 22 22 6 par(mfrow = c(1, 3), mar = rep(0.2, 4)) image(x1[,,,1]) image(x2[,,,1]) image(x3[,,,1])"},{"path":"/articles/stars1.html","id":"reading-a-raster-time-series-netcdf","dir":"Articles","previous_headings":"","what":"Reading a raster time series: NetCDF","title":"1. introduction","text":"Another example read raster time series model outputs NetCDF file, e.g. see dataset can see variables units associated (wrong unit, C assigned temperature) time now dimension, proper units time steps Alternatively, dataset can read using read_ncdf, difference read_ncdf read_stars NetCDF files former uses package RNetCDF directly read NetCDF file, latter uses GDAL driver NetCDF files.","code":"system.file(\"nc/bcsd_obs_1999.nc\", package = \"stars\") |> read_stars() -> w ## pr, tas, w ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## pr [mm/m] 0.5900000 56.139999 81.88000 101.26433 121.07250 848.54999 7116 ## tas [C] -0.4209678 8.898887 15.65763 15.48932 21.77979 29.38581 7116 ## dimension(s): ## from to offset delta refsys values x/y ## x 1 81 -85 0.125 NA NULL [x] ## y 1 33 37.12 -0.125 NA NULL [y] ## time 1 12 NA NA POSIXct 1999-01-31,...,1999-12-31 system.file(\"nc/bcsd_obs_1999.nc\", package = \"stars\") |> read_ncdf() ## no 'var' specified, using pr, tas ## other available variables: ## latitude, longitude, time ## Will return stars object with 32076 cells. ## No projection information found in nc file. ## Coordinate variable units found to be degrees, ## assuming WGS84 Lat/Lon. ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## pr [mm/m] 0.5900000 56.139999 81.88000 101.26433 121.07250 848.54999 7116 ## tas [C] -0.4209678 8.898887 15.65763 15.48932 21.77979 29.38581 7116 ## dimension(s): ## from to offset delta refsys values x/y ## longitude 1 81 -85 0.125 WGS 84 NULL [x] ## latitude 1 33 33 0.125 WGS 84 NULL [y] ## time 1 12 NA NA POSIXct 1999-01-31,...,1999-12-31"},{"path":"/articles/stars1.html","id":"reading-datasets-from-multiple-files","dir":"Articles","previous_headings":"Reading a raster time series: NetCDF","what":"Reading datasets from multiple files","title":"1. introduction","text":"Model data often spread across many files. example 0.25 degree grid, global daily sea surface temperature product found ; subset 1981 used downloaded NOAA ftp site longer available form. (ftp site used eclipse.ncdc.noaa.gov/pub/OI-daily-v2/NetCDF/1981/AVHRR/). read data giving read_stars vector character names: Next, select sea surface temperature (sst), drop singular zlev (depth) dimension using adrop: can now graph sea surface temperature (SST) using ggplot, needs data long table form, without units:","code":"x = c( \"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\", \"avhrr-only-v2.19810905.nc\", \"avhrr-only-v2.19810906.nc\", \"avhrr-only-v2.19810907.nc\", \"avhrr-only-v2.19810908.nc\", \"avhrr-only-v2.19810909.nc\" ) # see the second vignette: # install.packages(\"starsdata\", repos = \"http://pebesma.staff.ifgi.de\", type = \"source\") file_list = system.file(paste0(\"netcdf/\", x), package = \"starsdata\") (y = read_stars(file_list, quiet = TRUE)) ## stars object with 4 dimensions and 4 attributes ## attribute(s), summary of first 1e+05 cells: ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## sst [°*C] -1.80 -1.19 -1.05 -0.3201670 -0.20 9.36 13360 ## anom [°*C] -4.69 -0.06 0.52 0.2299385 0.71 3.70 13360 ## err [°*C] 0.11 0.30 0.30 0.2949421 0.30 0.48 13360 ## ice [percent] 0.01 0.73 0.83 0.7657695 0.87 1.00 27377 ## dimension(s): ## from to offset delta refsys x/y ## x 1 1440 0 0.25 NA [x] ## y 1 720 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct library(dplyr) ## ## Attaching package: 'dplyr' ## The following objects are masked from 'package:stats': ## ## filter, lag ## The following objects are masked from 'package:base': ## ## intersect, setdiff, setequal, union library(abind) z <- y |> select(sst) |> adrop() # convert POSIXct time to character, to please ggplot's facet_wrap() z1 = st_set_dimensions(z, 3, values = as.character(st_get_dimension_values(z, 3))) library(ggplot2) library(viridis) ## Loading required package: viridisLite library(ggthemes) ggplot() + geom_stars(data = z1[1], alpha = 0.8, downsample = c(10, 10, 1)) + facet_wrap(\"time\") + scale_fill_viridis() + coord_equal() + theme_map() + theme(legend.position = \"bottom\") + theme(legend.key.width = unit(2, \"cm\"))"},{"path":"/articles/stars1.html","id":"writing-stars-objects-to-disk","dir":"Articles","previous_headings":"","what":"Writing stars objects to disk","title":"1. introduction","text":"can write stars object disk using write_stars; used GDAL write engine. Writing NetCDF files without going GDAL interface currently supported. write_stars currently writes single attribute: See explanation merge see multiple attributes can merged (folded) dimension.","code":"write_stars(adrop(y[1]), \"sst.tif\")"},{"path":"/articles/stars1.html","id":"cropping-a-rasters-extent","dir":"Articles","previous_headings":"","what":"Cropping a raster’s extent","title":"1. introduction","text":"Using curvilinear grid, taken example read_ncdf: can now crop grid cells falling selection prec_slice[nc] essentially calls st_crop(prec_slice, nc) get cropped selection. happened cells intersecting North Carolina (sea) set NA values. regular grids, extent resulting stars object also reduced (cropped) default; can controlled crop parameter st_crop [.stars.","code":"prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\")) ## no 'var' specified, using Total_precipitation_surface_1_Hour_Accumulation ## other available variables: ## lat, lon, time ## Will return stars object with 236118 cells. ## No projection information found in nc file. ## Coordinate variable units found to be degrees, ## assuming WGS84 Lat/Lon. ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { if (inherits(x, \"units\")) x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } library(dplyr) # loads slice generic prec_slice = slice(prec, index = 17, along = \"time\") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') nc = st_transform(nc, st_crs(prec_slice)) # datum transformation plot(prec_slice[nc], border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red')"},{"path":"/articles/stars1.html","id":"vector-data-cube-example","dir":"Articles","previous_headings":"","what":"Vector data cube example","title":"1. introduction","text":"Like tbl_cube, stars arrays limits number dimensions handle. example origin-destination (OD) matrix, time travel mode.","code":""},{"path":"/articles/stars1.html","id":"od-space-x-space-x-travel-mode-x-time-x-time","dir":"Articles","previous_headings":"Vector data cube example","what":"OD: space x space x travel mode x time x time","title":"1. introduction","text":"create 5-dimensional matrix traffic regions, day, time day, travel mode. day time day dimension advantage want compute patterns day, certain period. array contains simple feature geometries origin destination can directly plot every slice without additional table joins. want represent array tbl_cube, simple feature geometry dimensions need replaced indexes: following demonstrates can use dplyr filter travel mode bike, compute mean bike traffic hour day:","code":"nc = st_read(system.file(\"gpkg/nc.gpkg\", package=\"sf\")) ## Reading layer `nc.gpkg' from data source ## `/home/runner/work/_temp/Library/sf/gpkg/nc.gpkg' using driver `GPKG' ## Simple feature collection with 100 features and 14 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 ## Geodetic CRS: NAD27 to = from = st_geometry(nc) # 100 polygons: O and D regions mode = c(\"car\", \"bike\", \"foot\") # travel mode day = 1:100 # arbitrary library(units) ## udunits database from /usr/share/xml/udunits/udunits2.xml units(day) = as_units(\"days since 2015-01-01\") hour = set_units(0:23, h) # hour of day dims = st_dimensions(origin = from, destination = to, mode = mode, day = day, hour = hour) (n = dim(dims)) ## origin destination mode day hour ## 100 100 3 100 24 traffic = array(rpois(prod(n), 10), dim = n) # simulated traffic counts (st = st_as_stars(list(traffic = traffic), dimensions = dims)) ## stars object with 5 dimensions and 1 attribute ## attribute(s), summary of first 1e+05 cells: ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## traffic 0 8 10 9.99961 12 26 ## dimension(s): ## from to offset delta ## origin 1 100 NA NA ## destination 1 100 NA NA ## mode 1 3 NA NA ## day 1 100 1 [(days since 2015-01-01)] 1 [(days since 2015-01-01)] ## hour 1 24 0 [h] 1 [h] ## refsys point ## origin NAD27 FALSE ## destination NAD27 FALSE ## mode NA FALSE ## day udunits FALSE ## hour udunits FALSE ## values ## origin MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... ## destination MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... ## mode car , bike, foot ## day NULL ## hour NULL st |> as.tbl_cube() ## Source: local array [72,000,000 x 5] ## D: origin [int, 100] ## D: destination [int, 100] ## D: mode [chr, 3] ## D: day [[(days since 2015-01-01)], 100] ## D: hour [[h], 24] ## M: traffic [int[,100,3,100,24]] b <- st |> as.tbl_cube() |> filter(mode == \"bike\") |> group_by(hour) |> summarise(traffic = mean(traffic)) |> as.data.frame() require(ggforce) # for plotting a units variable ## Loading required package: ggforce ggplot() + geom_line(data = b, aes(x = hour, y = traffic)) ## Warning: The `scale_name` argument of `continuous_scale()` is deprecated as of ggplot2 ## 3.5.0. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated."},{"path":"/articles/stars1.html","id":"extracting-at-point-locations-aggregating-over-polygons","dir":"Articles","previous_headings":"","what":"Extracting at point locations, aggregating over polygons","title":"1. introduction","text":"Data cube values point location can extracted st_extract, example found vignette 7 Aggregates, mean, maximum modal values can obtained aggregate. example use categorical raster, try find modal (frequent) class within two circular polygons: find modal value, need function gives back label corresponding class frequent, using table: can call aggregate raster map, set two circular polygons pol1 pol2, pass function f:","code":"s = system.file(\"tif/lc.tif\", package = \"stars\") r = read_stars(s, proxy = FALSE) |> droplevels() levels(r[[1]]) = abbreviate(levels(r[[1]]), 10) # shorten text labels st_point(c(3190631, 3125)) |> st_sfc(crs = st_crs(r)) |> st_buffer(25000) -> pol1 st_point(c(3233847, 21027)) |> st_sfc(crs = st_crs(r)) |> st_buffer(10000) -> pol2 if (isTRUE(dev.capabilities()$rasterImage == \"yes\")) { plot(r, reset = FALSE, key.pos = 4) plot(c(pol1, pol2), col = NA, border = c('yellow', 'green'), lwd = 2, add = TRUE) } f = function(x) { tb = table(x); names(tb)[which.max(tb)] } aggregate(r, c(pol1, pol2), f) |> st_as_sf() ## Simple feature collection with 2 features and 1 field ## Geometry type: POLYGON ## Dimension: XY ## Bounding box: xmin: 3165631 ymin: -21875 xmax: 3243847 ymax: 31027 ## Projected CRS: Albers Conical Equal Area ## lc.tif geometry ## 1 EvrgrnFrst POLYGON ((3215631 3125, 321... ## 2 Dvlpd,MdmI POLYGON ((3243847 21027, 32..."},{"path":"/articles/stars2.html","id":"preamble-the-starsdata-package","dir":"Articles","previous_headings":"","what":"Preamble: the starsdata package","title":"2. stars proxy objects","text":"run examples vignette, must install package datasets large (1 Gb) held stars package. drat repo, installation done ","code":"install.packages(\"starsdata\", repos = \"http://gis-bigdata.uni-muenster.de/pebesma\", type = \"source\") # possibly after: options(timeout = 100) # or from an alternative repository: # install.packages(\"starsdata\", repos = \"http://pebesma.staff.ifgi.de\", type = \"source\")"},{"path":"/articles/stars2.html","id":"reading-chunks-change-resolution-select-bands","dir":"Articles","previous_headings":"","what":"Reading chunks, change resolution, select bands","title":"2. stars proxy objects","text":"read_stars argument called RasterIO controls GDAL dataset read. default, pixels bands read memory. can consume lot time require lot memory. Remember file may compressed, pixel values represented file bytes converted 8-byte doubles R. reason using RasterIO parameters use directly mapped GDAL RasterIO function used (adapting 1-based offset index R 0-based offset C++).","code":""},{"path":"/articles/stars2.html","id":"reading-a-particular-chunk","dir":"Articles","previous_headings":"Reading chunks, change resolution, select bands","what":"Reading a particular chunk","title":"2. stars proxy objects","text":"example using RasterIO Compare see delta values remain , offset (x/y coordinates origin) grid remain reflect new area, relate new delta values dim(x) reflects new size, three bands read","code":"library(stars) ## Loading required package: abind ## Loading required package: sf ## Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 23 54 63 62.05977 73.25 235 ## dimension(s): ## from to offset delta refsys point x/y ## x 6 105 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 6 105 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 3 NA NA NA NA dim(x) ## x y band ## 100 100 3 st_dimensions(read_stars(tif)) ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA"},{"path":"/articles/stars2.html","id":"reading-at-a-different-resolution","dir":"Articles","previous_headings":"Reading chunks, change resolution, select bands","what":"Reading at a different resolution","title":"2. stars proxy objects","text":"Reading datasets lower (also higher!) resolution can done setting nBufXSize nBufYSize see addition: delta (raster cell size) values increased factor 5, nBufXSize nBufYSize set values factor 5 smaller nXSize nYSize offset coordinates grid still reflect new area, relate new delta cell size values can also read higher resolution; read 3 x 3 area blow 100 x 100: reason “see” three grid cells default sampling method “nearest neighbour”. can modify following methods allowed parameter resample: methods implemented GDAL; methods exactly , refer GDAL documentation source code.","code":"rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, nBufXSize = 20, nBufYSize = 20, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 27 53 63 62.09417 74 151 ## dimension(s): ## from to offset delta refsys point x/y ## x 2 21 288776 142.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 2 21 9120761 -142.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 3 NA NA NA NA rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1) x = read_stars(tif, RasterIO = rasterio) dim(x) ## x y ## 100 100 plot(x) rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1, resample = \"cubic_spline\") x = read_stars(tif, RasterIO = rasterio) dim(x) ## x y ## 100 100 plot(x)"},{"path":"/articles/stars2.html","id":"stars-proxy-objects","dir":"Articles","previous_headings":"","what":"Stars proxy objects","title":"2. stars proxy objects","text":"Stars proxy objects take another approach: upon creation contain data , pointers data can read. Data read needed, much needed: plot proxy objects, data read resolution pixels screen, rather native resolution, e.g. 10000 x 10000 Sentinel 2 (level 1C) image, can open happens instantly, data read. plot object, takes around 1 second, since pixels read can seen plot. read entire image memory first, reading take minute, require 5 Gb memory.","code":"granule = system.file(\"sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip\", package = \"starsdata\") s2 = paste0(\"SENTINEL2_L1C:/vsizip/\", granule, \"/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632\") (p = read_stars(s2, proxy = TRUE)) ## stars_proxy object with 1 attribute in 1 file(s): ## $EPSG_32632 ## [1] \"[...]/MTD_MSIL1C.xml:10m:EPSG_32632\" ## ## dimension(s): ## from to offset delta refsys values x/y ## x 1 10980 3e+05 10 WGS 84 / UTM zone 32N NULL [x] ## y 1 10980 6e+06 -10 WGS 84 / UTM zone 32N NULL [y] ## band 1 4 NA NA NA B4,...,B8 system.time(plot(p)) ## downsample set to 18 ## user system elapsed ## 0.997 0.172 0.665 p = read_stars(s2, proxy = FALSE)"},{"path":"/articles/stars2.html","id":"methods-for-stars-proxy-objects","dir":"Articles","previous_headings":"Stars proxy objects","what":"Methods for stars proxy objects","title":"2. stars proxy objects","text":"","code":"methods(class = \"stars_proxy\") ## [1] [ [[<- [<- adrop ## [5] aggregate aperm as.data.frame c ## [9] coerce dim droplevels hist ## [13] image initialize is.na Math ## [17] merge Ops plot prcomp ## [21] predict print show slotsFromS3 ## [25] split st_apply st_as_sf st_as_stars ## [29] st_crop st_dimensions<- st_downsample st_mosaic ## [33] st_normalize st_redimension st_sample st_set_bbox ## [37] write_stars ## see '?methods' for accessing help and source code"},{"path":"/articles/stars2.html","id":"select-attributes","dir":"Articles","previous_headings":"Stars proxy objects","what":"Select attributes","title":"2. stars proxy objects","text":"can select attributes regular stars objects, using first argument [: Note selection limits reading 4 1 subdataset 9 NetCDF files.","code":"x = c(\"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\", \"avhrr-only-v2.19810905.nc\", \"avhrr-only-v2.19810906.nc\", \"avhrr-only-v2.19810907.nc\", \"avhrr-only-v2.19810908.nc\", \"avhrr-only-v2.19810909.nc\") file_list = system.file(paste0(\"netcdf/\", x), package = \"starsdata\") y = read_stars(file_list, quiet = TRUE, proxy = TRUE) names(y) ## [1] \"sst\" \"anom\" \"err\" \"ice\" y[\"sst\"] ## stars_proxy object with 1 attribute in 9 file(s): ## $sst ## [1] \"[...]/avhrr-only-v2.19810901.nc:sst\" \"[...]/avhrr-only-v2.19810902.nc:sst\" ## [3] \"[...]/avhrr-only-v2.19810903.nc:sst\" \"[...]/avhrr-only-v2.19810904.nc:sst\" ## [5] \"[...]/avhrr-only-v2.19810905.nc:sst\" \"[...]/avhrr-only-v2.19810906.nc:sst\" ## [7] \"[...]/avhrr-only-v2.19810907.nc:sst\" \"[...]/avhrr-only-v2.19810908.nc:sst\" ## [9] \"[...]/avhrr-only-v2.19810909.nc:sst\" ## ## dimension(s): ## from to offset delta refsys x/y ## x 1 1440 0 0.25 NA [x] ## y 1 720 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct"},{"path":"/articles/stars2.html","id":"select-an-area","dir":"Articles","previous_headings":"Stars proxy objects","what":"Select an area","title":"2. stars proxy objects","text":"Another possibility crop, select rectangular region based spatial object. can done passing bbox object, sf, sfc stars object bounding box taken. example:","code":"bb = st_bbox(c(xmin = 10.125, ymin = 0.125, xmax = 70.125, ymax = 70.125)) ysub = y[bb] st_dimensions(ysub) ## from to offset delta refsys x/y ## x 41 281 0 0.25 NA [x] ## y 80 360 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct class(ysub) # still no data here!! ## [1] \"stars_proxy\" \"stars\" plot(ysub, reset = FALSE) # plot reads the data, at resolution that is relevant plot(st_as_sfc(bb), add = TRUE, lwd = .5, border = 'red')"},{"path":"/articles/stars2.html","id":"lazy-evaluation-changing-evaluation-order","dir":"Articles","previous_headings":"Stars proxy objects","what":"Lazy evaluation, changing evaluation order","title":"2. stars proxy objects","text":"actions can carried stars_proxy objects, effect delayed data actually needed (plot, write_stars). instance, range selections dimensions shown first need data, can carried . functions added object, attribute called call_list: allows optimizing order operations done. example, st_apply, reading can done sequentially dimensions function applied: example function applied band (: compute band quantiles), bands can read sequentially, discarded quantiles computed. time series function applied pixel time series result plotted map, time series function evaluated pixels actually plotted. means e.g. order evaluation reversed: plot knows pixels going shown, controls x downsampled st_apply carried subset.","code":"yy = adrop(y) yyy = yy[,1:10,1:10,] class(yyy) # still no data ## [1] \"stars_proxy\" \"stars\" st_dimensions(yyy) # and dimensions not adjusted ## from to offset delta refsys x/y ## x 1 1440 0 0.25 NA [x] ## y 1 720 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct attr(yyy, \"call_list\") # the name of object in the call (y) is replaced with x: ## [[1]] ## adrop(x = x, drop = drop) ## attr(,\".Environment\") ## ## ## [[2]] ## x[i = i, 1:10, 1:10, , drop = drop, crop = crop] ## attr(,\".Environment\") ## plot(st_apply(x, c(\"x\", \"y\"), range))"},{"path":"/articles/stars2.html","id":"fetching-the-data","dir":"Articles","previous_headings":"Stars proxy objects > Lazy evaluation, changing evaluation order","what":"Fetching the data","title":"2. stars proxy objects","text":"Fetching data now involves reading whole array evaluating call_list , sequentially:","code":"(x = st_as_stars(yyy)) # read, adrop, subset ## stars object with 3 dimensions and 4 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## sst [°*C] -1.28 -1.17 -1.11 -1.1163555 -1.06 -0.95 ## anom [°*C] 0.48 0.62 0.69 0.6649555 0.72 0.77 ## err [°*C] 0.30 0.30 0.30 0.3000000 0.30 0.30 ## ice [percent] 0.76 0.79 0.81 0.8062889 0.82 0.85 ## dimension(s): ## from to offset delta refsys x/y ## x 1 10 0 0.25 NA [x] ## y 1 10 90 -0.25 NA [y] ## time 1 9 1981-09-01 UTC 1 days POSIXct"},{"path":"/articles/stars2.html","id":"plotting-with-changed-evaluation-order","dir":"Articles","previous_headings":"Stars proxy objects > Lazy evaluation, changing evaluation order","what":"Plotting with changed evaluation order","title":"2. stars proxy objects","text":"Sentinel 2 data, band 4 represents NIR band 1 red, can compute NDVI ","code":"# S2 10m: band 4: near infrared, band 1: red. #ndvi = function(x) (x[4] - x[1])/(x[4] + x[1]) ndvi = function(x1, x2, x3, x4) (x4 - x1)/(x4 + x1) rm(x) (s2.ndvi = st_apply(p, c(\"x\", \"y\"), ndvi)) ## stars_proxy object with 1 attribute in 1 file(s): ## $EPSG_32632 ## [1] \"[...]/MTD_MSIL1C.xml:10m:EPSG_32632\" ## ## dimension(s): ## from to offset delta refsys values x/y ## x 1 10980 3e+05 10 WGS 84 / UTM zone 32N NULL [x] ## y 1 10980 6e+06 -10 WGS 84 / UTM zone 32N NULL [y] ## band 1 4 NA NA NA B4,...,B8 ## call_list: ## [[1]] ## st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, ## PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname) ## attr(,\".Environment\") ## ## ## This object has pending lazy operations: dimensions as printed may not reflect this. system.time(plot(s2.ndvi)) # read - compute ndvi - plot ## downsample set to 18 ## user system elapsed ## 0.707 0.174 0.383"},{"path":"/articles/stars2.html","id":"multi-resolution-proxy-objects","dir":"Articles","previous_headings":"","what":"Multi-resolution proxy objects","title":"2. stars proxy objects","text":"sections shows examples stars_proxy objects deal situation different maps dissimilar resolution. assumptions : maps need origin coordinates (typically upper-left corner) CRS. first map determines “working” resolution, e.g. native downsampled resolutions refer ’ll create four maps cells size 1, 2 3: created three rasters identical cell values dimensions, different cell sizes, hence extents. bind single proxy object, see multi-resolution mentioned printed summary. converting stars object, secondary rasters resampled cellsize + extent first: sub-range, defined object resolutions, get: now create four maps, region ([0,4] x [0,4]), different resolutions (cell size 1, 1/2 1/3): Finally, example first raster higher resolution:","code":"s1 = st_as_stars(matrix(1:16, 4)) s2 = st_as_stars(matrix(1:16, 4)) s3 = st_as_stars(matrix(1:16, 4)) attr(s1, \"dimensions\")$X1$offset = 0 attr(s1, \"dimensions\")$X2$offset = 4 attr(s2, \"dimensions\")$X1$offset = 0 attr(s2, \"dimensions\")$X2$offset = 4 attr(s3, \"dimensions\")$X1$offset = 0 attr(s3, \"dimensions\")$X2$offset = 4 attr(s1, \"dimensions\")$X1$delta = 1 attr(s1, \"dimensions\")$X2$delta = -1 attr(s2, \"dimensions\")$X1$delta = 2 attr(s2, \"dimensions\")$X2$delta = -2 attr(s3, \"dimensions\")$X1$delta = 3 attr(s3, \"dimensions\")$X2$delta = -3 plot(s1, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s2, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s3, axes = TRUE, text_values = TRUE, text_color = 'orange') fn1 = paste0(tempdir(), .Platform$file.sep, \"img1.tif\") fn2 = paste0(tempdir(), .Platform$file.sep, \"img2.tif\") fn3 = paste0(tempdir(), .Platform$file.sep, \"img3.tif\") write_stars(s1, fn1) write_stars(s2, fn2) write_stars(s3, fn3) (r1 = read_stars(c(fn1, fn2, fn3), proxy = TRUE)) ## multi-resolution stars_proxy object with 3 attributes in 3 file(s): ## $`1` ## [1] \"[...]/img1.tif\" ## ## $`2` ## [1] \"[...]/img2.tif\" ## ## $`3` ## [1] \"[...]/img3.tif\" ## ## dimension(s): ## from to offset delta x/y ## x 1 4 0 1 [x] ## y 1 4 4 -1 [y] st_as_stars(r1) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r1[,2:4,2:4]) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) s4 = st_as_stars(matrix(1: 16, 4)) s5 = st_as_stars(matrix(1: 64, 8)) s6 = st_as_stars(matrix(1:144,12)) attr(s4, \"dimensions\")$X1$offset = 0 attr(s4, \"dimensions\")$X2$offset = 4 attr(s5, \"dimensions\")$X1$offset = 0 attr(s5, \"dimensions\")$X2$offset = 4 attr(s6, \"dimensions\")$X1$offset = 0 attr(s6, \"dimensions\")$X2$offset = 4 attr(s4, \"dimensions\")$X1$delta = 1 attr(s4, \"dimensions\")$X2$delta = -1 attr(s5, \"dimensions\")$X1$delta = 1/2 attr(s5, \"dimensions\")$X2$delta = -1/2 attr(s6, \"dimensions\")$X1$delta = 1/3 attr(s6, \"dimensions\")$X2$delta = -1/3 plot(s4, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s5, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s6, axes = TRUE, text_values = TRUE, text_color = 'orange') fn4 = paste0(tempdir(), .Platform$file.sep, \"img4.tif\") fn5 = paste0(tempdir(), .Platform$file.sep, \"img5.tif\") fn6 = paste0(tempdir(), .Platform$file.sep, \"img6.tif\") write_stars(s4, fn4) write_stars(s5, fn5) write_stars(s6, fn6) (r2 = read_stars(c(fn4, fn5, fn6), proxy = TRUE)) ## multi-resolution stars_proxy object with 3 attributes in 3 file(s): ## $`4` ## [1] \"[...]/img4.tif\" ## ## $`5` ## [1] \"[...]/img5.tif\" ## ## $`6` ## [1] \"[...]/img6.tif\" ## ## dimension(s): ## from to offset delta x/y ## x 1 4 0 1 [x] ## y 1 4 4 -1 [y] st_as_stars(r2) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r2[,2:4,2:4]) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) (r3 = read_stars(c(fn6, fn5, fn4), proxy = TRUE)) ## multi-resolution stars_proxy object with 3 attributes in 3 file(s): ## $`6` ## [1] \"[...]/img6.tif\" ## ## $`5` ## [1] \"[...]/img5.tif\" ## ## $`4` ## [1] \"[...]/img4.tif\" ## ## dimension(s): ## from to offset delta x/y ## x 1 12 0 0.3333 [x] ## y 1 12 4 -0.3333 [y] st_as_stars(r3) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r3[,2:6,3:6]) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE)"},{"path":"/articles/stars3.html","id":"slice","dir":"Articles","previous_headings":"","what":"slice","title":"3. stars tidyverse methods","text":"slice slices sub-array cube; done specifying dimension act, slice number. returns lower-dimensional array single element selected along slice dimension.","code":"x %>% slice(band, 6) -> x6 x6 ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 32 60 59.97521 88 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]"},{"path":"/articles/stars3.html","id":"filter","dir":"Articles","previous_headings":"","what":"filter","title":"3. stars tidyverse methods","text":"Similar slice, filter selects dimensions evaluates values rather index: subarray created based x coordinate values. Note filter converts object tbl_cube, uses dplyr filter method tbl_cube objects. limitation stars objects rectilinear, curvilinear simple feature geometries handled. objects, using regular [ selection using st_crop may alternative.","code":"x %>% filter(x > 289000, x < 291000, band > 3) -> x7 x7 ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 5 54 70 71.79194 88 252 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 70 289004 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 3 4 1 NA NA"},{"path":"/articles/stars3.html","id":"pull","dir":"Articles","previous_headings":"","what":"pull","title":"3. stars tidyverse methods","text":"pull pulls array stars object:","code":"x %>% pull(1) -> x8 class(x8) ## [1] \"array\" dim(x8) ## x y band ## 349 352 6"},{"path":"/articles/stars3.html","id":"mutate","dir":"Articles","previous_headings":"","what":"mutate","title":"3. stars tidyverse methods","text":"","code":"x %>% mutate(band2 = 2 * L7_ETMs.tif) -> x2 x2 ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## band2 2 108 138 137.82484 172 510 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA"},{"path":"/articles/stars3.html","id":"select","dir":"Articles","previous_headings":"","what":"select","title":"3. stars tidyverse methods","text":"select selects attribute, set attributes:","code":"x2 %>% select(band2) -> x9 x9 ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## band2 2 108 138 137.8248 172 510 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA"},{"path":"/articles/stars3.html","id":"geom_stars","dir":"Articles","previous_headings":"","what":"geom_stars","title":"3. stars tidyverse methods","text":"geom_raster ggplot2 geom function accepts stars objects data argument sets raster vector spatial coordinates plot dimensions, first attribute fill variable allows downsampling (without choosing suitable downsampling level) chooses using geom_raster, geom_rect geom_sf depending whether geometry regular, rectilinear vector geometries example use ","code":"library(ggplot2) library(viridis) ## Loading required package: viridisLite ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_fill_viridis() + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0))"},{"path":"/articles/stars4.html","id":"stars-objects","dir":"Articles","previous_headings":"","what":"Stars objects","title":"4. stars data model","text":"stars objects consist (possibly empty) named list arrays, named dimensions (dim) attribute attribute called dimensions class dimensions carries dimension metadata class name includes stars dimensions object named list dimension elements, describing semantics dimension data arrays (space, time, type etc). addition , dimensions object attribute called raster class stars_raster, named list three elements: dimensions length 2 character; dimension names constitute spatial raster (NA) affine length 2 numeric; two affine parameters geotransform (NA) curvilinear boolean indicating whether raster curvilinear raster (NA) affine curvilinear values relevant case raster data, indicated dimensions non-NA values. dimension object describes single dimension; list named elements : (numeric length 1): start index array : (numeric length 1): end index array offset: (numeric length 1): start coordinate (time) value first pixel (.e., pixel/cell boundary) delta: (numeric length 1): increment, cell size refsys: (character, crs): object describing reference system; e.g. PROJ string, string POSIXct PCICt (360 365 days/year calendars), object class crs (containing EPSG code proj4string) point: (logical length 1): boolean indicating whether cells/pixels refer areas/periods, points/instances (may NA) NULL (missing), vector coordinate values (numeric, POSIXct, PCICt, sfc), object class intervals (list two vectors, start end, interval start- end-values), matrix longitudes latitudes cells (case curvilinear grids) usually 1 dimension size, may larger 1 case sub-grid got selected (cropped). offset delta apply regularly discretized dimensions, NA case. NA, dimension values may held values field. Rectilinear curvilinear grids need grid values values can either: rectilinear grids: irregularly spaced coordinate values, coordinate intervals irregular width (rectilinear grid can one dimension regular), curvilinear grids: matrix grid cell centre values row/col combinations (usually longitude latitude). Alternatively, values can contains set spatial geometries encoded sfc vector (“list-column”), case vector data cube.","code":""},{"path":[]},{"path":"/articles/stars4.html","id":"regular-grids","dir":"Articles","previous_headings":"Grid type","what":"Regular grids","title":"4. stars data model","text":"simple file created 4×54 \\times 5 matrix see rows (5) mapped first dimension, x-coordinate columns (4) mapped second dimension, y-coordinate fields dimension define range corresponds array dimension: offset delta specify increasing row column index maps x y coordinate values respectively. plot object, using image method stars objects, see (0,0)(0,0) origin grid (grid corner), 11 coordinate value increase one index (row, col) next. means consecutive matrix columns represent grid lines, going south north. Grids defined way regular: grid cell size constant everywhere. Many actual grid datasets y coordinates (grid rows) going North South (top bottom); realised negative value delta. see grid origin (0,0)(0,0) change: example GeoTIFF carried package, , probably data sources read GDAL, negative delta y-coordinate:","code":"suppressPackageStartupMessages(library(stars)) m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## A1 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to offset delta point x/y ## x 1 5 0 1 FALSE [x] ## y 1 4 0 1 FALSE [y] dim(s[[1]]) ## x y ## 5 4 image(s, text_values = TRUE, axes = TRUE) attr(s, \"dimensions\")[[2]]$delta = -1 image(s, text_values = TRUE, axes = TRUE) tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") st_dimensions(read_stars(tif))[\"y\"] ## from to offset delta refsys point ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE"},{"path":"/articles/stars4.html","id":"raster-attributes-rotated-and-sheared-grids","dir":"Articles","previous_headings":"Grid type","what":"Raster attributes, rotated and sheared grids","title":"4. stars data model","text":"Dimension tables stars objects carry raster attribute: list holds dimensions: character, names raster dimensions (), opposed e.g. spectral, temporal dimensions affine: numeric, affine parameters curvilinear: logical indicating whether raster curvilinear fields needed level, describe properties array higher level individual dimensions : pair dimensions forms raster, affine curvilinear describe x y pair derived grid indexes (see ) done per-dimension basis. two affine parameters a1a_1 a2a_2, xx yy coordinates derived (1-based) grid indexes ii jj, grid offset values oxo_x oyo_y, grid cell sizes dxd_x dyd_y x=ox+(−1)dx+(j−1)a1x = o_x + (-1) d_x + (j-1) a_1 y=oy+(−1)a2+(j−1)dyy = o_y + (-1) a_2 + (j-1) d_y Clearly, a1=a2=0a_1=a_2=0, xx yy entirely derived respective index, offset cellsize. Note integer indexes, coordinates starting edge grid cell; get grid cell center top left grid cell (case negative dyd_y), use =1.5i=1.5 j=1.5j=1.5. can rotate grids setting a1a_1 a2a_2 non-zero value: rotation angle, degrees, Sheared grids obtained two rotation coefficients, a1a_1 a2a_2, unequal: Now, y-axis x-axis different rotation degrees respectively","code":"str(attr(st_dimensions(s), \"raster\")) ## List of 4 ## $ affine : num [1:2] 0 0 ## $ dimensions : chr [1:2] \"x\" \"y\" ## $ curvilinear: logi FALSE ## $ blocksizes : NULL ## - attr(*, \"class\")= chr \"stars_raster\" attr(attr(s, \"dimensions\"), \"raster\")$affine = c(0.1, 0.1) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) atan2(0.1, 1) * 180 / pi ## [1] 5.710593 attr(attr(s, \"dimensions\"), \"raster\")$affine = c(0.1, 0.2) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) atan2(c(0.1, 0.2), 1) * 180 / pi ## [1] 5.710593 11.309932"},{"path":"/articles/stars4.html","id":"rectilinear-grids","dir":"Articles","previous_headings":"","what":"Rectilinear grids","title":"4. stars data model","text":"Rectilinear grids orthogonal axes, congruent (equally sized shaped) cells: axis irregular subdivision. can define rectilinear grid specifying cell boundaries, meaning every dimension specify one value dimension size: leave last value, stars may come different cell boundary last cell, now derived width one--last cell: problematic cells constant width, case boundaries reduced offset delta value, irrespective whether upper boundary given: Alternatively, one can also set cell midpoints specifying arguments cell_midpoints st_dimensions call: dimension regular, results offset shifted back half delta, else intervals derived distances cell centers. obviously done cell boundaries specified.","code":"x = c(0, 0.5, 1, 2, 4, 5) # 6 numbers: boundaries! y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## m 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to point values x/y ## x 1 5 FALSE [0,0.5),...,[4,5) [x] ## y 1 4 FALSE [0.3,0.5),...,[2,2.2) [y] st_bbox(r) ## xmin ymin xmax ymax ## 0.0 0.3 5.0 2.2 image(r, axes = TRUE, col = grey((1:20)/20)) x = c(0, 0.5, 1, 2, 4) # 5 numbers: offsets only! y = c(0.3, 0.5, 1, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## m 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to point values x/y ## x 1 5 FALSE [0,0.5),...,[4,6) [x] ## y 1 4 FALSE [0.3,0.5),...,[2,3) [y] st_bbox(r) ## xmin ymin xmax ymax ## 0.0 0.3 6.0 3.0 x = c(0, 1, 2, 3, 4) # 5 numbers: offsets only! y = c(0.5, 1, 1.5, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## m 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to offset delta point x/y ## x 1 5 0 1 FALSE [x] ## y 1 4 0.5 0.5 FALSE [y] st_bbox(r) ## xmin ymin xmax ymax ## 0.0 0.5 5.0 2.5 x = st_as_stars(matrix(1:9, 3, 3), st_dimensions(x = c(1, 2, 3), y = c(2, 3, 10), cell_midpoints = TRUE))"},{"path":"/articles/stars4.html","id":"curvilinear-grids","dir":"Articles","previous_headings":"","what":"Curvilinear grids","title":"4. stars data model","text":"Curvilinear grids grids whose grid lines straight. Rather describing curvature parametrically, typical (HDF5 NetCDF) files found two raster layers longitudes latitudes every corresponding pixel remaining layers. example, use Sentinel 5P dataset available package starsdata; package can installed dataset found : can construct curvilinear stars raster calling read_stars right sub-array: array, can see GDAL metadata item GEOLOCATION: reveals , dataset, longitude latitude arrays kept. curvilinear array actual arrays (raster layers, matrices) longitude latitude values read dimension table. can plot file: can downsample data doesn’t look nice, plotting cells polygons looks better: Another approach warp curvilinear grid regular grid, e.g. ","code":"install.packages(\"starsdata\", repos = \"http://pebesma.staff.ifgi.de\", type = \"source\") (s5p = system.file(\"sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\", package = \"starsdata\")) ## [1] \"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\" subs = gdal_subdatasets(s5p) subs[[6]] ## [1] \"NETCDF:\\\"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\\\":/PRODUCT/nitrogendioxide_tropospheric_column\" gdal_metadata(subs[[6]], \"GEOLOCATION\") ## $LINE_OFFSET ## [1] \"0\" ## ## $LINE_STEP ## [1] \"1\" ## ## $PIXEL_OFFSET ## [1] \"0\" ## ## $PIXEL_STEP ## [1] \"1\" ## ## $SRS ## [1] \"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.0174532925199433,AUTHORITY[\\\"EPSG\\\",\\\"9122\\\"]],AXIS[\\\"Latitude\\\",NORTH],AXIS[\\\"Longitude\\\",EAST],AUTHORITY[\\\"EPSG\\\",\\\"4326\\\"]]\" ## ## $X_BAND ## [1] \"1\" ## ## $X_DATASET ## [1] \"NETCDF:\\\"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\\\":/PRODUCT/longitude\" ## ## $Y_BAND ## [1] \"1\" ## ## $Y_DATASET ## [1] \"NETCDF:\\\"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\\\":/PRODUCT/latitude\" ## ## attr(,\"class\") ## [1] \"gdal_metadata\" nit.c = read_stars(subs[[6]]) ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. threshold = units::set_units(9e+36, mol/m^2) nit.c[[1]][nit.c[[1]] > threshold] = NA nit.c ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. ## nitrogendioxide_tropospheri... [mol/m^2] -3.301083e-05 1.868205e-05 ## Median Mean 3rd Qu. ## nitrogendioxide_tropospheri... [mol/m^2] 2.622178e-05 2.898976e-05 3.629641e-05 ## Max. NA's ## nitrogendioxide_tropospheri... [mol/m^2] 0.0003924858 330 ## dimension(s): ## from to offset refsys values x/y ## x 1 450 NA WGS 84 [450x278] -5.811 [°],...,30.95 [°] [x] ## y 1 278 NA WGS 84 [450x278] 28.36 [°],...,51.47 [°] [y] ## time 1 1 2018-07-17 UTC POSIXct NULL ## curvilinear grid plot(nit.c, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') plot(nit.c, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') (nit.c_ds = stars:::st_downsample(nit.c, 8)) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median ## nitrogendioxide_tropospheri... [mol/m^2] -1.847503e-05 1.85778e-05 2.700901e-05 ## Mean 3rd Qu. Max. ## nitrogendioxide_tropospheri... [mol/m^2] 2.9113e-05 3.642568e-05 0.0001363282 ## NA's ## nitrogendioxide_tropospheri... [mol/m^2] 32 ## dimension(s): ## from to offset refsys values x/y ## x 1 50 NA WGS 84 [50x31] -5.811 [°],...,30.14 [°] [x] ## y 1 31 NA WGS 84 [50x31] 28.78 [°],...,51.47 [°] [y] ## time 1 1 2018-07-17 UTC POSIXct NULL ## curvilinear grid plot(nit.c_ds, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') plot(nit.c_ds, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') w = st_warp(nit.c, crs = 4326, cellsize = 0.25) ## Warning in transform_grid_grid(st_as_stars(src), st_dimensions(dest), ## threshold): using Euclidean distance measures on geodetic coordinates ## threshold set to 0.108545 : set a larger value if you see missing values where there shouldn't be plot(w)"},{"path":"/articles/stars5.html","id":"rasterizing-an-sf-vector-object","dir":"Articles","previous_headings":"","what":"Rasterizing an sf vector object","title":"5. vector-raster conversions, reprojection, warping","text":"algorithm used GDAL rasterize utility, options utility can passed st_rasterize. geometry final raster can controlled passing target bounding box either raster dimensions nx ny, pixel size dx dy parameters.","code":"library(stars) ## Loading required package: abind system.file(\"gpkg/nc.gpkg\", package = \"sf\") %>% read_sf() %>% st_transform(32119) -> nc nc$dens = nc$BIR79 / units::set_units(st_area(nc), km^2) (nc.st = st_rasterize(nc[\"dens\"], dx = 5000, dy = 5000)) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## file281874a3fb9 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 ## NA's ## file281874a3fb9 [1/km^2] 4808 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 162 123829 5000 NAD83 / North Carolina FALSE [x] ## y 1 61 318260 -5000 NAD83 / North Carolina FALSE [y] plot(nc.st)"},{"path":"/articles/stars5.html","id":"vectorizing-a-raster-object-to-an-sf-object","dir":"Articles","previous_headings":"","what":"Vectorizing a raster object to an sf object","title":"5. vector-raster conversions, reprojection, warping","text":"stars objects can converted sf object using st_as_sf. number options, depending whether pixels represent point value pixel center, small square polygons single value. work landsat-7 6-band image, select first band round values:","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif)[, 1:50, 1:50, 1:2] x[[1]] = round(x[[1]]/5)"},{"path":"/articles/stars5.html","id":"polygonizing","dir":"Articles","previous_headings":"Vectorizing a raster object to an sf object","what":"Polygonizing","title":"5. vector-raster conversions, reprojection, warping","text":"case raster cells reflect point values want get vector representation whole field, can draw contour lines export contour sets (available GDAL version least 2.4.0):","code":"l = st_contour(x, contour_lines = TRUE, breaks = 11:15) plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8)"},{"path":"/articles/stars5.html","id":"exporting-to-points","dir":"Articles","previous_headings":"Vectorizing a raster object to an sf object","what":"Exporting to points","title":"5. vector-raster conversions, reprojection, warping","text":"Alternatively, can simply export pixels points, get either wide table bands per point, replicated POINT geometries: long table single attribute points replicated: can see, additional attribute band now indicates band concerned.","code":"st_as_sf(x, as_points = TRUE, merge = FALSE) ## Simple feature collection with 2500 features and 2 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: 288790.5 ymin: 9119350 xmax: 290187 ymax: 9120747 ## Projected CRS: SIRGAS 2000 / UTM zone 25S ## First 10 features: ## L7_ETMs.tif.V1 L7_ETMs.tif.V2 geometry ## 1 14 11 POINT (288790.5 9120747) ## 2 14 11 POINT (288819 9120747) ## 3 13 10 POINT (288847.5 9120747) ## 4 12 9 POINT (288876 9120747) ## 5 12 10 POINT (288904.5 9120747) ## 6 12 10 POINT (288933 9120747) ## 7 12 10 POINT (288961.5 9120747) ## 8 12 10 POINT (288990 9120747) ## 9 13 10 POINT (289018.5 9120747) ## 10 13 10 POINT (289047 9120747) st_as_sf(x, as_points = TRUE, merge = FALSE, long = TRUE) ## Simple feature collection with 5000 features and 2 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: 288790.5 ymin: 9119350 xmax: 290187 ymax: 9120747 ## Projected CRS: SIRGAS 2000 / UTM zone 25S ## First 10 features: ## band L7_ETMs.tif geometry ## 1 1 14 POINT (288790.5 9120747) ## 2 1 14 POINT (288819 9120747) ## 3 1 13 POINT (288847.5 9120747) ## 4 1 12 POINT (288876 9120747) ## 5 1 12 POINT (288904.5 9120747) ## 6 1 12 POINT (288933 9120747) ## 7 1 12 POINT (288961.5 9120747) ## 8 1 12 POINT (288990 9120747) ## 9 1 13 POINT (289018.5 9120747) ## 10 1 13 POINT (289047 9120747)"},{"path":"/articles/stars5.html","id":"exporting-to-polygons","dir":"Articles","previous_headings":"Vectorizing a raster object to an sf object","what":"Exporting to polygons","title":"5. vector-raster conversions, reprojection, warping","text":"Alternatively, can export polygons either get single polygon per pixel, merge polygons identical pixel values; plotted boundaries, see resolved boundaries areas pixel value: option connect8 can set TRUE use 8 connectedness, rather default 4 connectedness algorithm. cases, polygons returned often invalid according simple feature standard, can made valid using lwgeom::st_make_valid.","code":"st_as_sf(x[1], as_points = FALSE, merge = FALSE) ## Simple feature collection with 2500 features and 2 fields ## Geometry type: POLYGON ## Dimension: XY ## Bounding box: xmin: 288776.3 ymin: 9119336 xmax: 290201.3 ymax: 9120761 ## Projected CRS: SIRGAS 2000 / UTM zone 25S ## First 10 features: ## L7_ETMs.tif.V1 L7_ETMs.tif.V2 geometry ## 1 14 11 POLYGON ((288776.3 9120761,... ## 2 14 11 POLYGON ((288804.8 9120761,... ## 3 13 10 POLYGON ((288833.3 9120761,... ## 4 12 9 POLYGON ((288861.8 9120761,... ## 5 12 10 POLYGON ((288890.3 9120761,... ## 6 12 10 POLYGON ((288918.8 9120761,... ## 7 12 10 POLYGON ((288947.3 9120761,... ## 8 12 10 POLYGON ((288975.8 9120761,... ## 9 13 10 POLYGON ((289004.3 9120761,... ## 10 13 10 POLYGON ((289032.8 9120761,... p = st_as_sf(x, as_points = FALSE, merge = TRUE) plot(p)"},{"path":"/articles/stars5.html","id":"switching-between-vector-and-raster-in-stars-objects","dir":"Articles","previous_headings":"","what":"Switching between vector and raster in stars objects","title":"5. vector-raster conversions, reprojection, warping","text":"can convert raster dimension vector dimension keeping dimensions stars object also requires setting as_points arguments st_as_sf.","code":"x.sf = st_xy2sfc(x, as_points = TRUE) x.sf ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 7 9 11 11.2548 12 28 ## dimension(s): ## from to refsys point ## geometry 1 2500 SIRGAS 2000 / UTM zone 25S TRUE ## band 1 2 NA NA ## values ## geometry POINT (288790.5 9120747),...,POINT (290187 9119350) ## band NULL"},{"path":"/articles/stars5.html","id":"reprojecting-a-raster","dir":"Articles","previous_headings":"","what":"Reprojecting a raster","title":"5. vector-raster conversions, reprojection, warping","text":"accept curvilinear rasters rasters , regular rectilinear grids special cases curvilinear grids, reprojecting raster longer “problem”, just recomputes new coordinates every raster cell, generally results curvilinear grid (sometimes can brought back regular rectilinear grid). curvilinear grid cells represented coordinates cell center, actual shape grid cell gets lost, may larger effect grid cells large transformation stronger non-linear. example reprojection grid created noted dimensionality grid didn’t change: set raster cells replotted new CRS, now curvilinear grid.","code":"nc.st %>% st_transform(\"+proj=laea +lat_0=34 +lon_0=-60\") -> nc.curv nc.curv ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## file281874a3fb9 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 ## NA's ## file281874a3fb9 [1/km^2] 4808 ## dimension(s): ## from to refsys point values ## x 1 162 +proj=laea +lat_0=34 +lon... FALSE [162x61] -2210936,...,-1371611 ## y 1 61 +proj=laea +lat_0=34 +lon... FALSE [162x61] 90650,...,538204 ## x/y ## x [x] ## y [y] ## curvilinear grid plot(nc.curv, border = NA, graticule = TRUE)"},{"path":"/articles/stars5.html","id":"warping-a-raster","dir":"Articles","previous_headings":"","what":"Warping a raster","title":"5. vector-raster conversions, reprojection, warping","text":"Warping raster means creating new regular grid new CRS, based (usually regular) grid another CRS. can transformation previous section first creating target grid: warping old raster new new object regular grid new CRS, aligned new x- y-axes.","code":"nc %>% st_transform(\"+proj=laea +lat_0=34 +lon_0=-60\") %>% st_bbox() %>% st_as_stars() -> newgrid nc.st %>% st_warp(newgrid) -> nc.new nc.new ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## file281874a3fb9 [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 21.24828 ## NA's ## file281874a3fb9 [1/km^2] 36155 ## dimension(s): ## from to offset delta refsys x/y ## x 1 380 -2188110 2098 +proj=laea +lat_0=34 +lon... [x] ## y 1 171 494924 -2098 +proj=laea +lat_0=34 +lon... [y] plot(nc.new)"},{"path":"/articles/stars6.html","id":"comment-legend","dir":"Articles","previous_headings":"","what":"COMMENT LEGEND","title":"6. How `raster` functions map to `stars` functions","text":"? = sure / unknown * = present, low priority # = present, high priority NA = available design","code":""},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":"/articles/stars6.html","id":"computing-row-column-cell-numbers-and-coordinates","dir":"Articles","previous_headings":"","what":"Computing row, column, cell numbers and coordinates","title":"6. How `raster` functions map to `stars` functions","text":"format table follows raster-package entry raster manual, found https://cran.r-project.org/web/packages/raster/raster.pdf.","code":""},{"path":"/articles/stars7.html","id":"training-and-prediction-with-stars-objects","dir":"Articles","previous_headings":"","what":"Training and prediction with stars objects","title":"7. Statistical modelling with stars objects","text":"usual way statistical modelling R uses data.frames (tibbles), proceeds like model function like lm, glm, randomForest etc. returns classed object, predict generic can choose right prediction function based class. formula looks like y ~ x1+x2 specifies dependent variable (y) predictors (x1, x2), found columns data. newdata needs predictors columns, returns predicted values y values predictors.","code":"m = model(formula, data) pr = predict(m, newdata)"},{"path":"/articles/stars7.html","id":"stars-objects-as-data-frames","dir":"Articles","previous_headings":"Training and prediction with stars objects","what":"stars objects as data.frames","title":"7. Statistical modelling with stars objects","text":"analogy stars objects data.frame : attribute (array) becomes single column dimensions become added (index) columns see works 6-band example dataset, consider : see get one single variable object (array) name, added columns dimension values (x, y, band). typical case, like six bands distributed six variables, single observation (row) x/y pair. , use e.g. utils::unstack dplyr::pivot_wider data.frame, efficient way use dedicated split method stars objects, resolves dimension splits attributes, one dimension value: reason split efficient mentioned alternatives () split match records based dimensions (x/y), (ii) works --memory (stars_proxy) arrays, chunked process/write loop write_stars(). ### Predict stars objects pattern obtain predictions pixels stars objects : use full dataset sample train model, using .data.frame() (possibly split) use predict(star_object, model) predict pixels stars_object, using stars-wrapper predict method model. predict method model, provide one (see kmeans example ) works stars objects (-memory) stars_proxy objects (-memory). plotting stars_proxy objects, downsampling done prediction (predicting pixels shown), full rasters can written disk write_stars(), carry predictions chunks read written.","code":"library(stars) ## Loading required package: abind ## Loading required package: sf ## Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE l7 = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") %>% read_stars() l7 ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA as.data.frame(l7) %>% head() ## x y band L7_ETMs.tif ## 1 288790.5 9120747 1 69 ## 2 288819.0 9120747 1 69 ## 3 288847.5 9120747 1 63 ## 4 288876.0 9120747 1 60 ## 5 288904.5 9120747 1 61 ## 6 288933.0 9120747 1 61 l7 %>% split(\"band\") %>% as.data.frame() %>% head() ## x y X1 X2 X3 X4 X5 X6 ## 1 288790.5 9120747 69 56 46 79 86 46 ## 2 288819.0 9120747 69 57 49 75 88 49 ## 3 288847.5 9120747 63 52 45 66 75 41 ## 4 288876.0 9120747 60 45 35 66 69 38 ## 5 288904.5 9120747 61 52 44 76 92 60 ## 6 288933.0 9120747 61 50 37 78 74 38"},{"path":"/articles/stars7.html","id":"models-fitted-for-every-pixel","dir":"Articles","previous_headings":"","what":"models fitted for every pixel","title":"7. Statistical modelling with stars objects","text":"can run models many different ways array data. One way run single model pixels, model operates e.g. spectral (band) temporal dimension. example given vignette 2, NDVI computed red near infrared band. NDVI involve estimating parameters, reducing two bands one. example fit model every pixel fit time series model pixel time series, output one model coefficients pixel; shown next.","code":""},{"path":"/articles/stars7.html","id":"linear-regression-on-pixel-time-series","dir":"Articles","previous_headings":"models fitted for every pixel","what":"Linear regression on pixel time series","title":"7. Statistical modelling with stars objects","text":"can read avhrr dataset, containing 9 days: use function computes slope regression line temperature time. get temperatures vector first argument function supplied st_apply, t already defined. function look like optimize bit, using anyNA lm.fit rather lm: result lazily defined (adrop drops singular dimension) computed following command, computations restricted pixels plotted: interesting pattern appears (despite short time series!): SST reveals main signal colder getting equator, changes SST show much fine grained structures areas going , others going . diverging color ramp better choice , distinguish positive negative trends.","code":"library(stars) x = c(\"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\", \"avhrr-only-v2.19810905.nc\", \"avhrr-only-v2.19810906.nc\", \"avhrr-only-v2.19810907.nc\", \"avhrr-only-v2.19810908.nc\", \"avhrr-only-v2.19810909.nc\") file_list = system.file(paste0(\"netcdf/\", x), package = \"starsdata\") y = read_stars(file_list, sub = \"sst\", quiet = TRUE, proxy = TRUE) (t = st_get_dimension_values(y, 4)) ## [1] \"1981-09-01 UTC\" \"1981-09-02 UTC\" \"1981-09-03 UTC\" \"1981-09-04 UTC\" ## [5] \"1981-09-05 UTC\" \"1981-09-06 UTC\" \"1981-09-07 UTC\" \"1981-09-08 UTC\" ## [9] \"1981-09-09 UTC\" slope = function(x) { if (any(is.na(x))) NA_real_ else coeffients(lm(x~t))[2] } slope = function(x) { if (anyNA(x)) NA_real_ else lm.fit(cbind(1, t), x)$coefficients[2] } out = st_apply(adrop(y), c(1,2), slope) plot(out, breaks = \"equal\", main = \"9-day time trend (slope)\") ## downsample set to 1"},{"path":[]},{"path":"/articles/stars7.html","id":"principal-components","dir":"Articles","previous_headings":"Unsupervised learners","what":"Principal components","title":"7. Statistical modelling with stars objects","text":"first example, build principal components entire dataset, rather small. see, amongst others, PC1 picks difference sea (dark) land, PC2 3 structures sea coastal waters. second example, build principal components sample entire dataset, entire dataset rather large. apply , using predict, pixels shown plot (.e. reduced rather full resolution) plotting , ’ll add country borders delineate sea, obtained mapdata package: plot results independent color ranges, every PC stretched entire grey scale. suggests PC1 picks difference cloud signal (difference clouds non-clouds), PC2 difference sea land areas, PC4 sensor artefacts (striping swath direction). compute full resolution (10000 x 10000 pixels) results write file, use","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") r = split(read_stars(tif)) pc = prcomp(as.data.frame(r)[,-(1:2)]) # based on all data out = predict(r, pc) plot(merge(out), breaks = \"equal\", join_zlim = FALSE) granule = system.file(\"sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip\", package = \"starsdata\") s2 = paste0(\"SENTINEL2_L1C:/vsizip/\", granule, \"/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632\") p = read_stars(s2, proxy = TRUE, NA_value = 0) %>% split() r = st_sample(p, 1000) pc = prcomp(na.omit(as.data.frame(r))[,-(1:2)]) # based on all data out = predict(p, pc) bb = st_bbox(p) %>% st_as_sfc() %>% st_transform(4326) %>% st_bbox() library(maps) library(mapdata) m = map(\"worldHires\", xlim = bb[c(1,3)], ylim = bb[c(2,4)], plot=F,fill=TRUE) %>% st_as_sfc() %>% st_transform(st_crs(r)) plt_boundary = function() plot(m, border = 'orange', add = TRUE) plot(merge(out), hook = plt_boundary, join_zlim = FALSE) ## downsample set to 18 write_stars(merge(out), \"out.tif\")"},{"path":"/articles/stars7.html","id":"k-means-clustering","dir":"Articles","previous_headings":"Unsupervised learners","what":"K-means clustering","title":"7. Statistical modelling with stars objects","text":"small dataset: seems pick fair number land cover classes: water (5), rural (3), densely populated (1, 2). large(r) dataset: see class 1 3 identify unclouded area, 3 land, classes seem mainly catch aspects cloud signal.","code":"library(clue) predict.kmeans = function(object, newdata, ...) { unclass(clue::cl_predict(object, newdata[, -c(1:2)], ...)) } tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") i = read_stars(tif, proxy = TRUE) %>% split() nclus = 5 sam = st_sample(i, 1000) k = kmeans(na.omit(as.data.frame(sam)[, -c(1:2)]), nclus) out = predict(i, k) plot(out, col = sf.colors(nclus, categorical=TRUE)) i = read_stars(s2, proxy = TRUE, NA_value = 0) %>% split() sam = st_sample(i, 1000) k = kmeans(na.omit(as.data.frame(sam)[, -c(1:2)]), nclus) out = predict(i, k) plot(out, col = sf.colors(nclus, categorical=TRUE), reset = FALSE) ## downsample set to 18 plot(m, add = TRUE)"},{"path":[]},{"path":"/articles/stars7.html","id":"random-forest-land-use-classification","dir":"Articles","previous_headings":"Supervised learners","what":"Random Forest land use classification","title":"7. Statistical modelling with stars objects","text":"following example purely educational purposes; classified “land use” just rough approximation seems easily visible image: sea, land, areas partially covered clouds. opted therefore four classes: sea, land, clouds sea, clouds land. polygon areas land use classified, residing GeoPackage file. (file created using QGIS, using instructions found .) Next, need points, sampled inside polygons, need extract satellite spectral data comes rather trivial finding land sea can well predicted clouds, less trivial finding can reasonably distinguished patchy clouds kind. Note predictions kind pure pixel-based: prediction spectral bands pixel considered, instance neighboring pixels.","code":"# for all, multi-resolution, use: bands = c(\"B04\", \"B03\", \"B02\", \"B08\", \"B01\", \"B05\", \"B06\", \"B07\", \"B8A\", \"B09\", \"B10\", \"B11\", \"B12\") # bands = c(\"B04\", \"B03\", \"B02\", \"B08\") s2 = paste0(\"/vsizip/\", granule, \"/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/GRANULE/L1C_T32ULE_A013919_20180220T105539/IMG_DATA/T32ULE_20180220T105051_\", bands, \".jp2\") r = read_stars(s2, proxy = TRUE, NA_value = 0) %>% setNames(bands) cl = read_sf(system.file(\"gpkg/s2.gpkg\", package = \"stars\")) %>% st_transform(st_crs(r)) plot(r, reset = FALSE) ## downsample set to 8 plot(cl, add = TRUE) plot(m, add = TRUE, border = 'orange') pts = st_sample(cl, 1000, \"regular\") %>% st_as_sf() %>% st_intersection(cl) ## Warning: attribute variables are assumed to be spatially constant throughout ## all geometries train = st_extract(r, pts) train$use = as.factor(pts$use) # no need for join, since the order did not change train ## Simple feature collection with 1000 features and 14 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: 328195.1 ymin: 5909563 xmax: 407928.8 ymax: 5970391 ## Projected CRS: WGS 84 / UTM zone 32N ## First 10 features: ## B04 B03 B02 B08 B01 B05 B06 B07 B8A B09 B10 B11 B12 ## 1 921 1139 1396 2375 1744 1180 1860 2099 2396 1006 15 1458 779 ## 2 879 1136 1366 2935 1728 1246 2148 2537 2814 994 14 1669 887 ## 3 870 1029 1338 1872 1694 1076 1567 1765 2042 824 14 1629 856 ## 4 1016 1228 1439 3054 1789 1477 2655 3057 3427 1207 15 2220 1210 ## 5 1010 1145 1449 2039 1782 1302 1724 1975 2144 860 10 1795 999 ## 6 1344 1213 1475 1943 1770 1427 1684 1901 2143 863 14 2276 1365 ## 7 1067 1204 1472 2348 1778 1369 2057 2306 2685 1032 17 2010 1179 ## 8 1035 1144 1437 2289 1760 1299 1891 2246 2637 1042 11 1788 920 ## 9 854 1047 1371 1902 1715 1146 1815 1941 2133 782 16 1568 949 ## 10 941 1155 1379 2802 1689 1380 2268 2595 2976 1058 15 2012 1086 ## x use ## 1 POINT (394518.2 5940525) land ## 2 POINT (390045.1 5931738) land ## 3 POINT (390340.9 5929888) land ## 4 POINT (391254 5938829) land ## 5 POINT (391997.7 5937843) land ## 6 POINT (395680.9 5933296) land ## 7 POINT (388792.2 5934807) land ## 8 POINT (392185.2 5940074) land ## 9 POINT (387142.8 5936359) land ## 10 POINT (390877.6 5927178) land library(randomForest) ## randomForest 4.7-1.1 ## Type rfNews() to see new features/changes/bug fixes. ## ## Attaching package: 'randomForest' ## The following object is masked from 'package:dplyr': ## ## combine train = as.data.frame(train) train$x = NULL # remove geometry rf = randomForest(use ~ ., train) # ~ . : use all other attributes pr = predict(r, rf) plot(pr, reset = FALSE, key.pos = 1) ## downsample set to 8 # add country outline: plot(m, add = TRUE)"},{"path":"/articles/stars7.html","id":"parallel-processing","dir":"Articles","previous_headings":"","what":"Parallel processing","title":"7. Statistical modelling with stars objects","text":"machine learning models support multithreading default (e.g., ranger xgboost), rule. R single-threaded, using appropriate packages can easily parallelize calculations, reduce data processing time. example tutorial showing step--step unsupervised classification using multithreading can found R-Spatial blog.","code":""},{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Edzer Pebesma. Author, maintainer. Michael Sumner. Contributor. Etienne Racine. Contributor. Adriano Fantini. Contributor. David Blodgett. Contributor. Krzysztof Dyba. Contributor.","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Pebesma E, Bivand R (2023). Spatial Data Science: applications R. Chapman Hall/CRC, London. doi:10.1201/9780429459016, https://r-spatial.org/book/.","code":"@Book{, title = {{Spatial Data Science: With applications in R}}, author = {Edzer Pebesma and Roger Bivand}, year = {2023}, publisher = {Chapman and Hall/CRC}, address = {London}, url = {https://r-spatial.org/book/}, pages = {352}, doi = {10.1201/9780429459016}, }"},{"path":"/index.html","id":"spatiotemporal-arrays-raster-and-vector-datacubes","dir":"","previous_headings":"","what":"Spatiotemporal Arrays, Raster and Vector Data Cubes","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Spatiotemporal data often comes form dense arrays, space time array dimensions. Examples include socio-economic demographic data, environmental variables monitored fixed stations, raster maps time series satellite images multiple spectral bands, spatial simulations, climate weather model output. R package provides classes methods reading, manipulating, plotting writing data cubes, extent proper formats .","code":""},{"path":"/index.html","id":"raster-and-vector-data-cubes","dir":"","previous_headings":"","what":"Raster and vector data cubes","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"canonical data cube us mind two dimensions represent spatial raster dimensions, third time (band), e.g. shown : data cubes however also consider higher-dimensional cubes (hypercubes) five-dimensional cube addition time, spectral band sensor form dimensions: lower-dimensional cubes raster image: Raster data need regular aligned North/East, package stars supports besides regular also rotated, sheared, rectilinear curvilinear rasters: Vector data cubes arise two regularly discretized spatial dimensions, single dimension points distinct spatial feature geometries, polygons (e.g. denoting administrative regions): points (e.g. denoting sensor locations): NetCDF’s CF-convention calls discrete axis.","code":"suppressPackageStartupMessages(library(dplyr)) library(stars) # Loading required package: abind # Loading required package: sf # Linking to GEOS 3.11.2, GDAL 3.7.2, PROJ 9.3.0; sf_use_s2() is TRUE tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") read_stars(tif) |> slice(index = 1, along = \"band\") |> plot()"},{"path":"/index.html","id":"netcdf-gdal","dir":"","previous_headings":"","what":"NetCDF, GDAL","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"stars provides two functions read data: read_ncdf read_stars, latter reads GDAL. (future, integrated read_stars.) reading NetCDF files, package RNetCDF used, reading GDAL, package sf provides binary linking GDAL. vector raster operations, stars uses much possible routines available GDAL PROJ (e.g. st_transform, rasterize, polygonize, warp). Read vignette vector-raster conversions, reprojection, warping.","code":""},{"path":"/index.html","id":"out-of-memory-on-disk-rasters","dir":"","previous_headings":"","what":"Out-of-memory (on-disk) rasters","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Package stars provides stars_proxy objects (currently read GDAL), contain dimensions metadata pointers files disk. objects work lazily: reading processing data postponed moment pixels really needed (plot time, writing disk), done lowest spatial resolution possible still fulfills resolution graphics device. details found stars proxy vignette. following methods currently available stars_proxy objects:","code":"methods(class = \"stars_proxy\") # [1] [ [[<- [<- adrop # [5] aggregate aperm as.data.frame c # [9] coerce dim droplevels filter # [13] hist image initialize is.na # [17] Math merge mutate Ops # [21] plot predict print pull # [25] rename select show slice # [29] slotsFromS3 split st_apply st_as_sf # [33] st_as_stars st_crop st_dimensions<- st_downsample # [37] st_mosaic st_normalize st_redimension st_sample # [41] st_set_bbox transmute write_stars # see '?methods' for accessing help and source code"},{"path":"/index.html","id":"raster-and-vector-time-series-analysis-example","dir":"","previous_headings":"","what":"Raster and vector time series analysis example","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"following, curvilinear grid hourly precipitation values hurricane imported first 12 time steps plotted: next, intersected counties North Carolina, maximum precipitation intensity obtained per county, plotted: can integrate (reduce) time, instance find maximum precipitation occurred. following code finds time index, corresponding time value: package cubble, can make glyph map see magnitude timings county maximum precipitation:","code":"prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") (prec = read_stars(gdal_subdatasets(prec_file)[[1]])) # stars object with 3 dimensions and 1 attribute # attribute(s): # Min. 1st Qu. Median Mean 3rd Qu. # Total_precipitation_surface... [kg/m^2] 0 0 0.75 4.143009 4.63 # Max. # Total_precipitation_surface... [kg/m^2] 163.75 # dimension(s): # from to offset delta refsys # x 1 87 NA NA WGS 84 (CRS84) # y 1 118 NA NA WGS 84 (CRS84) # time 1 23 2018-09-13 19:00:00 UTC 1 hours POSIXct # values x/y # x [87x118] -80.61 [°],...,-74.88 [°] [x] # y [87x118] 32.44 [°],...,37.62 [°] [y] # time NULL # curvilinear grid # or: (prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\"), ignore_bounds = TRUE)) sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") |> st_transform(st_crs(prec)) -> nc # transform from NAD27 to WGS84 nc_outline = st_union(st_geometry(nc)) plot_hook = function() plot(nc_outline, border = 'red', add = TRUE) prec |> slice(index = 1:12, along = \"time\") |> plot(downsample = c(3, 3, 1), hook = plot_hook) a = aggregate(prec, by = nc, FUN = max) plot(a, max.plot = 23, border = 'grey', lwd = .5) index_max = function(x) ifelse(all(is.na(x)), NA, which.max(x)) b = st_apply(a, \"geom\", index_max) b |> mutate(when = st_get_dimension_values(a, \"time\")[b$index_max]) |> select(when) |> plot(key.pos = 1, main = \"time of maximum precipitation\") library(cubble) # # Attaching package: 'cubble' # The following object is masked from 'package:stats': # # filter library(ggplot2) a |> setNames(\"precip\") |> st_set_dimensions(2, name = \"tm\") |> units::drop_units() |> as_cubble(key = id, index = tm) |> suppressWarnings() -> a.cb a.cb |> face_temporal() |> unfold(long, lat) |> mutate(tm = as.numeric(tm)) |> ggplot(aes(x_major = long, x_minor = tm, y_major = lat, y_minor = precip)) + geom_sf(data = nc, inherit.aes = FALSE) + geom_glyph_box(width = 0.3, height = 0.1) + geom_glyph(width = 0.3, height = 0.1) # Warning: There were 84 warnings in `dplyr::mutate()`. # The first warning was: # ℹ In argument: `y = .data$y_major + rescale11(.data$y_minor) * .data$height/2`. # ℹ In group 12: `group = 12`. # Caused by warning in `min()`: # ! no non-missing arguments to min; returning Inf # ℹ Run `dplyr::last_dplyr_warnings()` to see the 83 remaining warnings. # Warning: Removed 966 rows containing missing values or values outside the scale range # (`geom_glyph_box()`). # Warning: Removed 966 rows containing missing values or values outside the scale range # (`geom_glyph()`)."},{"path":[]},{"path":"/index.html","id":"gdalcubes","dir":"","previous_headings":"Other packages for data cubes","what":"gdalcubes","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Package gdalcubes can used create data cubes (functions ) image collections, sets multi-band images varying spatial resolution spatial extent coordinate reference systems (e.g., spread multiple UTM zones) observation times resampling /aggregating space /time. reuses GDAL VRT’s gdalwarp spatial resampling /warping, handles temporal resampling aggregation .","code":""},{"path":"/index.html","id":"ncdfgeom","dir":"","previous_headings":"Other packages for data cubes","what":"ncdfgeom","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"ncdfgeom reads writes vector data cubes netcdf files standards-compliant way.","code":""},{"path":"/index.html","id":"raster-and-terra","dir":"","previous_headings":"Other packages for data cubes","what":"raster and terra","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Packages raster successor, terra powerful packages handling raster maps stacks raster maps memory disk, address non-raster time series, multi-attribute rasters time series rasters mixed type attributes (e.g., numeric, logical, factor, POSIXct) rectilinear curvilinear rasters list stars commands matching existing raster commands found wiki. list translations opposite direction (stars raster terra) still needs made. comment differences stars terra found .","code":""},{"path":"/index.html","id":"other-stars-resources","dir":"","previous_headings":"","what":"Other stars resources:","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"blog posts: first, second, third, newer blog posts vignettes original R Consortium proposal.","code":""},{"path":"/index.html","id":"acknowledgment","dir":"","previous_headings":"Other stars resources:","what":"Acknowledgment","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"project realized financial support ","code":""},{"path":"/reference/L7_ETMs.html","id":null,"dir":"Reference","previous_headings":"","what":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","title":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","text":"Probably containing six 30 m bands: Band 1 Visible (0.45 - 0.52 µm) 30 m Band 2 Visible (0.52 - 0.60 µm) 30 m Band 3 Visible (0.63 - 0.69 µm) 30 m Band 4 Near-Infrared (0.77 - 0.90 µm) 30 m Band 5 Short-wave Infrared (1.55 - 1.75 µm) 30 m Band 7 Mid-Infrared (2.08 - 2.35 µm) 30 m","code":""},{"path":"/reference/L7_ETMs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","text":"","code":"L7_ETMs"},{"path":"/reference/L7_ETMs.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","text":"object class stars_proxy (inherits stars) dimension 349 x 352 x 6.","code":""},{"path":"/reference/aggregate.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"spatially or temporally aggregate stars object — aggregate.stars","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"spatially temporally aggregate stars object, returning data cube lower spatial temporal resolution","code":""},{"path":"/reference/aggregate.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"","code":"# S3 method for class 'stars' aggregate( x, by, FUN, ..., drop = FALSE, join = st_intersects, as_points = any(st_dimension(by) == 2, na.rm = TRUE), rightmost.closed = FALSE, left.open = FALSE, exact = FALSE )"},{"path":"/reference/aggregate.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"x object class stars information aggregated object class sf sfc spatial aggregation, temporal aggregation vector time values (Date, POSIXct, PCICt) interpreted sequence left-closed, right-open time intervals string like \"months\", \"5 days\" like (see cut.POSIXt), function cuts time intervals; object class stars, converted sfc st_as_sfc(, as_points = FALSE) thus ignoring time component. Note: pixel assigned single group (order groups occur) non-overlapping spatial features temporal windows recommended. FUN aggregation function, mean ... arguments passed FUN, na.rm=TRUE drop logical; ignored join function; function used find matches x as_points see st_as_sf: shall raster pixels taken points, small square polygons? rightmost.closed see findInterval left.open logical; used time intervals, see findInterval cut.POSIXt exact logical; TRUE, use coverage_fraction compute exact overlap fractions polygons raster cells","code":""},{"path":[]},{"path":"/reference/aggregate.stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"","code":"# aggregate time dimension in format Date tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") t1 = as.Date(\"2018-07-31\") x = read_stars(c(tif, tif, tif, tif), along = list(time = c(t1, t1+1, t1+2, t1+3)))[,1:30,1:30] st_get_dimension_values(x, \"time\") #> [1] \"2018-07-31\" \"2018-08-01\" \"2018-08-02\" \"2018-08-03\" x_agg_time = aggregate(x, by = t1 + c(0, 2, 4), FUN = max) # aggregate time dimension in format Date - interval by_t = \"2 days\" x_agg_time2 = aggregate(x, by = by_t, FUN = max) st_get_dimension_values(x_agg_time2, \"time\") #> [1] \"2018-07-31\" \"2018-08-02\" #TBD: #x_agg_time - x_agg_time2 # aggregate time dimension in format POSIXct x = st_set_dimensions(x, 4, values = as.POSIXct(c(\"2018-07-31\", \"2018-08-01\", \"2018-08-02\", \"2018-08-03\")), names = \"time\") by_t = as.POSIXct(c(\"2018-07-31\", \"2018-08-02\")) x_agg_posix = aggregate(x, by = by_t, FUN = max) st_get_dimension_values(x_agg_posix, \"time\") #> [1] \"2018-07-31 UTC\" \"2018-08-02 UTC\" #TBD: # x_agg_time - x_agg_posix aggregate(x, \"2 days\", mean) #> stars object with 4 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 58 57.58796 70 145 #> dimension(s): #> from to offset delta refsys point x/y #> time 1 2 2018-07-31 UTC 2 days POSIXct NA #> x 1 30 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 30 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA if (require(ncmeta, quietly = TRUE)) { # Spatial aggregation, see https://github.com/r-spatial/stars/issues/299 prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\")) prec_slice = dplyr::slice(prec, index = 17, along = \"time\") nc = sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") nc = st_transform(nc, st_crs(prec_slice)) agg = aggregate(prec_slice, st_geometry(nc), mean) plot(agg) } #> no 'var' specified, using Total_precipitation_surface_1_Hour_Accumulation #> other available variables: #> lat, lon, time #> Will return stars object with 236118 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. # example of using a function for \"by\": aggregate by month-of-year d = c(10, 10, 150) a = array(rnorm(prod(d)), d) # pure noise times = Sys.Date() + seq(1, 2000, length.out = d[3]) m = as.numeric(format(times, \"%m\")) signal = rep(sin(m / 12 * pi), each = prod(d[1:2])) # yearly period s = (st_as_stars(a) + signal) %>% st_set_dimensions(3, values = times) f = function(x, format = \"%B\") { months = format(as.Date(paste0(\"01-\", 1:12, \"-1970\")), format) factor(format(x, format), levels = months) } agg = aggregate(s, f, mean) plot(agg)"},{"path":"/reference/bcsd_obs.html","id":null,"dir":"Reference","previous_headings":"","what":"Monthly Gridded Meteorological Observations — bcsd_obs","title":"Monthly Gridded Meteorological Observations — bcsd_obs","text":"monthly observational data used BCSD downscaling. See: information.\" ; \"Atmospheric Temperature, Air Temperature Atmosphere, Precipitation, Rain, Maximum Daily Temperature, Minimum Daily Temperature\" ;","code":""},{"path":"/reference/bcsd_obs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Monthly Gridded Meteorological Observations — bcsd_obs","text":"","code":"bcsd_obs"},{"path":"/reference/bcsd_obs.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Monthly Gridded Meteorological Observations — bcsd_obs","text":"object class stars_proxy (inherits stars) dimension 81 x 33 x 12.","code":""},{"path":"/reference/c.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"combine multiple stars objects, combine multiple attributes single stars object single array","code":""},{"path":"/reference/c.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"","code":"# S3 method for class 'stars_proxy' c( ..., along = NA_integer_, along_crs = FALSE, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps) ) # S3 method for class 'stars' c( ..., along = NA_integer_, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps) )"},{"path":"/reference/c.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"... object(s) class star: case multiple arguments, combined single stars object, case single argument, attributes combined single attribute. case multiple objects, objects dimensionality. along integer; see read_stars along_crs logical; TRUE, combine arrays along CRS dimension try_hard logical; TRUE arrays different dimensions, combine dimensions matching first array nms character; vector array names tolerance numeric; values used .equal compare dimension values combine dimensions matching first array","code":""},{"path":"/reference/c.stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"single stars object merged (binded) arrays.","code":""},{"path":"/reference/c.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"error raised attempting combine arrays different measurement units single array. intentded, drop_units can used remove units stars object merging.","code":""},{"path":"/reference/c.stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) (new = c(x, x)) #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> L7_ETMs.tif.1 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA c(new) # collapses two arrays into one with an additional dimension #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> L7_ETMs.tif.1 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA c(x, x, along = 3) #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 12 NA NA NA NA"},{"path":"/reference/coerce-methods.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce stars object into a Raster raster or brick — as","title":"Coerce stars object into a Raster raster or brick — as","text":"Coerce stars object Raster raster brick Coerce stars object terra SpatRaster","code":""},{"path":"/reference/coerce-methods.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce stars object into a Raster raster or brick — as","text":"object coerce","code":""},{"path":"/reference/coerce-methods.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce stars object into a Raster raster or brick — as","text":"RasterLayer RasterBrick SpatRaster","code":""},{"path":"/reference/coerce-methods.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce stars object into a Raster raster or brick — as","text":"stars object three dimensions, dimensions higher third collapsed third dimensions. stars object x/y raster multiple attributes, merged first, put raster brick. stars object three dimensions, dimensions higher third collapsed third dimensions. stars object x/y raster multiple attributes, merged first, put SpatRaster.","code":""},{"path":"/reference/contour.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"plot contours of a stars object — contour.stars","title":"plot contours of a stars object — contour.stars","text":"plot contours stars object","code":""},{"path":"/reference/contour.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"plot contours of a stars object — contour.stars","text":"","code":"# S3 method for class 'stars' contour(x, ...)"},{"path":"/reference/contour.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"plot contours of a stars object — contour.stars","text":"x object class stars ... parameters passed contour","code":""},{"path":"/reference/contour.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"plot contours of a stars object — contour.stars","text":"uses R internal contour algorithm, (default) plots contours; st_contour uses GDAL contour algorithm returns contours simple features.","code":""},{"path":"/reference/contour.stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"plot contours of a stars object — contour.stars","text":"","code":"d = st_dimensions(x = 1:ncol(volcano), y = 1:nrow(volcano)) r = st_as_stars(t(volcano)) r = st_set_dimensions(r, 1, offset = 0, delta = 1) r = st_set_dimensions(r, 2, offset = 0, delta = -1) plot(r, reset = FALSE) contour(r, add = TRUE)"},{"path":"/reference/cut_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"cut methods for stars objects — cut_stars","title":"cut methods for stars objects — cut_stars","text":"cut methods stars objects","code":""},{"path":"/reference/cut_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"cut methods for stars objects — cut_stars","text":"","code":"# S3 method for class 'array' cut(x, breaks, ...) # S3 method for class 'matrix' cut(x, breaks, ...) # S3 method for class 'stars' cut(x, breaks, ...)"},{"path":"/reference/cut_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"cut methods for stars objects — cut_stars","text":"x see cut breaks see cut ... see cut","code":""},{"path":"/reference/cut_stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"cut methods for stars objects — cut_stars","text":"array matrix levels attribute; see details","code":""},{"path":"/reference/cut_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"cut methods for stars objects — cut_stars","text":"R's factor works vectors, arrays matrices. work-around (hack?) keep factor levels generated cut use plots.","code":""},{"path":"/reference/cut_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"cut methods for stars objects — cut_stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) cut(x, c(0, 50, 100, 255)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> (0,50] :156060 #> (50,100] :503764 #> (100,255]: 77264 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA cut(x[,,,1], c(0, 50, 100, 255)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> (0,50] : 1 #> (50,100] :117134 #> (100,255]: 5713 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 1 NA NA NA NA plot(cut(x[,,,1], c(0, 50, 100, 255))) tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x1 = read_stars(tif) (x1_cut = cut(x1, breaks = c(0, 50, 100, Inf))) # shows factor in summary #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> (0,50] :156060 #> (50,100] :503764 #> (100,Inf]: 77264 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x1_cut[,,,c(3,6)]) # propagates through [ and plot"},{"path":"/reference/dplyr.html","id":null,"dir":"Reference","previous_headings":"","what":"dplyr verbs for stars objects — dplyr","title":"dplyr verbs for stars objects — dplyr","text":"dplyr verbs stars objects; package dplyr needs loaded methods can used stars objects.","code":""},{"path":"/reference/dplyr.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"dplyr verbs for stars objects — dplyr","text":"","code":"filter.stars(.data, ...) filter.stars_proxy(.data, ...) mutate.stars(.data, ...) mutate.stars_proxy(.data, ...) transmute.stars(.data, ...) transmute.stars_proxy(.data, ...) select.stars(.data, ...) select.stars_proxy(.data, ...) rename.stars(.data, ...) rename.stars_proxy(.data, ...) pull.stars(.data, var = -1) pull.stars_proxy(.data, ...) as.tbl_cube.stars(x, ...) slice.stars(.data, along, index, ..., drop = length(index) == 1) slice.stars_proxy(.data, along, index, ...) replace_na.stars(data, replace, ...) replace_na.stars_proxy(data, ...)"},{"path":"/reference/dplyr.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"dplyr verbs for stars objects — dplyr","text":".data object class stars ... see filter var see pull x object class stars along name index dimension slice applied index integer value(s) index drop logical; drop dimensions single index? data data set work replace see replace_na: list variable=value pairs, value replacement value NA's","code":""},{"path":"/reference/dplyr.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"dplyr verbs for stars objects — dplyr","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x1 = read_stars(tif) if (require(dplyr, quietly = TRUE)) { x1 %>% slice(\"band\", 2:3) x1 %>% slice(\"x\", 50:100) } #> #> Attaching package: ‘dplyr’ #> The following objects are masked from ‘package:stats’: #> #> filter, lag #> The following objects are masked from ‘package:base’: #> #> intersect, setdiff, setequal, union #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 11 56 68 70.50099 82 252 #> dimension(s): #> from to offset delta refsys point x/y #> x 50 100 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA"},{"path":"/reference/expand_dimensions.html","id":null,"dir":"Reference","previous_headings":"","what":"expand the dimension values into a list — expand_dimensions","title":"expand the dimension values into a list — expand_dimensions","text":"expand dimension values list","code":""},{"path":"/reference/expand_dimensions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"expand the dimension values into a list — expand_dimensions","text":"","code":"expand_dimensions(x, ...) # S3 method for class 'dimensions' expand_dimensions(x, ..., max = FALSE, center = NA)"},{"path":"/reference/expand_dimensions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"expand the dimension values into a list — expand_dimensions","text":"x object class `stars` `dimensions` ... ignored max logical; `TRUE` return max (end) values dimensions intervals center logical; `TRUE` return center values intervals, otherwise return offset (start) intervals; `NA` (default) return centers x/y dimensions, offsets others","code":""},{"path":"/reference/geom_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"ggplot geom for stars objects — geom_stars","title":"ggplot geom for stars objects — geom_stars","text":"ggplot geom stars objects","code":""},{"path":"/reference/geom_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ggplot geom for stars objects — geom_stars","text":"","code":"geom_stars( mapping = NULL, data = NULL, ..., downsample = 0, sf = FALSE, na.action = na.pass ) theme_stars(...)"},{"path":"/reference/geom_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ggplot geom for stars objects — geom_stars","text":"mapping see geom_raster data see geom_raster ... see geom_raster downsample downsampling rate: e.g. 3 keeps rows cols 1, 4, 7, 10 etc.; value 0 downsample; can specified dimension, e.g. c(5,5,0) downsample first two dimensions third. sf logical; TRUE rasters converted polygons plotted using geom_sf. na.action function; NA values need removed plotting use value na.omit (applies objects raster dimensions)","code":""},{"path":"/reference/geom_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ggplot geom for stars objects — geom_stars","text":"geom_stars returns (call ) either geom_raster, geom_tile, geom_sf, depending raster vector geometry; first , aes call constructed raster dimension names first array fill variable. calls coord_equal facet_wrap needed control aspect ratio layers plotted; see examples. stars array contains hex color values, fill parameter given, color values used fill color; see example . visual artefacts occur (Moiré-Effekt), see details section plot.stars","code":""},{"path":"/reference/geom_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ggplot geom for stars objects — geom_stars","text":"","code":"system.file(\"tif/L7_ETMs.tif\", package = \"stars\") %>% read_stars() -> x if (require(ggplot2, quietly = TRUE)) { ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_x_discrete(expand=c(0,0))+ scale_y_discrete(expand=c(0,0)) # plot rgb composite: st_as_stars(L7_ETMs)[,,,1:3] |> st_rgb() -> x # x contains colors as pixel values ggplot() + geom_stars(data = x) }"},{"path":"/reference/in-methods.html","id":null,"dir":"Reference","previous_headings":"","what":"evaluate whether cube values are in a given set — %in%,stars-method","title":"evaluate whether cube values are in a given set — %in%,stars-method","text":"evaluate whether cube values given set","code":""},{"path":"/reference/in-methods.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"evaluate whether cube values are in a given set — %in%,stars-method","text":"","code":"# S4 method for class 'stars' x %in% table"},{"path":"/reference/in-methods.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"evaluate whether cube values are in a given set — %in%,stars-method","text":"x data cube value table values set","code":""},{"path":"/reference/make_intervals.html","id":null,"dir":"Reference","previous_headings":"","what":"create an intervals object — make_intervals","title":"create an intervals object — make_intervals","text":"create intervals object, assuming left-closed right-open intervals","code":""},{"path":"/reference/make_intervals.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"create an intervals object — make_intervals","text":"","code":"make_intervals(start, end)"},{"path":"/reference/make_intervals.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"create an intervals object — make_intervals","text":"start vector start values, 2-column matrix start end values column 1 2, respectively end vector end values","code":""},{"path":"/reference/mdim.html","id":null,"dir":"Reference","previous_headings":"","what":"Read or write data using GDAL's multidimensional array API — mdim","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"Read write data using GDAL's multidimensional array API","code":""},{"path":"/reference/mdim.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"","code":"read_mdim( filename, variable = character(0), ..., options = character(0), raster = NULL, offset = integer(0), count = integer(0), step = integer(0), proxy = FALSE, debug = FALSE, bounds = TRUE, curvilinear = NA ) write_mdim( x, filename, driver = detect.driver(filename), ..., root_group_options = character(0), options = character(0), as_float = TRUE )"},{"path":"/reference/mdim.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"filename name source destination file data source variable name array read; `\"?\"`, list array names returned, group name list element names. ... ignored options character; driver specific options regarding opening (read_mdim) creation (write_mdim) dataset raster names raster variables (default: first two dimensions) offset integer; zero-based offset dimension (pixels) sub-array read, defaults 0 dimension(requires sf >= 1.0-9) count integer; size dimension (pixels) sub-array read (default: read ); value NA read corresponding dimension entirely; counts relative step size (requires sf >= 1.0-9) step integer; step size dimension (pixels) sub-array read; defaults 1 dimension (requires sf >= 1.0-9) proxy logical; return proxy object? debug logical; print debug info? bounds logical character: TRUE tries infer \"bounds\" attribute; character, named vector form c(longitude=\"lon_bnds\", latitude=\"lat_bnds\") names dimension names curvilinear control reading curvilinear (geolocation) coordinate arrays; NA try reading x/y dimension names; character, defines arrays read; FALSE try; see also read_stars x stars object driver character; driver name root_group_options character; driver specific options regarding creation root group as_float logical; TRUE write 4-byte floating point numbers, FALSE write 8-byte doubles","code":""},{"path":"/reference/mdim.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"assumed first two dimensions easting northing","code":""},{"path":[]},{"path":"/reference/mdim.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"","code":"set.seed(135) m = matrix(runif(10), 2, 5) names(dim(m)) = c(\"stations\", \"time\") times = as.Date(\"2022-05-01\") + 1:5 pts = st_as_sfc(c(\"POINT(0 1)\", \"POINT(3 5)\")) s = st_as_stars(list(Precipitation = m)) |> st_set_dimensions(1, values = pts) |> st_set_dimensions(2, values = times) nc = tempfile(fileext=\".nc\") if (compareVersion(sf_extSoftVersion()[\"GDAL\"], \"3.4.0\") > -1) { write_mdim(s, nc) # try ncdump on the generated file print(read_mdim(nc)) } #> Warning: GDAL Error 6: SetIndexingVariable() not implemented #> Warning: GDAL Error 6: SetIndexingVariable() not implemented #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> Precipitation 0.03524588 0.3224987 0.3772574 0.4289465 0.511113 0.9204841 #> dimension(s): #> from to offset delta refsys point values #> stations 1 2 NA NA NA TRUE POINT (0 1), POINT (3 5) #> time 1 5 2022-05-02 1 days Date NA NULL"},{"path":"/reference/merge.html","id":null,"dir":"Reference","previous_headings":"","what":"merge or split stars object — merge","title":"merge or split stars object — merge","text":"merge attributes dimension, split dimension attributes","code":""},{"path":"/reference/merge.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"merge or split stars object — merge","text":"","code":"# S3 method for class 'stars' split(x, f = length(dim(x)), drop = TRUE, ...) # S3 method for class 'stars' merge(x, y, ..., name = \"attributes\")"},{"path":"/reference/merge.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"merge or split stars object — merge","text":"x object class stars f name index dimension split; default last dimension drop ignored ... defined, first unnamed argument used dimension values, defined, attribute names used dimension values y needs missing name name new dimension","code":""},{"path":"/reference/merge.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"merge or split stars object — merge","text":"merge merges attributes stars object new dimension; split splits dimension attributes","code":""},{"path":"/reference/merge.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"merge or split stars object — merge","text":"split.stars works first attribute, give error one attribute present","code":""},{"path":"/reference/ops_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 Ops Group Generic Functions for stars objects — ops_stars","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"Ops functions stars objects, including comparison, product divide, add, subtract","code":""},{"path":"/reference/ops_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"","code":"# S3 method for class 'stars' Ops(e1, e2) # S3 method for class 'stars' Math(x, ...) # S3 method for class 'stars_proxy' Ops(e1, e2) # S3 method for class 'stars_proxy' Math(x, ...)"},{"path":"/reference/ops_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"e1 object class stars e2 object class stars x object class stars ... parameters passed Math functions","code":""},{"path":"/reference/ops_stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"object class stars","code":""},{"path":"/reference/ops_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"e1 e2 numeric vector, e2 less smaller dimensions e1, e2 recycled fits e1, using usual R array recycling rules. user needs make sure sensible; may needed use aperm permutate dimensions first.","code":""},{"path":"/reference/ops_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) x * x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 2916 4761 5512.41 7396 65025 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x / x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 1 1 1 1 1 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x + x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 2 108 138 137.8248 172 510 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x + 10 #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 11 64 79 78.91242 96 265 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA all.equal(x * 10, 10 * x) #> [1] TRUE tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) a = sqrt(x) b = log(x, base = 10)"},{"path":"/reference/plot.html","id":null,"dir":"Reference","previous_headings":"","what":"plot stars object, with subplots for each level of first non-spatial dimension — plot","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"plot stars object, subplots level first non-spatial dimension, customization legend key","code":""},{"path":"/reference/plot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"","code":"# S3 method for class 'nc_proxy' plot(x, y, ..., downsample = get_downsample(dim(x)), max_times = 16) # S3 method for class 'stars' plot( x, y, ..., join_zlim = TRUE, main = make_label(x, 1), axes = FALSE, downsample = TRUE, nbreaks = 11, breaks = \"quantile\", col = grey(1:(nbreaks - 1)/nbreaks), key.pos = get_key_pos(x, ...), key.width = kw_dflt(x, key.pos), key.length = 0.618, key.lab = main, reset = TRUE, box_col = NA, center_time = FALSE, hook = NULL, mfrow = NULL, compact = TRUE ) # S3 method for class 'stars' image( x, ..., band = 1, attr = 1, asp = NULL, rgb = NULL, maxColorValue = ifelse(inherits(rgb, \"data.frame\"), 255, max(x[[attr]], na.rm = TRUE)), xlab = if (!axes) \"\" else names(d)[1], ylab = if (!axes) \"\" else names(d)[2], xlim = st_bbox(extent)$xlim, ylim = st_bbox(extent)$ylim, text_values = FALSE, text_color = \"black\", axes = FALSE, interpolate = FALSE, as_points = FALSE, key.pos = NULL, logz = FALSE, key.width = kw_dflt(x, key.pos), key.length = 0.618, add.geom = NULL, border = NA, useRaster = isTRUE(dev.capabilities()$rasterImage == \"yes\"), extent = x ) # S3 method for class 'stars_proxy' plot(x, y, ..., downsample = get_downsample(dim(x)))"},{"path":"/reference/plot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"x object class stars y ignored ... arguments: plot, passed image.stars; image, passed image.default rasterImage. downsample logical numeric; TRUE try plot many pixels actually visible, FALSE, downsampling takes place, numeric, number pixels/lines/bands etc skipped; see Details. max_times integer; maximum number time steps attempt plot. join_zlim logical; TRUE, compute single, joint zlim (color scale) subplots x main character; subplot title prefix; use \"\" get time, use NULL suppress subplot titles axes logical; axes box added plot? nbreaks number color breaks; one number colors. missing col specified, derived . breaks numeric vector actual color breaks, style name used classIntervals. col colors use grid cells, color palette function key.pos numeric; side plot color key: 1 bottom, 2 left, 3 top, 4 right; set NULL omit key. Ignored multiple columns plotted single function call. Default depends plot size, map aspect, , set, parameter asp. length 2, second value, ranging 0 1, determines key placed available space (default: 0.5, center). key.width amount space reserved width key (labels); relative absolute (using lcm) key.length amount space reserved length key (labels); relative absolute (using lcm) key.lab character; label color key case multiple subplots, use \"\" suppress reset logical; FALSE, keep plot mode allows adding map elements; TRUE restore original mode plotting box_col color box around sub-plots; use NA suppress plotting boxes around sub-plots. center_time logical; TRUE, sub-plot titles show center time intervals, otherwise start hook NULL function; hook function called every sub-plot; see examples. mfrow length-2 integer vector nrows, ncolumns composite plot, override default layout compact logical; place facets compactly (TRUE), spread plotting device area? band integer; band (dimension) plot attr integer; attribute plot asp numeric; aspect ratio image rgb integer; specify three bands form rgb composite. Experimental: rgb color table; see Details. maxColorValue numeric; passed rgb xlab character; x axis label ylab character; y axis label xlim x axis limits ylim y axis limits text_values logical; print values text image? text_color character; color printed text values interpolate logical; using rasterImage (rgb), pixels interpolated? as_points logical; curvilinear sheared grids: parameter passed st_as_sf, determining whether raster cells plotted symbols (fast, approximate) small polygons (slow, exact) logz logical; TRUE, use log10-scale attribute variable. case, breaks need given log10-values; see examples. add.geom object class sfc, list arguments plot, added image sub-image border color used cell borders (case x curvilinear rotated/sheared grid) useRaster logical; use rasterImage capabilities graphics device? extent object st_bbox method; sets plotting extent","code":""},{"path":"/reference/plot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"plotting subsetted stars_proxy object, default value argument downsample computed correctly, set manually. Downsampling: value downsample 0: downsampling, 1: every dimension value (pixel/line/band), one value skipped (half original resolution), 2: every dimension value, 2 values skipped (one third original resolution), etc. downsample TRUE length 1 numeric vector, downsampling applied raster [x] [y] dimensions. remove unused classes categorical raster, use droplevels function. bitmaps show visual artefacts (Moiré effects), make sure device png used rather ragg::agg_png latter uses antialiasing filled polygons causes ; see also https://github.com/r-spatial/stars/issues/573 . use rgb color table experimental; see https://github.com/r-spatial/mapview/issues/208 plotting subsetted stars_proxy object, default value argument downsample computed correctly, set manually.","code":""},{"path":"/reference/plot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"","code":"st_bbox(L7_ETMs) |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt hook1 = function() { text(pt[,\"X\"], pt[,\"Y\"], \"foo\", col = 'orange', cex = 2) } plot(L7_ETMs, hook = hook1) x = st_set_dimensions(L7_ETMs, 3, paste0(\"B_\", 1:6)) hook2 = function(..., row, col, nr, nrow, ncol, value, bbox) { str = paste0(\"row \", row, \"/\", nrow, \", col \", col, \"/\", ncol, \"\\nnr: \", nr, \" value: \", value) bbox |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt text(pt[,\"X\"], pt[,\"Y\"], str, col = 'red', cex = 2) } plot(x, hook = hook2, col = grey(c(.2,.25,.3,.35))) if (isTRUE(dev.capabilities()$rasterImage == \"yes\")) { lc = read_stars(system.file(\"tif/lc.tif\", package = \"stars\")) levels(lc[[1]]) = abbreviate(levels(lc[[1]]), 6) # so it's not only legend plot(lc, key.pos=4) } tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) image(x, col = grey((3:9)/10)) if (isTRUE(dev.capabilities()$rasterImage == \"yes\")) { image(x, rgb = c(1,3,5)) # false color composite }"},{"path":"/reference/prcomp.html","id":null,"dir":"Reference","previous_headings":"","what":"Principle components of stars object — prcomp","title":"Principle components of stars object — prcomp","text":"Compute principle components stars object","code":""},{"path":"/reference/prcomp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Principle components of stars object — prcomp","text":"","code":"# S3 method for class 'stars_proxy' prcomp(x, ..., downsample = 0) # S3 method for class 'stars' prcomp(x, ..., quiet = FALSE)"},{"path":"/reference/prcomp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Principle components of stars object — prcomp","text":"x object class `stars` `stars_proxy` ... see prcomp downsample see st_as_stars quiet logical; `TRUE`, suppress message PCs computed last dimension; see details","code":""},{"path":"/reference/prcomp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Principle components of stars object — prcomp","text":"object class `prcomp`, see prcomp","code":""},{"path":"/reference/prcomp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Principle components of stars object — prcomp","text":"`x` one attribute, principle components computed space last dimension `x` predict PC scores `stars` object, use predict.stars; see example ","code":""},{"path":"/reference/prcomp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Principle components of stars object — prcomp","text":"","code":"l7 = split(st_as_stars(L7_ETMs), 3) # use bands as features l7 |> prcomp() |> plot() l7 |> prcomp() |> predict(l7, model = _) |> merge() |> plot() #> downsample set to 1"},{"path":"/reference/predict.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"Predict values, given model object, stars stars_proxy object","code":""},{"path":"/reference/predict.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"","code":"# S3 method for class 'stars_proxy' predict(object, model, ...) # S3 method for class 'stars' predict(object, model, ..., drop_dimensions = FALSE)"},{"path":"/reference/predict.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"object object class `stars` model model object class predict method; check `methods(class = class(object))` ... arguments passed predict method drop_dimensions logical; `TRUE`, remove dimensions (coordinates etc) `data.frame` predictors","code":""},{"path":"/reference/predict.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"separate predictors object need separate attributes object; case e.g. band dimension, use `split(object)`","code":""},{"path":"/reference/print_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"print stars or dimensions object — print_stars","title":"print stars or dimensions object — print_stars","text":"print stars dimensions object","code":""},{"path":"/reference/print_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"print stars or dimensions object — print_stars","text":"","code":"# S3 method for class 'dimensions' as.data.frame( x, ..., digits = max(3, getOption(\"digits\") - 3), usetz = TRUE, stars_crs = getOption(\"stars.crs\") %||% 28, all = FALSE ) # S3 method for class 'dimensions' print(x, ...) # S3 method for class 'stars' print(x, ..., n = 1e+05, abbrev = 30)"},{"path":"/reference/print_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"print stars or dimensions object — print_stars","text":"x object class stars class dimensions ... passed .data.frame.dimensions digits number digits print numbers usetz logical; used format PCICt POSIXct values stars_crs maximum width string CRS objects logical; TRUE print also fields entirely filled NA NULL n prod(dim(x)) > 10 * n, first n cells used attribute summary statistics abbrev number characters abbreviate attribute names ","code":""},{"path":"/reference/read_ncdf.html","id":null,"dir":"Reference","previous_headings":"","what":"Read NetCDF into stars object — read_ncdf","title":"Read NetCDF into stars object — read_ncdf","text":"Read data file (source) using NetCDF library directly.","code":""},{"path":"/reference/read_ncdf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read NetCDF into stars object — read_ncdf","text":"","code":"read_ncdf( .x, ..., var = NULL, ncsub = NULL, curvilinear = character(0), eps = sqrt(.Machine$double.eps), ignore_bounds = FALSE, make_time = TRUE, make_units = TRUE, proxy = NULL, downsample = 0 )"},{"path":"/reference/read_ncdf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read NetCDF into stars object — read_ncdf","text":".x NetCDF file source character vector nc_proxy object. ... ignored var variable name names (must matching grids) ncsub matrix start, count columns (see Details) curvilinear length two character named vector names variables holding longitude latitude values raster cells. `stars` attempts figure appropriate curvilinear coordinates supplied. eps numeric; dimension value increases considered identical differ less eps ignore_bounds logical; bounds values dimensions, present, ignored? make_time TRUE (default), attempt made provide date-time class \"time\" variable make_units TRUE (default), attempt made set units property variable proxy logical; TRUE, object class stars_proxy read contains array metadata ; FALSE full array data read memory. set, defaults TRUE number cells read larger options(stars.n_proxy), 1e8 option set. downsample integer; number cells omit samples along dimension. e.g. c(1,1,2) return every cell x y every third cell third dimension (z t). 0, downsampling applied. Note transformation applied NetCDF data read using st_downsample. , proxy=TRUE, option ignored.","code":""},{"path":"/reference/read_ncdf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Read NetCDF into stars object — read_ncdf","text":"following logic applied coordinates. coordinate axes regularly spaced coordinate variables reduced offset/delta form 'affine = c(0, 0)', otherwise values coordinates stored used define rectilinear grid. data two dimensions first two regular nominated 'raster' plotting. curvilinear argument used specifies 2D arrays containing coordinate values first two dimensions data read. currently assumed coordinates 2D relate first two dimensions order. var set first set variables shared grid used. start count columns ncsub must correspond variable dimension (nrows) valid index using var.get.nc convention (start 1-based). count value NA steps included. Axis order must match variable/s read.","code":""},{"path":"/reference/read_ncdf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read NetCDF into stars object — read_ncdf","text":"","code":"f <- system.file(\"nc/reduced.nc\", package = \"stars\") if (require(ncmeta, quietly = TRUE)) { read_ncdf(f) read_ncdf(f, var = c(\"anom\")) read_ncdf(f, ncsub = cbind(start = c(1, 1, 1, 1), count = c(10, 12, 1, 1))) } #> no 'var' specified, using sst, anom, err, ice #> other available variables: #> lon, lat, zlev, time #> 0-360 longitude crossing the international date line encountered. #> Longitude coordinates will be 0-360 in output. #> Will return stars object with 16200 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. #> 0-360 longitude crossing the international date line encountered. #> Longitude coordinates will be 0-360 in output. #> Will return stars object with 16200 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. #> no 'var' specified, using sst, anom, err, ice #> other available variables: #> lon, lat, zlev, time #> Will return stars object with 120 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. #> stars object with 4 dimensions and 4 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> sst [°C] -1.39 -0.7200 -0.515 -0.53399999 -0.275 0.03 90 #> anom [°C] -1.07 -0.3625 0.195 0.05866667 0.555 0.92 90 #> err [°C] 0.30 0.3000 0.300 0.30299999 0.300 0.32 90 #> ice [percent] 0.01 0.1100 0.170 0.20937500 0.255 0.52 104 #> dimension(s): #> from to offset delta refsys values x/y #> lon 1 10 -1 2 WGS 84 NULL [x] #> lat 1 12 -90 2 WGS 84 NULL [y] #> zlev 1 1 NA NA NA 0 #> time 1 1 NA NA POSIXct 1981-12-31 UTC if (require(ncmeta, quietly = TRUE)) { #' precipitation data in a curvilinear NetCDF prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\"), ignore_bounds = TRUE) } #> no 'var' specified, using Total_precipitation_surface_1_Hour_Accumulation #> other available variables: #> lat, lon, time #> Will return stars object with 236118 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } if (require(dplyr, quietly = TRUE)) { prec_slice = slice(prec, index = 17, along = \"time\") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA) }"},{"path":"/reference/read_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"read raster/array dataset from file or connection — read_stars","title":"read raster/array dataset from file or connection — read_stars","text":"read raster/array dataset file connection","code":""},{"path":"/reference/read_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"read raster/array dataset from file or connection — read_stars","text":"","code":"read_stars( .x, sub = TRUE, ..., options = character(0), driver = character(0), quiet = FALSE, NA_value = NA_real_, along = NA_integer_, RasterIO = list(), proxy = getOption(\"stars.n_proxy\") %||% 1e+08, curvilinear = character(0), normalize_path = TRUE, RAT = character(0), tolerance = 1e-10, exclude = \"\", shorten = TRUE )"},{"path":"/reference/read_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"read raster/array dataset from file or connection — read_stars","text":".x character vector name(s) file(s) data source(s) read, function returns vector sub character, integer logical; name, index indicator sub-dataset(s) read ... passed st_as_stars curvilinear set options character; opening options driver character; driver use opening file. override fixing subdatasets autodetect well, use NULL. quiet logical; print progress output? NA_value numeric value used conversion NA values; default read input file along length-one character integer, list; determines several arrays combined, see Details. RasterIO list named parameters GDAL's RasterIO, control extent, resolution bands read data source; see details. proxy logical; TRUE, object class stars_proxy read contains array metadata ; FALSE full array data read memory. Always FALSE curvilinear girds. set number, defaults TRUE number cells read larger number. curvilinear length two character vector names subdatasets holding longitude latitude values raster cells, named length 2 list holding longitude latitude matrices; names list correspond raster dimensions referred normalize_path logical; FALSE, suppress call normalizePath .x RAT character; raster attribute table column name use factor levels tolerance numeric; passed .equal comparing dimension parameters. exclude character; vector category value(s) exclude shorten logical character; TRUE length(.x) > 1, remove common start end parts array names; character new prefix","code":""},{"path":"/reference/read_stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"read raster/array dataset from file or connection — read_stars","text":"object class stars","code":""},{"path":"/reference/read_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"read raster/array dataset from file or connection — read_stars","text":"case .x contains multiple files, read combined c.stars. Along dimension, objects merged? along set NA merge arrays new attributes objects identical dimensions, else try merge along time dimension called time indicates different time stamps. single name (positive value) along merge along dimension, create new one already exist. arrays arranged along one dimensions values (e.g. time stamps), named list can passed along specify ; see example. RasterIO list zero following named arguments: nXOff, nYOff (1-based: first row/col offset value 1), nXSize, nYSize, nBufXSize, nBufYSize, bands, resample. See https://gdal.org/doxygen/classGDALDataset.html meaning; bands integer vector containing band numbers read (1-based: first band 1). Note nBufXSize nBufYSize specified downsampling image, resulting adjusted geotransform. resample reflects resampling method one : \"nearest_neighbour\" (default), \"bilinear\", \"cubic\", \"cubic_spline\", \"lanczos\", \"average\", \"mode\", \"Gauss\". Data read memory (proxy=FALSE) read numeric (double) array, except categorical variables read numeric (integer) array class factor.","code":""},{"path":"/reference/read_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"read raster/array dataset from file or connection — read_stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") (x1 = read_stars(tif)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA (x2 = read_stars(c(tif, tif))) #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> L7_ETMs.tif.1 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA (x3 = read_stars(c(tif, tif), along = \"band\")) #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 12 NA NA NA NA (x4 = read_stars(c(tif, tif), along = \"new_dimensions\")) # create 4-dimensional array #> stars object with 4 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA #> new_dimensions 1 2 NA NA NA NA x1o = read_stars(tif, options = \"OVERVIEW_LEVEL=1\") t1 = as.Date(\"2018-07-31\") # along is a named list indicating two dimensions: read_stars(c(tif, tif, tif, tif), along = list(foo = c(\"bar1\", \"bar2\"), time = c(t1, t1+2))) #> stars object with 5 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point values x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] #> band 1 6 NA NA NA NA NULL #> foo 1 2 NA NA NA NA bar1, bar2 #> time 1 2 2018-07-31 2 days Date NA NULL m = matrix(1:120, nrow = 12, ncol = 10) dim(m) = c(x = 10, y = 12) # named dim st = st_as_stars(m) attr(st, \"dimensions\")$y$delta = -1 attr(st, \"dimensions\")$y$offset = 12 st #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 30.75 60.5 60.5 90.25 120 #> dimension(s): #> from to offset delta point x/y #> x 1 10 0 1 FALSE [x] #> y 1 12 12 -1 FALSE [y] tmp = tempfile(fileext = \".tif\") write_stars(st, tmp) (red <- read_stars(tmp)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> file2294b73d7d8.tif 1 30.75 60.5 60.5 90.25 120 #> dimension(s): #> from to offset delta x/y #> x 1 10 0 1 [x] #> y 1 12 12 -1 [y] read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, nBufXSize = 2, nBufYSize = 2))[[1]] #> [,1] [,2] #> [1,] 33 93 #> [2,] 38 98 (red <- read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, nBufXSize = 2, nBufYSize = 2))) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> file2294b73d7d8.tif 33 36.75 65.5 65.5 94.25 98 #> dimension(s): #> from to offset delta x/y #> x 1 2 0 5 [x] #> y 1 2 12 -6 [y] red[[1]] # cell values of subsample grid: #> [,1] [,2] #> [1,] 33 93 #> [2,] 38 98 if (FALSE) { # \\dontrun{ plot(st, reset = FALSE, axes = TRUE, ylim = c(-.1,12.1), xlim = c(-.1,10.1), main = \"nBufXSize & nBufYSize demo\", text_values = TRUE) plot(st_as_sfc(red, as_points = TRUE), add = TRUE, col = 'red', pch = 16) plot(st_as_sfc(st_as_stars(st), as_points = FALSE), add = TRUE, border = 'grey') plot(st_as_sfc(red, as_points = FALSE), add = TRUE, border = 'green', lwd = 2) } # } file.remove(tmp) #> [1] TRUE"},{"path":"/reference/redimension.html","id":null,"dir":"Reference","previous_headings":"","what":"redimension array, or collapse attributes into a new dimension — redimension","title":"redimension array, or collapse attributes into a new dimension — redimension","text":"redimension array, collapse attributes new dimension","code":""},{"path":"/reference/redimension.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"redimension array, or collapse attributes into a new dimension — redimension","text":"","code":"# S3 method for class 'stars_proxy' st_redimension( x, new_dims = st_dimensions(x), along = list(new_dim = names(x)), ... ) st_redimension(x, new_dims, along, ...) # S3 method for class 'stars' st_redimension( x, new_dims = st_dimensions(x), along = setNames(list(names(x)), name), ..., name = \"new_dim\" )"},{"path":"/reference/redimension.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"redimension array, or collapse attributes into a new dimension — redimension","text":"x object class stars new_dims target dimensions: either `dimensions` object integer vector dimensions' sizes along named list new dimension name values ... ignored name character name new dimension","code":""},{"path":"/reference/st_apply.html","id":null,"dir":"Reference","previous_headings":"","what":"st_apply apply a function to one or more array dimensions — st_apply","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"st_apply apply function array dimensions: aggregate space, time, something else","code":""},{"path":"/reference/st_apply.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"","code":"# S3 method for class 'stars' st_apply( X, MARGIN, FUN, ..., CLUSTER = NULL, PROGRESS = FALSE, FUTURE = FALSE, rename = TRUE, .fname, single_arg = has_single_arg(FUN, list(...)) || can_single_arg(FUN), keep = FALSE )"},{"path":"/reference/st_apply.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"X object class stars MARGIN see apply; index number(s) name(s) dimensions FUN applied FUN see apply see Details. ... arguments passed FUN CLUSTER cluster use parallel apply; see makeCluster PROGRESS logical; TRUE, use pbapply::pbapply show progress bar FUTURE logical;TRUE, use future.apply::future_apply rename logical; TRUE X one attribute FUN simple function name, rename attribute returned object function name .fname function name new attribute name (one dimensions reduced) new dimension (new dimension created); missing, name FUN used single_arg logical; TRUE, FUN takes single argument (like fn_ndvi1 ), FALSE FUN takes multiple arguments (like fn_ndvi2 ). keep logical; TRUE, preserve dimension metadata (e.g. time stamps)","code":""},{"path":"/reference/st_apply.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"object class stars accordingly reduced number dimensions; case FUN returns one value, new dimension created carrying name function used; see examples. Following logic apply, new dimension put dimensions; use aperm rearrange , see last example.","code":""},{"path":"/reference/st_apply.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"FUN function either operates single object, data iteration step dimensions MARGIN, function many arguments elements object. See NDVI examples . second form can much faster e.g. trivial function called every pixel, (example). heuristics default single_arg work often, always; try setting right value st_apply gives error.","code":""},{"path":"/reference/st_apply.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) st_apply(x, 1:2, mean) # mean band value for each pixel #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> mean 25.5 53.33333 68.33333 68.91242 82 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] st_apply(x, c(\"x\", \"y\"), mean) # equivalent to the above #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> mean 25.5 53.33333 68.33333 68.91242 82 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] st_apply(x, 3, mean) # mean of all pixels for each band #> stars object with 1 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> mean 59.23541 61.07112 65.96675 68.91242 76.25445 83.18266 #> dimension(s): #> from to #> band 1 6 if (FALSE) { # \\dontrun{ st_apply(x, \"band\", mean) # equivalent to the above st_apply(x, 1:2, range) # min and max band value for each pixel fn_ndvi1 = function(x) (x[4]-x[3])/(x[4]+x[3]) # ONE argument: will be called for each pixel fn_ndvi2 = function(red,nir) (nir-red)/(nir+red) # n arguments: will be called only once ndvi1 = st_apply(x, 1:2, fn_ndvi1) # note that we can select bands 3 and 4 in the first argument: ndvi2 = st_apply(x[,,,3:4], 1:2, fn_ndvi2) all.equal(ndvi1, ndvi2) # compute the (spatial) variance of each band; https://github.com/r-spatial/stars/issues/430 st_apply(x, 3, function(x) var(as.vector(x))) # as.vector is required! # to get a progress bar also in non-interactive mode, specify: if (require(pbapply)) { # install it, if FALSE pboptions(type = \"timer\") } st_apply(x, 1:2, range) # dimension \"range\" is first; rearrange by: st_apply(x, 1:2, range) %>% aperm(c(2,3,1)) } # }"},{"path":"/reference/st_as_sf.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert stars object into an sf object — st_as_sf","title":"Convert stars object into an sf object — st_as_sf","text":"Convert stars object sf object","code":""},{"path":"/reference/st_as_sf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert stars object into an sf object — st_as_sf","text":"","code":"# S3 method for class 'stars' st_as_sfc(x, ..., as_points, which = seq_len(prod(dim(x)[1:2]))) # S3 method for class 'stars' st_as_sf( x, ..., as_points = FALSE, merge = FALSE, na.rm = TRUE, use_integer = is.logical(x[[1]]) || is.integer(x[[1]]), long = FALSE, connect8 = FALSE ) # S3 method for class 'stars_proxy' st_as_sf(x, ..., downsample = 0)"},{"path":"/reference/st_as_sf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert stars object into an sf object — st_as_sf","text":"x object class stars ... ignored as_points logical; cells converted points polygons? See details. linear index cells keep (argument recommended used) merge logical; TRUE, cells identical values merged (using GDAL_Polygonize GDAL_FPolygonize); FALSE, polygon raster cell returned; see details na.rm logical; missing valued cells removed, also converted features? use_integer (relevant merge TRUE): TRUE, polygonizing values rounded 32-bits signed integer values (GDALPolygonize), otherwise converted 32-bit floating point values (GDALFPolygonize). long logical; TRUE, return long table form sf, geometries dimensions recycled connect8 logical; TRUE, use 8 connectedness. Otherwise 4 connectedness algorithm applied. downsample see st_as_stars","code":""},{"path":"/reference/st_as_sf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Convert stars object into an sf object — st_as_sf","text":"merge TRUE, first attribute converted sf object. na.rm FALSE, areas NA values also written polygons. Note resulting polygons typically invalid, use st_make_valid create valid polygons .","code":""},{"path":"/reference/st_as_sf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert stars object into an sf object — st_as_sf","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) x = x[,1:100,1:100,6] # subset of a band with lower values in it x[[1]][x[[1]] < 30] = NA # set lower values to NA x[[1]] = x[[1]] < 100 # make the rest binary x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> Mode :logical #> FALSE:525 #> TRUE :7665 #> NA's :1810 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 100 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 100 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 6 6 NA NA NA NA (p = st_as_sf(x)) # removes NA areas #> Simple feature collection with 8190 features and 1 field #> Geometry type: POLYGON #> Dimension: XY #> Bounding box: xmin: 288776.3 ymin: 9117911 xmax: 291626.3 ymax: 9120761 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> First 10 features: #> V1 geometry #> 1 TRUE POLYGON ((288776.3 9120761,... #> 2 TRUE POLYGON ((288804.8 9120761,... #> 3 TRUE POLYGON ((288833.3 9120761,... #> 4 TRUE POLYGON ((288861.8 9120761,... #> 5 TRUE POLYGON ((288890.3 9120761,... #> 6 TRUE POLYGON ((288918.8 9120761,... #> 7 TRUE POLYGON ((288947.3 9120761,... #> 8 TRUE POLYGON ((288975.8 9120761,... #> 9 TRUE POLYGON ((289004.3 9120761,... #> 10 TRUE POLYGON ((289032.8 9120761,... (p = st_as_sf(x[,,,1], merge = TRUE)) # glues polygons together #> Simple feature collection with 155 features and 1 field #> Geometry type: POLYGON #> Dimension: XY #> Bounding box: xmin: 288776.3 ymin: 9117911 xmax: 291626.3 ymax: 9120761 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> First 10 features: #> L7_ETMs.tif geometry #> 1 0 POLYGON ((289517.3 9120761,... #> 2 0 POLYGON ((290144.3 9120761,... #> 3 0 POLYGON ((290315.3 9120761,... #> 4 0 POLYGON ((291113.3 9120761,... #> 5 0 POLYGON ((291341.3 9120761,... #> 6 1 POLYGON ((291455.3 9120761,... #> 7 1 POLYGON ((291569.3 9120761,... #> 8 0 POLYGON ((290372.3 9120732,... #> 9 1 POLYGON ((290628.8 9120732,... #> 10 1 POLYGON ((290771.3 9120732,... all(st_is_valid(p)) # not all valid, see details #> [1] TRUE plot(p, axes = TRUE) (p = st_as_sf(x, na.rm = FALSE, merge = TRUE)) # includes polygons with NA values #> Simple feature collection with 380 features and 1 field #> Geometry type: POLYGON #> Dimension: XY #> Bounding box: xmin: 288776.3 ymin: 9117911 xmax: 291626.3 ymax: 9120761 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> First 10 features: #> L7_ETMs.tif geometry #> 1 0 POLYGON ((289517.3 9120761,... #> 2 0 POLYGON ((290144.3 9120761,... #> 3 0 POLYGON ((290315.3 9120761,... #> 4 0 POLYGON ((291113.3 9120761,... #> 5 0 POLYGON ((291341.3 9120761,... #> 6 1 POLYGON ((291455.3 9120761,... #> 7 1 POLYGON ((291569.3 9120761,... #> 8 NA POLYGON ((289745.3 9120732,... #> 9 NA POLYGON ((289830.8 9120732,... #> 10 0 POLYGON ((290372.3 9120732,... plot(p, axes = TRUE)"},{"path":"/reference/st_as_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"convert objects into a stars object — st_as_stars","title":"convert objects into a stars object — st_as_stars","text":"convert objects stars object","code":""},{"path":"/reference/st_as_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"convert objects into a stars object — st_as_stars","text":"","code":"# S3 method for class 'cubble_df' st_as_stars(.x, ..., check_times = FALSE) # S3 method for class 'ncdfgeom' st_as_stars(.x, ..., sf_geometry = NA) # S3 method for class 'OpenStreetMap' st_as_stars(.x, ..., as_col = FALSE) # S3 method for class 'stars_proxy' st_as_stars( .x, ..., downsample = 0, url = attr(.x, \"url\"), envir = parent.frame() ) # S3 method for class 'data.frame' st_as_stars(.x, ..., dims = coords, xy, y_decreasing = TRUE, coords = 1:2) # S3 method for class 'Raster' st_as_stars(.x, ..., att = 1, ignore_file = FALSE) # S3 method for class 'SpatRaster' st_as_stars( .x, ..., ignore_file = FALSE, as_attributes = all(terra::is.factor(.x)) ) # S3 method for class 'sf' st_as_stars(.x, ..., dims = attr(.x, \"sf_column\")) st_as_stars(.x, ...) # S3 method for class 'list' st_as_stars(.x, ..., dimensions = NULL) # Default S3 method st_as_stars(.x = NULL, ..., raster = NULL) # S3 method for class 'stars' st_as_stars(.x, ..., curvilinear = NULL, crs = st_crs(\"OGC:CRS84\")) # S3 method for class 'bbox' st_as_stars( .x, ..., nx, ny, dx = dy, dy = dx, xlim = .x[c(\"xmin\", \"xmax\")], ylim = .x[c(\"ymin\", \"ymax\")], values = 0, n = 64800, pretty = FALSE, inside = FALSE, nz, proxy = FALSE ) # S3 method for class 'xts' st_as_stars(.x, ..., dimensions, name = \"attr\")"},{"path":"/reference/st_as_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"convert objects into a stars object — st_as_stars","text":".x object convert ... case .x class bbox, arguments passed pretty. case .x class nc_proxy, arguments passed read_ncdf. check_times logical; check time stamps time series identical? sf_geometry sf data.frame geometry attributes added stars object. Must number rows timeseries instances. as_col logical; return rgb numbers (FALSE) (character) color values (TRUE)? downsample integer: larger 0, downsample rate (number pixels skip every row/column); length 2, specifies downsampling rate x y. url character; URL stars endpoint data reside envir environment resolve objects dims column names indices form cube dimensions xy x y raster dimension names indices; takes effect dims specified, see details y_decreasing logical; TRUE, (numeric) y values get negative delta (decrease increasing index) coords dims, symmetry st_as_sf att see factorValues; column RasterLayer's attribute table ignore_file logical; TRUE, ignore SpatRaster object file name as_attributes logical; TRUE .x one layer, load separate attributes rather band time dimension (implemented case ignore_file TRUE) dimensions object class dimensions raster character; names dimensions denote raster dimensions curvilinear creating curvilinear grids: named length 2 list holding longitude latitude matrices stars arrays, names corresponding attributes .x; names vector correspond raster dimensions matrices associated ; see Details. crs object class crs coordinate reference system values curvilinear; see details nx integer; number cells x direction; see details ny integer; number cells y direction; see details dx numeric object class units; cell size x direction; see details dy numeric object class units; cell size y direction; see details xlim length 2 numeric vector extent (min, max) x direction ylim length 2 numeric vector extent (min, max) y direction values value(s) populate raster values n (approximate) target number grid cells pretty logical; cell coordinates pretty values? inside logical; cells entirely fall inside bbox, potentially covering completely (TRUE), always cover bbox (FALSE), find good approximation (NA, default)? nz integer; number cells z direction; missing z-dimension created. proxy logical; stars_proxy object created? (requires gdal_create binary sf < 1.0-6) name character; attribute name array xts object","code":""},{"path":"/reference/st_as_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"convert objects into a stars object — st_as_stars","text":"ncdfgeom method: objects point-timeseries optional line polygon geometry timeseries specified sf_geometry parameter. See ncdfgeom NetCDF-based format geometry timeseries. xy specified first two dimensions dims numeric, set two dimensions. st_as_stars method sf objects without additional arguments returns one-dimensional data cube dimension simple features geometries, remaining attributes data cube attributes. used arguments, method data.frames called. curvilinear list stars objects longitude latitude values, coordinate reference system typically latitude longitude values. curvilinear contains names two arrays .x, removed returned object. bbox method: pretty TRUE, raster cells may extend coordinate range .x sides. addition nx ny, dx dy also missing, set single value computed sqrt(diff(xlim)*diff(ylim)/n). nx ny missing values matrix, number columns rows matrix taken. Otherwise, nx ny missing, computed (ceiling, floor, rounded integer value) ratio (x y) range divided (dx dy), depending value inside. Positive dy made negative. named arguments (...) passed pretty. dx dy units objects, value converted units st_crs(.x) (sf >= 1.0-7). xts methods, dimensions provided, time first dimension.","code":""},{"path":"/reference/st_as_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"convert objects into a stars object — st_as_stars","text":"","code":"if (require(plm, quietly = TRUE)) { data(Produc, package = \"plm\") st_as_stars(Produc) } #> #> Attaching package: ‘plm’ #> The following objects are masked from ‘package:dplyr’: #> #> between, lag, lead #> stars object with 2 dimensions and 9 attributes #> attribute(s): #> region pcap hwy water #> 5 :136 Min. : 2627 Min. : 1827 Min. : 228.5 #> 8 :136 1st Qu.: 7097 1st Qu.: 3858 1st Qu.: 764.5 #> 4 :119 Median : 17572 Median : 7556 Median : 2266.5 #> 1 :102 Mean : 25037 Mean :10218 Mean : 3618.8 #> 3 : 85 3rd Qu.: 27692 3rd Qu.:11267 3rd Qu.: 4318.7 #> 6 : 68 Max. :140217 Max. :47699 Max. :24592.3 #> (Other):170 #> util pc gsp emp #> Min. : 538.5 Min. : 4053 Min. : 4354 Min. : 108.3 #> 1st Qu.: 2488.3 1st Qu.: 21651 1st Qu.: 16502 1st Qu.: 475.0 #> Median : 7008.8 Median : 40671 Median : 39987 Median : 1164.8 #> Mean :11199.5 Mean : 58188 Mean : 61014 Mean : 1747.1 #> 3rd Qu.:11598.5 3rd Qu.: 64796 3rd Qu.: 68126 3rd Qu.: 2114.1 #> Max. :80728.1 Max. :375342 Max. :464550 Max. :11258.0 #> #> unemp #> Min. : 2.800 #> 1st Qu.: 5.000 #> Median : 6.200 #> Mean : 6.602 #> 3rd Qu.: 7.900 #> Max. :18.000 #> #> dimension(s): #> from to offset delta values #> state 1 48 NA NA ALABAMA,...,WYOMING #> year 1 17 1970 1 NULL if (require(dplyr, quietly = TRUE)) { # https://stackoverflow.com/questions/77368957/ spatial_dim <- st_sf( ID = 1:3, geometry = list( st_polygon(list( cbind(c(0, 1, 1, 0, 0), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(1, 2, 2, 1, 1), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(2, 3, 3, 2, 2), c(0, 0, 1, 1, 0)) )) ) ) weekdays_dim <- data.frame(weekdays = c(\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\")) hours_dim <- data.frame(hours = c(\"8am\", \"11am\", \"4pm\", \"11pm\")) sf_dta <- spatial_dim |> cross_join(weekdays_dim)|> cross_join(hours_dim) |> mutate(population = rnorm(n(), mean = 1000, sd = 200)) |> select(everything(), geometry) st_as_stars(sf_dta, dims = c(\"weekdays\", \"hours\", \"geometry\")) } #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> ID 1.0000 1.0000 2.000 2.000 3.000 3.000 #> population 594.2642 909.3489 1016.819 1010.279 1112.744 1324.842 #> dimension(s): #> from to point #> weekdays 1 7 NA #> hours 1 4 NA #> geometry 1 3 FALSE #> values #> weekdays Monday,...,Sunday #> hours 8am,...,11pm #> geometry POLYGON ((0 0, 1 0, 1 1, ...,...,POLYGON ((2 0, 3 0, 3 1, ... demo(nc, echo=FALSE,ask=FALSE) st_as_stars(nc) #> stars object with 1 dimensions and 14 attributes #> attribute(s): #> AREA PERIMETER CNTY_ CNTY_ID #> Min. :0.0420 Min. :0.999 Min. :1825 Min. :1825 #> 1st Qu.:0.0910 1st Qu.:1.324 1st Qu.:1902 1st Qu.:1902 #> Median :0.1205 Median :1.609 Median :1982 Median :1982 #> Mean :0.1263 Mean :1.673 Mean :1986 Mean :1986 #> 3rd Qu.:0.1542 3rd Qu.:1.859 3rd Qu.:2067 3rd Qu.:2067 #> Max. :0.2410 Max. :3.640 Max. :2241 Max. :2241 #> NAME FIPS FIPSNO CRESS_ID #> Length:100 Length:100 Min. :37001 Min. : 1.00 #> Class :character Class :character 1st Qu.:37050 1st Qu.: 25.75 #> Mode :character Mode :character Median :37100 Median : 50.50 #> Mean :37100 Mean : 50.50 #> 3rd Qu.:37150 3rd Qu.: 75.25 #> Max. :37199 Max. :100.00 #> BIR74 SID74 NWBIR74 BIR79 #> Min. : 248 Min. : 0.00 Min. : 1.0 Min. : 319 #> 1st Qu.: 1077 1st Qu.: 2.00 1st Qu.: 190.0 1st Qu.: 1336 #> Median : 2180 Median : 4.00 Median : 697.5 Median : 2636 #> Mean : 3300 Mean : 6.67 Mean :1050.8 Mean : 4224 #> 3rd Qu.: 3936 3rd Qu.: 8.25 3rd Qu.:1168.5 3rd Qu.: 4889 #> Max. :21588 Max. :44.00 Max. :8027.0 Max. :30757 #> SID79 NWBIR79 #> Min. : 0.00 Min. : 3.0 #> 1st Qu.: 2.00 1st Qu.: 250.5 #> Median : 5.00 Median : 874.5 #> Mean : 8.36 Mean : 1352.8 #> 3rd Qu.:10.25 3rd Qu.: 1406.8 #> Max. :57.00 Max. :11631.0 #> dimension(s): #> from to refsys point #> geom 1 100 NAD27 FALSE #> values #> geom MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... st_as_stars(st_drop_geometry(nc), dims = \"NAME\") #> stars object with 1 dimensions and 13 attributes #> attribute(s): #> AREA PERIMETER CNTY_ CNTY_ID #> Min. :0.0420 Min. :0.999 Min. :1825 Min. :1825 #> 1st Qu.:0.0910 1st Qu.:1.324 1st Qu.:1902 1st Qu.:1902 #> Median :0.1205 Median :1.609 Median :1982 Median :1982 #> Mean :0.1263 Mean :1.673 Mean :1986 Mean :1986 #> 3rd Qu.:0.1542 3rd Qu.:1.859 3rd Qu.:2067 3rd Qu.:2067 #> Max. :0.2410 Max. :3.640 Max. :2241 Max. :2241 #> FIPS FIPSNO CRESS_ID BIR74 #> Length:100 Min. :37001 Min. : 1.00 Min. : 248 #> Class :character 1st Qu.:37050 1st Qu.: 25.75 1st Qu.: 1077 #> Mode :character Median :37100 Median : 50.50 Median : 2180 #> Mean :37100 Mean : 50.50 Mean : 3300 #> 3rd Qu.:37150 3rd Qu.: 75.25 3rd Qu.: 3936 #> Max. :37199 Max. :100.00 Max. :21588 #> SID74 NWBIR74 BIR79 SID79 #> Min. : 0.00 Min. : 1.0 Min. : 319 Min. : 0.00 #> 1st Qu.: 2.00 1st Qu.: 190.0 1st Qu.: 1336 1st Qu.: 2.00 #> Median : 4.00 Median : 697.5 Median : 2636 Median : 5.00 #> Mean : 6.67 Mean :1050.8 Mean : 4224 Mean : 8.36 #> 3rd Qu.: 8.25 3rd Qu.:1168.5 3rd Qu.: 4889 3rd Qu.:10.25 #> Max. :44.00 Max. :8027.0 Max. :30757 Max. :57.00 #> NWBIR79 #> Min. : 3.0 #> 1st Qu.: 250.5 #> Median : 874.5 #> Mean : 1352.8 #> 3rd Qu.: 1406.8 #> Max. :11631.0 #> dimension(s): #> from to values #> NAME 1 100 Ashe,...,Brunswick data.frame(expand.grid(x=1:5, y = 1:5), z = rnorm(25)) |> st_as_stars() #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> z -2.194688 -1.01616 -0.258447 -0.3639007 0.3655264 1.613714 #> dimension(s): #> from to offset delta x/y #> x 1 5 0.5 1 [x] #> y 1 5 5.5 -1 [y] nc = st_read(system.file(\"gpkg/nc.gpkg\", package=\"sf\")) #> Reading layer `nc.gpkg' from data source #> `/home/runner/work/_temp/Library/sf/gpkg/nc.gpkg' using driver `GPKG' #> Simple feature collection with 100 features and 14 fields #> Geometry type: MULTIPOLYGON #> Dimension: XY #> Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 #> Geodetic CRS: NAD27 st_as_stars(nc) #> stars object with 1 dimensions and 14 attributes #> attribute(s): #> AREA PERIMETER CNTY_ CNTY_ID #> Min. :0.0420 Min. :0.999 Min. :1825 Min. :1825 #> 1st Qu.:0.0910 1st Qu.:1.324 1st Qu.:1902 1st Qu.:1902 #> Median :0.1205 Median :1.609 Median :1982 Median :1982 #> Mean :0.1263 Mean :1.673 Mean :1986 Mean :1986 #> 3rd Qu.:0.1542 3rd Qu.:1.859 3rd Qu.:2067 3rd Qu.:2067 #> Max. :0.2410 Max. :3.640 Max. :2241 Max. :2241 #> NAME FIPS FIPSNO CRESS_ID #> Length:100 Length:100 Min. :37001 Min. : 1.00 #> Class :character Class :character 1st Qu.:37050 1st Qu.: 25.75 #> Mode :character Mode :character Median :37100 Median : 50.50 #> Mean :37100 Mean : 50.50 #> 3rd Qu.:37150 3rd Qu.: 75.25 #> Max. :37199 Max. :100.00 #> BIR74 SID74 NWBIR74 BIR79 #> Min. : 248 Min. : 0.00 Min. : 1.0 Min. : 319 #> 1st Qu.: 1077 1st Qu.: 2.00 1st Qu.: 190.0 1st Qu.: 1336 #> Median : 2180 Median : 4.00 Median : 697.5 Median : 2636 #> Mean : 3300 Mean : 6.67 Mean :1050.8 Mean : 4224 #> 3rd Qu.: 3936 3rd Qu.: 8.25 3rd Qu.:1168.5 3rd Qu.: 4889 #> Max. :21588 Max. :44.00 Max. :8027.0 Max. :30757 #> SID79 NWBIR79 #> Min. : 0.00 Min. : 3.0 #> 1st Qu.: 2.00 1st Qu.: 250.5 #> Median : 5.00 Median : 874.5 #> Mean : 8.36 Mean : 1352.8 #> 3rd Qu.:10.25 3rd Qu.: 1406.8 #> Max. :57.00 Max. :11631.0 #> dimension(s): #> from to refsys point #> geom 1 100 NAD27 FALSE #> values #> geom MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572..."},{"path":"/reference/st_cells.html","id":null,"dir":"Reference","previous_headings":"","what":"return the cell index corresponding to the location of a set of points — st_cells","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"object cropped without normalization, indices return relative original uncropped extent. See st_crop","code":""},{"path":"/reference/st_cells.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"","code":"st_cells(x, sf)"},{"path":"/reference/st_cells.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"x object class stars sf object class sf sfc","code":""},{"path":"/reference/st_cells.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"","code":"set.seed(1345) st_bbox(L7_ETMs) |> st_as_sfc() |> st_sample(10) -> pts (x <- st_cells(L7_ETMs, pts)) #> [1] 102496 112324 74862 56976 112862 105242 75593 11784 91245 63885 # get the pixel values (first band only): st_as_stars(L7_ETMs)[[1]][x] #> [1] 92 92 89 76 67 94 77 98 113 56 # get pixel values for all bands: st_as_stars(L7_ETMs) |> split() |> sapply(`[`, x) #> X1 X2 X3 X4 X5 X6 #> [1,] 92 81 60 14 14 11 #> [2,] 92 83 59 13 13 12 #> [3,] 89 83 88 66 113 92 #> [4,] 76 63 66 61 108 78 #> [5,] 67 55 50 65 69 38 #> [6,] 94 81 92 60 125 105 #> [7,] 77 63 65 58 114 93 #> [8,] 98 85 88 57 93 80 #> [9,] 113 98 104 66 110 94 #> [10,] 56 40 27 68 50 24 # compare with st_extract(): st_as_stars(L7_ETMs) |> split() |> st_extract(pts) #> Simple feature collection with 10 features and 6 fields #> Geometry type: POINT #> Dimension: XY #> Bounding box: xmin: 289267.4 ymin: 9111549 xmax: 297166.8 ymax: 9119794 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> X1 X2 X3 X4 X5 X6 geometry #> 1 92 81 60 14 14 11 POINT (295582.2 9112406) #> 2 92 83 59 13 13 12 POINT (297166.8 9111599) #> 3 89 83 88 66 113 92 POINT (293775.8 9114659) #> 4 76 63 66 61 108 78 POINT (291294.7 9116093) #> 5 67 55 50 65 69 38 POINT (292609.8 9111549) #> 6 94 81 92 60 125 105 POINT (294276.2 9112159) #> 7 77 63 65 58 114 93 POINT (294731 9114598) #> 8 98 85 88 57 93 80 POINT (296360.6 9119794) #> 9 113 98 104 66 110 94 POINT (293206.5 9113313) #> 10 56 40 27 68 50 24 POINT (289267.4 9115521)"},{"path":"/reference/st_contour.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute or plot contour lines or sets — st_contour","title":"Compute or plot contour lines or sets — st_contour","text":"Compute contour lines sets","code":""},{"path":"/reference/st_contour.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute or plot contour lines or sets — st_contour","text":"","code":"st_contour( x, na.rm = TRUE, contour_lines = FALSE, breaks = classInt::classIntervals(na.omit(as.vector(x[[1]])))$brks )"},{"path":"/reference/st_contour.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute or plot contour lines or sets — st_contour","text":"x object class stars na.rm logical; missing valued cells removed, also converted features? contour_lines logical; FALSE, polygons returned (contour sets), otherwise contour lines breaks numerical; values \"draw\" contour levels","code":""},{"path":"/reference/st_contour.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute or plot contour lines or sets — st_contour","text":"function requires GDAL >= 2.4.0","code":""},{"path":[]},{"path":"/reference/st_coordinates.html","id":null,"dir":"Reference","previous_headings":"","what":"retrieve coordinates for raster or vector cube cells — st_coordinates","title":"retrieve coordinates for raster or vector cube cells — st_coordinates","text":"retrieve coordinates raster vector cube cells","code":""},{"path":"/reference/st_coordinates.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"retrieve coordinates for raster or vector cube cells — st_coordinates","text":"","code":"# S3 method for class 'stars' st_coordinates(x, ..., add_max = FALSE, center = TRUE) # S3 method for class 'stars' as.data.frame(x, ..., add_max = FALSE, center = NA, add_coordinates = TRUE) as_tibble.stars(.x, ..., add_max = FALSE, center = NA)"},{"path":"/reference/st_coordinates.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"retrieve coordinates for raster or vector cube cells — st_coordinates","text":"x object class stars ... ignored add_max logical; TRUE, dimensions given min (x) max (x_max) value center logical; (add_max FALSE): grid cell center coordinates returned (TRUE) offset values (FALSE)? center can named logical vector list specify values dimension. add_coordinates logical; `TRUE`, columns dimension values preceed array values, otherwise omitted .x object converted tibble","code":""},{"path":"/reference/st_crop.html","id":null,"dir":"Reference","previous_headings":"","what":"crop a stars object — st_crop","title":"crop a stars object — st_crop","text":"crop stars object","code":""},{"path":"/reference/st_crop.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"crop a stars object — st_crop","text":"","code":"# S3 method for class 'mdim' st_crop(x, y, ...) # S3 method for class 'stars_proxy' st_crop( x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), collect = TRUE ) # S3 method for class 'stars' st_crop( x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), as_points = all(st_dimension(y) == 2, na.rm = TRUE), normalize = FALSE )"},{"path":"/reference/st_crop.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"crop a stars object — st_crop","text":"x object class stars y object class sf, sfc bbox; see Details . ... ignored crop logical; TRUE, spatial extent returned object cropped still cover obj, FALSE, extent remains cells outside y given NA values. epsilon numeric; factor shrink bounding box y towards center cropping. collect logical; TRUE, repeat cropping stars object, .e. data read as_points logical; relevant y class sf sfc: FALSE, treat x set points, else set small polygons. Default: TRUE y two-dimensional, else FALSE; see Details normalize logical; TRUE pass cropped object st_normalize returning.","code":""},{"path":"/reference/st_crop.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"crop a stars object — st_crop","text":"raster x, st_crop selects cells intersect y. intersection, raster cells interpreted points small polygons? y class stars, x raster cells interpreted points; y class bbox, x cells interpreted cells (small polygons). Otherwise, as_points given, cells interpreted points y two-dimensional geometry.","code":""},{"path":"/reference/st_crop.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"crop a stars object — st_crop","text":"","code":"l7 = read_stars(system.file(\"tif/L7_ETMs.tif\", package = \"stars\")) d = st_dimensions(l7) # area around cells 3:10 (x) and 4:11 (y): offset = c(d[[\"x\"]]$offset, d[[\"y\"]]$offset) res = c(d[[\"x\"]]$delta, d[[\"y\"]]$delta) bb = st_bbox(c(xmin = offset[1] + 2 * res[1], ymin = offset[2] + 11 * res[2], xmax = offset[1] + 10 * res[1], ymax = offset[2] + 3 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55.5 56.36979 65 111 #> dimension(s): #> from to offset delta refsys point x/y #> x 3 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 4 11 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA # equivalent: st_crop(l7, bb) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55.5 56.36979 65 111 #> dimension(s): #> from to offset delta refsys point x/y #> x 3 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 4 11 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # slightly smaller bbox: bb = st_bbox(c(xmin = offset[1] + 2.1 * res[1], ymin = offset[2] + 10.9 * res[2], xmax = offset[1] + 9.9 * res[1], ymax = offset[2] + 3.1 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55.5 56.36979 65 111 #> dimension(s): #> from to offset delta refsys point x/y #> x 3 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 4 11 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # slightly larger bbox: bb = st_bbox(c(xmin = offset[1] + 1.9 * res[1], ymin = offset[2] + 11.1 * res[2], xmax = offset[1] + 10.1 * res[1], ymax = offset[2] + 2.9 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55 56.11167 66 112 #> dimension(s): #> from to offset delta refsys point x/y #> x 2 11 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 3 12 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # half a cell size larger bbox: bb = st_bbox(c(xmin = offset[1] + 1.49 * res[1], ymin = offset[2] + 11.51 * res[2], xmax = offset[1] + 10.51 * res[1], ymax = offset[2] + 2.49 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55 56.11167 66 112 #> dimension(s): #> from to offset delta refsys point x/y #> x 2 11 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 3 12 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2)"},{"path":"/reference/st_dim_to_attr.html","id":null,"dir":"Reference","previous_headings":"","what":"create an array with dimension values — st_dim_to_attr","title":"create an array with dimension values — st_dim_to_attr","text":"create array dimension values","code":""},{"path":"/reference/st_dim_to_attr.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"create an array with dimension values — st_dim_to_attr","text":"","code":"st_dim_to_attr(x, which = seq_along(dim(x)))"},{"path":"/reference/st_dim_to_attr.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"create an array with dimension values — st_dim_to_attr","text":"x object class stars integer; indices dimensions address (default: )","code":""},{"path":"/reference/st_dim_to_attr.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"create an array with dimension values — st_dim_to_attr","text":"stars object dimension values attributes","code":""},{"path":"/reference/st_dim_to_attr.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"create an array with dimension values — st_dim_to_attr","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x1 = read_stars(tif) (x = st_dim_to_attr(x1)) #> stars object with 3 dimensions and 3 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> x 288790.5 291270 293749.5 293749.5 296229 298708.5 #> y 9110743.0 9113244 9115744.8 9115744.8 9118246 9120746.5 #> band 1.0 2 3.5 3.5 5 6.0 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x) (x = st_dim_to_attr(x1, 2:3)) #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> y 9110743 9113244 9115744.8 9115744.8 9118246 9120747 #> band 1 2 3.5 3.5 5 6 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x) (x= st_dim_to_attr(x1, 3)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> band 1 2 3.5 3.5 5 6 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x)"},{"path":"/reference/st_dimensions.html","id":null,"dir":"Reference","previous_headings":"","what":"get dimensions from stars object — st_dimensions","title":"get dimensions from stars object — st_dimensions","text":"get dimensions stars object","code":""},{"path":"/reference/st_dimensions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"get dimensions from stars object — st_dimensions","text":"","code":"st_dimensions(.x, ...) # S3 method for class 'stars' st_dimensions(.x, ...) st_dimensions(x) <- value # S3 method for class 'stars' st_dimensions(x) <- value # S3 method for class 'stars_proxy' st_dimensions(x) <- value # S3 method for class 'list' st_dimensions(x) <- value # S3 method for class 'array' st_dimensions(.x, ...) # Default S3 method st_dimensions( .x, ..., .raster, affine = c(0, 0), cell_midpoints = FALSE, point = FALSE ) st_set_dimensions( .x, which, values = NULL, point = NULL, names = NULL, xy, ... ) st_get_dimension_values(.x, which, ..., where = NA, max = FALSE, center = NA)"},{"path":"/reference/st_dimensions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"get dimensions from stars object — st_dimensions","text":".x object retrieve dimensions information ... arguments x object class dimensions value new object class dimensions, matching dimensions .raster length 2 character array names () raster dimensions affine numeric; specify parameters affine transformation cell_midpoints logical; TRUE dimension values strictly regular, values interpreted cell midpoint values rather cell offset values calculating offset (.e., half-cell-size correction applied); can value dimension, else recycled point logical; pixel value (measure) refer point (location) value pixel (area) summary value? integer character; index name dimension changed values values dimension (e.g. sfc list-column), length-1 dimensions object; setting special value NULL removes dimension values, instance remove curvilinear raster coordinates names character; vector new names dimensions, single new name dimension indicated xy length-2 character vector; (new) names x y raster dimensions character, one 'start', 'center' 'end'. Set NA (default) ignore use max center explictly. argument provides convenient alternative setting max center. max logical; TRUE return end, rather beginning interval center logical; TRUE return center interval; NA return center raster dimensions, start intervals cases","code":""},{"path":"/reference/st_dimensions.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"get dimensions from stars object — st_dimensions","text":"dimensions attribute x, class dimensions","code":""},{"path":"/reference/st_dimensions.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"get dimensions from stars object — st_dimensions","text":"dimensions can specified two ways. simplest pass vector numeric values numeric dimension, character values categorical dimension. Parameter cell_midpoints used specify whether numeric values refer offset (start) dimension interval (default), center; center case available regular dimensions. rectilinear numeric dimensions, one can specify either vector cell borders (start values), data.frame two columns named \"start\" \"end\", respective interval start end values. first case, end values computed start values assuming last two intervals equal width.","code":""},{"path":"/reference/st_dimensions.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"get dimensions from stars object — st_dimensions","text":"","code":"x = read_stars(system.file(\"tif/L7_ETMs.tif\", package = \"stars\")) # Landsat 7 ETM+ band semantics: https://landsat.gsfc.nasa.gov/the-enhanced-thematic-mapper-plus/ # set bands to values 1,2,3,4,5,7: (x1 = st_set_dimensions(x, \"band\", values = c(1,2,3,4,5,7), names = \"band_number\", point = TRUE)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point values x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] #> band_number 1 6 NA NA NA TRUE 1,...,7 # set band values as bandwidth rbind(c(0.45,0.515), c(0.525,0.605), c(0.63,0.69), c(0.775,0.90), c(1.55,1.75), c(2.08,2.35)) %>% units::set_units(\"um\") -> bw # or: units::set_units(µm) -> bw # set bandwidth midpoint: (x2 = st_set_dimensions(x, \"band\", values = 0.5 * (bw[,1]+bw[,2]), names = \"bandwidth_midpoint\", point = TRUE)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE #> bandwidth_midpoint 1 6 NA NA udunits TRUE #> values x/y #> x NULL [x] #> y NULL [y] #> bandwidth_midpoint 0.4825 [um],...,2.215 [um] # set bandwidth intervals: (x3 = st_set_dimensions(x, \"band\", values = make_intervals(bw), names = \"bandwidth\")) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE #> bandwidth 1 6 NA NA udunits NA #> values x/y #> x NULL [x] #> y NULL [y] #> bandwidth [0.45,0.515) [um],...,[2.08,2.35) [um] m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 5.75 10.5 10.5 15.25 20 #> dimension(s): #> from to offset delta point x/y #> x 1 5 0 1 FALSE [x] #> y 1 4 0 1 FALSE [y] st_get_dimension_values(s, 'x', where = \"start\") #> [1] 0 1 2 3 4 st_get_dimension_values(s, 'x', center = FALSE) #> [1] 0 1 2 3 4 st_get_dimension_values(s, 'x', where = \"center\") #> [1] 0.5 1.5 2.5 3.5 4.5 st_get_dimension_values(s, 'x', center = TRUE) #> [1] 0.5 1.5 2.5 3.5 4.5 st_get_dimension_values(s, 'x', where = \"end\") #> [1] 1 2 3 4 5 st_get_dimension_values(s, 'x', max = TRUE) #> [1] 1 2 3 4 5"},{"path":"/reference/st_downsample.html","id":null,"dir":"Reference","previous_headings":"","what":"downsample stars or stars_proxy objects — st_downsample","title":"downsample stars or stars_proxy objects — st_downsample","text":"downsample stars stars_proxy object either skipping rows, columns bands, computing single value (e.g. mean) sub-tiles involved","code":""},{"path":"/reference/st_downsample.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"downsample stars or stars_proxy objects — st_downsample","text":"","code":"st_downsample(x, n, ...) # S3 method for class 'stars' st_downsample(x, n, ..., offset = 0, FUN) # S3 method for class 'stars_proxy' st_downsample(x, n, ...)"},{"path":"/reference/st_downsample.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"downsample stars or stars_proxy objects — st_downsample","text":"x object class stars stars_proxy n integer; dimension number pixels/lines/bands etc skipped; see Details. ... arguments passed FUN (e.g., na.rm = TRUE ignore missing values FUN mean) offset integer; offset(s) downsampling, pixels, starting offset dimension; smaller equal n FUN function; given, downsampling apply FUN subtiles","code":""},{"path":"/reference/st_downsample.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"downsample stars or stars_proxy objects — st_downsample","text":"n == 0, downsampling takes place; 1, every second row/column/band skipped, 2, every second+third row/column/band skipped, etc. Downsampling stars_proxy object returns stars object, equivalent calling st_as_stars(x, downsample = 2), downsamples first two (x y) dimensions. Downsampled regular rasters keep dimension offsets, cell size (delta) n[]+1 times larger, may result (slightly) different extent. Note terra's aggregate fact=2 corresponds st_downsample(x, n = 1, FUN = mean): fact one larger n.","code":""},{"path":"/reference/st_downsample.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"downsample stars or stars_proxy objects — st_downsample","text":"","code":"(m = matrix(1:121, 11, 11)) #> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] #> [1,] 1 12 23 34 45 56 67 78 89 100 111 #> [2,] 2 13 24 35 46 57 68 79 90 101 112 #> [3,] 3 14 25 36 47 58 69 80 91 102 113 #> [4,] 4 15 26 37 48 59 70 81 92 103 114 #> [5,] 5 16 27 38 49 60 71 82 93 104 115 #> [6,] 6 17 28 39 50 61 72 83 94 105 116 #> [7,] 7 18 29 40 51 62 73 84 95 106 117 #> [8,] 8 19 30 41 52 63 74 85 96 107 118 #> [9,] 9 20 31 42 53 64 75 86 97 108 119 #> [10,] 10 21 32 43 54 65 76 87 98 109 120 #> [11,] 11 22 33 44 55 66 77 88 99 110 121 (s = st_as_stars(m)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 31 61 61 91 121 #> dimension(s): #> from to offset delta point x/y #> X1 1 11 0 1 FALSE [x] #> X2 1 11 0 1 FALSE [y] st_downsample(s, 1) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 28.5 61 61 93.5 121 #> dimension(s): #> from to offset delta point x/y #> X1 1 6 0 2 FALSE [x] #> X2 1 6 0 2 FALSE [y] st_downsample(s, 1)[[1]] #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 1 23 45 67 89 111 #> [2,] 3 25 47 69 91 113 #> [3,] 5 27 49 71 93 115 #> [4,] 7 29 51 73 95 117 #> [5,] 9 31 53 75 97 119 #> [6,] 11 33 55 77 99 121 st_downsample(s, 1, offset = 1) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 13 37 61 61 85 109 #> dimension(s): #> from to offset delta point x/y #> X1 1 5 1 2 FALSE [x] #> X2 1 5 1 2 FALSE [y] st_downsample(s, 1, offset = 1)[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 13 35 57 79 101 #> [2,] 15 37 59 81 103 #> [3,] 17 39 61 83 105 #> [4,] 19 41 63 85 107 #> [5,] 21 43 65 87 109 st_downsample(s, 1, offset = c(0,1)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 12 36.5 61 61 85.5 110 #> dimension(s): #> from to offset delta point x/y #> X1 1 6 0 2 FALSE [x] #> X2 1 5 1 2 FALSE [y] st_downsample(s, 1, offset = c(0,1))[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 12 34 56 78 100 #> [2,] 14 36 58 80 102 #> [3,] 16 38 60 82 104 #> [4,] 18 40 62 84 106 #> [5,] 20 42 64 86 108 #> [6,] 22 44 66 88 110 st_downsample(s, 1, FUN = mean) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 7 31 55 55 79 103 #> dimension(s): #> from to offset delta point x/y #> X1 1 5 0 2 FALSE [x] #> X2 1 5 0 2 FALSE [y] st_downsample(s, 1, FUN = mean)[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 7 29 51 73 95 #> [2,] 9 31 53 75 97 #> [3,] 11 33 55 77 99 #> [4,] 13 35 57 79 101 #> [5,] 15 37 59 81 103 st_downsample(s, 1, offset = 1, FUN = mean) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 19 43 67 67 91 115 #> dimension(s): #> from to offset delta point x/y #> X1 1 5 1 2 FALSE [x] #> X2 1 5 1 2 FALSE [y] st_downsample(s, 1, offset = c(0,1), FUN = mean)[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 18 40 62 84 106 #> [2,] 20 42 64 86 108 #> [3,] 22 44 66 88 110 #> [4,] 24 46 68 90 112 #> [5,] 26 48 70 92 114"},{"path":"/reference/st_extract.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract cell values at point locations — st_extract","title":"Extract cell values at point locations — st_extract","text":"Extract cell values point locations","code":""},{"path":"/reference/st_extract.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract cell values at point locations — st_extract","text":"","code":"st_extract(x, ...) # S3 method for class 'stars' st_extract( x, at, ..., bilinear = FALSE, time_column = attr(at, \"time_column\") %||% attr(at, \"time_col\"), interpolate_time = bilinear, FUN = mean )"},{"path":"/reference/st_extract.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract cell values at point locations — st_extract","text":"x object class stars stars_proxy ... passed aggregate.stars geometries exclusively POINT geometries object class sf sfc geometries, two-column matrix coordinate points rows, indicating extract values x bilinear logical; use bilinear interpolation rather nearest neighbour? time_column character integer; name index column time date values matched values first temporal dimension (matching classes POSIXct, POSIXt, Date, PCICt), x, dimension reduced. useful extract data cube values along trajectory; see https://github.com/r-spatial/stars/issues/352 . interpolate_time logical; time interpolated? FALSE, time instances matched using coinciding last preceding time data cube. FUN function used aggregate pixel values geometries intersect one pixel","code":""},{"path":"/reference/st_extract.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract cell values at point locations — st_extract","text":"class matrix, matrix extracted values returned; otherwise: x dimensions x y (raster), object class stars POINT geometries replacing x y raster dimensions, case, object sf extracted values.","code":""},{"path":"/reference/st_extract.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract cell values at point locations — st_extract","text":"points outside raster returned NA values. large sets points extraction needed, passing matrix may much faster passing sf sfc object.","code":""},{"path":"/reference/st_extract.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract cell values at point locations — st_extract","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") r = read_stars(tif) pnt = st_sample(st_as_sfc(st_bbox(r)), 10) st_extract(r, pnt) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 12 60.75 74 72.51667 87 150 #> dimension(s): #> from to refsys point #> geometry 1 10 SIRGAS 2000 / UTM zone 25S TRUE #> band 1 6 NA NA #> values #> geometry POINT (298340.2 9114943),...,POINT (289531.4 9111471) #> band NULL st_extract(r, pnt) %>% st_as_sf() #> Simple feature collection with 10 features and 6 fields #> Geometry type: POINT #> Dimension: XY #> Bounding box: xmin: 288950.3 ymin: 9111189 xmax: 298340.2 ymax: 9119338 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> L7_ETMs.tif.V1 L7_ETMs.tif.V2 L7_ETMs.tif.V3 L7_ETMs.tif.V4 L7_ETMs.tif.V5 #> 1 97 88 67 14 13 #> 2 82 66 74 49 107 #> 3 66 54 46 73 79 #> 4 80 68 69 77 117 #> 5 87 85 104 87 120 #> 6 90 83 65 13 13 #> 7 63 46 38 65 83 #> 8 110 101 114 74 150 #> 9 80 68 74 54 110 #> 10 80 65 65 44 84 #> L7_ETMs.tif.V6 geometry #> 1 12 POINT (298340.2 9114943) #> 2 82 POINT (293918.4 9114415) #> 3 42 POINT (293485.2 9118749) #> 4 86 POINT (294440.9 9114839) #> 5 79 POINT (295209 9118813) #> 6 12 POINT (295048.9 9111189) #> 7 50 POINT (289649.4 9116888) #> 8 128 POINT (295730.3 9119338) #> 9 88 POINT (288950.3 9111816) #> 10 71 POINT (289531.4 9111471) st_extract(r[,,,1], pnt) #> Simple feature collection with 10 features and 1 field #> Geometry type: POINT #> Dimension: XY #> Bounding box: xmin: 288950.3 ymin: 9111189 xmax: 298340.2 ymax: 9119338 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> L7_ETMs.tif geometry #> 1 97 POINT (298340.2 9114943) #> 2 82 POINT (293918.4 9114415) #> 3 66 POINT (293485.2 9118749) #> 4 80 POINT (294440.9 9114839) #> 5 87 POINT (295209 9118813) #> 6 90 POINT (295048.9 9111189) #> 7 63 POINT (289649.4 9116888) #> 8 110 POINT (295730.3 9119338) #> 9 80 POINT (288950.3 9111816) #> 10 80 POINT (289531.4 9111471) st_extract(r, st_coordinates(pnt)) # \"at\" is a matrix: return a matrix #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 97 88 67 14 13 12 #> [2,] 82 66 74 49 107 82 #> [3,] 66 54 46 73 79 42 #> [4,] 80 68 69 77 117 86 #> [5,] 87 85 104 87 120 79 #> [6,] 90 83 65 13 13 12 #> [7,] 63 46 38 65 83 50 #> [8,] 110 101 114 74 150 128 #> [9,] 80 68 74 54 110 88 #> [10,] 80 65 65 44 84 71"},{"path":"/reference/st_geotransform.html","id":null,"dir":"Reference","previous_headings":"","what":"get or set the geotransform, or rotation matrix — st_geotransform","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"get set geotransform, rotation matrix","code":""},{"path":"/reference/st_geotransform.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"","code":"st_geotransform(x, ...) st_geotransform(x) <- value # S3 method for class 'stars' st_geotransform(x) <- value"},{"path":"/reference/st_geotransform.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"x object class stars dimensions ... ignored value length 6 numeric vector, 2 x 2 (scaled) rotation matrix","code":""},{"path":"/reference/st_geotransform.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"","code":"# using the \"classical\" rotation matrix, see https://en.wikipedia.org/wiki/Rotation_matrix : rot = function(theta, dxdy = c(1., -1.)) { th = theta / 180 * pi matrix(c(cos(th), sin(th), -sin(th), cos(th)), 2, 2) %*% matrix(c(dxdy[2], 0, 0, dxdy[1]), 2, 2) } l = st_downsample(st_as_stars(L7_ETMs), 9) # save time in plotting st_geotransform(l) = rot(20, c(28.5, 28.5)) # clockwise, 20 degrees, scale by cell size plot(l[,,,1]) m = rot(20, c(1, 2)) g = expand.grid(x = 0:4, y = 0:4) plot(g[1:2], asp = 1) text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4) g = t(m %*% t(as.matrix(g))) points(g, col = 'red') text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4, col = 'red') m = matrix(1:20, 4) s0 = st_as_stars(m) s = s0 # dy > 0, clockwise rotation: st_geotransform(s) = rot(10, c(1,1)) plot(s0, reset = FALSE) plot(s, add = TRUE) # dy < 0, counter clockwise rotation, + expansion in x-direction: layout(1) s0 = st_as_stars(st_bbox(s0), dx = 1) s0$values = 1:20 s0 #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> values 1 5.75 10.5 10.5 15.25 20 #> dimension(s): #> from to offset delta x/y #> x 1 4 0 1 [x] #> y 1 5 5 -1 [y] plot(s0, reset = FALSE) s = s0 st_geotransform(s) = rot(10, c(2,1)) plot(s, add = TRUE)"},{"path":"/reference/st_intersects.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"spatial intersect predicate for stars and sfc object — st_intersects.stars","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"spatial intersect predicate stars sfc object","code":""},{"path":"/reference/st_intersects.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"","code":"# S3 method for class 'stars' st_intersects(x, y, sparse = TRUE, ..., as_points = NA, transpose = FALSE)"},{"path":"/reference/st_intersects.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"x object class stars y object `st_geometry` method: class `sf` `sfc`, `stars` object `sfc` dimension sparse logical; TRUE, return sparse logical matrix (object class `sgbp`), FALSE, return logical matrix ... ignored, passed `st_intersects.sf` curvilinear grids as_points logical, grid cells considered points (TRUE) polygons (FALSE)? Default: FALSE warning emitted transpose logical; transpose `sgbp` object returned?","code":""},{"path":"/reference/st_intersects.stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"`sgbp` object sparse = TRUE, logical matrix otherwise","code":""},{"path":"/reference/st_intersects.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"curvilinear grids always converted polygons, points grid boundaries may intersect two cells touched; grids cell boundary corner belongs one cell.","code":""},{"path":"/reference/st_join.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatially join a stars and an `sf` object — st_join.stars","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"Spatially join stars `sf` object","code":""},{"path":"/reference/st_join.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"","code":"# S3 method for class 'stars' st_join( x, y, join = st_intersects, ..., what = \"left1\", as_points = NA, warn = TRUE )"},{"path":"/reference/st_join.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"x object class stars y object class sf, one can coerced st_as_sf join join function, return sgbp object; see details ... arguments passed join function \"left1\", \"right\" \"inner\"; see details as_points logical; controls whether grid cells x treated points, cell areas; st_intersects.stars method default derive x's metadata, else assume areas. warn logical; TRUE, warn 1--many matches \"left1\"","code":""},{"path":"/reference/st_join.stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"\"left1\", object class stars (first) value y spatial instances x","code":""},{"path":"/reference/st_join.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"one match single x value, first matching record y taken (warn TRUE warning raised). \"inner\", object class sf matching records x y.","code":""},{"path":"/reference/st_mosaic.html","id":null,"dir":"Reference","previous_headings":"","what":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"build mosaic (composite) several spatially disjoint stars objects","code":""},{"path":"/reference/st_mosaic.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"","code":"st_mosaic(.x, ...) # S3 method for class 'stars' st_mosaic( .x, ..., dst = tempfile(fileext = file_ext), options = c(\"-vrtnodata\", \"-9999\", \"-srcnodata\", \"nan\"), file_ext = \".tif\" ) # S3 method for class 'character' st_mosaic( .x, ..., dst = tempfile(fileext = file_ext), options = c(\"-vrtnodata\", \"-9999\"), file_ext = \".tif\" ) # S3 method for class 'stars_proxy' st_mosaic( .x, ..., dst = tempfile(fileext = file_ext), options = c(\"-vrtnodata\", \"-9999\"), file_ext = \".tif\" )"},{"path":"/reference/st_mosaic.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":".x object class stars, character vector input dataset names ... input stars objects dst character; destination file name; VRT file references source file(s), see details options character; options gdalbuildvrt command file_ext character; file extension, determining format used write (\".tif\" implies GeoTIFF)","code":""},{"path":"/reference/st_mosaic.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"stars method returns stars object composite input; character method returns file name file mosaic; see also GDAL documentation gdalbuildvrt","code":""},{"path":"/reference/st_mosaic.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"gdal function buildvrt builds mosaic input images; input images can multi-band, higher-dimensional data cubes stars objects multiple attributes; note `stars` method, `dst` file may contain references temporary files going removed termination R session. uses gdal_utils internally call buildvrt; executables external R called.","code":""},{"path":"/reference/st_mosaic.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"","code":"x = read_stars(system.file(\"tif/L7_ETMs.tif\", package = \"stars\")) x1 = x[,100:200,100:200,] x2 = x[,150:300,150:300,] plot(st_mosaic(x1, x2))"},{"path":"/reference/st_raster_type.html","id":null,"dir":"Reference","previous_headings":"","what":"get the raster type (if any) of a stars object — st_raster_type","title":"get the raster type (if any) of a stars object — st_raster_type","text":"get raster type () stars object","code":""},{"path":"/reference/st_raster_type.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"get the raster type (if any) of a stars object — st_raster_type","text":"","code":"st_raster_type(x, dimension = character(0))"},{"path":"/reference/st_raster_type.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"get the raster type (if any) of a stars object — st_raster_type","text":"x object class stars dimension optional: numbers names dimension(s) get per-dimension type","code":""},{"path":"/reference/st_raster_type.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"get the raster type (if any) of a stars object — st_raster_type","text":"dimension specified, return spatial raster type: one NA (object raster dimensions), \"curvilinear\", \"rectilinear\", \"affine\", \"regular\". case dimension(s) specified, return one \"regular\", \"rectilinear\" (irregular numeric), \"discrete\" (anything else).","code":""},{"path":"/reference/st_raster_type.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"get the raster type (if any) of a stars object — st_raster_type","text":"categories \"curvilinear\" \"affine\" refer relationship pair spatial (raster) dimensions.","code":""},{"path":"/reference/st_raster_type.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"get the raster type (if any) of a stars object — st_raster_type","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) st_raster_type(x) #> [1] \"regular\" st_raster_type(x, 1:3) #> x y band #> \"regular\" \"regular\" \"discrete\""},{"path":"/reference/st_rasterize.html","id":null,"dir":"Reference","previous_headings":"","what":"rasterize simple feature geometries — st_rasterize","title":"rasterize simple feature geometries — st_rasterize","text":"rasterize simple feature geometries","code":""},{"path":"/reference/st_rasterize.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"rasterize simple feature geometries — st_rasterize","text":"","code":"st_rasterize( sf, template = guess_raster(sf, ...) %||% st_as_stars(st_bbox(sf), values = NA_real_, ...), file = tempfile(), driver = \"GTiff\", options = character(0), align = FALSE, proxy = FALSE, ... )"},{"path":"/reference/st_rasterize.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"rasterize simple feature geometries — st_rasterize","text":"sf object class sf template optional; stars object desired target geometry, target geometry alignment align=TRUE; see details file temporary file name driver driver temporary file options character; options vector GDALRasterize align logical; TRUE, template used geometry _alignment_, informing target resolution offset proxy logical; proxy object returned? ... arguments passed st_as_stars","code":""},{"path":"/reference/st_rasterize.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"rasterize simple feature geometries — st_rasterize","text":"`template` `stars` object, non-NA cells covered `sf` receive value `template`; see also argument `align`.","code":""},{"path":"/reference/st_rasterize.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"rasterize simple feature geometries — st_rasterize","text":"","code":"demo(nc, echo = FALSE, ask = FALSE) (x = st_rasterize(nc)) # default grid: #> stars object with 2 dimensions and 12 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> AREA 0.042 0.108 0.142 1.451932e-01 0.181 0.241 30904 #> PERIMETER 0.999 1.461 1.716 1.786110e+00 2.004 3.640 30904 #> CNTY_ 1825.000 1907.000 1989.000 1.998403e+03 2085.000 2241.000 30904 #> CNTY_ID 1825.000 1907.000 1989.000 1.998403e+03 2085.000 2241.000 30904 #> FIPSNO 37001.000 37049.000 37101.000 3.710042e+04 37153.000 37199.000 30904 #> CRESS_ID 1.000 25.000 51.000 5.071206e+01 77.000 100.000 30904 #> BIR74 248.000 1323.000 2648.000 3.791637e+03 4139.000 21588.000 30904 #> SID74 0.000 3.000 5.000 7.891985e+00 10.000 44.000 30904 #> NWBIR74 1.000 297.000 844.000 1.246210e+03 1396.000 8027.000 30904 #> BIR79 319.000 1606.000 3108.000 4.852046e+03 5400.000 30757.000 30904 #> SID79 0.000 3.000 6.000 9.584098e+00 13.000 57.000 30904 #> NWBIR79 3.000 360.000 1058.000 1.604642e+03 1524.000 11631.000 30904 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 461 -84.32 0.01925 NAD27 FALSE [x] #> y 1 141 36.59 -0.01925 NAD27 FALSE [y] plot(x, axes = TRUE) # a bit more customized grid: (x = st_rasterize(nc, st_as_stars(st_bbox(nc), nx = 100, ny = 50, values = NA_real_))) #> stars object with 2 dimensions and 12 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> AREA 0.042 0.108 0.142 0.145536 0.181 0.241 2373 #> PERIMETER 0.999 1.470 1.716 1.789032 2.004 3.640 2373 #> CNTY_ 1825.000 1908.000 1989.000 1999.761325 2088.000 2241.000 2373 #> CNTY_ID 1825.000 1908.000 1989.000 1999.761325 2088.000 2241.000 2373 #> FIPSNO 37001.000 37049.000 37101.000 37100.327750 37151.000 37199.000 2373 #> CRESS_ID 1.000 25.000 51.000 50.663875 76.000 100.000 2373 #> BIR74 248.000 1323.500 2648.000 3790.530263 4139.000 21588.000 2373 #> SID74 0.000 3.000 5.000 7.905976 10.000 44.000 2373 #> NWBIR74 1.000 289.000 844.000 1246.116483 1396.000 8027.000 2373 #> BIR79 319.000 1606.000 3108.000 4848.231062 5386.000 30757.000 2373 #> SID79 0.000 3.000 6.000 9.574419 13.000 57.000 2373 #> NWBIR79 3.000 360.000 1058.000 1602.740769 1524.000 11631.000 2373 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 100 -84.32 0.08867 NAD27 FALSE [x] #> y 1 50 36.59 -0.05415 NAD27 FALSE [y] plot(x, axes = TRUE) (ls = st_sf(a = 1:2, st_sfc(st_linestring(rbind(c(0.1, 0), c(1.1, 1))), st_linestring(rbind(c(0, 0.05), c(1, 0.05)))))) #> Simple feature collection with 2 features and 1 field #> Geometry type: LINESTRING #> Dimension: XY #> Bounding box: xmin: 0 ymin: 0 xmax: 1.1 ymax: 1 #> CRS: NA #> a #> 1 1 #> 2 2 #> c..st_sfc.st_linestring.rbind.c.0.1..0...c.1.1..1.....st_linestring.rbind.c.0..........0.05...c.1..0.05...... #> 1 LINESTRING (0.1 0, 1.1 1) #> 2 LINESTRING (0 0.05, 1 0.05) (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = NA_real_)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> values NA NA NA NaN NA NA 100 #> dimension(s): #> from to offset delta x/y #> x 1 10 0 0.1 [x] #> y 1 10 1 -0.1 [y] # Only the left-top corner is part of the grid cell: sf_extSoftVersion()[\"GDAL\"] #> GDAL #> \"3.4.1\" plot(st_rasterize(ls, grd), axes = TRUE, reset = FALSE) # ALL_TOUCHED=FALSE; plot(ls, add = TRUE, col = \"red\") plot(st_rasterize(ls, grd, options = \"ALL_TOUCHED=TRUE\"), axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = \"red\") # add lines to existing 0 values, summing values in case of multiple lines: (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = 0)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> values 0 0 0 0 0 0 #> dimension(s): #> from to offset delta x/y #> x 1 10 0 0.1 [x] #> y 1 10 1 -0.1 [y] r = st_rasterize(ls, grd, options = c(\"MERGE_ALG=ADD\", \"ALL_TOUCHED=TRUE\")) plot(r, axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = \"red\")"},{"path":"/reference/st_res.html","id":null,"dir":"Reference","previous_headings":"","what":"obtain (spatial) resolution of a stars object — st_res","title":"obtain (spatial) resolution of a stars object — st_res","text":"obtain resolution(s) stars object: default (absolute) x/y raster dimensions, optionally delta dimension parameters","code":""},{"path":"/reference/st_res.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"obtain (spatial) resolution of a stars object — st_res","text":"","code":"st_res(x, all = FALSE, absolute = !all)"},{"path":"/reference/st_res.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"obtain (spatial) resolution of a stars object — st_res","text":"x object class stars logical; FALSE return vector x/y raster resolution absolute logical; works = FALSE; TRUE return absolute resolution values, FALSE return delta values","code":""},{"path":"/reference/st_res.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"obtain (spatial) resolution of a stars object — st_res","text":"= FALSE vector x/y raster resolutions, otherwise list delta values","code":""},{"path":"/reference/st_res.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"obtain (spatial) resolution of a stars object — st_res","text":"","code":"st_res(L7_ETMs) #> x y #> 28.5 28.5 st_res(L7_ETMs, absolute = FALSE) #> x y #> 28.5 -28.5 st_res(L7_ETMs, all = TRUE) #> $x #> [1] 28.5 #> #> $y #> [1] -28.5 #> #> $band #> [1] NA #> if (require(starsdata)) { paste0(\"netcdf/\", c(\"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\")) |> system.file(package = \"starsdata\") |> read_stars(quiet = TRUE) -> x st_res(x) |> print() st_res(x, all = TRUE) |> print() } #> Loading required package: starsdata #> x y #> 0.25 0.25 #> $x #> [1] 0.25 #> #> $y #> [1] -0.25 #> #> $zlev #> [1] NA #> #> $time #> Time difference of 1 days #>"},{"path":"/reference/st_rgb.html","id":null,"dir":"Reference","previous_headings":"","what":"reduce dimension to rgb (alpha) hex values — st_rgb","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"reduce dimension rgb (alpha) hex values","code":""},{"path":"/reference/st_rgb.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"","code":"st_rgb( x, dimension = 3, use_alpha = dim(x)[dimension] == 4, maxColorValue = 255L, probs = c(0, 1), stretch = NULL )"},{"path":"/reference/st_rgb.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"x object class stars dimension dimension name number reduce use_alpha logical; TRUE, fourth band used alpha values maxColorValue integer; maximum value colors probs probability values quantiles used stretching \"percent\". stretch logical character; TRUE \"percent\", band stretched 0 ... maxColorValue \"percent clip\" method using probs values. \"histogram\", \"histogram equalization\" performed (probs values ignored). stretch NULL FALSE, stretching performed. character values interpreted \"percent\" message printed.","code":""},{"path":"/reference/st_rgb.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"dimension's bands mapped red, green, blue, alpha; different ordering wanted, use [.stars reorder dimension, see examples. Alternatively, can use plot.stars rgb argument create three-band composition.","code":""},{"path":[]},{"path":"/reference/st_rgb.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) st_rgb(x[,,,3:1]) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> Length:122848 #> Class :character #> Mode :character #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] r = st_rgb(x[,,,c(6,5,4,3)], 3, use_alpha=TRUE) # now R=6,G=5,B=4,alpha=3 if (require(ggplot2)) { ggplot() + geom_stars(data = r) + scale_fill_identity() } r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = \"percent\") plot(r) #> Error in image.stars(x, ..., axes = axes, breaks = breaks, col = col, key.pos = key.pos, key.width = key.width, key.length = key.length, main = NULL): rgb plotting not supported on this device r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = \"histogram\") plot(r) #> Error in image.stars(x, ..., axes = axes, breaks = breaks, col = col, key.pos = key.pos, key.width = key.width, key.length = key.length, main = NULL): rgb plotting not supported on this device"},{"path":"/reference/st_rotate.html","id":null,"dir":"Reference","previous_headings":"","what":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"Transform rotated long/lat regular grid unrotated curvilinear grid","code":""},{"path":"/reference/st_rotate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"","code":"# S3 method for class 'stars' st_rotate(.x, lon0, lat0, north = TRUE, ...) # S3 method for class 'sfc' st_rotate(.x, lon0, lat0, north = TRUE, ...) # S3 method for class 'sf' st_rotate(.x, lon0, lat0, north = TRUE, ...)"},{"path":"/reference/st_rotate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":".x object class stars lon0 longitude rotated pole degrees lat0 latitude rotated pole degrees north logical; TRUE pole refers North pole, otherwise South pole ... ignored","code":""},{"path":"/reference/st_rotate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"curvilinear stars object coordinates regular long/lat (North pole lat=90)","code":""},{"path":"/reference/st_rotate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"","code":"if (require(\"starsdata\") && require(\"maps\")) { # data downloaded from https://esgf-data.dkrz.de/search/cosmo-rea/ nc = \"netcdf/ts_EUR-6km_ECMWF-ERAINT_REA6_r1i1p1f1_COSMO_v1_mon_201801-201812.nc\" f = system.file(nc, package = \"starsdata\") m = read_mdim(f, \"ts\") print(m) # NOTE this function is obsolete when reading m as # m = read_mdim(f, \"ts\", curvilinear = c(\"longitude\", \"latitude\")) if (require(RNetCDF)) { x = open.nc(f) lon = att.get.nc(x, \"rotated_latitude_longitude\", \"grid_north_pole_longitude\") lat = att.get.nc(x, \"rotated_latitude_longitude\", \"grid_north_pole_latitude\") close.nc(x) print(c(lon = lon, lat = lat)) } else { lon = -162 lat = 39.25 } m1 = st_rotate(m, lon, lat) print(m1) h = function() maps::map(add = TRUE) plot(m1, downsample = c(10, 10, 5), axes = TRUE, hook = h, mfrow = c(1, 2)) # curvilinear grid: downsample for plotting speed m2 = st_warp(m1, crs = st_crs(\"OGC:CRS84\"), threshold = .1) plot(m2, hook = h, mfrow = c(3, 4)) # regular grid: plots fast } #> Loading required package: maps #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> ts [K] 277.3233 284.7061 286.1046 286.5914 288.003 296.9786 #> dimension(s): #> from to offset delta refsys values x/y #> rlon 1 848 -28.43 0.055 NA NULL [x] #> rlat 1 824 -23.43 0.055 NA NULL [y] #> time 1 12 NA NA Date 2018-01-16,...,2018-12-16 #> Loading required package: RNetCDF #> lon lat #> -162.00 39.25 #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> ts [K] 277.3233 284.7061 286.1046 286.5914 288.003 296.9786 #> dimension(s): #> from to refsys values x/y #> rlon 1 848 WGS 84 [848x824] -44.67,...,65.06 [x] #> rlat 1 824 WGS 84 [848x824] 21.95,...,72.61 [y] #> time 1 12 Date 2018-01-16,...,2018-12-16 #> curvilinear grid #> Warning: using Euclidean distance measures on geodetic coordinates #> downsample set to 5"},{"path":"/reference/st_set_bbox.html","id":null,"dir":"Reference","previous_headings":"","what":"set bounding box parameters of regular grid — st_set_bbox","title":"set bounding box parameters of regular grid — st_set_bbox","text":"set bounding box parameters regular grid","code":""},{"path":"/reference/st_set_bbox.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"set bounding box parameters of regular grid — st_set_bbox","text":"","code":"st_set_bbox(x, value, ...)"},{"path":"/reference/st_set_bbox.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"set bounding box parameters of regular grid — st_set_bbox","text":"x object class dimensions, stars stars_proxy value object class bbox ... ignored","code":""},{"path":"/reference/st_sfc2xy.html","id":null,"dir":"Reference","previous_headings":"","what":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"replace POINT simple feature geometry list x y raster","code":""},{"path":"/reference/st_sfc2xy.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"","code":"st_sfc2xy(x, ...)"},{"path":"/reference/st_sfc2xy.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"x object class stars, class sf ... passed .data.frame.stars","code":""},{"path":"/reference/st_sfc2xy.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"object class stars POINT list replaced x y raster dimensions. works points distributed regular rectilinear grid.","code":""},{"path":"/reference/st_tile.html","id":null,"dir":"Reference","previous_headings":"","what":"Specify parameters to load raster in blocks — st_tile","title":"Specify parameters to load raster in blocks — st_tile","text":"Helper function specifying block parameters (nXOff, nYOff, nXsize, nYSize) required RasterIO argument read_stars","code":""},{"path":"/reference/st_tile.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Specify parameters to load raster in blocks — st_tile","text":"","code":"st_tile(img_rows, img_cols, x_window, y_window, overlap = 0)"},{"path":"/reference/st_tile.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Specify parameters to load raster in blocks — st_tile","text":"img_rows number input raster rows (integer) img_cols number input raster columns (integer) x_window number rows block (integer) y_window number columns block (integer) overlap number overlapping pixels (integer)","code":""},{"path":"/reference/st_tile.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Specify parameters to load raster in blocks — st_tile","text":"matrix specified nXOff, nYOff, nXsize, nYSize parameters every block","code":""},{"path":"/reference/st_tile.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Specify parameters to load raster in blocks — st_tile","text":"","code":"if (FALSE) { # \\dontrun{ tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") r = read_stars(tif, proxy = TRUE) tiles = st_tile(nrow(r), ncol(r), 256, 256) for (i in seq_len(nrow(tiles))) { tile = read_stars(tif, proxy = FALSE, RasterIO = tiles[i, ]) # write tiles to separate files write_stars(tile, dsn = paste0(i, \".tif\")) } } # }"},{"path":"/reference/st_transform.html","id":null,"dir":"Reference","previous_headings":"","what":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"transform geometries stars objects new coordinate reference system, without warping","code":""},{"path":"/reference/st_transform.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"","code":"# S3 method for class 'stars' st_transform(x, crs, ...) st_transform_proj.stars(x, crs, ...)"},{"path":"/reference/st_transform.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"x object class stars, either raster simple feature geometries crs object class crs target crs ... ignored","code":""},{"path":"/reference/st_transform.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"simple feature dimensions, st_transform called, leading lossless transformation. gridded spatial data, curvilinear grid transformed grid cell (centers) returned, also lossless. convert regular grid new CRS, use st_warp (general lossy). array values contain geometries array whole class `sfc` non-missing CRS, array geometries also transformed.","code":""},{"path":[]},{"path":"/reference/st_transform.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"","code":"geomatrix = system.file(\"tif/geomatrix.tif\", package = \"stars\") (x = read_stars(geomatrix)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> geomatrix.tif 74 107 123 126.765 132 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 20 1841002 1.5 WGS 84 / UTM zone 11N TRUE [x] #> y 1 20 1144003 -1.5 WGS 84 / UTM zone 11N TRUE [y] #> sheared raster with parameters: -5 -5 new = st_crs('OGC:CRS84') y = st_transform(x, new) plot(st_transform(st_as_sfc(st_bbox(x)), new), col = NA, border = 'red') plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) image(y, col = heat.colors(12), add = TRUE) plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) plot(st_transform(st_as_sfc(x, as_points=FALSE), new), add = TRUE)"},{"path":"/reference/st_warp.html","id":null,"dir":"Reference","previous_headings":"","what":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"Warp (resample) grids stars objects new grid, possibly new coordinate reference system","code":""},{"path":"/reference/st_warp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"","code":"st_warp( src, dest, ..., crs = NA_crs_, cellsize = NA_real_, segments = 100, use_gdal = FALSE, options = character(0), no_data_value = NA_real_, debug = FALSE, method = \"near\", threshold = NA_real_ )"},{"path":"/reference/st_warp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"src object class stars source raster dest object class stars target raster geometry ... ignored crs coordinate reference system destination grid, used dest missing cellsize length 1 2 numeric; cellsize target coordinate reference system units segments (total) number segments segmentizing bounding box transforming new crs use_gdal logical; TRUE, use gdal's warp warper, gdal_utils options character vector options, passed gdalwarp no_data_value value used gdalwarp no_data (NA) writing temporary file; setting use_gdal TRUE leads warning debug logical; TRUE, remove temporary gdalwarp destination file, print name method character; see details options; methods near work use_gdal=TRUE threshold numeric; distance threshold warping curvilinear grids: new cells distances larger threshold assigned NA values.","code":""},{"path":"/reference/st_warp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"method one near, bilinear, cubic, cubicspline, lanczos, average, mode, max, min, med, q1 q3; see https://github.com/r-spatial/stars/issues/109 gridded spatial data (dimensions x y), see figure; existing grid transformed regular grid defined dest, possibly new coordinate reference system. dest specified, crs , procedure used choose target grid similar projectRaster. entails: () envelope (bounding box polygon) transformed new crs, possibly segmentation (red box); (ii) grid formed new crs, touching transformed envelope East North side, (cellsize given) cellsize similar cell size src, extent least covers x; (iii) cell center new grid, matching grid cell x used; match, NA value used.","code":""},{"path":"/reference/st_warp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"","code":"geomatrix = system.file(\"tif/geomatrix.tif\", package = \"stars\") (x = read_stars(geomatrix)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> geomatrix.tif 74 107 123 126.765 132 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 20 1841002 1.5 WGS 84 / UTM zone 11N TRUE [x] #> y 1 20 1144003 -1.5 WGS 84 / UTM zone 11N TRUE [y] #> sheared raster with parameters: -5 -5 new_crs = st_crs('OGC:CRS84') y = st_warp(x, crs = new_crs) plot(st_transform(st_as_sfc(st_bbox(x)), new_crs), col = NA, border = 'red') plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) image(y, add = TRUE, nbreaks = 6) plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) plot(st_transform(st_as_sfc(x, as_points=FALSE), new_crs), add = TRUE) # warp 0-360 raster to -180-180 raster: r = read_stars(system.file(\"nc/reduced.nc\", package = \"stars\")) #> sst, anom, err, ice, r %>% st_set_crs('OGC:CRS84') %>% st_warp(st_as_stars(st_bbox(), dx = 2)) -> s plot(r, axes = TRUE) # no CRS set, so no degree symbols in labels plot(s, axes = TRUE) # downsample raster (90 to 270 m) r = read_stars(system.file(\"tif/olinda_dem_utm25s.tif\", package = \"stars\")) r270 = st_as_stars(st_bbox(r), dx = 270) r270 = st_warp(r, r270)"},{"path":"/reference/st_xy2sfc.html","id":null,"dir":"Reference","previous_headings":"","what":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"replace x y raster dimensions simple feature geometry list (points, polygons = rasterize)","code":""},{"path":"/reference/st_xy2sfc.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"","code":"st_xy2sfc(x, as_points, ..., na.rm = TRUE)"},{"path":"/reference/st_xy2sfc.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"x object class stars as_points logical; TRUE, generate points cell centers, else generate polygons ... arguments passed st_as_sfc na.rm logical; omit (remove) cells entirely missing valued (across dimensions)?","code":""},{"path":"/reference/st_xy2sfc.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"object class stars x y raster dimensions replaced single sfc geometry list column containing either points, polygons. Adjacent cells identical values merged; see st_rasterize .","code":""},{"path":"/reference/stars_sentinel2.html","id":null,"dir":"Reference","previous_headings":"","what":"Sentinel-2 sample tile — stars_sentinel2","title":"Sentinel-2 sample tile — stars_sentinel2","text":"Sentinel-2 sample tile, downloaded reads four 10-m bands: B2 (490 nm), B3 (560 nm), B4 (665 nm) B8 (842 nm)","code":""},{"path":"/reference/stars_sentinel2.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sentinel-2 sample tile — stars_sentinel2","text":"","code":"stars_sentinel2"},{"path":"/reference/stars_sentinel2.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sentinel-2 sample tile — stars_sentinel2","text":"object class stars_proxy (inherits stars) dimension 10980 x 10980 x 4.","code":""},{"path":"/reference/stars_subset.html","id":null,"dir":"Reference","previous_headings":"","what":"subset stars objects — stars_subset","title":"subset stars objects — stars_subset","text":"subset stars objects","code":""},{"path":"/reference/stars_subset.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"subset stars objects — stars_subset","text":"","code":"# S3 method for class 'stars_proxy' x[i, downsample = 0] <- value # S3 method for class 'stars' x[i = TRUE, ..., drop = FALSE, crop = !is_curvilinear(x)] # S3 method for class 'stars' x[i] <- value st_flip(x, which = 1)"},{"path":"/reference/stars_subset.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"subset stars objects — stars_subset","text":"x object class stars first selector: integer, logical character vector indicating attributes select, object class sf, sfc, bbox, stars used spatial selector; see details downsample downsampling rate used case stars_proxy object value array dimensions equal x, vector value recycled array ... (logical integer vector) selectors, matched order, select individual dimensions drop logical; TRUE, degenerate dimensions (one value) dropped crop logical; TRUE parameter spatial geometry (sf sfc) object, extent (bounding box) result cropped match extent using st_crop. Cropping curvilinear grids supported. character integer; dimension(s) flipped","code":""},{"path":"/reference/stars_subset.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"subset stars objects — stars_subset","text":"st_flip flips (reverts) array values along chosen dimension without(s) changing dimension properties","code":""},{"path":"/reference/stars_subset.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"subset stars objects — stars_subset","text":"object class sf, sfc bbox, spatial subset covering geometry selected, possibly followed cropping extent. Array values cell centre inside geometry assigned NA. class stars, attributes logical, cells x corresponding NA FALSE cells assigned NA. Dimension ranges containing negative values NA may partially supported. assignment (replacement form, [<-), argument needs either () stars object logical attribute(s) dimensions matching (possibly recycling) x, case TRUE cells replaced /value recycled dimensions arrays x, (ii) length-one integer character vector indicating array replace, case value may stars object vector array (recycled).","code":""},{"path":"/reference/stars_subset.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"subset stars objects — stars_subset","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) x[,,,1:3] # select bands #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 21 58 70 70.36041 83 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 3 NA NA NA NA x[,1:100,100:200,] # select x and y by range #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 13 54 65 67.21531 77 252 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 100 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 100 200 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x[\"L7_ETMs.tif\"] # select attribute #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA xy = structure(list(x = c(293253.999046018, 296400.196497684), y = c(9113801.64775462, 9111328.49619133)), .Names = c(\"x\", \"y\")) pts = st_as_sf(data.frame(do.call(cbind, xy)), coords = c(\"x\", \"y\"), crs = st_crs(x)) image(x, axes = TRUE) plot(st_as_sfc(st_bbox(pts)), col = NA, add = TRUE) bb = st_bbox(pts) (xx = x[bb]) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 3 56 73 70.87303 89 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 158 268 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 245 331 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA image(xx) plot(st_as_sfc(bb), add = TRUE, col = NA) image(x) pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) buf = st_buffer(st_sfc(pt, crs = st_crs(x)), 1500) plot(buf, add = TRUE) buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), crs = st_crs(x)) image(x[buf]) plot(buf, add = TRUE, col = NA) image(x[buf, crop=FALSE]) plot(buf, add = TRUE, col = NA) # with i of class stars: x[x > 75] # generates lots of NA's; pattern for each band #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> L7_ETMs.tif 76 82 90 94.40052 101 255 443210 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x[x[,,,1] > 75] # recycles a single band template for all bands #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> L7_ETMs.tif 1 63 79 74.98075 93 255 318960 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x = read_stars(tif) # replace, using a logical stars selector: cuts all values above 90 to 90 x[x > 90] = 90 # replace a single attribute when there are more than one: s = split(x) names(s) = paste0(\"band\", 1:6) # rescale only band 1: s[1] = s[1] * 0.75 # rescale only attribute named \"band2\": s[\"band2\"] = s[\"band2\"] * 0.85 # create a new attribute from a numeric vector: s[\"rnorm\"] = rnorm(prod(dim(s))) s #> stars object with 2 dimensions and 7 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> band1 35.250000 50.2500000 58.500000000 57.878219426 66.7500000 67.500000 #> band2 27.200000 46.7500000 56.100000000 56.776205555 67.1500000 76.500000 #> band3 21.000000 49.0000000 63.000000000 62.777008987 77.0000000 90.000000 #> band4 9.000000 52.0000000 63.000000000 58.940544413 75.0000000 90.000000 #> band5 1.000000 63.0000000 89.000000000 71.285092146 90.0000000 90.000000 #> band6 1.000000 32.0000000 60.000000000 56.662127182 88.0000000 90.000000 #> rnorm -5.096659 -0.6759559 -0.004252816 -0.003659307 0.6699726 4.216072 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] lc = read_stars(system.file(\"tif/lc.tif\", package = \"stars\")) x = c(orig = lc, flip_x = st_flip(lc, \"x\"), flip_y = st_flip(lc, \"y\"), flip_xy = st_flip(lc, c(\"x\", \"y\")), along = 3) plot(x)"},{"path":"/reference/write_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"write stars object to gdal dataset (typically: to file) — write_stars","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"write stars object gdal dataset (typically: file)","code":""},{"path":"/reference/write_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"","code":"write_stars(obj, dsn, layer, ...) # S3 method for class 'stars' write_stars( obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), type = if (is.factor(obj[[1]]) && length(levels(obj[[1]])) < 256) \"Byte\" else \"Float32\", NA_value = NA_real_, update = FALSE, normalize_path = TRUE, scale_offset = c(1, 0) ) # S3 method for class 'stars_proxy' write_stars( obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), scale_offset = c(1, 0), type = \"Float32\", NA_value = NA_real_, chunk_size = c(dim(obj)[1], floor(2.5e+07/dim(obj)[1])), progress = TRUE ) detect.driver(filename)"},{"path":"/reference/write_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"obj object class stars dsn gdal dataset (file) name layer attribute name; missing, first attribute written ... passed gdal_write driver driver driver name; see st_drivers options character vector dataset creation options, passed GDAL type character; output binary type, one : Byte eight bit unsigned integer, UInt16 sixteen bit unsigned integer, Int16 sixteen bit signed integer, UInt32 thirty two bit unsigned integer, Int32 thirty two bit signed integer, Float32 thirty two bit floating point, Float64 sixty four bit floating point. NA_value non-NA value represent R's NA value target raster file; set NA, ignored. update logical; TRUE, existing file updated normalize_path logical; see read_stars scale_offset length 2 numeric vector scale, offset values: raw values computed raw = (value - offset) / scale written dsn; scale offset values written dsn else warning raised chunk_size length two integer vector number pixels (x, y) used read/write loop; see details. progress logical; TRUE, progress bar shown filename character; used guessing driver short name based file extension; see examples","code":""},{"path":"/reference/write_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"write_stars first creates target file, updates sequentially writing blocks chunk_size. case obj multi-file stars_proxy object, files written layers output file dsn","code":""},{"path":"/reference/write_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"","code":"detect.driver(\"L7_ETMs.tif\") #> [1] \"GTiff\""},{"path":"/news/index.html","id":"version-06-7","dir":"Changelog","previous_headings":"","what":"version 0.6-7","title":"version 0.6-7","text":"c.stars() verifies semantic equivalence objects’ CRS; #703 initial support read_mdim() work proxy = TRUE; #659","code":""},{"path":"/news/index.html","id":"version-06-6","dir":"Changelog","previous_headings":"","what":"version 0.6-6","title":"version 0.6-6","text":"CRAN release: 2024-07-16 skip cubble tests cubble version 0.3.1; https://github.com/huizezhang-sherry/cubble/issues/30 st_transform.stars transforms geometries array elements mutate.stars (others) handle attribute names spaces ; #689 st_crop() gains argument normalize; set TRUE st_normalize() called returned value; #685, #686 constrain reading full GEOLOCATION arrays case 2-D; #678","code":""},{"path":"/news/index.html","id":"version-06-5","dir":"Changelog","previous_headings":"","what":"version 0.6-5","title":"version 0.6-5","text":"CRAN release: 2024-04-04 fix st_as_stars.Spatial() Spatial gridded objects non-square grid cells, see https://github.com/r-spatial/gstat/issues/123 add prcomp() methods stars stars_proxy objects, working attributes last dimension st_rasterize() align=TRUE returns NA values data; #668 read_mdim() reads tables composity type, returning data.frame case; #659 st_rotate() transforms rotated grid back curvilinear grid unrotated coordinates. aggregate.stars() deals functions return one number, putting new dimension like st_apply() st_as_stars.data.frame() st_as_stars.sf() better handle non-raster data cubes plot.stars() resets layout needed (one sub-plot, key present) fixed st_as_stars.im(); #648 st_crs<-.stars() less critical existing CRS class crs c.stars() single (valid) argument along specified adds dimension; #646 st_join.stars() keeps attributes x complete; #643 st_as_stars.list() requires named list, set names array dimensions present","code":""},{"path":"/news/index.html","id":"version-06-4","dir":"Changelog","previous_headings":"","what":"version 0.6-4","title":"version 0.6-4","text":"CRAN release: 2023-09-11 plot.stars() fill argument shifts unused plotting space sub-maps bottom right side plotting area plot.stars(), key.width default sensitive par(\"ps\"), pointsize graphics parameter plot.stars() image.stars() sensitive cex.axis, axes key (requires sf >= 1.0-14); #642 move lwgeom dependency Suggests; using st_transform_proj() vector data cubes requires loading lwgeom first","code":""},{"path":"/news/index.html","id":"version-06-3","dir":"Changelog","previous_headings":"","what":"version 0.6-3","title":"version 0.6-3","text":"CRAN release: 2023-08-11 st_downsample() argument offset pixel-shift downsampled images st_downsample() argument FUN compute sub-tile aggregates; #604 st_as_stars.bbox() retains factor values; #640 fix CRAN error test script st_crop() works (warns) case crop area overlap area object; #638","code":""},{"path":"/news/index.html","id":"version-06-2","dir":"Changelog","previous_headings":"","what":"version 0.6-2","title":"version 0.6-2","text":"CRAN release: 2023-07-12 split.stars() accepts stars objects multiple attributes; #635 [.stars() supports NA values dimension ranges vector geometry (sfc) dimensions, resulting empty geometries st_extract() supports extracting points values curvilinear grids (proxy); #632 read_mdim() reads curvilinear rasters (geolocation arrays), far full extent/resolution st_as_stars.stars() accepts curvilinear argument lon/lat array names present .x consistently use OGC:CRS84 instead EPSG:4326 setting values = NULL st_set_dimensions() removes dimension values gracefully handle plotting global coverage curvilinear grids; #632 image.stars() plots images (e.g. cross sections) x /y singular absent; #628 st_as_stars.cubble_df() adds conversion cubble; cubble::as_cubble() methods converts back [<-.stars() accepts indicator (numeric length character) array replaced; #626 plot.stars() gains argument key.lab set legend key label (requires sf >= 1.0-13)","code":""},{"path":"/news/index.html","id":"version-06-1","dir":"Changelog","previous_headings":"","what":"version 0.6-1","title":"version 0.6-1","text":"CRAN release: 2023-04-06 remove rgdal dependency read_stars() fixes combining bands different block sizes; #623 st_warp() gets (proper) default value threshold; #618 read_mdim() reads “raster” single pixel (point) [.stars(), r[x] allows x logical stars object [<-.stars_proxy() clones environment, r[r > 100] = NA don’t get infinite recursion realizing r read_stars() avoids reading raster twice determine choose proxy; proxy can now set (defaults ) number cells (bands * rows * columns) data read memory returned stars_proxy object; #609 fix using RasterIO read_stars() proxy=TRUE; #608 plot.stars() hook function can handle arguments row, col, nrow, ncol, nr, value bbox; #600 fix handling categorical rasters colors without category labels; #595, fallout #565 fix subsetting proxy objects time range; #596","code":""},{"path":"/news/index.html","id":"version-06-0","dir":"Changelog","previous_headings":"","what":"version 0.6-0","title":"version 0.6-0","text":"CRAN release: 2022-11-21 write_stars() writes scaled /shifted values using argument scale_offset; #589 aggregate.stars_proxy() implements aggregation non-spatial objects (lazily) fix [.stars_proxy() selecting dimension 3 higher; #561 plot.stars(), col can also palette function st_res() returns spatial resolutions, optionally dimension resolutions; #557 thanks Krzysztof Dyba read_stars() shortens band array names contain common start ending, unless names become empty shorten=FALSE set; e.g. shorten=\"B\" puts B shortened array names printing stars dimension tables omits fields NULL NA values, unless print(..., = TRUE) given improve reading categorical rasters, now avoids calling factor(); #565 thanks Krzysztof Dyba read_mdim() read bounds arrays coordinates using bounds attribute, accepts bounds argument specify attribute missing time() returns time stamps time dimension st_cells() returns cell index set point coordinates, provided sf sfc object; #558 reading & writing vector data cubes: read_mdim() reads CF compliant vector geometries, reconstructs sfc dimension; write_mdim() writes . write_mdim() uses GDAL multidimensional array API; read_mdim() uses arguments offset, count step read sub-arrays strided arrays (requires sf >= 1.0-9)","code":""},{"path":"/news/index.html","id":"version-05-6","dir":"Changelog","previous_headings":"","what":"version 0.5-6","title":"version 0.5-6","text":"CRAN release: 2022-07-21 export read_mdim(), reader using GDAL’s multidimensional array API (sf <= 1.0-8) remove tos_O1_2001-2002.nc packaged datasets keep source package size 5 Mb .POSIXct.stars() converts PCICt dimensions POSIXct values. improve handling PCICt 360 365 day calendars; read read_mdim (requires sf >= 1.0-9) read_stars() reads factor levels better attribute table; #484 thanks @ailich read_stars() puts band names band_meta DESCRIPTION= tags values; improve handling categorical rasters, exchange terra; #484 plot() handles auto colors better factor arrays read_ncdf() handles units formally setting crs; #533 print message dimensions proxy objects reflect unevaluated operations; #530 passing na.action = na.omit geom_stars() removes NA values; #532 read_stars() detects curvilinear grids automatically; #513 st_warp() warps curvilinear grids (using Euclidean distances coordinates); #513 Ops.stars() errors (common) dimension identical; #506 guess_raster() accepts empty rows/columns sparse grids; #509 speed rgb plotting; #503 Added new helper function st_tile() specify block parameters (nXOff, nYOff, nXsize, nYSize) required RasterIO argument read_stars(); #492 thanks Krzysztof Dyba","code":""},{"path":"/news/index.html","id":"version-05-5","dir":"Changelog","previous_headings":"","what":"version 0.5-5","title":"version 0.5-5","text":"CRAN release: 2021-12-19 st_as_stars.bbox() creates empy raster file proxy = TRUE; #489 st_rasterize() option align = TRUE use template aligning new raster ; #489 adrop.stars() missing dimensions longer drops x/y raster dimensions; #485 aggregate.stars() propagates units arrays; #477","code":""},{"path":"/news/index.html","id":"version-05-4","dir":"Changelog","previous_headings":"","what":"version 0.5-4","title":"version 0.5-4","text":"CRAN release: 2021-11-19 c.stars() fails tries merge arrays different units; #475 NetCDF files, read_stars() uses long_name array name; #475 add rename() method; #470 refresh CRS packaged L7_ETMs.tif; #466 .data.frame.stars() works mixed regular rectilinear dimension; #458 plot.stars() plots curvilinear rasters color table, without table col argument passed; #456 st_extract() accepts matrix points argument, performance important; see e.g. https://github.com/rspatial/terra/issues/341 fix bug st_crop() cropping area larger grid; #455 export st_downsample(), e.g. used tmap; https://github.com/r-tmap/tmap/issues/597 argument downsample plot.stars() st_as_stars.stars_proxy() st_downsample() effect (removed one-offset ). st_redimension() works curvilinear grids; #441 downsample propagated subexpressions like r[r < 50] = NA predict.stars() obtains argument drop_dimensions , TRUE, drops dimensions prediction data.frame; #362 extend options st_rgb(), #432, Gabo Gaona allow subsetting [ using labels, e.g. band names.","code":""},{"path":"/news/index.html","id":"version-05-3","dir":"Changelog","previous_headings":"","what":"version 0.5-3","title":"version 0.5-3","text":"CRAN release: 2021-06-08 read_stars() accepts function (list functions) first argument, allowing saving stars objects read package directories resolving platform-dependent paths run-time handle categorical rasters starting value 0 (adding 1, warning); #428 add %% method; #424 read_stars() gains argument tolerance control tolerance dimension value comparisons; #414 binary Ops (like +, -, * etc.) work stars_proxy objects; #390 st_rasterize() rasterizes multiple attributes, handles factors (sf >= 0.9-9) write_stars() deals better stars_proxy objects; #404 fix regression reading stars_proxy objects; #379 add [<- (partially) .na methods stars_proxy objects; #402 add replace_na() methods; #402","code":""},{"path":"/news/index.html","id":"version-05-2","dir":"Changelog","previous_headings":"","what":"version 0.5-2","title":"version 0.5-2","text":"CRAN release: 2021-03-17 read write factor levels GDAL category names; write color table; #392 handle normalize_path choosing proxy; #391 ignore units different units across bands subdataset speed st_rgb() using faster st_apply() approach; #315, #390 improve handling crs Spatial objects (avoid loss wkt comments) correctly write band subsets smaller proxy objects; #291 write arbitrarily cropped proxy objects; #291 speed st_apply() function provided works chunks time; #390 warn breaks = “quantile” results single class; #388 fix [ bug selecting bands proxy objects; #388 stars_proxy objects, write_stars() writes objects multi-layer file; #385 multi-file proxy objects can st_warp()ed use_gdal = TRUE; #385","code":""},{"path":"/news/index.html","id":"version-05-1","dir":"Changelog","previous_headings":"","what":"version 0.5-1","title":"version 0.5-1","text":"CRAN release: 2021-01-25 fix weird GDAL-related bug stars2 vignette read_ncdf() take time mid-points regular intervals, starting points; #378","code":""},{"path":"/news/index.html","id":"version-05-0","dir":"Changelog","previous_headings":"","what":"version 0.5-0","title":"version 0.5-0","text":"CRAN release: 2021-01-19 fix handling rasters color tables; #375 st_apply() methods stars_proxy objects handle … ; #374 add st_bbox(), st_crs() methods terra’s SpatVector objects; https://github.com/r-tmap/tmap/issues/536 add st_bbox(), st_crs() st_as_stars() methods terra’s SpatRaster objects; https://github.com/r-tmap/tmap/issues/536 allow multi-resolution attributes stars_proxy objects (e.g., gray scale sentinel-2 bands); see vignettes 2 7 examples. plot() defaults categorical color scale plotting factor variable; https://github.com/r-tmap/tmap/issues/526 st_extract() extracts space-time points time_column specified, handles time intervals; #352 add [[<-.stars method, now called $<-.stars, array names can set programmatically add transmute() methods plot.stars() calls droplevels factor array NA levels; #339 read_stars() reads NaNs NA; #333 improve st_extract() method stars stars_proxy objects; interpolation options reduced bilinear; #322, #279, #290 better handle categorical rasters start value 1; #329 plot layout can controlled mfrow = c(nr, nc) argument stars_proxy objects normalized path; #331 cropping selecting bbox treats cells always small polygons; #330 add faster st_extract() method stars objects; #322 added vignette: “raster functions map stars functions”, Sebastien Rochette; #122, #325 fix bug dimension values field downsampling; #324 write_stars() also writes band names; #323 add rgdal Suggests: call_list entry stars_proxy object carries proper calling environment; #309 st_as_sf.stars() copes zero attribute (empty) stars objects add st_set_bbox() generic, set raster extent, motivated #315 set tic, great help @pat-s, #313 get rid proj4strings representing coordinate reference systems; #312 (x, “Spatial”) correctly handles dimension values different one read_stars() now sets BANDNAME GDAL metadata item, else band’s GetDescription() band’s dimension values st_as_stars.data.frame() reads simple tables (non-raster data) dims length less 2 band descriptions band dimension values dimension tables simpler, shown properly Rstudio st_rgb() gains probs argument, cut stretch based quantiles (x, \"Raster\") merges multiple attributes converting raster brick","code":""},{"path":"/news/index.html","id":"version-04-3","dir":"Changelog","previous_headings":"","what":"version 0.4-3","title":"version 0.4-3","text":"CRAN release: 2020-07-08 fix bug st_as_stars.Raster; set crs one assigned raster; https://github.com/r-tmap/tmap/issues/471 add s2 Suggests: new function st_rgb() collapses (reduces) dimension rgb hex value; #302","code":""},{"path":"/news/index.html","id":"version-04-2","dir":"Changelog","previous_headings":"","what":"version 0.4-2","title":"version 0.4-2","text":"CRAN release: 2020-07-01 aggregate.stars() handles arrays NA values now correctly; brought #299 Thorsten Simon aggregate.stars() gains argument exact , TRUE, calls exactextractr polygonal aggregation; #289 read_stars() reads subdatasets dimensions equal first, warns ignoring others; #296 make copying dimensions somewhat easier; #295 st_as_stars.Raster() tries read file raster object -memory object. write_stars() normalizes path, read_stars already ; #293 merge() proxy objects acts, longer lazy; #290 st_as_stars.Raster() returns proxy object raster layer disk add st_extract() extract e.g. time series grids point locations; #279; #290 read_stars() chooses value proxy depends data dimensions; #281 x/y range subsetting stars_proxy objects now reads range, similar crop already . st_warp() preserves levels colors; https://github.com/r-tmap/tmap/issues/429 st_crop() works bounding boxes larger downsampled bounding box; #276 st_crop() non-zero default epsilon (bounding box shrinkage) exclude cells touching crop bounding box; #275 image.stars() (hence plot.stars) gains extent argument setting extent plot; https://github.com/r-spatial/sf/issues/1193","code":""},{"path":"/news/index.html","id":"version-04-1","dir":"Changelog","previous_headings":"","what":"version 0.4-1","title":"version 0.4-1","text":"CRAN release: 2020-04-07 st_warp() (stars native) flips longitudes full cycle; #256, #264, #269 handle axis order st_transform (requires sf >= 0.9-1) depend sf 0.9-0 adapt cubelyr split-dplyr; add cubelyr Suggests:; https://github.com/hadley/cubelyr/issues/2 add droplevels() method handle color tables, category tables raster attribute tables read GDAL; #128, #245; https://github.com/r-spatial/mapview/issues/208 handle dimension crs specially, proxy objects now. handle new-style crs objects upcoming sf, moving away proj4strings handle full crs objects refsys element spatial dimensions, rather proj4string st_raster_type(x) reveals raster type x; #248, https://github.com/r-tmap/tmap/issues/368 add st_as_stars.OpenStreetMap() method; #241 @mtennekes add st_flip() flip arrays along one dimensions without changing dimension properties add .owin() method convert (2D raster) stars objects spatstat owin; https://github.com/r-spatial/sf/issues/1233 temporal aggregation, aggregate.stars now also takes arguments like “week”, “month”, “5 days” add st_as_stars() method xts objects; improve .xts stars objects skip tests solaris","code":""},{"path":"/news/index.html","id":"version-04-0","dir":"Changelog","previous_headings":"","what":"version 0.4-0","title":"version 0.4-0","text":"CRAN release: 2019-10-10 plot() now uses data figure breaks, order also find extremes; #216 st_mosaic() creates mosaics spatially disjoint rasters; #210 #205 large refactoring read_ncdf, David Blodgett Mike Sumner, affecting #199, #89, #30, #86, #175 allow funny units like m s**-1; #201 add contour() method stars objects; #196 plot uses rasterImage default available; #194 x y raster dimensions can set unset xy argument st_set_dimensions; #190 retain factor levels dimension values set st_set_dimensions; #188 add conversion stars_proxy Raster: #193 make plotting multiple curvilinear grids work plot default cell borders case curvilinear, rotated sheared grids robustify handling units allow read_ncdf() ignore bounds scale applied wrongly multi-band images; #189, requires sf >= 0.7-5 .nc now recognized correctly write_stars write NetCDF file; #186 [ subset now works correctly negative logical indices; #184, #185 NA values float32 grids now correctly detected; #182, requires sf >= 0.7-5 cropping stars_proxy object now works; #179 st_apply() can now loop Raster layers; examples #176","code":""},{"path":"/news/index.html","id":"version-03-1","dir":"Changelog","previous_headings":"","what":"version 0.3-1","title":"version 0.3-1","text":"CRAN release: 2019-04-23 st_as_stars.bbox now ncells pretty argument, better choose default raster dimensions geom_stars now works stars_proxy objects, needs downsample set; #21 NA values Float32 rasters now read correctly read_stars; #182 handle bounds, given, read_ncdf provide time parsing (POSIXct, PCICt) read_ncdf; #115","code":""},{"path":"/news/index.html","id":"version-03-0","dir":"Changelog","previous_headings":"","what":"version 0.3-0","title":"version 0.3-0","text":"CRAN release: 2019-02-24 add st_area method return raster grid cell sizes; #99 fix st_warp use_gdal=TRUE, allowing multi-band warps add st_get_dimension_values get values particular dimension (meaningful); #100 allow setting intervals dimension values; see examples st_dimensions add st_contour, clean st_as_sf; #99 experimental color table support; https://github.com/r-spatial/mapview/issues/208 rewrote vignettes, added vignettes; #99 deprecate st_write.stars write_stars; #96 use “native” R array-factor support support PCICt 360- 365-day calendars; #29 remove import ncdf4 favor RNetCDF, now line practice ncmeta package. Thanks David Blodgett motivation testing (see #87, #94). st_as_sf uses date/time column names appropriate allow missing trailing comma’s subsetting: [1,,] [1,] now . move rlang Imports: ; rewrite [ subset using rlang. add conversion Spatial* classes, including gridded ones, taking care factor variables depend sf 0.7-2 add logz support log-scale keys plot image","code":""},{"path":"/news/index.html","id":"version-02-0","dir":"Changelog","previous_headings":"","what":"version 0.2-0","title":"version 0.2-0","text":"CRAN release: 2018-10-25 vignettes now use external package, starsdata, larger dataset examples support [<-.stars e.g. mask values; support .na.stars replace NA masks support cut methods factor arrays (plot, subset); #56 add st_rasterize, uses GDALRasterize rasterize sf object; #13 st_as_sf.stars now uses GDAL(F)Polygonize give regular sheared grid grid cells points, returns contour bands using GDALContourGenerateEx (requiring GDAL 2.4.0) case cells points; #13 support curvilinear grids; see #54 data_model vignette add vignette stars_proxy objects work stars_proxy objects defer processing st_apply jobs subsampling; #50 allow reading sections raster, raster lower resolution, selected bands; #48 allow reading vectors (arrays) 2^31 elements; #48 fold higher dimensions third dimension coercing Raster; #40","code":""},{"path":"/news/index.html","id":"version-01-1","dir":"Changelog","previous_headings":"","what":"version 0.1-1","title":"version 0.1-1","text":"CRAN release: 2018-07-25 add meta data reader read_stars","code":""},{"path":"/news/index.html","id":"version-01-0","dir":"Changelog","previous_headings":"","what":"version 0.1-0","title":"version 0.1-0","text":"add merge (merge attributes array dimension) split (split dimension attributes) interface sf, raster spacetime improve plotting handle logical arrays plot add st_apply, analogous apply add cropping/masking used x[buf] buf sf, sfc bbox object; masking x[buf, crop = FALSE] add Ops (+,-,/ etc) Math (sqrt, pow, sin etc) methods add dimnames dimnames<- methods stars objects downsample large grids plot pixels actually shown can plot rectilinear grids (plot rgb images regular grids) rgb argument image works [ array-like subsetting works; first index attribute selector","code":""},{"path":"/news/index.html","id":"version-00","dir":"Changelog","previous_headings":"","what":"version 0.0","title":"version 0.0","text":"interface 9 C++ gdal utils gdal_utils() (now part sf)","code":""}] +[{"path":"/PROPOSAL.html","id":null,"dir":"","previous_headings":"","what":"Scalable, spatiotemporal Tidy Arrays for R","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"Edzer Pebesma, Michael Sumner, Etienne Racine","code":""},{"path":"/PROPOSAL.html","id":"summary","dir":"","previous_headings":"","what":"Summary","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"lot spatiotemporal data takes form dense, multidimensional arrays. Examples population counts region, year age group weather data variable, time step sensor location satellite imagery, e.g. energy spectral band, location (pixel) time collection climate model data, e.g. surface temperature location, time climate scenario. financial data, e.g. share price company time Although data can represented long tables, larger datasets array form beneficial replicate dimension indexes, array form provides faster access implicitly indexed. R’s native arrays number limitations, handle heterogeneous data records (e.g. consisting numeric, logical Date) like typically data.frame’s, can deal -memory data, handle spatial temporal array dimensions. project () implement flexible generic multidimensional array model heterogeneous records (ii) handles strong spatial temporal referencing array indexes, (iii) scales moderately sized - memory data, large -disk data, massive data held remote servers, using unified user interface follows tidy tools manifesto.","code":""},{"path":"/PROPOSAL.html","id":"the-problem","dir":"","previous_headings":"","what":"The Problem","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"handle analyze large amounts spatially referenced time series data R? handle satellite imagery don’t fit local disc R, need small cluster finish computation within acceptable time? can quickly easily develop analysis testing small portion spatiotemporal datasets, deploying massive data set? can use pipe-based workflows dplyr-verbs data sets? can visually explore high-dimensional raster data? Today, people use R large spatiotemporal data, hit limits related usability, user interface, scalability. r-sig-geo mailing list documents many cases. Now simple features R project largely modernized handling analysis vector data (points, lines, polygons) R tidyverse-friendly fashion, time raster data catch . proposal aims spatiotemporal raster data, well time series feature data.","code":""},{"path":"/PROPOSAL.html","id":"existing-work","dir":"","previous_headings":"The Problem","what":"Existing work","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"Base R supports n-dimensional homogeneous arrays basic types (double, integer, logical, logical), -memory. Package ff supports --memory data structures, held local disc, spatial temporal references dimensions. Spatial packages include rgdal, lets read write raster data, possibly piece--piece, one 142 different file formats. Package raster allows users work raster maps stacks , stack can either refer different bands (color) different time steps, . Package raster can iterate functions large files disc, takes care caching, using either rgdal ncdf4. Another package reading writing NetCDF RNetCDF. Packages dedicated single data source type include include RStoolbox, MODIS, landsat, hsdar; relies raster rgdal file-based /O. CRAN package spacetime provides heterogeneous records, using data.frame attributes. keeps indexes record spatial geometry (grid cell/point/polygon) time instance period; keeps data memory builds xts temporal, sp spatial reference. support R Consortium, Distributed Computing Working Group started develop API distributed computing; initial version available package ddR. aims generic R data structures, works towards relieving users worrying data distributed. Relevant work outside R includes GDAL, particular gdal virtual tiles building arbitrary large grid data sets many individual files, SciDB, open source array database spatial temporal capabilities, strongly scalable architecture, extremely flexible array manipulation methods SciDB4geo, SciDB Plugin Managing Spatial Temporal Reference Information Arrays, SciDB4gdal, GDAL driver SciDB arrays, two activities make SciDB databases aware space time PostGIS Raster, raster data extension PostGIS Rasdaman, array database dedicate images, partially open source. Since definite trend downloading Earth observation data longer feasible, work towards solutions data accessed web service interface. Cloud services AWS starting give access large remote sensing imagery archives e.g. Landsat, MODIS Sentinel satellites.","code":""},{"path":"/PROPOSAL.html","id":"the-plan","dir":"","previous_headings":"","what":"The Plan:","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"develop R package container infrastructure supports dense, n-dimensional arrays heterogeneous records, supports flexible reference array dimensions space, space can gridded (2D/3D raster) set simple features (1D, irregular) supports flexible reference array dimensions time (POSIXct, Date) supports regular arrays (fixed cell size / time step) well irregular arrays allows working memory, local disc, remote computer (using web service interface), allows R functions passed web service back-end, executed parallel, uses -memory proxies large arrays, allowing work first n records computations carried full arrays (similar dplyr ) allows pipe-based workflows, using data.frames, dplyr-style verbs. document software provide tutorials reproducible data analysis examples using locally downloaded imagery, well scalable examples accessing larger (> 1 Tb) datasets using docker container images. document RESTful API connects R client web service holding (processing) big Earth observation data. also develop discuss migration path raster package (43K lines R, C C++ code), functionality, new infrastructure. publish resulting products open access form, R journal, also journal (conference) directed Earth observation community. Timeline: Month 1-2: work design, decide web service technology, basic web service API design Month 3-6: programming R package, testing smaller data sets Month 7-8: testing larger datasets, develop test cases, deploy docker containers Month 9-12: write tutorials, develop teaching material reproducible examples Month 9-12: experiment different back-ends: file-based, database SciDB Failure modes: can’t get RESTful API work properly; solution path: ask rOpenSci community help (Scott Chamberlain, Jeroen Ooms) downloading large image sets cumbersome (slow) larger tutorial examples; solution path: deploy test server teaching/experimenting purposes Amazon cloud, Landsat Sentinel imagery readily available","code":""},{"path":"/PROPOSAL.html","id":"how-can-the-isc-help","dir":"","previous_headings":"","what":"How Can The ISC Help:","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"use funding develop R package web service API. Total costs 10,000 USD, breaks : workshop: travel costs Etienne Racine Michael Sumner visit Muenster, another venue can meet (USD 2500). Programming, project communication: (USD 7000). Cloud deployment Amazon cloud (USD 500).","code":""},{"path":"/PROPOSAL.html","id":"dissemination","dir":"","previous_headings":"","what":"Dissemination:","title":"Scalable, spatiotemporal Tidy Arrays for R","text":"regularly post blogs project r-spatial.org, use twitter, post r-sig-geo, stackoverflow, communicate github issues gitter discussion. project live GitHub, r-spatial organisation. work permissive open source license, probably LGPL-2.1. Pull requests encouraged. R consortium blogs provided start end. Publications R Journal scientific outlets foreseen.","code":""},{"path":"/articles/stars1.html","id":"reading-a-satellite-image","dir":"Articles","previous_headings":"","what":"Reading a satellite image","title":"1. introduction","text":"can read satellite image GDAL, e.g. GeoTIFF file package: see image geographically referenced (coordinate values along axes), object returned (x) three dimensions called x, y band, one attribute: dimension name; meaning fields single dimension : means index (starting =1i=1) along certain dimension, corresponding dimension value (coordinate, time) offset+(−1)×delta\\mbox{offset} + (-1) \\times \\mbox{delta}. value refers start (edge) cell interval; order get interval middle cell centre, one needs add half offset. Dimension band simple sequence 1 6. Since bands refer colors, one put wavelength values values field. particular dataset (raster datasets), see delta dimension y negative: means consecutive array values decreasing yy values: cell indexes increase top bottom, direction opposite yy axis. read_stars reads bands raster dataset, optionally subset raster datasets, single stars array structure. , raster values (often UINT8 UINT16) converted double (numeric) values, scaled back original values needed file encodes scaling parameters. data structure stars generalization tbl_cube found cubelyr; can convert cause loss certain properties (cell size, reference system, vector geometries)","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) plot(x, axes = TRUE) x ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA library(cubelyr) as.tbl_cube(x) ## Source: local array [737,088 x 3] ## D: x [dbl, 349] ## D: y [dbl, 352] ## D: band [int, 6] ## M: L7_ETMs.tif [dbl[,352,6]]"},{"path":"/articles/stars1.html","id":"switching-attributes-to-dimensions-and-back","dir":"Articles","previous_headings":"Reading a satellite image","what":"Switching attributes to dimensions and back","title":"1. introduction","text":"see newly created dimension lost name, single attribute got default name. can set attribute names setNames, dimension names values st_set_dimensions:","code":"(x.spl = split(x, \"band\")) ## stars object with 2 dimensions and 6 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## X1 47 67 78 79.14772 89 255 ## X2 32 55 66 67.57465 79 255 ## X3 21 49 63 64.35886 77 255 ## X4 9 52 63 59.23541 75 255 ## X5 1 63 89 83.18266 112 255 ## X6 1 32 60 59.97521 88 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] merge(x.spl) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## X1.X2.X3.X4.X5.X6 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point values ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## attributes 1 6 NA NA NA NA X1,...,X6 ## x/y ## x [x] ## y [y] ## attributes merge(x.spl) |> setNames(names(x)) |> st_set_dimensions(3, values = paste0(\"band\", 1:6)) |> st_set_dimensions(names = c(\"x\", \"y\", \"band\")) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point values ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL ## band 1 6 NA NA NA NA band1,...,band6 ## x/y ## x [x] ## y [y] ## band"},{"path":"/articles/stars1.html","id":"subsetting","dir":"Articles","previous_headings":"Reading a satellite image","what":"Subsetting","title":"1. introduction","text":"Besides tidyverse subsetting selection operators explained vignette, can also use [ [[. Since stars objects list arrays metadata table describing dimensions, list extraction (assignment) works expected: level, can work array objects directly. stars subset operator [ works bit different: first argument selects attributes second argument selects first dimension third argument selects second dimension, etc Thus, selects second attribute, first 10 columns (x-coordinate), rows, bands 2-4. Alternatively, [ given single argument class sf, sfc bbox, [ work crop operator:","code":"class(x[[1]]) ## [1] \"array\" dim(x[[1]]) ## x y band ## 349 352 6 x$two = 2 * x[[1]] x ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## two 2 108 138 137.82484 172 510 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA x[\"two\", 1:10, , 2:4] ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## two 36 100 116 119.7326 136 470 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 2 4 NA NA NA NA circle = st_sfc(st_buffer(st_point(c(293749.5, 9115745)), 400), crs = st_crs(x)) plot(x[circle][, , , 1], reset = FALSE) plot(circle, col = NA, border = 'red', add = TRUE, lwd = 2)"},{"path":"/articles/stars1.html","id":"overviews","dir":"Articles","previous_headings":"Reading a satellite image","what":"Overviews","title":"1. introduction","text":"can read rasters lower resolution contain -called overviews. GeoTIFF file, created gdaladdo utility, particular adds coarse resolution versions using average resampling method compute values based blocks pixels. can read ","code":"gdaladdo -r average L7_ETMs.tif 2 4 8 16 x1 = read_stars(tif, options = c(\"OVERVIEW_LEVEL=1\")) x2 = read_stars(tif, options = c(\"OVERVIEW_LEVEL=2\")) x3 = read_stars(tif, options = c(\"OVERVIEW_LEVEL=3\")) dim(x1) ## x y band ## 88 88 6 dim(x2) ## x y band ## 44 44 6 dim(x3) ## x y band ## 22 22 6 par(mfrow = c(1, 3), mar = rep(0.2, 4)) image(x1[,,,1]) image(x2[,,,1]) image(x3[,,,1])"},{"path":"/articles/stars1.html","id":"reading-a-raster-time-series-netcdf","dir":"Articles","previous_headings":"","what":"Reading a raster time series: NetCDF","title":"1. introduction","text":"Another example read raster time series model outputs NetCDF file, e.g. see dataset can see variables units associated (wrong unit, C assigned temperature) time now dimension, proper units time steps Alternatively, dataset can read using read_ncdf, difference read_ncdf read_stars NetCDF files former uses package RNetCDF directly read NetCDF file, latter uses GDAL driver NetCDF files.","code":"system.file(\"nc/bcsd_obs_1999.nc\", package = \"stars\") |> read_stars() -> w ## pr, tas, w ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## pr [mm/m] 0.5900000 56.139999 81.88000 101.26433 121.07250 848.54999 7116 ## tas [C] -0.4209678 8.898887 15.65763 15.48932 21.77979 29.38581 7116 ## dimension(s): ## from to offset delta refsys values x/y ## x 1 81 -85 0.125 NA NULL [x] ## y 1 33 37.12 -0.125 NA NULL [y] ## time 1 12 NA NA POSIXct 1999-01-31,...,1999-12-31 system.file(\"nc/bcsd_obs_1999.nc\", package = \"stars\") |> read_ncdf() ## no 'var' specified, using pr, tas ## other available variables: ## latitude, longitude, time ## Will return stars object with 32076 cells. ## No projection information found in nc file. ## Coordinate variable units found to be degrees, ## assuming WGS84 Lat/Lon. ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## pr [mm/m] 0.5900000 56.139999 81.88000 101.26433 121.07250 848.54999 7116 ## tas [C] -0.4209678 8.898887 15.65763 15.48932 21.77979 29.38581 7116 ## dimension(s): ## from to offset delta refsys values x/y ## longitude 1 81 -85 0.125 WGS 84 NULL [x] ## latitude 1 33 33 0.125 WGS 84 NULL [y] ## time 1 12 NA NA POSIXct 1999-01-31,...,1999-12-31"},{"path":"/articles/stars1.html","id":"reading-datasets-from-multiple-files","dir":"Articles","previous_headings":"Reading a raster time series: NetCDF","what":"Reading datasets from multiple files","title":"1. introduction","text":"Model data often spread across many files. example 0.25 degree grid, global daily sea surface temperature product found ; subset 1981 used downloaded NOAA ftp site longer available form. (ftp site used eclipse.ncdc.noaa.gov/pub/OI-daily-v2/NetCDF/1981/AVHRR/). read data giving read_stars vector character names: Next, select sea surface temperature (sst), drop singular zlev (depth) dimension using adrop: can now graph sea surface temperature (SST) using ggplot, needs data long table form, without units:","code":"x = c( \"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\", \"avhrr-only-v2.19810905.nc\", \"avhrr-only-v2.19810906.nc\", \"avhrr-only-v2.19810907.nc\", \"avhrr-only-v2.19810908.nc\", \"avhrr-only-v2.19810909.nc\" ) # see the second vignette: # install.packages(\"starsdata\", repos = \"http://pebesma.staff.ifgi.de\", type = \"source\") file_list = system.file(paste0(\"netcdf/\", x), package = \"starsdata\") (y = read_stars(file_list, quiet = TRUE)) ## stars object with 4 dimensions and 4 attributes ## attribute(s), summary of first 1e+05 cells: ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## sst [°*C] -1.80 -1.19 -1.05 -0.3201670 -0.20 9.36 13360 ## anom [°*C] -4.69 -0.06 0.52 0.2299385 0.71 3.70 13360 ## err [°*C] 0.11 0.30 0.30 0.2949421 0.30 0.48 13360 ## ice [percent] 0.01 0.73 0.83 0.7657695 0.87 1.00 27377 ## dimension(s): ## from to offset delta refsys x/y ## x 1 1440 0 0.25 NA [x] ## y 1 720 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct library(dplyr) ## ## Attaching package: 'dplyr' ## The following objects are masked from 'package:stats': ## ## filter, lag ## The following objects are masked from 'package:base': ## ## intersect, setdiff, setequal, union library(abind) z <- y |> select(sst) |> adrop() # convert POSIXct time to character, to please ggplot's facet_wrap() z1 = st_set_dimensions(z, 3, values = as.character(st_get_dimension_values(z, 3))) library(ggplot2) library(viridis) ## Loading required package: viridisLite library(ggthemes) ggplot() + geom_stars(data = z1[1], alpha = 0.8, downsample = c(10, 10, 1)) + facet_wrap(\"time\") + scale_fill_viridis() + coord_equal() + theme_map() + theme(legend.position = \"bottom\") + theme(legend.key.width = unit(2, \"cm\"))"},{"path":"/articles/stars1.html","id":"writing-stars-objects-to-disk","dir":"Articles","previous_headings":"","what":"Writing stars objects to disk","title":"1. introduction","text":"can write stars object disk using write_stars; used GDAL write engine. Writing NetCDF files without going GDAL interface currently supported. write_stars currently writes single attribute: See explanation merge see multiple attributes can merged (folded) dimension.","code":"write_stars(adrop(y[1]), \"sst.tif\")"},{"path":"/articles/stars1.html","id":"cropping-a-rasters-extent","dir":"Articles","previous_headings":"","what":"Cropping a raster’s extent","title":"1. introduction","text":"Using curvilinear grid, taken example read_ncdf: can now crop grid cells falling selection prec_slice[nc] essentially calls st_crop(prec_slice, nc) get cropped selection. happened cells intersecting North Carolina (sea) set NA values. regular grids, extent resulting stars object also reduced (cropped) default; can controlled crop parameter st_crop [.stars.","code":"prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\")) ## no 'var' specified, using Total_precipitation_surface_1_Hour_Accumulation ## other available variables: ## lat, lon, time ## Will return stars object with 236118 cells. ## No projection information found in nc file. ## Coordinate variable units found to be degrees, ## assuming WGS84 Lat/Lon. ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { if (inherits(x, \"units\")) x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } library(dplyr) # loads slice generic prec_slice = slice(prec, index = 17, along = \"time\") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') nc = st_transform(nc, st_crs(prec_slice)) # datum transformation plot(prec_slice[nc], border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red')"},{"path":"/articles/stars1.html","id":"vector-data-cube-example","dir":"Articles","previous_headings":"","what":"Vector data cube example","title":"1. introduction","text":"Like tbl_cube, stars arrays limits number dimensions handle. example origin-destination (OD) matrix, time travel mode.","code":""},{"path":"/articles/stars1.html","id":"od-space-x-space-x-travel-mode-x-time-x-time","dir":"Articles","previous_headings":"Vector data cube example","what":"OD: space x space x travel mode x time x time","title":"1. introduction","text":"create 5-dimensional matrix traffic regions, day, time day, travel mode. day time day dimension advantage want compute patterns day, certain period. array contains simple feature geometries origin destination can directly plot every slice without additional table joins. want represent array tbl_cube, simple feature geometry dimensions need replaced indexes: following demonstrates can use dplyr filter travel mode bike, compute mean bike traffic hour day:","code":"nc = st_read(system.file(\"gpkg/nc.gpkg\", package=\"sf\")) ## Reading layer `nc.gpkg' from data source ## `/home/runner/work/_temp/Library/sf/gpkg/nc.gpkg' using driver `GPKG' ## Simple feature collection with 100 features and 14 fields ## Geometry type: MULTIPOLYGON ## Dimension: XY ## Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 ## Geodetic CRS: NAD27 to = from = st_geometry(nc) # 100 polygons: O and D regions mode = c(\"car\", \"bike\", \"foot\") # travel mode day = 1:100 # arbitrary library(units) ## udunits database from /usr/share/xml/udunits/udunits2.xml units(day) = as_units(\"days since 2015-01-01\") hour = set_units(0:23, h) # hour of day dims = st_dimensions(origin = from, destination = to, mode = mode, day = day, hour = hour) (n = dim(dims)) ## origin destination mode day hour ## 100 100 3 100 24 traffic = array(rpois(prod(n), 10), dim = n) # simulated traffic counts (st = st_as_stars(list(traffic = traffic), dimensions = dims)) ## stars object with 5 dimensions and 1 attribute ## attribute(s), summary of first 1e+05 cells: ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## traffic 0 8 10 9.99961 12 26 ## dimension(s): ## from to offset delta ## origin 1 100 NA NA ## destination 1 100 NA NA ## mode 1 3 NA NA ## day 1 100 1 [(days since 2015-01-01)] 1 [(days since 2015-01-01)] ## hour 1 24 0 [h] 1 [h] ## refsys point ## origin NAD27 FALSE ## destination NAD27 FALSE ## mode NA FALSE ## day udunits FALSE ## hour udunits FALSE ## values ## origin MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... ## destination MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... ## mode car , bike, foot ## day NULL ## hour NULL st |> as.tbl_cube() ## Source: local array [72,000,000 x 5] ## D: origin [int, 100] ## D: destination [int, 100] ## D: mode [chr, 3] ## D: day [[(days since 2015-01-01)], 100] ## D: hour [[h], 24] ## M: traffic [int[,100,3,100,24]] b <- st |> as.tbl_cube() |> filter(mode == \"bike\") |> group_by(hour) |> summarise(traffic = mean(traffic)) |> as.data.frame() require(ggforce) # for plotting a units variable ## Loading required package: ggforce ggplot() + geom_line(data = b, aes(x = hour, y = traffic)) ## Warning: The `scale_name` argument of `continuous_scale()` is deprecated as of ggplot2 ## 3.5.0. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated."},{"path":"/articles/stars1.html","id":"extracting-at-point-locations-aggregating-over-polygons","dir":"Articles","previous_headings":"","what":"Extracting at point locations, aggregating over polygons","title":"1. introduction","text":"Data cube values point location can extracted st_extract, example found vignette 7 Aggregates, mean, maximum modal values can obtained aggregate. example use categorical raster, try find modal (frequent) class within two circular polygons: find modal value, need function gives back label corresponding class frequent, using table: can call aggregate raster map, set two circular polygons pol1 pol2, pass function f:","code":"s = system.file(\"tif/lc.tif\", package = \"stars\") r = read_stars(s, proxy = FALSE) |> droplevels() levels(r[[1]]) = abbreviate(levels(r[[1]]), 10) # shorten text labels st_point(c(3190631, 3125)) |> st_sfc(crs = st_crs(r)) |> st_buffer(25000) -> pol1 st_point(c(3233847, 21027)) |> st_sfc(crs = st_crs(r)) |> st_buffer(10000) -> pol2 if (isTRUE(dev.capabilities()$rasterImage == \"yes\")) { plot(r, reset = FALSE, key.pos = 4) plot(c(pol1, pol2), col = NA, border = c('yellow', 'green'), lwd = 2, add = TRUE) } f = function(x) { tb = table(x); names(tb)[which.max(tb)] } aggregate(r, c(pol1, pol2), f) |> st_as_sf() ## Simple feature collection with 2 features and 1 field ## Geometry type: POLYGON ## Dimension: XY ## Bounding box: xmin: 3165631 ymin: -21875 xmax: 3243847 ymax: 31027 ## Projected CRS: Albers Conical Equal Area ## lc.tif geometry ## 1 EvrgrnFrst POLYGON ((3215631 3125, 321... ## 2 Dvlpd,MdmI POLYGON ((3243847 21027, 32..."},{"path":"/articles/stars2.html","id":"preamble-the-starsdata-package","dir":"Articles","previous_headings":"","what":"Preamble: the starsdata package","title":"2. stars proxy objects","text":"run examples vignette, must install package datasets large (1 Gb) held stars package. drat repo, installation done ","code":"install.packages(\"starsdata\", repos = \"http://gis-bigdata.uni-muenster.de/pebesma\", type = \"source\") # possibly after: options(timeout = 100) # or from an alternative repository: # install.packages(\"starsdata\", repos = \"http://pebesma.staff.ifgi.de\", type = \"source\")"},{"path":"/articles/stars2.html","id":"reading-chunks-change-resolution-select-bands","dir":"Articles","previous_headings":"","what":"Reading chunks, change resolution, select bands","title":"2. stars proxy objects","text":"read_stars argument called RasterIO controls GDAL dataset read. default, pixels bands read memory. can consume lot time require lot memory. Remember file may compressed, pixel values represented file bytes converted 8-byte doubles R. reason using RasterIO parameters use directly mapped GDAL RasterIO function used (adapting 1-based offset index R 0-based offset C++).","code":""},{"path":"/articles/stars2.html","id":"reading-a-particular-chunk","dir":"Articles","previous_headings":"Reading chunks, change resolution, select bands","what":"Reading a particular chunk","title":"2. stars proxy objects","text":"example using RasterIO Compare see delta values remain , offset (x/y coordinates origin) grid remain reflect new area, relate new delta values dim(x) reflects new size, three bands read","code":"library(stars) ## Loading required package: abind ## Loading required package: sf ## Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 23 54 63 62.05977 73.25 235 ## dimension(s): ## from to offset delta refsys point x/y ## x 6 105 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 6 105 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 3 NA NA NA NA dim(x) ## x y band ## 100 100 3 st_dimensions(read_stars(tif)) ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA"},{"path":"/articles/stars2.html","id":"reading-at-a-different-resolution","dir":"Articles","previous_headings":"Reading chunks, change resolution, select bands","what":"Reading at a different resolution","title":"2. stars proxy objects","text":"Reading datasets lower (also higher!) resolution can done setting nBufXSize nBufYSize see addition: delta (raster cell size) values increased factor 5, nBufXSize nBufYSize set values factor 5 smaller nXSize nYSize offset coordinates grid still reflect new area, relate new delta cell size values can also read higher resolution; read 3 x 3 area blow 100 x 100: reason “see” three grid cells default sampling method “nearest neighbour”. can modify following methods allowed parameter resample: methods implemented GDAL; methods exactly , refer GDAL documentation source code.","code":"rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, nBufXSize = 20, nBufYSize = 20, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 27 53 63 62.09417 74 151 ## dimension(s): ## from to offset delta refsys point x/y ## x 2 21 288776 142.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 2 21 9120761 -142.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 3 NA NA NA NA rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1) x = read_stars(tif, RasterIO = rasterio) dim(x) ## x y ## 100 100 plot(x) rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1, resample = \"cubic_spline\") x = read_stars(tif, RasterIO = rasterio) dim(x) ## x y ## 100 100 plot(x)"},{"path":"/articles/stars2.html","id":"stars-proxy-objects","dir":"Articles","previous_headings":"","what":"Stars proxy objects","title":"2. stars proxy objects","text":"Stars proxy objects take another approach: upon creation contain data , pointers data can read. Data read needed, much needed: plot proxy objects, data read resolution pixels screen, rather native resolution, e.g. 10000 x 10000 Sentinel 2 (level 1C) image, can open happens instantly, data read. plot object, takes around 1 second, since pixels read can seen plot. read entire image memory first, reading take minute, require 5 Gb memory.","code":"granule = system.file(\"sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip\", package = \"starsdata\") s2 = paste0(\"SENTINEL2_L1C:/vsizip/\", granule, \"/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632\") (p = read_stars(s2, proxy = TRUE)) ## stars_proxy object with 1 attribute in 1 file(s): ## $EPSG_32632 ## [1] \"[...]/MTD_MSIL1C.xml:10m:EPSG_32632\" ## ## dimension(s): ## from to offset delta refsys values x/y ## x 1 10980 3e+05 10 WGS 84 / UTM zone 32N NULL [x] ## y 1 10980 6e+06 -10 WGS 84 / UTM zone 32N NULL [y] ## band 1 4 NA NA NA B4,...,B8 system.time(plot(p)) ## downsample set to 18 ## user system elapsed ## 0.958 0.210 0.678 p = read_stars(s2, proxy = FALSE)"},{"path":"/articles/stars2.html","id":"methods-for-stars-proxy-objects","dir":"Articles","previous_headings":"Stars proxy objects","what":"Methods for stars proxy objects","title":"2. stars proxy objects","text":"","code":"methods(class = \"stars_proxy\") ## [1] [ [[<- [<- adrop ## [5] aggregate aperm as.data.frame c ## [9] coerce dim droplevels hist ## [13] image initialize is.na Math ## [17] merge Ops plot prcomp ## [21] predict print show slotsFromS3 ## [25] split st_apply st_as_sf st_as_stars ## [29] st_crop st_dimensions<- st_downsample st_mosaic ## [33] st_normalize st_redimension st_sample st_set_bbox ## [37] write_stars ## see '?methods' for accessing help and source code"},{"path":"/articles/stars2.html","id":"select-attributes","dir":"Articles","previous_headings":"Stars proxy objects","what":"Select attributes","title":"2. stars proxy objects","text":"can select attributes regular stars objects, using first argument [: Note selection limits reading 4 1 subdataset 9 NetCDF files.","code":"x = c(\"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\", \"avhrr-only-v2.19810905.nc\", \"avhrr-only-v2.19810906.nc\", \"avhrr-only-v2.19810907.nc\", \"avhrr-only-v2.19810908.nc\", \"avhrr-only-v2.19810909.nc\") file_list = system.file(paste0(\"netcdf/\", x), package = \"starsdata\") y = read_stars(file_list, quiet = TRUE, proxy = TRUE) names(y) ## [1] \"sst\" \"anom\" \"err\" \"ice\" y[\"sst\"] ## stars_proxy object with 1 attribute in 9 file(s): ## $sst ## [1] \"[...]/avhrr-only-v2.19810901.nc:sst\" \"[...]/avhrr-only-v2.19810902.nc:sst\" ## [3] \"[...]/avhrr-only-v2.19810903.nc:sst\" \"[...]/avhrr-only-v2.19810904.nc:sst\" ## [5] \"[...]/avhrr-only-v2.19810905.nc:sst\" \"[...]/avhrr-only-v2.19810906.nc:sst\" ## [7] \"[...]/avhrr-only-v2.19810907.nc:sst\" \"[...]/avhrr-only-v2.19810908.nc:sst\" ## [9] \"[...]/avhrr-only-v2.19810909.nc:sst\" ## ## dimension(s): ## from to offset delta refsys x/y ## x 1 1440 0 0.25 NA [x] ## y 1 720 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct"},{"path":"/articles/stars2.html","id":"select-an-area","dir":"Articles","previous_headings":"Stars proxy objects","what":"Select an area","title":"2. stars proxy objects","text":"Another possibility crop, select rectangular region based spatial object. can done passing bbox object, sf, sfc stars object bounding box taken. example:","code":"bb = st_bbox(c(xmin = 10.125, ymin = 0.125, xmax = 70.125, ymax = 70.125)) ysub = y[bb] st_dimensions(ysub) ## from to offset delta refsys x/y ## x 41 281 0 0.25 NA [x] ## y 80 360 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct class(ysub) # still no data here!! ## [1] \"stars_proxy\" \"stars\" plot(ysub, reset = FALSE) # plot reads the data, at resolution that is relevant plot(st_as_sfc(bb), add = TRUE, lwd = .5, border = 'red')"},{"path":"/articles/stars2.html","id":"lazy-evaluation-changing-evaluation-order","dir":"Articles","previous_headings":"Stars proxy objects","what":"Lazy evaluation, changing evaluation order","title":"2. stars proxy objects","text":"actions can carried stars_proxy objects, effect delayed data actually needed (plot, write_stars). instance, range selections dimensions shown first need data, can carried . functions added object, attribute called call_list: allows optimizing order operations done. example, st_apply, reading can done sequentially dimensions function applied: example function applied band (: compute band quantiles), bands can read sequentially, discarded quantiles computed. time series function applied pixel time series result plotted map, time series function evaluated pixels actually plotted. means e.g. order evaluation reversed: plot knows pixels going shown, controls x downsampled st_apply carried subset.","code":"yy = adrop(y) yyy = yy[,1:10,1:10,] class(yyy) # still no data ## [1] \"stars_proxy\" \"stars\" st_dimensions(yyy) # and dimensions not adjusted ## from to offset delta refsys x/y ## x 1 1440 0 0.25 NA [x] ## y 1 720 90 -0.25 NA [y] ## zlev 1 1 0 [m] NA NA ## time 1 9 1981-09-01 UTC 1 days POSIXct attr(yyy, \"call_list\") # the name of object in the call (y) is replaced with x: ## [[1]] ## adrop(x = x, drop = drop) ## attr(,\".Environment\") ## ## ## [[2]] ## x[i = i, 1:10, 1:10, , drop = drop, crop = crop] ## attr(,\".Environment\") ## plot(st_apply(x, c(\"x\", \"y\"), range))"},{"path":"/articles/stars2.html","id":"fetching-the-data","dir":"Articles","previous_headings":"Stars proxy objects > Lazy evaluation, changing evaluation order","what":"Fetching the data","title":"2. stars proxy objects","text":"Fetching data now involves reading whole array evaluating call_list , sequentially:","code":"(x = st_as_stars(yyy)) # read, adrop, subset ## stars object with 3 dimensions and 4 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## sst [°*C] -1.28 -1.17 -1.11 -1.1163555 -1.06 -0.95 ## anom [°*C] 0.48 0.62 0.69 0.6649555 0.72 0.77 ## err [°*C] 0.30 0.30 0.30 0.3000000 0.30 0.30 ## ice [percent] 0.76 0.79 0.81 0.8062889 0.82 0.85 ## dimension(s): ## from to offset delta refsys x/y ## x 1 10 0 0.25 NA [x] ## y 1 10 90 -0.25 NA [y] ## time 1 9 1981-09-01 UTC 1 days POSIXct"},{"path":"/articles/stars2.html","id":"plotting-with-changed-evaluation-order","dir":"Articles","previous_headings":"Stars proxy objects > Lazy evaluation, changing evaluation order","what":"Plotting with changed evaluation order","title":"2. stars proxy objects","text":"Sentinel 2 data, band 4 represents NIR band 1 red, can compute NDVI ","code":"# S2 10m: band 4: near infrared, band 1: red. #ndvi = function(x) (x[4] - x[1])/(x[4] + x[1]) ndvi = function(x1, x2, x3, x4) (x4 - x1)/(x4 + x1) rm(x) (s2.ndvi = st_apply(p, c(\"x\", \"y\"), ndvi)) ## stars_proxy object with 1 attribute in 1 file(s): ## $EPSG_32632 ## [1] \"[...]/MTD_MSIL1C.xml:10m:EPSG_32632\" ## ## dimension(s): ## from to offset delta refsys values x/y ## x 1 10980 3e+05 10 WGS 84 / UTM zone 32N NULL [x] ## y 1 10980 6e+06 -10 WGS 84 / UTM zone 32N NULL [y] ## band 1 4 NA NA NA B4,...,B8 ## call_list: ## [[1]] ## st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, ## PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname) ## attr(,\".Environment\") ## ## ## This object has pending lazy operations: dimensions as printed may not reflect this. system.time(plot(s2.ndvi)) # read - compute ndvi - plot ## downsample set to 18 ## user system elapsed ## 0.693 0.158 0.367"},{"path":"/articles/stars2.html","id":"multi-resolution-proxy-objects","dir":"Articles","previous_headings":"","what":"Multi-resolution proxy objects","title":"2. stars proxy objects","text":"sections shows examples stars_proxy objects deal situation different maps dissimilar resolution. assumptions : maps need origin coordinates (typically upper-left corner) CRS. first map determines “working” resolution, e.g. native downsampled resolutions refer ’ll create four maps cells size 1, 2 3: created three rasters identical cell values dimensions, different cell sizes, hence extents. bind single proxy object, see multi-resolution mentioned printed summary. converting stars object, secondary rasters resampled cellsize + extent first: sub-range, defined object resolutions, get: now create four maps, region ([0,4] x [0,4]), different resolutions (cell size 1, 1/2 1/3): Finally, example first raster higher resolution:","code":"s1 = st_as_stars(matrix(1:16, 4)) s2 = st_as_stars(matrix(1:16, 4)) s3 = st_as_stars(matrix(1:16, 4)) attr(s1, \"dimensions\")$X1$offset = 0 attr(s1, \"dimensions\")$X2$offset = 4 attr(s2, \"dimensions\")$X1$offset = 0 attr(s2, \"dimensions\")$X2$offset = 4 attr(s3, \"dimensions\")$X1$offset = 0 attr(s3, \"dimensions\")$X2$offset = 4 attr(s1, \"dimensions\")$X1$delta = 1 attr(s1, \"dimensions\")$X2$delta = -1 attr(s2, \"dimensions\")$X1$delta = 2 attr(s2, \"dimensions\")$X2$delta = -2 attr(s3, \"dimensions\")$X1$delta = 3 attr(s3, \"dimensions\")$X2$delta = -3 plot(s1, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s2, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s3, axes = TRUE, text_values = TRUE, text_color = 'orange') fn1 = paste0(tempdir(), .Platform$file.sep, \"img1.tif\") fn2 = paste0(tempdir(), .Platform$file.sep, \"img2.tif\") fn3 = paste0(tempdir(), .Platform$file.sep, \"img3.tif\") write_stars(s1, fn1) write_stars(s2, fn2) write_stars(s3, fn3) (r1 = read_stars(c(fn1, fn2, fn3), proxy = TRUE)) ## multi-resolution stars_proxy object with 3 attributes in 3 file(s): ## $`1` ## [1] \"[...]/img1.tif\" ## ## $`2` ## [1] \"[...]/img2.tif\" ## ## $`3` ## [1] \"[...]/img3.tif\" ## ## dimension(s): ## from to offset delta x/y ## x 1 4 0 1 [x] ## y 1 4 4 -1 [y] st_as_stars(r1) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r1[,2:4,2:4]) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) s4 = st_as_stars(matrix(1: 16, 4)) s5 = st_as_stars(matrix(1: 64, 8)) s6 = st_as_stars(matrix(1:144,12)) attr(s4, \"dimensions\")$X1$offset = 0 attr(s4, \"dimensions\")$X2$offset = 4 attr(s5, \"dimensions\")$X1$offset = 0 attr(s5, \"dimensions\")$X2$offset = 4 attr(s6, \"dimensions\")$X1$offset = 0 attr(s6, \"dimensions\")$X2$offset = 4 attr(s4, \"dimensions\")$X1$delta = 1 attr(s4, \"dimensions\")$X2$delta = -1 attr(s5, \"dimensions\")$X1$delta = 1/2 attr(s5, \"dimensions\")$X2$delta = -1/2 attr(s6, \"dimensions\")$X1$delta = 1/3 attr(s6, \"dimensions\")$X2$delta = -1/3 plot(s4, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s5, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s6, axes = TRUE, text_values = TRUE, text_color = 'orange') fn4 = paste0(tempdir(), .Platform$file.sep, \"img4.tif\") fn5 = paste0(tempdir(), .Platform$file.sep, \"img5.tif\") fn6 = paste0(tempdir(), .Platform$file.sep, \"img6.tif\") write_stars(s4, fn4) write_stars(s5, fn5) write_stars(s6, fn6) (r2 = read_stars(c(fn4, fn5, fn6), proxy = TRUE)) ## multi-resolution stars_proxy object with 3 attributes in 3 file(s): ## $`4` ## [1] \"[...]/img4.tif\" ## ## $`5` ## [1] \"[...]/img5.tif\" ## ## $`6` ## [1] \"[...]/img6.tif\" ## ## dimension(s): ## from to offset delta x/y ## x 1 4 0 1 [x] ## y 1 4 4 -1 [y] st_as_stars(r2) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r2[,2:4,2:4]) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) (r3 = read_stars(c(fn6, fn5, fn4), proxy = TRUE)) ## multi-resolution stars_proxy object with 3 attributes in 3 file(s): ## $`6` ## [1] \"[...]/img6.tif\" ## ## $`5` ## [1] \"[...]/img5.tif\" ## ## $`4` ## [1] \"[...]/img4.tif\" ## ## dimension(s): ## from to offset delta x/y ## x 1 12 0 0.3333 [x] ## y 1 12 4 -0.3333 [y] st_as_stars(r3) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r3[,2:6,3:6]) %>% merge() %>% plot(breaks = \"equal\", text_values = TRUE, text_color = 'orange', axes = TRUE)"},{"path":"/articles/stars3.html","id":"slice","dir":"Articles","previous_headings":"","what":"slice","title":"3. stars tidyverse methods","text":"slice slices sub-array cube; done specifying dimension act, slice number. returns lower-dimensional array single element selected along slice dimension.","code":"x %>% slice(band, 6) -> x6 x6 ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 32 60 59.97521 88 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]"},{"path":"/articles/stars3.html","id":"filter","dir":"Articles","previous_headings":"","what":"filter","title":"3. stars tidyverse methods","text":"Similar slice, filter selects dimensions evaluates values rather index: subarray created based x coordinate values. Note filter converts object tbl_cube, uses dplyr filter method tbl_cube objects. limitation stars objects rectilinear, curvilinear simple feature geometries handled. objects, using regular [ selection using st_crop may alternative.","code":"x %>% filter(x > 289000, x < 291000, band > 3) -> x7 x7 ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 5 54 70 71.79194 88 252 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 70 289004 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 3 4 1 NA NA"},{"path":"/articles/stars3.html","id":"pull","dir":"Articles","previous_headings":"","what":"pull","title":"3. stars tidyverse methods","text":"pull pulls array stars object:","code":"x %>% pull(1) -> x8 class(x8) ## [1] \"array\" dim(x8) ## x y band ## 349 352 6"},{"path":"/articles/stars3.html","id":"mutate","dir":"Articles","previous_headings":"","what":"mutate","title":"3. stars tidyverse methods","text":"","code":"x %>% mutate(band2 = 2 * L7_ETMs.tif) -> x2 x2 ## stars object with 3 dimensions and 2 attributes ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## band2 2 108 138 137.82484 172 510 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA"},{"path":"/articles/stars3.html","id":"select","dir":"Articles","previous_headings":"","what":"select","title":"3. stars tidyverse methods","text":"select selects attribute, set attributes:","code":"x2 %>% select(band2) -> x9 x9 ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## band2 2 108 138 137.8248 172 510 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA"},{"path":"/articles/stars3.html","id":"geom_stars","dir":"Articles","previous_headings":"","what":"geom_stars","title":"3. stars tidyverse methods","text":"geom_raster ggplot2 geom function accepts stars objects data argument sets raster vector spatial coordinates plot dimensions, first attribute fill variable allows downsampling (without choosing suitable downsampling level) chooses using geom_raster, geom_rect geom_sf depending whether geometry regular, rectilinear vector geometries example use ","code":"library(ggplot2) library(viridis) ## Loading required package: viridisLite ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_fill_viridis() + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0))"},{"path":"/articles/stars4.html","id":"stars-objects","dir":"Articles","previous_headings":"","what":"Stars objects","title":"4. stars data model","text":"stars objects consist (possibly empty) named list arrays, named dimensions (dim) attribute attribute called dimensions class dimensions carries dimension metadata class name includes stars dimensions object named list dimension elements, describing semantics dimension data arrays (space, time, type etc). addition , dimensions object attribute called raster class stars_raster, named list three elements: dimensions length 2 character; dimension names constitute spatial raster (NA) affine length 2 numeric; two affine parameters geotransform (NA) curvilinear boolean indicating whether raster curvilinear raster (NA) affine curvilinear values relevant case raster data, indicated dimensions non-NA values. dimension object describes single dimension; list named elements : (numeric length 1): start index array : (numeric length 1): end index array offset: (numeric length 1): start coordinate (time) value first pixel (.e., pixel/cell boundary) delta: (numeric length 1): increment, cell size refsys: (character, crs): object describing reference system; e.g. PROJ string, string POSIXct PCICt (360 365 days/year calendars), object class crs (containing EPSG code proj4string) point: (logical length 1): boolean indicating whether cells/pixels refer areas/periods, points/instances (may NA) NULL (missing), vector coordinate values (numeric, POSIXct, PCICt, sfc), object class intervals (list two vectors, start end, interval start- end-values), matrix longitudes latitudes cells (case curvilinear grids) usually 1 dimension size, may larger 1 case sub-grid got selected (cropped). offset delta apply regularly discretized dimensions, NA case. NA, dimension values may held values field. Rectilinear curvilinear grids need grid values values can either: rectilinear grids: irregularly spaced coordinate values, coordinate intervals irregular width (rectilinear grid can one dimension regular), curvilinear grids: matrix grid cell centre values row/col combinations (usually longitude latitude). Alternatively, values can contains set spatial geometries encoded sfc vector (“list-column”), case vector data cube.","code":""},{"path":[]},{"path":"/articles/stars4.html","id":"regular-grids","dir":"Articles","previous_headings":"Grid type","what":"Regular grids","title":"4. stars data model","text":"simple file created 4×54 \\times 5 matrix see rows (5) mapped first dimension, x-coordinate columns (4) mapped second dimension, y-coordinate fields dimension define range corresponds array dimension: offset delta specify increasing row column index maps x y coordinate values respectively. plot object, using image method stars objects, see (0,0)(0,0) origin grid (grid corner), 11 coordinate value increase one index (row, col) next. means consecutive matrix columns represent grid lines, going south north. Grids defined way regular: grid cell size constant everywhere. Many actual grid datasets y coordinates (grid rows) going North South (top bottom); realised negative value delta. see grid origin (0,0)(0,0) change: example GeoTIFF carried package, , probably data sources read GDAL, negative delta y-coordinate:","code":"suppressPackageStartupMessages(library(stars)) m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## A1 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to offset delta point x/y ## x 1 5 0 1 FALSE [x] ## y 1 4 0 1 FALSE [y] dim(s[[1]]) ## x y ## 5 4 image(s, text_values = TRUE, axes = TRUE) attr(s, \"dimensions\")[[2]]$delta = -1 image(s, text_values = TRUE, axes = TRUE) tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") st_dimensions(read_stars(tif))[\"y\"] ## from to offset delta refsys point ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE"},{"path":"/articles/stars4.html","id":"raster-attributes-rotated-and-sheared-grids","dir":"Articles","previous_headings":"Grid type","what":"Raster attributes, rotated and sheared grids","title":"4. stars data model","text":"Dimension tables stars objects carry raster attribute: list holds dimensions: character, names raster dimensions (), opposed e.g. spectral, temporal dimensions affine: numeric, affine parameters curvilinear: logical indicating whether raster curvilinear fields needed level, describe properties array higher level individual dimensions : pair dimensions forms raster, affine curvilinear describe x y pair derived grid indexes (see ) done per-dimension basis. two affine parameters a1a_1 a2a_2, xx yy coordinates derived (1-based) grid indexes ii jj, grid offset values oxo_x oyo_y, grid cell sizes dxd_x dyd_y x=ox+(−1)dx+(j−1)a1x = o_x + (-1) d_x + (j-1) a_1 y=oy+(−1)a2+(j−1)dyy = o_y + (-1) a_2 + (j-1) d_y Clearly, a1=a2=0a_1=a_2=0, xx yy entirely derived respective index, offset cellsize. Note integer indexes, coordinates starting edge grid cell; get grid cell center top left grid cell (case negative dyd_y), use =1.5i=1.5 j=1.5j=1.5. can rotate grids setting a1a_1 a2a_2 non-zero value: rotation angle, degrees, Sheared grids obtained two rotation coefficients, a1a_1 a2a_2, unequal: Now, y-axis x-axis different rotation degrees respectively","code":"str(attr(st_dimensions(s), \"raster\")) ## List of 4 ## $ affine : num [1:2] 0 0 ## $ dimensions : chr [1:2] \"x\" \"y\" ## $ curvilinear: logi FALSE ## $ blocksizes : NULL ## - attr(*, \"class\")= chr \"stars_raster\" attr(attr(s, \"dimensions\"), \"raster\")$affine = c(0.1, 0.1) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) atan2(0.1, 1) * 180 / pi ## [1] 5.710593 attr(attr(s, \"dimensions\"), \"raster\")$affine = c(0.1, 0.2) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) atan2(c(0.1, 0.2), 1) * 180 / pi ## [1] 5.710593 11.309932"},{"path":"/articles/stars4.html","id":"rectilinear-grids","dir":"Articles","previous_headings":"","what":"Rectilinear grids","title":"4. stars data model","text":"Rectilinear grids orthogonal axes, congruent (equally sized shaped) cells: axis irregular subdivision. can define rectilinear grid specifying cell boundaries, meaning every dimension specify one value dimension size: leave last value, stars may come different cell boundary last cell, now derived width one--last cell: problematic cells constant width, case boundaries reduced offset delta value, irrespective whether upper boundary given: Alternatively, one can also set cell midpoints specifying arguments cell_midpoints st_dimensions call: dimension regular, results offset shifted back half delta, else intervals derived distances cell centers. obviously done cell boundaries specified.","code":"x = c(0, 0.5, 1, 2, 4, 5) # 6 numbers: boundaries! y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## m 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to point values x/y ## x 1 5 FALSE [0,0.5),...,[4,5) [x] ## y 1 4 FALSE [0.3,0.5),...,[2,2.2) [y] st_bbox(r) ## xmin ymin xmax ymax ## 0.0 0.3 5.0 2.2 image(r, axes = TRUE, col = grey((1:20)/20)) x = c(0, 0.5, 1, 2, 4) # 5 numbers: offsets only! y = c(0.3, 0.5, 1, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## m 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to point values x/y ## x 1 5 FALSE [0,0.5),...,[4,6) [x] ## y 1 4 FALSE [0.3,0.5),...,[2,3) [y] st_bbox(r) ## xmin ymin xmax ymax ## 0.0 0.3 6.0 3.0 x = c(0, 1, 2, 3, 4) # 5 numbers: offsets only! y = c(0.5, 1, 1.5, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## m 1 5.75 10.5 10.5 15.25 20 ## dimension(s): ## from to offset delta point x/y ## x 1 5 0 1 FALSE [x] ## y 1 4 0.5 0.5 FALSE [y] st_bbox(r) ## xmin ymin xmax ymax ## 0.0 0.5 5.0 2.5 x = st_as_stars(matrix(1:9, 3, 3), st_dimensions(x = c(1, 2, 3), y = c(2, 3, 10), cell_midpoints = TRUE))"},{"path":"/articles/stars4.html","id":"curvilinear-grids","dir":"Articles","previous_headings":"","what":"Curvilinear grids","title":"4. stars data model","text":"Curvilinear grids grids whose grid lines straight. Rather describing curvature parametrically, typical (HDF5 NetCDF) files found two raster layers longitudes latitudes every corresponding pixel remaining layers. example, use Sentinel 5P dataset available package starsdata; package can installed dataset found : can construct curvilinear stars raster calling read_stars right sub-array: array, can see GDAL metadata item GEOLOCATION: reveals , dataset, longitude latitude arrays kept. curvilinear array actual arrays (raster layers, matrices) longitude latitude values read dimension table. can plot file: can downsample data doesn’t look nice, plotting cells polygons looks better: Another approach warp curvilinear grid regular grid, e.g. ","code":"install.packages(\"starsdata\", repos = \"http://pebesma.staff.ifgi.de\", type = \"source\") (s5p = system.file(\"sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\", package = \"starsdata\")) ## [1] \"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\" subs = gdal_subdatasets(s5p) subs[[6]] ## [1] \"NETCDF:\\\"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\\\":/PRODUCT/nitrogendioxide_tropospheric_column\" gdal_metadata(subs[[6]], \"GEOLOCATION\") ## $LINE_OFFSET ## [1] \"0\" ## ## $LINE_STEP ## [1] \"1\" ## ## $PIXEL_OFFSET ## [1] \"0\" ## ## $PIXEL_STEP ## [1] \"1\" ## ## $SRS ## [1] \"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.0174532925199433,AUTHORITY[\\\"EPSG\\\",\\\"9122\\\"]],AXIS[\\\"Latitude\\\",NORTH],AXIS[\\\"Longitude\\\",EAST],AUTHORITY[\\\"EPSG\\\",\\\"4326\\\"]]\" ## ## $X_BAND ## [1] \"1\" ## ## $X_DATASET ## [1] \"NETCDF:\\\"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\\\":/PRODUCT/longitude\" ## ## $Y_BAND ## [1] \"1\" ## ## $Y_DATASET ## [1] \"NETCDF:\\\"/home/runner/work/_temp/Library/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\\\":/PRODUCT/latitude\" ## ## attr(,\"class\") ## [1] \"gdal_metadata\" nit.c = read_stars(subs[[6]]) ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. ## Warning in CPL_read_gdal(as.character(x), as.character(options), ## as.character(driver), : GDAL Message 1: The dataset has several variables that ## could be identified as vector fields, but not all share the same primary ## dimension. Consequently they will be ignored. threshold = units::set_units(9e+36, mol/m^2) nit.c[[1]][nit.c[[1]] > threshold] = NA nit.c ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. ## nitrogendioxide_tropospheri... [mol/m^2] -3.301083e-05 1.868205e-05 ## Median Mean 3rd Qu. ## nitrogendioxide_tropospheri... [mol/m^2] 2.622178e-05 2.898976e-05 3.629641e-05 ## Max. NA's ## nitrogendioxide_tropospheri... [mol/m^2] 0.0003924858 330 ## dimension(s): ## from to offset refsys values x/y ## x 1 450 NA WGS 84 [450x278] -5.811 [°],...,30.95 [°] [x] ## y 1 278 NA WGS 84 [450x278] 28.36 [°],...,51.47 [°] [y] ## time 1 1 2018-07-17 UTC POSIXct NULL ## curvilinear grid plot(nit.c, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') plot(nit.c, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') (nit.c_ds = stars:::st_downsample(nit.c, 8)) ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median ## nitrogendioxide_tropospheri... [mol/m^2] -1.847503e-05 1.85778e-05 2.700901e-05 ## Mean 3rd Qu. Max. ## nitrogendioxide_tropospheri... [mol/m^2] 2.9113e-05 3.642568e-05 0.0001363282 ## NA's ## nitrogendioxide_tropospheri... [mol/m^2] 32 ## dimension(s): ## from to offset refsys values x/y ## x 1 50 NA WGS 84 [50x31] -5.811 [°],...,30.14 [°] [x] ## y 1 31 NA WGS 84 [50x31] 28.78 [°],...,51.47 [°] [y] ## time 1 1 2018-07-17 UTC POSIXct NULL ## curvilinear grid plot(nit.c_ds, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') plot(nit.c_ds, breaks = \"equal\", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) ## Warning in NextMethod(): NaNs produced ## Warning in plot.sf(x, pal = col, ...): NaNs produced maps::map('world', add = TRUE, col = 'red') w = st_warp(nit.c, crs = 4326, cellsize = 0.25) ## Warning in transform_grid_grid(st_as_stars(src), st_dimensions(dest), ## threshold): using Euclidean distance measures on geodetic coordinates ## threshold set to 0.108545 : set a larger value if you see missing values where there shouldn't be plot(w)"},{"path":"/articles/stars5.html","id":"rasterizing-an-sf-vector-object","dir":"Articles","previous_headings":"","what":"Rasterizing an sf vector object","title":"5. vector-raster conversions, reprojection, warping","text":"algorithm used GDAL rasterize utility, options utility can passed st_rasterize. geometry final raster can controlled passing target bounding box either raster dimensions nx ny, pixel size dx dy parameters.","code":"library(stars) ## Loading required package: abind system.file(\"gpkg/nc.gpkg\", package = \"sf\") %>% read_sf() %>% st_transform(32119) -> nc nc$dens = nc$BIR79 / units::set_units(st_area(nc), km^2) (nc.st = st_rasterize(nc[\"dens\"], dx = 5000, dy = 5000)) ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## file27f483a3a2a [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 ## NA's ## file27f483a3a2a [1/km^2] 4808 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 162 123829 5000 NAD83 / North Carolina FALSE [x] ## y 1 61 318260 -5000 NAD83 / North Carolina FALSE [y] plot(nc.st)"},{"path":"/articles/stars5.html","id":"vectorizing-a-raster-object-to-an-sf-object","dir":"Articles","previous_headings":"","what":"Vectorizing a raster object to an sf object","title":"5. vector-raster conversions, reprojection, warping","text":"stars objects can converted sf object using st_as_sf. number options, depending whether pixels represent point value pixel center, small square polygons single value. work landsat-7 6-band image, select first band round values:","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif)[, 1:50, 1:50, 1:2] x[[1]] = round(x[[1]]/5)"},{"path":"/articles/stars5.html","id":"polygonizing","dir":"Articles","previous_headings":"Vectorizing a raster object to an sf object","what":"Polygonizing","title":"5. vector-raster conversions, reprojection, warping","text":"case raster cells reflect point values want get vector representation whole field, can draw contour lines export contour sets (available GDAL version least 2.4.0):","code":"l = st_contour(x, contour_lines = TRUE, breaks = 11:15) plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8)"},{"path":"/articles/stars5.html","id":"exporting-to-points","dir":"Articles","previous_headings":"Vectorizing a raster object to an sf object","what":"Exporting to points","title":"5. vector-raster conversions, reprojection, warping","text":"Alternatively, can simply export pixels points, get either wide table bands per point, replicated POINT geometries: long table single attribute points replicated: can see, additional attribute band now indicates band concerned.","code":"st_as_sf(x, as_points = TRUE, merge = FALSE) ## Simple feature collection with 2500 features and 2 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: 288790.5 ymin: 9119350 xmax: 290187 ymax: 9120747 ## Projected CRS: SIRGAS 2000 / UTM zone 25S ## First 10 features: ## L7_ETMs.tif.V1 L7_ETMs.tif.V2 geometry ## 1 14 11 POINT (288790.5 9120747) ## 2 14 11 POINT (288819 9120747) ## 3 13 10 POINT (288847.5 9120747) ## 4 12 9 POINT (288876 9120747) ## 5 12 10 POINT (288904.5 9120747) ## 6 12 10 POINT (288933 9120747) ## 7 12 10 POINT (288961.5 9120747) ## 8 12 10 POINT (288990 9120747) ## 9 13 10 POINT (289018.5 9120747) ## 10 13 10 POINT (289047 9120747) st_as_sf(x, as_points = TRUE, merge = FALSE, long = TRUE) ## Simple feature collection with 5000 features and 2 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: 288790.5 ymin: 9119350 xmax: 290187 ymax: 9120747 ## Projected CRS: SIRGAS 2000 / UTM zone 25S ## First 10 features: ## band L7_ETMs.tif geometry ## 1 1 14 POINT (288790.5 9120747) ## 2 1 14 POINT (288819 9120747) ## 3 1 13 POINT (288847.5 9120747) ## 4 1 12 POINT (288876 9120747) ## 5 1 12 POINT (288904.5 9120747) ## 6 1 12 POINT (288933 9120747) ## 7 1 12 POINT (288961.5 9120747) ## 8 1 12 POINT (288990 9120747) ## 9 1 13 POINT (289018.5 9120747) ## 10 1 13 POINT (289047 9120747)"},{"path":"/articles/stars5.html","id":"exporting-to-polygons","dir":"Articles","previous_headings":"Vectorizing a raster object to an sf object","what":"Exporting to polygons","title":"5. vector-raster conversions, reprojection, warping","text":"Alternatively, can export polygons either get single polygon per pixel, merge polygons identical pixel values; plotted boundaries, see resolved boundaries areas pixel value: option connect8 can set TRUE use 8 connectedness, rather default 4 connectedness algorithm. cases, polygons returned often invalid according simple feature standard, can made valid using lwgeom::st_make_valid.","code":"st_as_sf(x[1], as_points = FALSE, merge = FALSE) ## Simple feature collection with 2500 features and 2 fields ## Geometry type: POLYGON ## Dimension: XY ## Bounding box: xmin: 288776.3 ymin: 9119336 xmax: 290201.3 ymax: 9120761 ## Projected CRS: SIRGAS 2000 / UTM zone 25S ## First 10 features: ## L7_ETMs.tif.V1 L7_ETMs.tif.V2 geometry ## 1 14 11 POLYGON ((288776.3 9120761,... ## 2 14 11 POLYGON ((288804.8 9120761,... ## 3 13 10 POLYGON ((288833.3 9120761,... ## 4 12 9 POLYGON ((288861.8 9120761,... ## 5 12 10 POLYGON ((288890.3 9120761,... ## 6 12 10 POLYGON ((288918.8 9120761,... ## 7 12 10 POLYGON ((288947.3 9120761,... ## 8 12 10 POLYGON ((288975.8 9120761,... ## 9 13 10 POLYGON ((289004.3 9120761,... ## 10 13 10 POLYGON ((289032.8 9120761,... p = st_as_sf(x, as_points = FALSE, merge = TRUE) plot(p)"},{"path":"/articles/stars5.html","id":"switching-between-vector-and-raster-in-stars-objects","dir":"Articles","previous_headings":"","what":"Switching between vector and raster in stars objects","title":"5. vector-raster conversions, reprojection, warping","text":"can convert raster dimension vector dimension keeping dimensions stars object also requires setting as_points arguments st_as_sf.","code":"x.sf = st_xy2sfc(x, as_points = TRUE) x.sf ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 7 9 11 11.2548 12 28 ## dimension(s): ## from to refsys point ## geometry 1 2500 SIRGAS 2000 / UTM zone 25S TRUE ## band 1 2 NA NA ## values ## geometry POINT (288790.5 9120747),...,POINT (290187 9119350) ## band NULL"},{"path":"/articles/stars5.html","id":"reprojecting-a-raster","dir":"Articles","previous_headings":"","what":"Reprojecting a raster","title":"5. vector-raster conversions, reprojection, warping","text":"accept curvilinear rasters rasters , regular rectilinear grids special cases curvilinear grids, reprojecting raster longer “problem”, just recomputes new coordinates every raster cell, generally results curvilinear grid (sometimes can brought back regular rectilinear grid). curvilinear grid cells represented coordinates cell center, actual shape grid cell gets lost, may larger effect grid cells large transformation stronger non-linear. example reprojection grid created noted dimensionality grid didn’t change: set raster cells replotted new CRS, now curvilinear grid.","code":"nc.st %>% st_transform(\"+proj=laea +lat_0=34 +lon_0=-60\") -> nc.curv nc.curv ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## file27f483a3a2a [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 21.24828 ## NA's ## file27f483a3a2a [1/km^2] 4808 ## dimension(s): ## from to refsys point values ## x 1 162 +proj=laea +lat_0=34 +lon... FALSE [162x61] -2210936,...,-1371611 ## y 1 61 +proj=laea +lat_0=34 +lon... FALSE [162x61] 90650,...,538204 ## x/y ## x [x] ## y [y] ## curvilinear grid plot(nc.curv, border = NA, graticule = TRUE)"},{"path":"/articles/stars5.html","id":"warping-a-raster","dir":"Articles","previous_headings":"","what":"Warping a raster","title":"5. vector-raster conversions, reprojection, warping","text":"Warping raster means creating new regular grid new CRS, based (usually regular) grid another CRS. can transformation previous section first creating target grid: warping old raster new new object regular grid new CRS, aligned new x- y-axes.","code":"nc %>% st_transform(\"+proj=laea +lat_0=34 +lon_0=-60\") %>% st_bbox() %>% st_as_stars() -> newgrid nc.st %>% st_warp(newgrid) -> nc.new nc.new ## stars object with 2 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## file27f483a3a2a [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 21.24828 ## NA's ## file27f483a3a2a [1/km^2] 36155 ## dimension(s): ## from to offset delta refsys x/y ## x 1 380 -2188110 2098 +proj=laea +lat_0=34 +lon... [x] ## y 1 171 494924 -2098 +proj=laea +lat_0=34 +lon... [y] plot(nc.new)"},{"path":"/articles/stars6.html","id":"comment-legend","dir":"Articles","previous_headings":"","what":"COMMENT LEGEND","title":"6. How `raster` functions map to `stars` functions","text":"? = sure / unknown * = present, low priority # = present, high priority NA = available design","code":""},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":"/articles/stars6.html","id":"computing-row-column-cell-numbers-and-coordinates","dir":"Articles","previous_headings":"","what":"Computing row, column, cell numbers and coordinates","title":"6. How `raster` functions map to `stars` functions","text":"format table follows raster-package entry raster manual, found https://cran.r-project.org/web/packages/raster/raster.pdf.","code":""},{"path":"/articles/stars7.html","id":"training-and-prediction-with-stars-objects","dir":"Articles","previous_headings":"","what":"Training and prediction with stars objects","title":"7. Statistical modelling with stars objects","text":"usual way statistical modelling R uses data.frames (tibbles), proceeds like model function like lm, glm, randomForest etc. returns classed object, predict generic can choose right prediction function based class. formula looks like y ~ x1+x2 specifies dependent variable (y) predictors (x1, x2), found columns data. newdata needs predictors columns, returns predicted values y values predictors.","code":"m = model(formula, data) pr = predict(m, newdata)"},{"path":"/articles/stars7.html","id":"stars-objects-as-data-frames","dir":"Articles","previous_headings":"Training and prediction with stars objects","what":"stars objects as data.frames","title":"7. Statistical modelling with stars objects","text":"analogy stars objects data.frame : attribute (array) becomes single column dimensions become added (index) columns see works 6-band example dataset, consider : see get one single variable object (array) name, added columns dimension values (x, y, band). typical case, like six bands distributed six variables, single observation (row) x/y pair. , use e.g. utils::unstack dplyr::pivot_wider data.frame, efficient way use dedicated split method stars objects, resolves dimension splits attributes, one dimension value: reason split efficient mentioned alternatives () split match records based dimensions (x/y), (ii) works --memory (stars_proxy) arrays, chunked process/write loop write_stars(). ### Predict stars objects pattern obtain predictions pixels stars objects : use full dataset sample train model, using .data.frame() (possibly split) use predict(star_object, model) predict pixels stars_object, using stars-wrapper predict method model. predict method model, provide one (see kmeans example ) works stars objects (-memory) stars_proxy objects (-memory). plotting stars_proxy objects, downsampling done prediction (predicting pixels shown), full rasters can written disk write_stars(), carry predictions chunks read written.","code":"library(stars) ## Loading required package: abind ## Loading required package: sf ## Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE l7 = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") %>% read_stars() l7 ## stars object with 3 dimensions and 1 attribute ## attribute(s): ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## L7_ETMs.tif 1 54 69 68.91242 86 255 ## dimension(s): ## from to offset delta refsys point x/y ## x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] ## y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] ## band 1 6 NA NA NA NA as.data.frame(l7) %>% head() ## x y band L7_ETMs.tif ## 1 288790.5 9120747 1 69 ## 2 288819.0 9120747 1 69 ## 3 288847.5 9120747 1 63 ## 4 288876.0 9120747 1 60 ## 5 288904.5 9120747 1 61 ## 6 288933.0 9120747 1 61 l7 %>% split(\"band\") %>% as.data.frame() %>% head() ## x y X1 X2 X3 X4 X5 X6 ## 1 288790.5 9120747 69 56 46 79 86 46 ## 2 288819.0 9120747 69 57 49 75 88 49 ## 3 288847.5 9120747 63 52 45 66 75 41 ## 4 288876.0 9120747 60 45 35 66 69 38 ## 5 288904.5 9120747 61 52 44 76 92 60 ## 6 288933.0 9120747 61 50 37 78 74 38"},{"path":"/articles/stars7.html","id":"models-fitted-for-every-pixel","dir":"Articles","previous_headings":"","what":"models fitted for every pixel","title":"7. Statistical modelling with stars objects","text":"can run models many different ways array data. One way run single model pixels, model operates e.g. spectral (band) temporal dimension. example given vignette 2, NDVI computed red near infrared band. NDVI involve estimating parameters, reducing two bands one. example fit model every pixel fit time series model pixel time series, output one model coefficients pixel; shown next.","code":""},{"path":"/articles/stars7.html","id":"linear-regression-on-pixel-time-series","dir":"Articles","previous_headings":"models fitted for every pixel","what":"Linear regression on pixel time series","title":"7. Statistical modelling with stars objects","text":"can read avhrr dataset, containing 9 days: use function computes slope regression line temperature time. get temperatures vector first argument function supplied st_apply, t already defined. function look like optimize bit, using anyNA lm.fit rather lm: result lazily defined (adrop drops singular dimension) computed following command, computations restricted pixels plotted: interesting pattern appears (despite short time series!): SST reveals main signal colder getting equator, changes SST show much fine grained structures areas going , others going . diverging color ramp better choice , distinguish positive negative trends.","code":"library(stars) x = c(\"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\", \"avhrr-only-v2.19810905.nc\", \"avhrr-only-v2.19810906.nc\", \"avhrr-only-v2.19810907.nc\", \"avhrr-only-v2.19810908.nc\", \"avhrr-only-v2.19810909.nc\") file_list = system.file(paste0(\"netcdf/\", x), package = \"starsdata\") y = read_stars(file_list, sub = \"sst\", quiet = TRUE, proxy = TRUE) (t = st_get_dimension_values(y, 4)) ## [1] \"1981-09-01 UTC\" \"1981-09-02 UTC\" \"1981-09-03 UTC\" \"1981-09-04 UTC\" ## [5] \"1981-09-05 UTC\" \"1981-09-06 UTC\" \"1981-09-07 UTC\" \"1981-09-08 UTC\" ## [9] \"1981-09-09 UTC\" slope = function(x) { if (any(is.na(x))) NA_real_ else coeffients(lm(x~t))[2] } slope = function(x) { if (anyNA(x)) NA_real_ else lm.fit(cbind(1, t), x)$coefficients[2] } out = st_apply(adrop(y), c(1,2), slope) plot(out, breaks = \"equal\", main = \"9-day time trend (slope)\") ## downsample set to 1"},{"path":[]},{"path":"/articles/stars7.html","id":"principal-components","dir":"Articles","previous_headings":"Unsupervised learners","what":"Principal components","title":"7. Statistical modelling with stars objects","text":"first example, build principal components entire dataset, rather small. see, amongst others, PC1 picks difference sea (dark) land, PC2 3 structures sea coastal waters. second example, build principal components sample entire dataset, entire dataset rather large. apply , using predict, pixels shown plot (.e. reduced rather full resolution) plotting , ’ll add country borders delineate sea, obtained mapdata package: plot results independent color ranges, every PC stretched entire grey scale. suggests PC1 picks difference cloud signal (difference clouds non-clouds), PC2 difference sea land areas, PC4 sensor artefacts (striping swath direction). compute full resolution (10000 x 10000 pixels) results write file, use","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") r = split(read_stars(tif)) pc = prcomp(as.data.frame(r)[,-(1:2)]) # based on all data out = predict(r, pc) plot(merge(out), breaks = \"equal\", join_zlim = FALSE) granule = system.file(\"sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip\", package = \"starsdata\") s2 = paste0(\"SENTINEL2_L1C:/vsizip/\", granule, \"/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632\") p = read_stars(s2, proxy = TRUE, NA_value = 0) %>% split() r = st_sample(p, 1000) pc = prcomp(na.omit(as.data.frame(r))[,-(1:2)]) # based on all data out = predict(p, pc) bb = st_bbox(p) %>% st_as_sfc() %>% st_transform(4326) %>% st_bbox() library(maps) library(mapdata) m = map(\"worldHires\", xlim = bb[c(1,3)], ylim = bb[c(2,4)], plot=F,fill=TRUE) %>% st_as_sfc() %>% st_transform(st_crs(r)) plt_boundary = function() plot(m, border = 'orange', add = TRUE) plot(merge(out), hook = plt_boundary, join_zlim = FALSE) ## downsample set to 18 write_stars(merge(out), \"out.tif\")"},{"path":"/articles/stars7.html","id":"k-means-clustering","dir":"Articles","previous_headings":"Unsupervised learners","what":"K-means clustering","title":"7. Statistical modelling with stars objects","text":"small dataset: seems pick fair number land cover classes: water (5), rural (3), densely populated (1, 2). large(r) dataset: see class 1 3 identify unclouded area, 3 land, classes seem mainly catch aspects cloud signal.","code":"library(clue) predict.kmeans = function(object, newdata, ...) { unclass(clue::cl_predict(object, newdata[, -c(1:2)], ...)) } tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") i = read_stars(tif, proxy = TRUE) %>% split() nclus = 5 sam = st_sample(i, 1000) k = kmeans(na.omit(as.data.frame(sam)[, -c(1:2)]), nclus) out = predict(i, k) plot(out, col = sf.colors(nclus, categorical=TRUE)) i = read_stars(s2, proxy = TRUE, NA_value = 0) %>% split() sam = st_sample(i, 1000) k = kmeans(na.omit(as.data.frame(sam)[, -c(1:2)]), nclus) out = predict(i, k) plot(out, col = sf.colors(nclus, categorical=TRUE), reset = FALSE) ## downsample set to 18 plot(m, add = TRUE)"},{"path":[]},{"path":"/articles/stars7.html","id":"random-forest-land-use-classification","dir":"Articles","previous_headings":"Supervised learners","what":"Random Forest land use classification","title":"7. Statistical modelling with stars objects","text":"following example purely educational purposes; classified “land use” just rough approximation seems easily visible image: sea, land, areas partially covered clouds. opted therefore four classes: sea, land, clouds sea, clouds land. polygon areas land use classified, residing GeoPackage file. (file created using QGIS, using instructions found .) Next, need points, sampled inside polygons, need extract satellite spectral data comes rather trivial finding land sea can well predicted clouds, less trivial finding can reasonably distinguished patchy clouds kind. Note predictions kind pure pixel-based: prediction spectral bands pixel considered, instance neighboring pixels.","code":"# for all, multi-resolution, use: bands = c(\"B04\", \"B03\", \"B02\", \"B08\", \"B01\", \"B05\", \"B06\", \"B07\", \"B8A\", \"B09\", \"B10\", \"B11\", \"B12\") # bands = c(\"B04\", \"B03\", \"B02\", \"B08\") s2 = paste0(\"/vsizip/\", granule, \"/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/GRANULE/L1C_T32ULE_A013919_20180220T105539/IMG_DATA/T32ULE_20180220T105051_\", bands, \".jp2\") r = read_stars(s2, proxy = TRUE, NA_value = 0) %>% setNames(bands) cl = read_sf(system.file(\"gpkg/s2.gpkg\", package = \"stars\")) %>% st_transform(st_crs(r)) plot(r, reset = FALSE) ## downsample set to 8 plot(cl, add = TRUE) plot(m, add = TRUE, border = 'orange') pts = st_sample(cl, 1000, \"regular\") %>% st_as_sf() %>% st_intersection(cl) ## Warning: attribute variables are assumed to be spatially constant throughout ## all geometries train = st_extract(r, pts) train$use = as.factor(pts$use) # no need for join, since the order did not change train ## Simple feature collection with 1000 features and 14 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: 328195.1 ymin: 5909563 xmax: 407928.8 ymax: 5970391 ## Projected CRS: WGS 84 / UTM zone 32N ## First 10 features: ## B04 B03 B02 B08 B01 B05 B06 B07 B8A B09 B10 B11 B12 ## 1 921 1139 1396 2375 1744 1180 1860 2099 2396 1006 15 1458 779 ## 2 879 1136 1366 2935 1728 1246 2148 2537 2814 994 14 1669 887 ## 3 870 1029 1338 1872 1694 1076 1567 1765 2042 824 14 1629 856 ## 4 1016 1228 1439 3054 1789 1477 2655 3057 3427 1207 15 2220 1210 ## 5 1010 1145 1449 2039 1782 1302 1724 1975 2144 860 10 1795 999 ## 6 1344 1213 1475 1943 1770 1427 1684 1901 2143 863 14 2276 1365 ## 7 1067 1204 1472 2348 1778 1369 2057 2306 2685 1032 17 2010 1179 ## 8 1035 1144 1437 2289 1760 1299 1891 2246 2637 1042 11 1788 920 ## 9 854 1047 1371 1902 1715 1146 1815 1941 2133 782 16 1568 949 ## 10 941 1155 1379 2802 1689 1380 2268 2595 2976 1058 15 2012 1086 ## x use ## 1 POINT (394518.2 5940525) land ## 2 POINT (390045.1 5931738) land ## 3 POINT (390340.9 5929888) land ## 4 POINT (391254 5938829) land ## 5 POINT (391997.7 5937843) land ## 6 POINT (395680.9 5933296) land ## 7 POINT (388792.2 5934807) land ## 8 POINT (392185.2 5940074) land ## 9 POINT (387142.8 5936359) land ## 10 POINT (390877.6 5927178) land library(randomForest) ## randomForest 4.7-1.1 ## Type rfNews() to see new features/changes/bug fixes. ## ## Attaching package: 'randomForest' ## The following object is masked from 'package:dplyr': ## ## combine train = as.data.frame(train) train$x = NULL # remove geometry rf = randomForest(use ~ ., train) # ~ . : use all other attributes pr = predict(r, rf) plot(pr, reset = FALSE, key.pos = 1) ## downsample set to 8 # add country outline: plot(m, add = TRUE)"},{"path":"/articles/stars7.html","id":"parallel-processing","dir":"Articles","previous_headings":"","what":"Parallel processing","title":"7. Statistical modelling with stars objects","text":"machine learning models support multithreading default (e.g., ranger xgboost), rule. R single-threaded, using appropriate packages can easily parallelize calculations, reduce data processing time. example tutorial showing step--step unsupervised classification using multithreading can found R-Spatial blog.","code":""},{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Edzer Pebesma. Author, maintainer. Michael Sumner. Contributor. Etienne Racine. Contributor. Adriano Fantini. Contributor. David Blodgett. Contributor. Krzysztof Dyba. Contributor.","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Pebesma E, Bivand R (2023). Spatial Data Science: applications R. Chapman Hall/CRC, London. doi:10.1201/9780429459016, https://r-spatial.org/book/.","code":"@Book{, title = {{Spatial Data Science: With applications in R}}, author = {Edzer Pebesma and Roger Bivand}, year = {2023}, publisher = {Chapman and Hall/CRC}, address = {London}, url = {https://r-spatial.org/book/}, pages = {352}, doi = {10.1201/9780429459016}, }"},{"path":"/index.html","id":"spatiotemporal-arrays-raster-and-vector-datacubes","dir":"","previous_headings":"","what":"Spatiotemporal Arrays, Raster and Vector Data Cubes","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Spatiotemporal data often comes form dense arrays, space time array dimensions. Examples include socio-economic demographic data, environmental variables monitored fixed stations, raster maps time series satellite images multiple spectral bands, spatial simulations, climate weather model output. R package provides classes methods reading, manipulating, plotting writing data cubes, extent proper formats .","code":""},{"path":"/index.html","id":"raster-and-vector-data-cubes","dir":"","previous_headings":"","what":"Raster and vector data cubes","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"canonical data cube us mind two dimensions represent spatial raster dimensions, third time (band), e.g. shown : data cubes however also consider higher-dimensional cubes (hypercubes) five-dimensional cube addition time, spectral band sensor form dimensions: lower-dimensional cubes raster image: Raster data need regular aligned North/East, package stars supports besides regular also rotated, sheared, rectilinear curvilinear rasters: Vector data cubes arise two regularly discretized spatial dimensions, single dimension points distinct spatial feature geometries, polygons (e.g. denoting administrative regions): points (e.g. denoting sensor locations): NetCDF’s CF-convention calls discrete axis.","code":"suppressPackageStartupMessages(library(dplyr)) library(stars) # Loading required package: abind # Loading required package: sf # Linking to GEOS 3.11.2, GDAL 3.7.2, PROJ 9.3.0; sf_use_s2() is TRUE tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") read_stars(tif) |> slice(index = 1, along = \"band\") |> plot()"},{"path":"/index.html","id":"netcdf-gdal","dir":"","previous_headings":"","what":"NetCDF, GDAL","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"stars provides two functions read data: read_ncdf read_stars, latter reads GDAL. (future, integrated read_stars.) reading NetCDF files, package RNetCDF used, reading GDAL, package sf provides binary linking GDAL. vector raster operations, stars uses much possible routines available GDAL PROJ (e.g. st_transform, rasterize, polygonize, warp). Read vignette vector-raster conversions, reprojection, warping.","code":""},{"path":"/index.html","id":"out-of-memory-on-disk-rasters","dir":"","previous_headings":"","what":"Out-of-memory (on-disk) rasters","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Package stars provides stars_proxy objects (currently read GDAL), contain dimensions metadata pointers files disk. objects work lazily: reading processing data postponed moment pixels really needed (plot time, writing disk), done lowest spatial resolution possible still fulfills resolution graphics device. details found stars proxy vignette. following methods currently available stars_proxy objects:","code":"methods(class = \"stars_proxy\") # [1] [ [[<- [<- adrop # [5] aggregate aperm as.data.frame c # [9] coerce dim droplevels filter # [13] hist image initialize is.na # [17] Math merge mutate Ops # [21] plot predict print pull # [25] rename select show slice # [29] slotsFromS3 split st_apply st_as_sf # [33] st_as_stars st_crop st_dimensions<- st_downsample # [37] st_mosaic st_normalize st_redimension st_sample # [41] st_set_bbox transmute write_stars # see '?methods' for accessing help and source code"},{"path":"/index.html","id":"raster-and-vector-time-series-analysis-example","dir":"","previous_headings":"","what":"Raster and vector time series analysis example","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"following, curvilinear grid hourly precipitation values hurricane imported first 12 time steps plotted: next, intersected counties North Carolina, maximum precipitation intensity obtained per county, plotted: can integrate (reduce) time, instance find maximum precipitation occurred. following code finds time index, corresponding time value: package cubble, can make glyph map see magnitude timings county maximum precipitation:","code":"prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") (prec = read_stars(gdal_subdatasets(prec_file)[[1]])) # stars object with 3 dimensions and 1 attribute # attribute(s): # Min. 1st Qu. Median Mean 3rd Qu. # Total_precipitation_surface... [kg/m^2] 0 0 0.75 4.143009 4.63 # Max. # Total_precipitation_surface... [kg/m^2] 163.75 # dimension(s): # from to offset delta refsys # x 1 87 NA NA WGS 84 (CRS84) # y 1 118 NA NA WGS 84 (CRS84) # time 1 23 2018-09-13 19:00:00 UTC 1 hours POSIXct # values x/y # x [87x118] -80.61 [°],...,-74.88 [°] [x] # y [87x118] 32.44 [°],...,37.62 [°] [y] # time NULL # curvilinear grid # or: (prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\"), ignore_bounds = TRUE)) sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") |> st_transform(st_crs(prec)) -> nc # transform from NAD27 to WGS84 nc_outline = st_union(st_geometry(nc)) plot_hook = function() plot(nc_outline, border = 'red', add = TRUE) prec |> slice(index = 1:12, along = \"time\") |> plot(downsample = c(3, 3, 1), hook = plot_hook) a = aggregate(prec, by = nc, FUN = max) plot(a, max.plot = 23, border = 'grey', lwd = .5) index_max = function(x) ifelse(all(is.na(x)), NA, which.max(x)) b = st_apply(a, \"geom\", index_max) b |> mutate(when = st_get_dimension_values(a, \"time\")[b$index_max]) |> select(when) |> plot(key.pos = 1, main = \"time of maximum precipitation\") library(cubble) # # Attaching package: 'cubble' # The following object is masked from 'package:stats': # # filter library(ggplot2) a |> setNames(\"precip\") |> st_set_dimensions(2, name = \"tm\") |> units::drop_units() |> as_cubble(key = id, index = tm) |> suppressWarnings() -> a.cb a.cb |> face_temporal() |> unfold(long, lat) |> mutate(tm = as.numeric(tm)) |> ggplot(aes(x_major = long, x_minor = tm, y_major = lat, y_minor = precip)) + geom_sf(data = nc, inherit.aes = FALSE) + geom_glyph_box(width = 0.3, height = 0.1) + geom_glyph(width = 0.3, height = 0.1) # Warning: There were 84 warnings in `dplyr::mutate()`. # The first warning was: # ℹ In argument: `y = .data$y_major + rescale11(.data$y_minor) * .data$height/2`. # ℹ In group 12: `group = 12`. # Caused by warning in `min()`: # ! no non-missing arguments to min; returning Inf # ℹ Run `dplyr::last_dplyr_warnings()` to see the 83 remaining warnings. # Warning: Removed 966 rows containing missing values or values outside the scale range # (`geom_glyph_box()`). # Warning: Removed 966 rows containing missing values or values outside the scale range # (`geom_glyph()`)."},{"path":[]},{"path":"/index.html","id":"gdalcubes","dir":"","previous_headings":"Other packages for data cubes","what":"gdalcubes","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Package gdalcubes can used create data cubes (functions ) image collections, sets multi-band images varying spatial resolution spatial extent coordinate reference systems (e.g., spread multiple UTM zones) observation times resampling /aggregating space /time. reuses GDAL VRT’s gdalwarp spatial resampling /warping, handles temporal resampling aggregation .","code":""},{"path":"/index.html","id":"ncdfgeom","dir":"","previous_headings":"Other packages for data cubes","what":"ncdfgeom","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"ncdfgeom reads writes vector data cubes netcdf files standards-compliant way.","code":""},{"path":"/index.html","id":"raster-and-terra","dir":"","previous_headings":"Other packages for data cubes","what":"raster and terra","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"Packages raster successor, terra powerful packages handling raster maps stacks raster maps memory disk, address non-raster time series, multi-attribute rasters time series rasters mixed type attributes (e.g., numeric, logical, factor, POSIXct) rectilinear curvilinear rasters list stars commands matching existing raster commands found wiki. list translations opposite direction (stars raster terra) still needs made. comment differences stars terra found .","code":""},{"path":"/index.html","id":"other-stars-resources","dir":"","previous_headings":"","what":"Other stars resources:","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"blog posts: first, second, third, newer blog posts vignettes original R Consortium proposal.","code":""},{"path":"/index.html","id":"acknowledgment","dir":"","previous_headings":"Other stars resources:","what":"Acknowledgment","title":"Spatiotemporal Arrays, Raster and Vector Data Cubes","text":"project realized financial support ","code":""},{"path":"/reference/L7_ETMs.html","id":null,"dir":"Reference","previous_headings":"","what":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","title":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","text":"Probably containing six 30 m bands: Band 1 Visible (0.45 - 0.52 µm) 30 m Band 2 Visible (0.52 - 0.60 µm) 30 m Band 3 Visible (0.63 - 0.69 µm) 30 m Band 4 Near-Infrared (0.77 - 0.90 µm) 30 m Band 5 Short-wave Infrared (1.55 - 1.75 µm) 30 m Band 7 Mid-Infrared (2.08 - 2.35 µm) 30 m","code":""},{"path":"/reference/L7_ETMs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","text":"","code":"L7_ETMs"},{"path":"/reference/L7_ETMs.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Landsat-7 bands for a selected region around Olinda, BR — L7_ETMs","text":"object class stars_proxy (inherits stars) dimension 349 x 352 x 6.","code":""},{"path":"/reference/aggregate.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"spatially or temporally aggregate stars object — aggregate.stars","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"spatially temporally aggregate stars object, returning data cube lower spatial temporal resolution","code":""},{"path":"/reference/aggregate.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"","code":"# S3 method for class 'stars' aggregate( x, by, FUN, ..., drop = FALSE, join = st_intersects, as_points = any(st_dimension(by) == 2, na.rm = TRUE), rightmost.closed = FALSE, left.open = FALSE, exact = FALSE )"},{"path":"/reference/aggregate.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"x object class stars information aggregated object class sf sfc spatial aggregation, temporal aggregation vector time values (Date, POSIXct, PCICt) interpreted sequence left-closed, right-open time intervals string like \"months\", \"5 days\" like (see cut.POSIXt), function cuts time intervals; object class stars, converted sfc st_as_sfc(, as_points = FALSE) thus ignoring time component. Note: pixel assigned single group (order groups occur) non-overlapping spatial features temporal windows recommended. FUN aggregation function, mean ... arguments passed FUN, na.rm=TRUE drop logical; ignored join function; function used find matches x as_points see st_as_sf: shall raster pixels taken points, small square polygons? rightmost.closed see findInterval left.open logical; used time intervals, see findInterval cut.POSIXt exact logical; TRUE, use coverage_fraction compute exact overlap fractions polygons raster cells","code":""},{"path":[]},{"path":"/reference/aggregate.stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"spatially or temporally aggregate stars object — aggregate.stars","text":"","code":"# aggregate time dimension in format Date tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") t1 = as.Date(\"2018-07-31\") x = read_stars(c(tif, tif, tif, tif), along = list(time = c(t1, t1+1, t1+2, t1+3)))[,1:30,1:30] st_get_dimension_values(x, \"time\") #> [1] \"2018-07-31\" \"2018-08-01\" \"2018-08-02\" \"2018-08-03\" x_agg_time = aggregate(x, by = t1 + c(0, 2, 4), FUN = max) # aggregate time dimension in format Date - interval by_t = \"2 days\" x_agg_time2 = aggregate(x, by = by_t, FUN = max) st_get_dimension_values(x_agg_time2, \"time\") #> [1] \"2018-07-31\" \"2018-08-02\" #TBD: #x_agg_time - x_agg_time2 # aggregate time dimension in format POSIXct x = st_set_dimensions(x, 4, values = as.POSIXct(c(\"2018-07-31\", \"2018-08-01\", \"2018-08-02\", \"2018-08-03\")), names = \"time\") by_t = as.POSIXct(c(\"2018-07-31\", \"2018-08-02\")) x_agg_posix = aggregate(x, by = by_t, FUN = max) st_get_dimension_values(x_agg_posix, \"time\") #> [1] \"2018-07-31 UTC\" \"2018-08-02 UTC\" #TBD: # x_agg_time - x_agg_posix aggregate(x, \"2 days\", mean) #> stars object with 4 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 58 57.58796 70 145 #> dimension(s): #> from to offset delta refsys point x/y #> time 1 2 2018-07-31 UTC 2 days POSIXct NA #> x 1 30 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 30 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA if (require(ncmeta, quietly = TRUE)) { # Spatial aggregation, see https://github.com/r-spatial/stars/issues/299 prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\")) prec_slice = dplyr::slice(prec, index = 17, along = \"time\") nc = sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") nc = st_transform(nc, st_crs(prec_slice)) agg = aggregate(prec_slice, st_geometry(nc), mean) plot(agg) } #> no 'var' specified, using Total_precipitation_surface_1_Hour_Accumulation #> other available variables: #> lat, lon, time #> Will return stars object with 236118 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. # example of using a function for \"by\": aggregate by month-of-year d = c(10, 10, 150) a = array(rnorm(prod(d)), d) # pure noise times = Sys.Date() + seq(1, 2000, length.out = d[3]) m = as.numeric(format(times, \"%m\")) signal = rep(sin(m / 12 * pi), each = prod(d[1:2])) # yearly period s = (st_as_stars(a) + signal) %>% st_set_dimensions(3, values = times) f = function(x, format = \"%B\") { months = format(as.Date(paste0(\"01-\", 1:12, \"-1970\")), format) factor(format(x, format), levels = months) } agg = aggregate(s, f, mean) plot(agg)"},{"path":"/reference/bcsd_obs.html","id":null,"dir":"Reference","previous_headings":"","what":"Monthly Gridded Meteorological Observations — bcsd_obs","title":"Monthly Gridded Meteorological Observations — bcsd_obs","text":"monthly observational data used BCSD downscaling. See: information.\" ; \"Atmospheric Temperature, Air Temperature Atmosphere, Precipitation, Rain, Maximum Daily Temperature, Minimum Daily Temperature\" ;","code":""},{"path":"/reference/bcsd_obs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Monthly Gridded Meteorological Observations — bcsd_obs","text":"","code":"bcsd_obs"},{"path":"/reference/bcsd_obs.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Monthly Gridded Meteorological Observations — bcsd_obs","text":"object class stars_proxy (inherits stars) dimension 81 x 33 x 12.","code":""},{"path":"/reference/c.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"combine multiple stars objects, combine multiple attributes single stars object single array","code":""},{"path":"/reference/c.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"","code":"# S3 method for class 'stars_proxy' c( ..., along = NA_integer_, along_crs = FALSE, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps) ) # S3 method for class 'stars' c( ..., along = NA_integer_, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps) )"},{"path":"/reference/c.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"... object(s) class star: case multiple arguments, combined single stars object, case single argument, attributes combined single attribute. case multiple objects, objects dimensionality. along integer; see read_stars along_crs logical; TRUE, combine arrays along CRS dimension try_hard logical; TRUE arrays different dimensions, combine dimensions matching first array nms character; vector array names tolerance numeric; values used .equal compare dimension values combine dimensions matching first array","code":""},{"path":"/reference/c.stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"single stars object merged (binded) arrays.","code":""},{"path":"/reference/c.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"error raised attempting combine arrays different measurement units single array. intentded, drop_units can used remove units stars object merging.","code":""},{"path":"/reference/c.stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"combine multiple stars objects, or combine multiple attributes in a single stars object into a single array — c.stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) (new = c(x, x)) #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> L7_ETMs.tif.1 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA c(new) # collapses two arrays into one with an additional dimension #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> L7_ETMs.tif.1 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA c(x, x, along = 3) #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 12 NA NA NA NA"},{"path":"/reference/coerce-methods.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce stars object into a Raster raster or brick — as","title":"Coerce stars object into a Raster raster or brick — as","text":"Coerce stars object Raster raster brick Coerce stars object terra SpatRaster","code":""},{"path":"/reference/coerce-methods.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce stars object into a Raster raster or brick — as","text":"object coerce","code":""},{"path":"/reference/coerce-methods.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce stars object into a Raster raster or brick — as","text":"RasterLayer RasterBrick SpatRaster","code":""},{"path":"/reference/coerce-methods.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce stars object into a Raster raster or brick — as","text":"stars object three dimensions, dimensions higher third collapsed third dimensions. stars object x/y raster multiple attributes, merged first, put raster brick. stars object three dimensions, dimensions higher third collapsed third dimensions. stars object x/y raster multiple attributes, merged first, put SpatRaster.","code":""},{"path":"/reference/contour.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"plot contours of a stars object — contour.stars","title":"plot contours of a stars object — contour.stars","text":"plot contours stars object","code":""},{"path":"/reference/contour.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"plot contours of a stars object — contour.stars","text":"","code":"# S3 method for class 'stars' contour(x, ...)"},{"path":"/reference/contour.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"plot contours of a stars object — contour.stars","text":"x object class stars ... parameters passed contour","code":""},{"path":"/reference/contour.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"plot contours of a stars object — contour.stars","text":"uses R internal contour algorithm, (default) plots contours; st_contour uses GDAL contour algorithm returns contours simple features.","code":""},{"path":"/reference/contour.stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"plot contours of a stars object — contour.stars","text":"","code":"d = st_dimensions(x = 1:ncol(volcano), y = 1:nrow(volcano)) r = st_as_stars(t(volcano)) r = st_set_dimensions(r, 1, offset = 0, delta = 1) r = st_set_dimensions(r, 2, offset = 0, delta = -1) plot(r, reset = FALSE) contour(r, add = TRUE)"},{"path":"/reference/cut_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"cut methods for stars objects — cut_stars","title":"cut methods for stars objects — cut_stars","text":"cut methods stars objects","code":""},{"path":"/reference/cut_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"cut methods for stars objects — cut_stars","text":"","code":"# S3 method for class 'array' cut(x, breaks, ...) # S3 method for class 'matrix' cut(x, breaks, ...) # S3 method for class 'stars' cut(x, breaks, ...)"},{"path":"/reference/cut_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"cut methods for stars objects — cut_stars","text":"x see cut breaks see cut ... see cut","code":""},{"path":"/reference/cut_stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"cut methods for stars objects — cut_stars","text":"array matrix levels attribute; see details","code":""},{"path":"/reference/cut_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"cut methods for stars objects — cut_stars","text":"R's factor works vectors, arrays matrices. work-around (hack?) keep factor levels generated cut use plots.","code":""},{"path":"/reference/cut_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"cut methods for stars objects — cut_stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) cut(x, c(0, 50, 100, 255)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> (0,50] :156060 #> (50,100] :503764 #> (100,255]: 77264 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA cut(x[,,,1], c(0, 50, 100, 255)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> (0,50] : 1 #> (50,100] :117134 #> (100,255]: 5713 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 1 NA NA NA NA plot(cut(x[,,,1], c(0, 50, 100, 255))) tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x1 = read_stars(tif) (x1_cut = cut(x1, breaks = c(0, 50, 100, Inf))) # shows factor in summary #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> (0,50] :156060 #> (50,100] :503764 #> (100,Inf]: 77264 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x1_cut[,,,c(3,6)]) # propagates through [ and plot"},{"path":"/reference/dplyr.html","id":null,"dir":"Reference","previous_headings":"","what":"dplyr verbs for stars objects — dplyr","title":"dplyr verbs for stars objects — dplyr","text":"dplyr verbs stars objects; package dplyr needs loaded methods can used stars objects.","code":""},{"path":"/reference/dplyr.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"dplyr verbs for stars objects — dplyr","text":"","code":"filter.stars(.data, ...) filter.stars_proxy(.data, ...) mutate.stars(.data, ...) mutate.stars_proxy(.data, ...) transmute.stars(.data, ...) transmute.stars_proxy(.data, ...) select.stars(.data, ...) select.stars_proxy(.data, ...) rename.stars(.data, ...) rename.stars_proxy(.data, ...) pull.stars(.data, var = -1) pull.stars_proxy(.data, ...) as.tbl_cube.stars(x, ...) slice.stars(.data, along, index, ..., drop = length(index) == 1) slice.stars_proxy(.data, along, index, ...) replace_na.stars(data, replace, ...) replace_na.stars_proxy(data, ...)"},{"path":"/reference/dplyr.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"dplyr verbs for stars objects — dplyr","text":".data object class stars ... see filter var see pull x object class stars along name index dimension slice applied index integer value(s) index drop logical; drop dimensions single index? data data set work replace see replace_na: list variable=value pairs, value replacement value NA's","code":""},{"path":"/reference/dplyr.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"dplyr verbs for stars objects — dplyr","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x1 = read_stars(tif) if (require(dplyr, quietly = TRUE)) { x1 %>% slice(\"band\", 2:3) x1 %>% slice(\"x\", 50:100) } #> #> Attaching package: ‘dplyr’ #> The following objects are masked from ‘package:stats’: #> #> filter, lag #> The following objects are masked from ‘package:base’: #> #> intersect, setdiff, setequal, union #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 11 56 68 70.50099 82 252 #> dimension(s): #> from to offset delta refsys point x/y #> x 50 100 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA"},{"path":"/reference/expand_dimensions.html","id":null,"dir":"Reference","previous_headings":"","what":"expand the dimension values into a list — expand_dimensions","title":"expand the dimension values into a list — expand_dimensions","text":"expand dimension values list","code":""},{"path":"/reference/expand_dimensions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"expand the dimension values into a list — expand_dimensions","text":"","code":"expand_dimensions(x, ...) # S3 method for class 'dimensions' expand_dimensions(x, ..., max = FALSE, center = NA)"},{"path":"/reference/expand_dimensions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"expand the dimension values into a list — expand_dimensions","text":"x object class `stars` `dimensions` ... ignored max logical; `TRUE` return max (end) values dimensions intervals center logical; `TRUE` return center values intervals, otherwise return offset (start) intervals; `NA` (default) return centers x/y dimensions, offsets others","code":""},{"path":"/reference/geom_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"ggplot geom for stars objects — geom_stars","title":"ggplot geom for stars objects — geom_stars","text":"ggplot geom stars objects","code":""},{"path":"/reference/geom_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ggplot geom for stars objects — geom_stars","text":"","code":"geom_stars( mapping = NULL, data = NULL, ..., downsample = 0, sf = FALSE, na.action = na.pass ) theme_stars(...)"},{"path":"/reference/geom_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ggplot geom for stars objects — geom_stars","text":"mapping see geom_raster data see geom_raster ... see geom_raster downsample downsampling rate: e.g. 3 keeps rows cols 1, 4, 7, 10 etc.; value 0 downsample; can specified dimension, e.g. c(5,5,0) downsample first two dimensions third. sf logical; TRUE rasters converted polygons plotted using geom_sf. na.action function; NA values need removed plotting use value na.omit (applies objects raster dimensions)","code":""},{"path":"/reference/geom_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ggplot geom for stars objects — geom_stars","text":"geom_stars returns (call ) either geom_raster, geom_tile, geom_sf, depending raster vector geometry; first , aes call constructed raster dimension names first array fill variable. calls coord_equal facet_wrap needed control aspect ratio layers plotted; see examples. stars array contains hex color values, fill parameter given, color values used fill color; see example . visual artefacts occur (Moiré-Effekt), see details section plot.stars","code":""},{"path":"/reference/geom_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ggplot geom for stars objects — geom_stars","text":"","code":"system.file(\"tif/L7_ETMs.tif\", package = \"stars\") %>% read_stars() -> x if (require(ggplot2, quietly = TRUE)) { ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_x_discrete(expand=c(0,0))+ scale_y_discrete(expand=c(0,0)) # plot rgb composite: st_as_stars(L7_ETMs)[,,,1:3] |> st_rgb() -> x # x contains colors as pixel values ggplot() + geom_stars(data = x) }"},{"path":"/reference/in-methods.html","id":null,"dir":"Reference","previous_headings":"","what":"evaluate whether cube values are in a given set — %in%,stars-method","title":"evaluate whether cube values are in a given set — %in%,stars-method","text":"evaluate whether cube values given set","code":""},{"path":"/reference/in-methods.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"evaluate whether cube values are in a given set — %in%,stars-method","text":"","code":"# S4 method for class 'stars' x %in% table"},{"path":"/reference/in-methods.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"evaluate whether cube values are in a given set — %in%,stars-method","text":"x data cube value table values set","code":""},{"path":"/reference/make_intervals.html","id":null,"dir":"Reference","previous_headings":"","what":"create an intervals object — make_intervals","title":"create an intervals object — make_intervals","text":"create intervals object, assuming left-closed right-open intervals","code":""},{"path":"/reference/make_intervals.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"create an intervals object — make_intervals","text":"","code":"make_intervals(start, end)"},{"path":"/reference/make_intervals.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"create an intervals object — make_intervals","text":"start vector start values, 2-column matrix start end values column 1 2, respectively end vector end values","code":""},{"path":"/reference/mdim.html","id":null,"dir":"Reference","previous_headings":"","what":"Read or write data using GDAL's multidimensional array API — mdim","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"Read write data using GDAL's multidimensional array API","code":""},{"path":"/reference/mdim.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"","code":"read_mdim( filename, variable = character(0), ..., options = character(0), raster = NULL, offset = integer(0), count = integer(0), step = integer(0), proxy = FALSE, debug = FALSE, bounds = TRUE, curvilinear = NA ) write_mdim( x, filename, driver = detect.driver(filename), ..., root_group_options = character(0), options = character(0), as_float = TRUE )"},{"path":"/reference/mdim.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"filename name source destination file data source variable name array read; `\"?\"`, list array names returned, group name list element names. ... ignored options character; driver specific options regarding opening (read_mdim) creation (write_mdim) dataset raster names raster variables (default: first two dimensions) offset integer; zero-based offset dimension (pixels) sub-array read, defaults 0 dimension(requires sf >= 1.0-9) count integer; size dimension (pixels) sub-array read (default: read ); value NA read corresponding dimension entirely; counts relative step size (requires sf >= 1.0-9) step integer; step size dimension (pixels) sub-array read; defaults 1 dimension (requires sf >= 1.0-9) proxy logical; return proxy object? debug logical; print debug info? bounds logical character: TRUE tries infer \"bounds\" attribute; character, named vector form c(longitude=\"lon_bnds\", latitude=\"lat_bnds\") names dimension names curvilinear control reading curvilinear (geolocation) coordinate arrays; NA try reading x/y dimension names; character, defines arrays read; FALSE try; see also read_stars x stars object driver character; driver name root_group_options character; driver specific options regarding creation root group as_float logical; TRUE write 4-byte floating point numbers, FALSE write 8-byte doubles","code":""},{"path":"/reference/mdim.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"assumed first two dimensions easting northing","code":""},{"path":[]},{"path":"/reference/mdim.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read or write data using GDAL's multidimensional array API — mdim","text":"","code":"set.seed(135) m = matrix(runif(10), 2, 5) names(dim(m)) = c(\"stations\", \"time\") times = as.Date(\"2022-05-01\") + 1:5 pts = st_as_sfc(c(\"POINT(0 1)\", \"POINT(3 5)\")) s = st_as_stars(list(Precipitation = m)) |> st_set_dimensions(1, values = pts) |> st_set_dimensions(2, values = times) nc = tempfile(fileext=\".nc\") if (compareVersion(sf_extSoftVersion()[\"GDAL\"], \"3.4.0\") > -1) { write_mdim(s, nc) # try ncdump on the generated file print(read_mdim(nc)) } #> Warning: GDAL Error 6: SetIndexingVariable() not implemented #> Warning: GDAL Error 6: SetIndexingVariable() not implemented #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> Precipitation 0.03524588 0.3224987 0.3772574 0.4289465 0.511113 0.9204841 #> dimension(s): #> from to offset delta refsys point values #> stations 1 2 NA NA NA TRUE POINT (0 1), POINT (3 5) #> time 1 5 2022-05-02 1 days Date NA NULL"},{"path":"/reference/merge.html","id":null,"dir":"Reference","previous_headings":"","what":"merge or split stars object — merge","title":"merge or split stars object — merge","text":"merge attributes dimension, split dimension attributes","code":""},{"path":"/reference/merge.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"merge or split stars object — merge","text":"","code":"# S3 method for class 'stars' split(x, f = length(dim(x)), drop = TRUE, ...) # S3 method for class 'stars' merge(x, y, ..., name = \"attributes\")"},{"path":"/reference/merge.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"merge or split stars object — merge","text":"x object class stars f name index dimension split; default last dimension drop ignored ... defined, first unnamed argument used dimension values, defined, attribute names used dimension values y needs missing name name new dimension","code":""},{"path":"/reference/merge.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"merge or split stars object — merge","text":"merge merges attributes stars object new dimension; split splits dimension attributes","code":""},{"path":"/reference/merge.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"merge or split stars object — merge","text":"split.stars works first attribute, give error one attribute present","code":""},{"path":"/reference/ops_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 Ops Group Generic Functions for stars objects — ops_stars","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"Ops functions stars objects, including comparison, product divide, add, subtract","code":""},{"path":"/reference/ops_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"","code":"# S3 method for class 'stars' Ops(e1, e2) # S3 method for class 'stars' Math(x, ...) # S3 method for class 'stars_proxy' Ops(e1, e2) # S3 method for class 'stars_proxy' Math(x, ...)"},{"path":"/reference/ops_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"e1 object class stars e2 object class stars x object class stars ... parameters passed Math functions","code":""},{"path":"/reference/ops_stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"object class stars","code":""},{"path":"/reference/ops_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"e1 e2 numeric vector, e2 less smaller dimensions e1, e2 recycled fits e1, using usual R array recycling rules. user needs make sure sensible; may needed use aperm permutate dimensions first.","code":""},{"path":"/reference/ops_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"S3 Ops Group Generic Functions for stars objects — ops_stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) x * x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 2916 4761 5512.41 7396 65025 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x / x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 1 1 1 1 1 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x + x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 2 108 138 137.8248 172 510 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x + 10 #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 11 64 79 78.91242 96 265 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA all.equal(x * 10, 10 * x) #> [1] TRUE tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) a = sqrt(x) b = log(x, base = 10)"},{"path":"/reference/plot.html","id":null,"dir":"Reference","previous_headings":"","what":"plot stars object, with subplots for each level of first non-spatial dimension — plot","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"plot stars object, subplots level first non-spatial dimension, customization legend key","code":""},{"path":"/reference/plot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"","code":"# S3 method for class 'nc_proxy' plot(x, y, ..., downsample = get_downsample(dim(x)), max_times = 16) # S3 method for class 'stars' plot( x, y, ..., join_zlim = TRUE, main = make_label(x, 1), axes = FALSE, downsample = TRUE, nbreaks = 11, breaks = \"quantile\", col = grey(1:(nbreaks - 1)/nbreaks), key.pos = get_key_pos(x, ...), key.width = kw_dflt(x, key.pos), key.length = 0.618, key.lab = main, reset = TRUE, box_col = NA, center_time = FALSE, hook = NULL, mfrow = NULL, compact = TRUE ) # S3 method for class 'stars' image( x, ..., band = 1, attr = 1, asp = NULL, rgb = NULL, maxColorValue = ifelse(inherits(rgb, \"data.frame\"), 255, max(x[[attr]], na.rm = TRUE)), xlab = if (!axes) \"\" else names(d)[1], ylab = if (!axes) \"\" else names(d)[2], xlim = st_bbox(extent)$xlim, ylim = st_bbox(extent)$ylim, text_values = FALSE, text_color = \"black\", axes = FALSE, interpolate = FALSE, as_points = FALSE, key.pos = NULL, logz = FALSE, key.width = kw_dflt(x, key.pos), key.length = 0.618, add.geom = NULL, border = NA, useRaster = isTRUE(dev.capabilities()$rasterImage == \"yes\"), extent = x ) # S3 method for class 'stars_proxy' plot(x, y, ..., downsample = get_downsample(dim(x)))"},{"path":"/reference/plot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"x object class stars y ignored ... arguments: plot, passed image.stars; image, passed image.default rasterImage. downsample logical numeric; TRUE try plot many pixels actually visible, FALSE, downsampling takes place, numeric, number pixels/lines/bands etc skipped; see Details. max_times integer; maximum number time steps attempt plot. join_zlim logical; TRUE, compute single, joint zlim (color scale) subplots x main character; subplot title prefix; use \"\" get time, use NULL suppress subplot titles axes logical; axes box added plot? nbreaks number color breaks; one number colors. missing col specified, derived . breaks numeric vector actual color breaks, style name used classIntervals. col colors use grid cells, color palette function key.pos numeric; side plot color key: 1 bottom, 2 left, 3 top, 4 right; set NULL omit key. Ignored multiple columns plotted single function call. Default depends plot size, map aspect, , set, parameter asp. length 2, second value, ranging 0 1, determines key placed available space (default: 0.5, center). key.width amount space reserved width key (labels); relative absolute (using lcm) key.length amount space reserved length key (labels); relative absolute (using lcm) key.lab character; label color key case multiple subplots, use \"\" suppress reset logical; FALSE, keep plot mode allows adding map elements; TRUE restore original mode plotting box_col color box around sub-plots; use NA suppress plotting boxes around sub-plots. center_time logical; TRUE, sub-plot titles show center time intervals, otherwise start hook NULL function; hook function called every sub-plot; see examples. mfrow length-2 integer vector nrows, ncolumns composite plot, override default layout compact logical; place facets compactly (TRUE), spread plotting device area? band integer; band (dimension) plot attr integer; attribute plot asp numeric; aspect ratio image rgb integer; specify three bands form rgb composite. Experimental: rgb color table; see Details. maxColorValue numeric; passed rgb xlab character; x axis label ylab character; y axis label xlim x axis limits ylim y axis limits text_values logical; print values text image? text_color character; color printed text values interpolate logical; using rasterImage (rgb), pixels interpolated? as_points logical; curvilinear sheared grids: parameter passed st_as_sf, determining whether raster cells plotted symbols (fast, approximate) small polygons (slow, exact) logz logical; TRUE, use log10-scale attribute variable. case, breaks need given log10-values; see examples. add.geom object class sfc, list arguments plot, added image sub-image border color used cell borders (case x curvilinear rotated/sheared grid) useRaster logical; use rasterImage capabilities graphics device? extent object st_bbox method; sets plotting extent","code":""},{"path":"/reference/plot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"plotting subsetted stars_proxy object, default value argument downsample computed correctly, set manually. Downsampling: value downsample 0: downsampling, 1: every dimension value (pixel/line/band), one value skipped (half original resolution), 2: every dimension value, 2 values skipped (one third original resolution), etc. downsample TRUE length 1 numeric vector, downsampling applied raster [x] [y] dimensions. remove unused classes categorical raster, use droplevels function. bitmaps show visual artefacts (Moiré effects), make sure device png used rather ragg::agg_png latter uses antialiasing filled polygons causes ; see also https://github.com/r-spatial/stars/issues/573 . use rgb color table experimental; see https://github.com/r-spatial/mapview/issues/208 plotting subsetted stars_proxy object, default value argument downsample computed correctly, set manually.","code":""},{"path":"/reference/plot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"plot stars object, with subplots for each level of first non-spatial dimension — plot","text":"","code":"st_bbox(L7_ETMs) |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt hook1 = function() { text(pt[,\"X\"], pt[,\"Y\"], \"foo\", col = 'orange', cex = 2) } plot(L7_ETMs, hook = hook1) x = st_set_dimensions(L7_ETMs, 3, paste0(\"B_\", 1:6)) hook2 = function(..., row, col, nr, nrow, ncol, value, bbox) { str = paste0(\"row \", row, \"/\", nrow, \", col \", col, \"/\", ncol, \"\\nnr: \", nr, \" value: \", value) bbox |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt text(pt[,\"X\"], pt[,\"Y\"], str, col = 'red', cex = 2) } plot(x, hook = hook2, col = grey(c(.2,.25,.3,.35))) if (isTRUE(dev.capabilities()$rasterImage == \"yes\")) { lc = read_stars(system.file(\"tif/lc.tif\", package = \"stars\")) levels(lc[[1]]) = abbreviate(levels(lc[[1]]), 6) # so it's not only legend plot(lc, key.pos=4) } tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) image(x, col = grey((3:9)/10)) if (isTRUE(dev.capabilities()$rasterImage == \"yes\")) { image(x, rgb = c(1,3,5)) # false color composite }"},{"path":"/reference/prcomp.html","id":null,"dir":"Reference","previous_headings":"","what":"Principle components of stars object — prcomp","title":"Principle components of stars object — prcomp","text":"Compute principle components stars object","code":""},{"path":"/reference/prcomp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Principle components of stars object — prcomp","text":"","code":"# S3 method for class 'stars_proxy' prcomp(x, ..., downsample = 0) # S3 method for class 'stars' prcomp(x, ..., quiet = FALSE)"},{"path":"/reference/prcomp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Principle components of stars object — prcomp","text":"x object class `stars` `stars_proxy` ... see prcomp downsample see st_as_stars quiet logical; `TRUE`, suppress message PCs computed last dimension; see details","code":""},{"path":"/reference/prcomp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Principle components of stars object — prcomp","text":"object class `prcomp`, see prcomp","code":""},{"path":"/reference/prcomp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Principle components of stars object — prcomp","text":"`x` one attribute, principle components computed space last dimension `x` predict PC scores `stars` object, use predict.stars; see example ","code":""},{"path":"/reference/prcomp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Principle components of stars object — prcomp","text":"","code":"l7 = split(st_as_stars(L7_ETMs), 3) # use bands as features l7 |> prcomp() |> plot() l7 |> prcomp() |> predict(l7, model = _) |> merge() |> plot() #> downsample set to 1"},{"path":"/reference/predict.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"Predict values, given model object, stars stars_proxy object","code":""},{"path":"/reference/predict.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"","code":"# S3 method for class 'stars_proxy' predict(object, model, ...) # S3 method for class 'stars' predict(object, model, ..., drop_dimensions = FALSE)"},{"path":"/reference/predict.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"object object class `stars` model model object class predict method; check `methods(class = class(object))` ... arguments passed predict method drop_dimensions logical; `TRUE`, remove dimensions (coordinates etc) `data.frame` predictors","code":""},{"path":"/reference/predict.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Predict values, given a model object, for a stars or stars_proxy object — predict.stars","text":"separate predictors object need separate attributes object; case e.g. band dimension, use `split(object)`","code":""},{"path":"/reference/print_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"print stars or dimensions object — print_stars","title":"print stars or dimensions object — print_stars","text":"print stars dimensions object","code":""},{"path":"/reference/print_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"print stars or dimensions object — print_stars","text":"","code":"# S3 method for class 'dimensions' as.data.frame( x, ..., digits = max(3, getOption(\"digits\") - 3), usetz = TRUE, stars_crs = getOption(\"stars.crs\") %||% 28, all = FALSE ) # S3 method for class 'dimensions' print(x, ...) # S3 method for class 'stars' print(x, ..., n = 1e+05, abbrev = 30)"},{"path":"/reference/print_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"print stars or dimensions object — print_stars","text":"x object class stars class dimensions ... passed .data.frame.dimensions digits number digits print numbers usetz logical; used format PCICt POSIXct values stars_crs maximum width string CRS objects logical; TRUE print also fields entirely filled NA NULL n prod(dim(x)) > 10 * n, first n cells used attribute summary statistics abbrev number characters abbreviate attribute names ","code":""},{"path":"/reference/read_ncdf.html","id":null,"dir":"Reference","previous_headings":"","what":"Read NetCDF into stars object — read_ncdf","title":"Read NetCDF into stars object — read_ncdf","text":"Read data file (source) using NetCDF library directly.","code":""},{"path":"/reference/read_ncdf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read NetCDF into stars object — read_ncdf","text":"","code":"read_ncdf( .x, ..., var = NULL, ncsub = NULL, curvilinear = character(0), eps = sqrt(.Machine$double.eps), ignore_bounds = FALSE, make_time = TRUE, make_units = TRUE, proxy = NULL, downsample = 0 )"},{"path":"/reference/read_ncdf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read NetCDF into stars object — read_ncdf","text":".x NetCDF file source character vector nc_proxy object. ... ignored var variable name names (must matching grids) ncsub matrix start, count columns (see Details) curvilinear length two character named vector names variables holding longitude latitude values raster cells. `stars` attempts figure appropriate curvilinear coordinates supplied. eps numeric; dimension value increases considered identical differ less eps ignore_bounds logical; bounds values dimensions, present, ignored? make_time TRUE (default), attempt made provide date-time class \"time\" variable make_units TRUE (default), attempt made set units property variable proxy logical; TRUE, object class stars_proxy read contains array metadata ; FALSE full array data read memory. set, defaults TRUE number cells read larger options(stars.n_proxy), 1e8 option set. downsample integer; number cells omit samples along dimension. e.g. c(1,1,2) return every cell x y every third cell third dimension (z t). 0, downsampling applied. Note transformation applied NetCDF data read using st_downsample. , proxy=TRUE, option ignored.","code":""},{"path":"/reference/read_ncdf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Read NetCDF into stars object — read_ncdf","text":"following logic applied coordinates. coordinate axes regularly spaced coordinate variables reduced offset/delta form 'affine = c(0, 0)', otherwise values coordinates stored used define rectilinear grid. data two dimensions first two regular nominated 'raster' plotting. curvilinear argument used specifies 2D arrays containing coordinate values first two dimensions data read. currently assumed coordinates 2D relate first two dimensions order. var set first set variables shared grid used. start count columns ncsub must correspond variable dimension (nrows) valid index using var.get.nc convention (start 1-based). count value NA steps included. Axis order must match variable/s read.","code":""},{"path":"/reference/read_ncdf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read NetCDF into stars object — read_ncdf","text":"","code":"f <- system.file(\"nc/reduced.nc\", package = \"stars\") if (require(ncmeta, quietly = TRUE)) { read_ncdf(f) read_ncdf(f, var = c(\"anom\")) read_ncdf(f, ncsub = cbind(start = c(1, 1, 1, 1), count = c(10, 12, 1, 1))) } #> no 'var' specified, using sst, anom, err, ice #> other available variables: #> lon, lat, zlev, time #> 0-360 longitude crossing the international date line encountered. #> Longitude coordinates will be 0-360 in output. #> Will return stars object with 16200 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. #> 0-360 longitude crossing the international date line encountered. #> Longitude coordinates will be 0-360 in output. #> Will return stars object with 16200 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. #> no 'var' specified, using sst, anom, err, ice #> other available variables: #> lon, lat, zlev, time #> Will return stars object with 120 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. #> stars object with 4 dimensions and 4 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> sst [°C] -1.39 -0.7200 -0.515 -0.53399999 -0.275 0.03 90 #> anom [°C] -1.07 -0.3625 0.195 0.05866667 0.555 0.92 90 #> err [°C] 0.30 0.3000 0.300 0.30299999 0.300 0.32 90 #> ice [percent] 0.01 0.1100 0.170 0.20937500 0.255 0.52 104 #> dimension(s): #> from to offset delta refsys values x/y #> lon 1 10 -1 2 WGS 84 NULL [x] #> lat 1 12 -90 2 WGS 84 NULL [y] #> zlev 1 1 NA NA NA 0 #> time 1 1 NA NA POSIXct 1981-12-31 UTC if (require(ncmeta, quietly = TRUE)) { #' precipitation data in a curvilinear NetCDF prec_file = system.file(\"nc/test_stageiv_xyt.nc\", package = \"stars\") prec = read_ncdf(prec_file, curvilinear = c(\"lon\", \"lat\"), ignore_bounds = TRUE) } #> no 'var' specified, using Total_precipitation_surface_1_Hour_Accumulation #> other available variables: #> lat, lon, time #> Will return stars object with 236118 cells. #> No projection information found in nc file. #> Coordinate variable units found to be degrees, #> assuming WGS84 Lat/Lon. ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } if (require(dplyr, quietly = TRUE)) { prec_slice = slice(prec, index = 17, along = \"time\") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file(\"gpkg/nc.gpkg\", package = \"sf\"), \"nc.gpkg\") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA) }"},{"path":"/reference/read_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"read raster/array dataset from file or connection — read_stars","title":"read raster/array dataset from file or connection — read_stars","text":"read raster/array dataset file connection","code":""},{"path":"/reference/read_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"read raster/array dataset from file or connection — read_stars","text":"","code":"read_stars( .x, sub = TRUE, ..., options = character(0), driver = character(0), quiet = FALSE, NA_value = NA_real_, along = NA_integer_, RasterIO = list(), proxy = getOption(\"stars.n_proxy\") %||% 1e+08, curvilinear = character(0), normalize_path = TRUE, RAT = character(0), tolerance = 1e-10, exclude = \"\", shorten = TRUE )"},{"path":"/reference/read_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"read raster/array dataset from file or connection — read_stars","text":".x character vector name(s) file(s) data source(s) read, function returns vector sub character, integer logical; name, index indicator sub-dataset(s) read ... passed st_as_stars curvilinear set options character; opening options driver character; driver use opening file. override fixing subdatasets autodetect well, use NULL. quiet logical; print progress output? NA_value numeric value used conversion NA values; default read input file along length-one character integer, list; determines several arrays combined, see Details. RasterIO list named parameters GDAL's RasterIO, control extent, resolution bands read data source; see details. proxy logical; TRUE, object class stars_proxy read contains array metadata ; FALSE full array data read memory. Always FALSE curvilinear girds. set number, defaults TRUE number cells read larger number. curvilinear length two character vector names subdatasets holding longitude latitude values raster cells, named length 2 list holding longitude latitude matrices; names list correspond raster dimensions referred normalize_path logical; FALSE, suppress call normalizePath .x RAT character; raster attribute table column name use factor levels tolerance numeric; passed .equal comparing dimension parameters. exclude character; vector category value(s) exclude shorten logical character; TRUE length(.x) > 1, remove common start end parts array names; character new prefix","code":""},{"path":"/reference/read_stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"read raster/array dataset from file or connection — read_stars","text":"object class stars","code":""},{"path":"/reference/read_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"read raster/array dataset from file or connection — read_stars","text":"case .x contains multiple files, read combined c.stars. Along dimension, objects merged? along set NA merge arrays new attributes objects identical dimensions, else try merge along time dimension called time indicates different time stamps. single name (positive value) along merge along dimension, create new one already exist. arrays arranged along one dimensions values (e.g. time stamps), named list can passed along specify ; see example. RasterIO list zero following named arguments: nXOff, nYOff (1-based: first row/col offset value 1), nXSize, nYSize, nBufXSize, nBufYSize, bands, resample. See https://gdal.org/doxygen/classGDALDataset.html meaning; bands integer vector containing band numbers read (1-based: first band 1). Note nBufXSize nBufYSize specified downsampling image, resulting adjusted geotransform. resample reflects resampling method one : \"nearest_neighbour\" (default), \"bilinear\", \"cubic\", \"cubic_spline\", \"lanczos\", \"average\", \"mode\", \"Gauss\". Data read memory (proxy=FALSE) read numeric (double) array, except categorical variables read numeric (integer) array class factor.","code":""},{"path":"/reference/read_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"read raster/array dataset from file or connection — read_stars","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") (x1 = read_stars(tif)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA (x2 = read_stars(c(tif, tif))) #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> L7_ETMs.tif.1 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA (x3 = read_stars(c(tif, tif), along = \"band\")) #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 12 NA NA NA NA (x4 = read_stars(c(tif, tif), along = \"new_dimensions\")) # create 4-dimensional array #> stars object with 4 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA #> new_dimensions 1 2 NA NA NA NA x1o = read_stars(tif, options = \"OVERVIEW_LEVEL=1\") t1 = as.Date(\"2018-07-31\") # along is a named list indicating two dimensions: read_stars(c(tif, tif, tif, tif), along = list(foo = c(\"bar1\", \"bar2\"), time = c(t1, t1+2))) #> stars object with 5 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 47 65 76 77.3419 87 255 #> dimension(s): #> from to offset delta refsys point values x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] #> band 1 6 NA NA NA NA NULL #> foo 1 2 NA NA NA NA bar1, bar2 #> time 1 2 2018-07-31 2 days Date NA NULL m = matrix(1:120, nrow = 12, ncol = 10) dim(m) = c(x = 10, y = 12) # named dim st = st_as_stars(m) attr(st, \"dimensions\")$y$delta = -1 attr(st, \"dimensions\")$y$offset = 12 st #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 30.75 60.5 60.5 90.25 120 #> dimension(s): #> from to offset delta point x/y #> x 1 10 0 1 FALSE [x] #> y 1 12 12 -1 FALSE [y] tmp = tempfile(fileext = \".tif\") write_stars(st, tmp) (red <- read_stars(tmp)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> file227966b83ae9.tif 1 30.75 60.5 60.5 90.25 120 #> dimension(s): #> from to offset delta x/y #> x 1 10 0 1 [x] #> y 1 12 12 -1 [y] read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, nBufXSize = 2, nBufYSize = 2))[[1]] #> [,1] [,2] #> [1,] 33 93 #> [2,] 38 98 (red <- read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, nBufXSize = 2, nBufYSize = 2))) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> file227966b83ae9.tif 33 36.75 65.5 65.5 94.25 98 #> dimension(s): #> from to offset delta x/y #> x 1 2 0 5 [x] #> y 1 2 12 -6 [y] red[[1]] # cell values of subsample grid: #> [,1] [,2] #> [1,] 33 93 #> [2,] 38 98 if (FALSE) { # \\dontrun{ plot(st, reset = FALSE, axes = TRUE, ylim = c(-.1,12.1), xlim = c(-.1,10.1), main = \"nBufXSize & nBufYSize demo\", text_values = TRUE) plot(st_as_sfc(red, as_points = TRUE), add = TRUE, col = 'red', pch = 16) plot(st_as_sfc(st_as_stars(st), as_points = FALSE), add = TRUE, border = 'grey') plot(st_as_sfc(red, as_points = FALSE), add = TRUE, border = 'green', lwd = 2) } # } file.remove(tmp) #> [1] TRUE"},{"path":"/reference/redimension.html","id":null,"dir":"Reference","previous_headings":"","what":"redimension array, or collapse attributes into a new dimension — redimension","title":"redimension array, or collapse attributes into a new dimension — redimension","text":"redimension array, collapse attributes new dimension","code":""},{"path":"/reference/redimension.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"redimension array, or collapse attributes into a new dimension — redimension","text":"","code":"# S3 method for class 'stars_proxy' st_redimension( x, new_dims = st_dimensions(x), along = list(new_dim = names(x)), ... ) st_redimension(x, new_dims, along, ...) # S3 method for class 'stars' st_redimension( x, new_dims = st_dimensions(x), along = setNames(list(names(x)), name), ..., name = \"new_dim\" )"},{"path":"/reference/redimension.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"redimension array, or collapse attributes into a new dimension — redimension","text":"x object class stars new_dims target dimensions: either `dimensions` object integer vector dimensions' sizes along named list new dimension name values ... ignored name character name new dimension","code":""},{"path":"/reference/st_apply.html","id":null,"dir":"Reference","previous_headings":"","what":"st_apply apply a function to one or more array dimensions — st_apply","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"st_apply apply function array dimensions: aggregate space, time, something else","code":""},{"path":"/reference/st_apply.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"","code":"# S3 method for class 'stars' st_apply( X, MARGIN, FUN, ..., CLUSTER = NULL, PROGRESS = FALSE, FUTURE = FALSE, rename = TRUE, .fname, single_arg = has_single_arg(FUN, list(...)) || can_single_arg(FUN), keep = FALSE )"},{"path":"/reference/st_apply.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"X object class stars MARGIN see apply; index number(s) name(s) dimensions FUN applied FUN see apply see Details. ... arguments passed FUN CLUSTER cluster use parallel apply; see makeCluster PROGRESS logical; TRUE, use pbapply::pbapply show progress bar FUTURE logical;TRUE, use future.apply::future_apply rename logical; TRUE X one attribute FUN simple function name, rename attribute returned object function name .fname function name new attribute name (one dimensions reduced) new dimension (new dimension created); missing, name FUN used single_arg logical; TRUE, FUN takes single argument (like fn_ndvi1 ), FALSE FUN takes multiple arguments (like fn_ndvi2 ). keep logical; TRUE, preserve dimension metadata (e.g. time stamps)","code":""},{"path":"/reference/st_apply.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"object class stars accordingly reduced number dimensions; case FUN returns one value, new dimension created carrying name function used; see examples. Following logic apply, new dimension put dimensions; use aperm rearrange , see last example.","code":""},{"path":"/reference/st_apply.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"FUN function either operates single object, data iteration step dimensions MARGIN, function many arguments elements object. See NDVI examples . second form can much faster e.g. trivial function called every pixel, (example). heuristics default single_arg work often, always; try setting right value st_apply gives error.","code":""},{"path":"/reference/st_apply.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"st_apply apply a function to one or more array dimensions — st_apply","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) st_apply(x, 1:2, mean) # mean band value for each pixel #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> mean 25.5 53.33333 68.33333 68.91242 82 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] st_apply(x, c(\"x\", \"y\"), mean) # equivalent to the above #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> mean 25.5 53.33333 68.33333 68.91242 82 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] st_apply(x, 3, mean) # mean of all pixels for each band #> stars object with 1 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> mean 59.23541 61.07112 65.96675 68.91242 76.25445 83.18266 #> dimension(s): #> from to #> band 1 6 if (FALSE) { # \\dontrun{ st_apply(x, \"band\", mean) # equivalent to the above st_apply(x, 1:2, range) # min and max band value for each pixel fn_ndvi1 = function(x) (x[4]-x[3])/(x[4]+x[3]) # ONE argument: will be called for each pixel fn_ndvi2 = function(red,nir) (nir-red)/(nir+red) # n arguments: will be called only once ndvi1 = st_apply(x, 1:2, fn_ndvi1) # note that we can select bands 3 and 4 in the first argument: ndvi2 = st_apply(x[,,,3:4], 1:2, fn_ndvi2) all.equal(ndvi1, ndvi2) # compute the (spatial) variance of each band; https://github.com/r-spatial/stars/issues/430 st_apply(x, 3, function(x) var(as.vector(x))) # as.vector is required! # to get a progress bar also in non-interactive mode, specify: if (require(pbapply)) { # install it, if FALSE pboptions(type = \"timer\") } st_apply(x, 1:2, range) # dimension \"range\" is first; rearrange by: st_apply(x, 1:2, range) %>% aperm(c(2,3,1)) } # }"},{"path":"/reference/st_as_sf.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert stars object into an sf object — st_as_sf","title":"Convert stars object into an sf object — st_as_sf","text":"Convert stars object sf object","code":""},{"path":"/reference/st_as_sf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert stars object into an sf object — st_as_sf","text":"","code":"# S3 method for class 'stars' st_as_sfc(x, ..., as_points, which = seq_len(prod(dim(x)[1:2]))) # S3 method for class 'stars' st_as_sf( x, ..., as_points = FALSE, merge = FALSE, na.rm = TRUE, use_integer = is.logical(x[[1]]) || is.integer(x[[1]]), long = FALSE, connect8 = FALSE ) # S3 method for class 'stars_proxy' st_as_sf(x, ..., downsample = 0)"},{"path":"/reference/st_as_sf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert stars object into an sf object — st_as_sf","text":"x object class stars ... ignored as_points logical; cells converted points polygons? See details. linear index cells keep (argument recommended used) merge logical; TRUE, cells identical values merged (using GDAL_Polygonize GDAL_FPolygonize); FALSE, polygon raster cell returned; see details na.rm logical; missing valued cells removed, also converted features? use_integer (relevant merge TRUE): TRUE, polygonizing values rounded 32-bits signed integer values (GDALPolygonize), otherwise converted 32-bit floating point values (GDALFPolygonize). long logical; TRUE, return long table form sf, geometries dimensions recycled connect8 logical; TRUE, use 8 connectedness. Otherwise 4 connectedness algorithm applied. downsample see st_as_stars","code":""},{"path":"/reference/st_as_sf.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Convert stars object into an sf object — st_as_sf","text":"merge TRUE, first attribute converted sf object. na.rm FALSE, areas NA values also written polygons. Note resulting polygons typically invalid, use st_make_valid create valid polygons .","code":""},{"path":"/reference/st_as_sf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert stars object into an sf object — st_as_sf","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) x = x[,1:100,1:100,6] # subset of a band with lower values in it x[[1]][x[[1]] < 30] = NA # set lower values to NA x[[1]] = x[[1]] < 100 # make the rest binary x #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> Mode :logical #> FALSE:525 #> TRUE :7665 #> NA's :1810 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 100 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 100 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 6 6 NA NA NA NA (p = st_as_sf(x)) # removes NA areas #> Simple feature collection with 8190 features and 1 field #> Geometry type: POLYGON #> Dimension: XY #> Bounding box: xmin: 288776.3 ymin: 9117911 xmax: 291626.3 ymax: 9120761 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> First 10 features: #> V1 geometry #> 1 TRUE POLYGON ((288776.3 9120761,... #> 2 TRUE POLYGON ((288804.8 9120761,... #> 3 TRUE POLYGON ((288833.3 9120761,... #> 4 TRUE POLYGON ((288861.8 9120761,... #> 5 TRUE POLYGON ((288890.3 9120761,... #> 6 TRUE POLYGON ((288918.8 9120761,... #> 7 TRUE POLYGON ((288947.3 9120761,... #> 8 TRUE POLYGON ((288975.8 9120761,... #> 9 TRUE POLYGON ((289004.3 9120761,... #> 10 TRUE POLYGON ((289032.8 9120761,... (p = st_as_sf(x[,,,1], merge = TRUE)) # glues polygons together #> Simple feature collection with 155 features and 1 field #> Geometry type: POLYGON #> Dimension: XY #> Bounding box: xmin: 288776.3 ymin: 9117911 xmax: 291626.3 ymax: 9120761 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> First 10 features: #> L7_ETMs.tif geometry #> 1 0 POLYGON ((289517.3 9120761,... #> 2 0 POLYGON ((290144.3 9120761,... #> 3 0 POLYGON ((290315.3 9120761,... #> 4 0 POLYGON ((291113.3 9120761,... #> 5 0 POLYGON ((291341.3 9120761,... #> 6 1 POLYGON ((291455.3 9120761,... #> 7 1 POLYGON ((291569.3 9120761,... #> 8 0 POLYGON ((290372.3 9120732,... #> 9 1 POLYGON ((290628.8 9120732,... #> 10 1 POLYGON ((290771.3 9120732,... all(st_is_valid(p)) # not all valid, see details #> [1] TRUE plot(p, axes = TRUE) (p = st_as_sf(x, na.rm = FALSE, merge = TRUE)) # includes polygons with NA values #> Simple feature collection with 380 features and 1 field #> Geometry type: POLYGON #> Dimension: XY #> Bounding box: xmin: 288776.3 ymin: 9117911 xmax: 291626.3 ymax: 9120761 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> First 10 features: #> L7_ETMs.tif geometry #> 1 0 POLYGON ((289517.3 9120761,... #> 2 0 POLYGON ((290144.3 9120761,... #> 3 0 POLYGON ((290315.3 9120761,... #> 4 0 POLYGON ((291113.3 9120761,... #> 5 0 POLYGON ((291341.3 9120761,... #> 6 1 POLYGON ((291455.3 9120761,... #> 7 1 POLYGON ((291569.3 9120761,... #> 8 NA POLYGON ((289745.3 9120732,... #> 9 NA POLYGON ((289830.8 9120732,... #> 10 0 POLYGON ((290372.3 9120732,... plot(p, axes = TRUE)"},{"path":"/reference/st_as_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"convert objects into a stars object — st_as_stars","title":"convert objects into a stars object — st_as_stars","text":"convert objects stars object","code":""},{"path":"/reference/st_as_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"convert objects into a stars object — st_as_stars","text":"","code":"# S3 method for class 'cubble_df' st_as_stars(.x, ..., check_times = FALSE) # S3 method for class 'ncdfgeom' st_as_stars(.x, ..., sf_geometry = NA) # S3 method for class 'OpenStreetMap' st_as_stars(.x, ..., as_col = FALSE) # S3 method for class 'stars_proxy' st_as_stars( .x, ..., downsample = 0, url = attr(.x, \"url\"), envir = parent.frame() ) # S3 method for class 'data.frame' st_as_stars(.x, ..., dims = coords, xy, y_decreasing = TRUE, coords = 1:2) # S3 method for class 'Raster' st_as_stars(.x, ..., att = 1, ignore_file = FALSE) # S3 method for class 'SpatRaster' st_as_stars( .x, ..., ignore_file = FALSE, as_attributes = all(terra::is.factor(.x)) ) # S3 method for class 'sf' st_as_stars(.x, ..., dims = attr(.x, \"sf_column\")) st_as_stars(.x, ...) # S3 method for class 'list' st_as_stars(.x, ..., dimensions = NULL) # Default S3 method st_as_stars(.x = NULL, ..., raster = NULL) # S3 method for class 'stars' st_as_stars(.x, ..., curvilinear = NULL, crs = st_crs(\"OGC:CRS84\")) # S3 method for class 'bbox' st_as_stars( .x, ..., nx, ny, dx = dy, dy = dx, xlim = .x[c(\"xmin\", \"xmax\")], ylim = .x[c(\"ymin\", \"ymax\")], values = 0, n = 64800, pretty = FALSE, inside = FALSE, nz, proxy = FALSE ) # S3 method for class 'xts' st_as_stars(.x, ..., dimensions, name = \"attr\")"},{"path":"/reference/st_as_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"convert objects into a stars object — st_as_stars","text":".x object convert ... case .x class bbox, arguments passed pretty. case .x class nc_proxy, arguments passed read_ncdf. check_times logical; check time stamps time series identical? sf_geometry sf data.frame geometry attributes added stars object. Must number rows timeseries instances. as_col logical; return rgb numbers (FALSE) (character) color values (TRUE)? downsample integer: larger 0, downsample rate (number pixels skip every row/column); length 2, specifies downsampling rate x y. url character; URL stars endpoint data reside envir environment resolve objects dims column names indices form cube dimensions xy x y raster dimension names indices; takes effect dims specified, see details y_decreasing logical; TRUE, (numeric) y values get negative delta (decrease increasing index) coords dims, symmetry st_as_sf att see factorValues; column RasterLayer's attribute table ignore_file logical; TRUE, ignore SpatRaster object file name as_attributes logical; TRUE .x one layer, load separate attributes rather band time dimension (implemented case ignore_file TRUE) dimensions object class dimensions raster character; names dimensions denote raster dimensions curvilinear creating curvilinear grids: named length 2 list holding longitude latitude matrices stars arrays, names corresponding attributes .x; names vector correspond raster dimensions matrices associated ; see Details. crs object class crs coordinate reference system values curvilinear; see details nx integer; number cells x direction; see details ny integer; number cells y direction; see details dx numeric object class units; cell size x direction; see details dy numeric object class units; cell size y direction; see details xlim length 2 numeric vector extent (min, max) x direction ylim length 2 numeric vector extent (min, max) y direction values value(s) populate raster values n (approximate) target number grid cells pretty logical; cell coordinates pretty values? inside logical; cells entirely fall inside bbox, potentially covering completely (TRUE), always cover bbox (FALSE), find good approximation (NA, default)? nz integer; number cells z direction; missing z-dimension created. proxy logical; stars_proxy object created? (requires gdal_create binary sf < 1.0-6) name character; attribute name array xts object","code":""},{"path":"/reference/st_as_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"convert objects into a stars object — st_as_stars","text":"ncdfgeom method: objects point-timeseries optional line polygon geometry timeseries specified sf_geometry parameter. See ncdfgeom NetCDF-based format geometry timeseries. xy specified first two dimensions dims numeric, set two dimensions. st_as_stars method sf objects without additional arguments returns one-dimensional data cube dimension simple features geometries, remaining attributes data cube attributes. used arguments, method data.frames called. curvilinear list stars objects longitude latitude values, coordinate reference system typically latitude longitude values. curvilinear contains names two arrays .x, removed returned object. bbox method: pretty TRUE, raster cells may extend coordinate range .x sides. addition nx ny, dx dy also missing, set single value computed sqrt(diff(xlim)*diff(ylim)/n). nx ny missing values matrix, number columns rows matrix taken. Otherwise, nx ny missing, computed (ceiling, floor, rounded integer value) ratio (x y) range divided (dx dy), depending value inside. Positive dy made negative. named arguments (...) passed pretty. dx dy units objects, value converted units st_crs(.x) (sf >= 1.0-7). xts methods, dimensions provided, time first dimension.","code":""},{"path":"/reference/st_as_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"convert objects into a stars object — st_as_stars","text":"","code":"if (require(plm, quietly = TRUE)) { data(Produc, package = \"plm\") st_as_stars(Produc) } #> #> Attaching package: ‘plm’ #> The following objects are masked from ‘package:dplyr’: #> #> between, lag, lead #> stars object with 2 dimensions and 9 attributes #> attribute(s): #> region pcap hwy water #> 5 :136 Min. : 2627 Min. : 1827 Min. : 228.5 #> 8 :136 1st Qu.: 7097 1st Qu.: 3858 1st Qu.: 764.5 #> 4 :119 Median : 17572 Median : 7556 Median : 2266.5 #> 1 :102 Mean : 25037 Mean :10218 Mean : 3618.8 #> 3 : 85 3rd Qu.: 27692 3rd Qu.:11267 3rd Qu.: 4318.7 #> 6 : 68 Max. :140217 Max. :47699 Max. :24592.3 #> (Other):170 #> util pc gsp emp #> Min. : 538.5 Min. : 4053 Min. : 4354 Min. : 108.3 #> 1st Qu.: 2488.3 1st Qu.: 21651 1st Qu.: 16502 1st Qu.: 475.0 #> Median : 7008.8 Median : 40671 Median : 39987 Median : 1164.8 #> Mean :11199.5 Mean : 58188 Mean : 61014 Mean : 1747.1 #> 3rd Qu.:11598.5 3rd Qu.: 64796 3rd Qu.: 68126 3rd Qu.: 2114.1 #> Max. :80728.1 Max. :375342 Max. :464550 Max. :11258.0 #> #> unemp #> Min. : 2.800 #> 1st Qu.: 5.000 #> Median : 6.200 #> Mean : 6.602 #> 3rd Qu.: 7.900 #> Max. :18.000 #> #> dimension(s): #> from to offset delta values #> state 1 48 NA NA ALABAMA,...,WYOMING #> year 1 17 1970 1 NULL if (require(dplyr, quietly = TRUE)) { # https://stackoverflow.com/questions/77368957/ spatial_dim <- st_sf( ID = 1:3, geometry = list( st_polygon(list( cbind(c(0, 1, 1, 0, 0), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(1, 2, 2, 1, 1), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(2, 3, 3, 2, 2), c(0, 0, 1, 1, 0)) )) ) ) weekdays_dim <- data.frame(weekdays = c(\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\")) hours_dim <- data.frame(hours = c(\"8am\", \"11am\", \"4pm\", \"11pm\")) sf_dta <- spatial_dim |> cross_join(weekdays_dim)|> cross_join(hours_dim) |> mutate(population = rnorm(n(), mean = 1000, sd = 200)) |> select(everything(), geometry) st_as_stars(sf_dta, dims = c(\"weekdays\", \"hours\", \"geometry\")) } #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> ID 1.0000 1.0000 2.000 2.000 3.000 3.000 #> population 594.2642 909.3489 1016.819 1010.279 1112.744 1324.842 #> dimension(s): #> from to point #> weekdays 1 7 NA #> hours 1 4 NA #> geometry 1 3 FALSE #> values #> weekdays Monday,...,Sunday #> hours 8am,...,11pm #> geometry POLYGON ((0 0, 1 0, 1 1, ...,...,POLYGON ((2 0, 3 0, 3 1, ... demo(nc, echo=FALSE,ask=FALSE) st_as_stars(nc) #> stars object with 1 dimensions and 14 attributes #> attribute(s): #> AREA PERIMETER CNTY_ CNTY_ID #> Min. :0.0420 Min. :0.999 Min. :1825 Min. :1825 #> 1st Qu.:0.0910 1st Qu.:1.324 1st Qu.:1902 1st Qu.:1902 #> Median :0.1205 Median :1.609 Median :1982 Median :1982 #> Mean :0.1263 Mean :1.673 Mean :1986 Mean :1986 #> 3rd Qu.:0.1542 3rd Qu.:1.859 3rd Qu.:2067 3rd Qu.:2067 #> Max. :0.2410 Max. :3.640 Max. :2241 Max. :2241 #> NAME FIPS FIPSNO CRESS_ID #> Length:100 Length:100 Min. :37001 Min. : 1.00 #> Class :character Class :character 1st Qu.:37050 1st Qu.: 25.75 #> Mode :character Mode :character Median :37100 Median : 50.50 #> Mean :37100 Mean : 50.50 #> 3rd Qu.:37150 3rd Qu.: 75.25 #> Max. :37199 Max. :100.00 #> BIR74 SID74 NWBIR74 BIR79 #> Min. : 248 Min. : 0.00 Min. : 1.0 Min. : 319 #> 1st Qu.: 1077 1st Qu.: 2.00 1st Qu.: 190.0 1st Qu.: 1336 #> Median : 2180 Median : 4.00 Median : 697.5 Median : 2636 #> Mean : 3300 Mean : 6.67 Mean :1050.8 Mean : 4224 #> 3rd Qu.: 3936 3rd Qu.: 8.25 3rd Qu.:1168.5 3rd Qu.: 4889 #> Max. :21588 Max. :44.00 Max. :8027.0 Max. :30757 #> SID79 NWBIR79 #> Min. : 0.00 Min. : 3.0 #> 1st Qu.: 2.00 1st Qu.: 250.5 #> Median : 5.00 Median : 874.5 #> Mean : 8.36 Mean : 1352.8 #> 3rd Qu.:10.25 3rd Qu.: 1406.8 #> Max. :57.00 Max. :11631.0 #> dimension(s): #> from to refsys point #> geom 1 100 NAD27 FALSE #> values #> geom MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... st_as_stars(st_drop_geometry(nc), dims = \"NAME\") #> stars object with 1 dimensions and 13 attributes #> attribute(s): #> AREA PERIMETER CNTY_ CNTY_ID #> Min. :0.0420 Min. :0.999 Min. :1825 Min. :1825 #> 1st Qu.:0.0910 1st Qu.:1.324 1st Qu.:1902 1st Qu.:1902 #> Median :0.1205 Median :1.609 Median :1982 Median :1982 #> Mean :0.1263 Mean :1.673 Mean :1986 Mean :1986 #> 3rd Qu.:0.1542 3rd Qu.:1.859 3rd Qu.:2067 3rd Qu.:2067 #> Max. :0.2410 Max. :3.640 Max. :2241 Max. :2241 #> FIPS FIPSNO CRESS_ID BIR74 #> Length:100 Min. :37001 Min. : 1.00 Min. : 248 #> Class :character 1st Qu.:37050 1st Qu.: 25.75 1st Qu.: 1077 #> Mode :character Median :37100 Median : 50.50 Median : 2180 #> Mean :37100 Mean : 50.50 Mean : 3300 #> 3rd Qu.:37150 3rd Qu.: 75.25 3rd Qu.: 3936 #> Max. :37199 Max. :100.00 Max. :21588 #> SID74 NWBIR74 BIR79 SID79 #> Min. : 0.00 Min. : 1.0 Min. : 319 Min. : 0.00 #> 1st Qu.: 2.00 1st Qu.: 190.0 1st Qu.: 1336 1st Qu.: 2.00 #> Median : 4.00 Median : 697.5 Median : 2636 Median : 5.00 #> Mean : 6.67 Mean :1050.8 Mean : 4224 Mean : 8.36 #> 3rd Qu.: 8.25 3rd Qu.:1168.5 3rd Qu.: 4889 3rd Qu.:10.25 #> Max. :44.00 Max. :8027.0 Max. :30757 Max. :57.00 #> NWBIR79 #> Min. : 3.0 #> 1st Qu.: 250.5 #> Median : 874.5 #> Mean : 1352.8 #> 3rd Qu.: 1406.8 #> Max. :11631.0 #> dimension(s): #> from to values #> NAME 1 100 Ashe,...,Brunswick data.frame(expand.grid(x=1:5, y = 1:5), z = rnorm(25)) |> st_as_stars() #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> z -2.194688 -1.01616 -0.258447 -0.3639007 0.3655264 1.613714 #> dimension(s): #> from to offset delta x/y #> x 1 5 0.5 1 [x] #> y 1 5 5.5 -1 [y] nc = st_read(system.file(\"gpkg/nc.gpkg\", package=\"sf\")) #> Reading layer `nc.gpkg' from data source #> `/home/runner/work/_temp/Library/sf/gpkg/nc.gpkg' using driver `GPKG' #> Simple feature collection with 100 features and 14 fields #> Geometry type: MULTIPOLYGON #> Dimension: XY #> Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 #> Geodetic CRS: NAD27 st_as_stars(nc) #> stars object with 1 dimensions and 14 attributes #> attribute(s): #> AREA PERIMETER CNTY_ CNTY_ID #> Min. :0.0420 Min. :0.999 Min. :1825 Min. :1825 #> 1st Qu.:0.0910 1st Qu.:1.324 1st Qu.:1902 1st Qu.:1902 #> Median :0.1205 Median :1.609 Median :1982 Median :1982 #> Mean :0.1263 Mean :1.673 Mean :1986 Mean :1986 #> 3rd Qu.:0.1542 3rd Qu.:1.859 3rd Qu.:2067 3rd Qu.:2067 #> Max. :0.2410 Max. :3.640 Max. :2241 Max. :2241 #> NAME FIPS FIPSNO CRESS_ID #> Length:100 Length:100 Min. :37001 Min. : 1.00 #> Class :character Class :character 1st Qu.:37050 1st Qu.: 25.75 #> Mode :character Mode :character Median :37100 Median : 50.50 #> Mean :37100 Mean : 50.50 #> 3rd Qu.:37150 3rd Qu.: 75.25 #> Max. :37199 Max. :100.00 #> BIR74 SID74 NWBIR74 BIR79 #> Min. : 248 Min. : 0.00 Min. : 1.0 Min. : 319 #> 1st Qu.: 1077 1st Qu.: 2.00 1st Qu.: 190.0 1st Qu.: 1336 #> Median : 2180 Median : 4.00 Median : 697.5 Median : 2636 #> Mean : 3300 Mean : 6.67 Mean :1050.8 Mean : 4224 #> 3rd Qu.: 3936 3rd Qu.: 8.25 3rd Qu.:1168.5 3rd Qu.: 4889 #> Max. :21588 Max. :44.00 Max. :8027.0 Max. :30757 #> SID79 NWBIR79 #> Min. : 0.00 Min. : 3.0 #> 1st Qu.: 2.00 1st Qu.: 250.5 #> Median : 5.00 Median : 874.5 #> Mean : 8.36 Mean : 1352.8 #> 3rd Qu.:10.25 3rd Qu.: 1406.8 #> Max. :57.00 Max. :11631.0 #> dimension(s): #> from to refsys point #> geom 1 100 NAD27 FALSE #> values #> geom MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572..."},{"path":"/reference/st_cells.html","id":null,"dir":"Reference","previous_headings":"","what":"return the cell index corresponding to the location of a set of points — st_cells","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"object cropped without normalization, indices return relative original uncropped extent. See st_crop","code":""},{"path":"/reference/st_cells.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"","code":"st_cells(x, sf)"},{"path":"/reference/st_cells.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"x object class stars sf object class sf sfc","code":""},{"path":"/reference/st_cells.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"return the cell index corresponding to the location of a set of points — st_cells","text":"","code":"set.seed(1345) st_bbox(L7_ETMs) |> st_as_sfc() |> st_sample(10) -> pts (x <- st_cells(L7_ETMs, pts)) #> [1] 102496 112324 74862 56976 112862 105242 75593 11784 91245 63885 # get the pixel values (first band only): st_as_stars(L7_ETMs)[[1]][x] #> [1] 92 92 89 76 67 94 77 98 113 56 # get pixel values for all bands: st_as_stars(L7_ETMs) |> split() |> sapply(`[`, x) #> X1 X2 X3 X4 X5 X6 #> [1,] 92 81 60 14 14 11 #> [2,] 92 83 59 13 13 12 #> [3,] 89 83 88 66 113 92 #> [4,] 76 63 66 61 108 78 #> [5,] 67 55 50 65 69 38 #> [6,] 94 81 92 60 125 105 #> [7,] 77 63 65 58 114 93 #> [8,] 98 85 88 57 93 80 #> [9,] 113 98 104 66 110 94 #> [10,] 56 40 27 68 50 24 # compare with st_extract(): st_as_stars(L7_ETMs) |> split() |> st_extract(pts) #> Simple feature collection with 10 features and 6 fields #> Geometry type: POINT #> Dimension: XY #> Bounding box: xmin: 289267.4 ymin: 9111549 xmax: 297166.8 ymax: 9119794 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> X1 X2 X3 X4 X5 X6 geometry #> 1 92 81 60 14 14 11 POINT (295582.2 9112406) #> 2 92 83 59 13 13 12 POINT (297166.8 9111599) #> 3 89 83 88 66 113 92 POINT (293775.8 9114659) #> 4 76 63 66 61 108 78 POINT (291294.7 9116093) #> 5 67 55 50 65 69 38 POINT (292609.8 9111549) #> 6 94 81 92 60 125 105 POINT (294276.2 9112159) #> 7 77 63 65 58 114 93 POINT (294731 9114598) #> 8 98 85 88 57 93 80 POINT (296360.6 9119794) #> 9 113 98 104 66 110 94 POINT (293206.5 9113313) #> 10 56 40 27 68 50 24 POINT (289267.4 9115521)"},{"path":"/reference/st_contour.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute or plot contour lines or sets — st_contour","title":"Compute or plot contour lines or sets — st_contour","text":"Compute contour lines sets","code":""},{"path":"/reference/st_contour.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute or plot contour lines or sets — st_contour","text":"","code":"st_contour( x, na.rm = TRUE, contour_lines = FALSE, breaks = classInt::classIntervals(na.omit(as.vector(x[[1]])))$brks )"},{"path":"/reference/st_contour.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute or plot contour lines or sets — st_contour","text":"x object class stars na.rm logical; missing valued cells removed, also converted features? contour_lines logical; FALSE, polygons returned (contour sets), otherwise contour lines breaks numerical; values \"draw\" contour levels","code":""},{"path":"/reference/st_contour.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute or plot contour lines or sets — st_contour","text":"function requires GDAL >= 2.4.0","code":""},{"path":[]},{"path":"/reference/st_coordinates.html","id":null,"dir":"Reference","previous_headings":"","what":"retrieve coordinates for raster or vector cube cells — st_coordinates","title":"retrieve coordinates for raster or vector cube cells — st_coordinates","text":"retrieve coordinates raster vector cube cells","code":""},{"path":"/reference/st_coordinates.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"retrieve coordinates for raster or vector cube cells — st_coordinates","text":"","code":"# S3 method for class 'stars' st_coordinates(x, ..., add_max = FALSE, center = TRUE) # S3 method for class 'stars' as.data.frame(x, ..., add_max = FALSE, center = NA, add_coordinates = TRUE) as_tibble.stars(.x, ..., add_max = FALSE, center = NA)"},{"path":"/reference/st_coordinates.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"retrieve coordinates for raster or vector cube cells — st_coordinates","text":"x object class stars ... ignored add_max logical; TRUE, dimensions given min (x) max (x_max) value center logical; (add_max FALSE): grid cell center coordinates returned (TRUE) offset values (FALSE)? center can named logical vector list specify values dimension. add_coordinates logical; `TRUE`, columns dimension values preceed array values, otherwise omitted .x object converted tibble","code":""},{"path":"/reference/st_crop.html","id":null,"dir":"Reference","previous_headings":"","what":"crop a stars object — st_crop","title":"crop a stars object — st_crop","text":"crop stars object","code":""},{"path":"/reference/st_crop.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"crop a stars object — st_crop","text":"","code":"# S3 method for class 'mdim' st_crop(x, y, ...) # S3 method for class 'stars_proxy' st_crop( x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), collect = TRUE ) # S3 method for class 'stars' st_crop( x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), as_points = all(st_dimension(y) == 2, na.rm = TRUE), normalize = FALSE )"},{"path":"/reference/st_crop.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"crop a stars object — st_crop","text":"x object class stars y object class sf, sfc bbox; see Details . ... ignored crop logical; TRUE, spatial extent returned object cropped still cover obj, FALSE, extent remains cells outside y given NA values. epsilon numeric; factor shrink bounding box y towards center cropping. collect logical; TRUE, repeat cropping stars object, .e. data read as_points logical; relevant y class sf sfc: FALSE, treat x set points, else set small polygons. Default: TRUE y two-dimensional, else FALSE; see Details normalize logical; TRUE pass cropped object st_normalize returning.","code":""},{"path":"/reference/st_crop.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"crop a stars object — st_crop","text":"raster x, st_crop selects cells intersect y. intersection, raster cells interpreted points small polygons? y class stars, x raster cells interpreted points; y class bbox, x cells interpreted cells (small polygons). Otherwise, as_points given, cells interpreted points y two-dimensional geometry.","code":""},{"path":"/reference/st_crop.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"crop a stars object — st_crop","text":"","code":"l7 = read_stars(system.file(\"tif/L7_ETMs.tif\", package = \"stars\")) d = st_dimensions(l7) # area around cells 3:10 (x) and 4:11 (y): offset = c(d[[\"x\"]]$offset, d[[\"y\"]]$offset) res = c(d[[\"x\"]]$delta, d[[\"y\"]]$delta) bb = st_bbox(c(xmin = offset[1] + 2 * res[1], ymin = offset[2] + 11 * res[2], xmax = offset[1] + 10 * res[1], ymax = offset[2] + 3 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55.5 56.36979 65 111 #> dimension(s): #> from to offset delta refsys point x/y #> x 3 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 4 11 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA # equivalent: st_crop(l7, bb) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55.5 56.36979 65 111 #> dimension(s): #> from to offset delta refsys point x/y #> x 3 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 4 11 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # slightly smaller bbox: bb = st_bbox(c(xmin = offset[1] + 2.1 * res[1], ymin = offset[2] + 10.9 * res[2], xmax = offset[1] + 9.9 * res[1], ymax = offset[2] + 3.1 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55.5 56.36979 65 111 #> dimension(s): #> from to offset delta refsys point x/y #> x 3 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 4 11 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # slightly larger bbox: bb = st_bbox(c(xmin = offset[1] + 1.9 * res[1], ymin = offset[2] + 11.1 * res[2], xmax = offset[1] + 10.1 * res[1], ymax = offset[2] + 2.9 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55 56.11167 66 112 #> dimension(s): #> from to offset delta refsys point x/y #> x 2 11 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 3 12 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # half a cell size larger bbox: bb = st_bbox(c(xmin = offset[1] + 1.49 * res[1], ymin = offset[2] + 11.51 * res[2], xmax = offset[1] + 10.51 * res[1], ymax = offset[2] + 2.49 * res[2]), crs = st_crs(l7)) l7[bb] #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 17 43 55 56.11167 66 112 #> dimension(s): #> from to offset delta refsys point x/y #> x 2 11 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 3 12 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2)"},{"path":"/reference/st_dim_to_attr.html","id":null,"dir":"Reference","previous_headings":"","what":"create an array with dimension values — st_dim_to_attr","title":"create an array with dimension values — st_dim_to_attr","text":"create array dimension values","code":""},{"path":"/reference/st_dim_to_attr.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"create an array with dimension values — st_dim_to_attr","text":"","code":"st_dim_to_attr(x, which = seq_along(dim(x)))"},{"path":"/reference/st_dim_to_attr.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"create an array with dimension values — st_dim_to_attr","text":"x object class stars integer; indices dimensions address (default: )","code":""},{"path":"/reference/st_dim_to_attr.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"create an array with dimension values — st_dim_to_attr","text":"stars object dimension values attributes","code":""},{"path":"/reference/st_dim_to_attr.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"create an array with dimension values — st_dim_to_attr","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x1 = read_stars(tif) (x = st_dim_to_attr(x1)) #> stars object with 3 dimensions and 3 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> x 288790.5 291270 293749.5 293749.5 296229 298708.5 #> y 9110743.0 9113244 9115744.8 9115744.8 9118246 9120746.5 #> band 1.0 2 3.5 3.5 5 6.0 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x) (x = st_dim_to_attr(x1, 2:3)) #> stars object with 3 dimensions and 2 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> y 9110743 9113244 9115744.8 9115744.8 9118246 9120747 #> band 1 2 3.5 3.5 5 6 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x) (x= st_dim_to_attr(x1, 3)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> band 1 2 3.5 3.5 5 6 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA plot(x)"},{"path":"/reference/st_dimensions.html","id":null,"dir":"Reference","previous_headings":"","what":"get dimensions from stars object — st_dimensions","title":"get dimensions from stars object — st_dimensions","text":"get dimensions stars object","code":""},{"path":"/reference/st_dimensions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"get dimensions from stars object — st_dimensions","text":"","code":"st_dimensions(.x, ...) # S3 method for class 'stars' st_dimensions(.x, ...) st_dimensions(x) <- value # S3 method for class 'stars' st_dimensions(x) <- value # S3 method for class 'stars_proxy' st_dimensions(x) <- value # S3 method for class 'list' st_dimensions(x) <- value # S3 method for class 'array' st_dimensions(.x, ...) # Default S3 method st_dimensions( .x, ..., .raster, affine = c(0, 0), cell_midpoints = FALSE, point = FALSE ) st_set_dimensions( .x, which, values = NULL, point = NULL, names = NULL, xy, ... ) st_get_dimension_values(.x, which, ..., where = NA, max = FALSE, center = NA)"},{"path":"/reference/st_dimensions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"get dimensions from stars object — st_dimensions","text":".x object retrieve dimensions information ... arguments x object class dimensions value new object class dimensions, matching dimensions .raster length 2 character array names () raster dimensions affine numeric; specify parameters affine transformation cell_midpoints logical; TRUE dimension values strictly regular, values interpreted cell midpoint values rather cell offset values calculating offset (.e., half-cell-size correction applied); can value dimension, else recycled point logical; pixel value (measure) refer point (location) value pixel (area) summary value? integer character; index name dimension changed values values dimension (e.g. sfc list-column), length-1 dimensions object; setting special value NULL removes dimension values, instance remove curvilinear raster coordinates names character; vector new names dimensions, single new name dimension indicated xy length-2 character vector; (new) names x y raster dimensions character, one 'start', 'center' 'end'. Set NA (default) ignore use max center explictly. argument provides convenient alternative setting max center. max logical; TRUE return end, rather beginning interval center logical; TRUE return center interval; NA return center raster dimensions, start intervals cases","code":""},{"path":"/reference/st_dimensions.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"get dimensions from stars object — st_dimensions","text":"dimensions attribute x, class dimensions","code":""},{"path":"/reference/st_dimensions.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"get dimensions from stars object — st_dimensions","text":"dimensions can specified two ways. simplest pass vector numeric values numeric dimension, character values categorical dimension. Parameter cell_midpoints used specify whether numeric values refer offset (start) dimension interval (default), center; center case available regular dimensions. rectilinear numeric dimensions, one can specify either vector cell borders (start values), data.frame two columns named \"start\" \"end\", respective interval start end values. first case, end values computed start values assuming last two intervals equal width.","code":""},{"path":"/reference/st_dimensions.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"get dimensions from stars object — st_dimensions","text":"","code":"x = read_stars(system.file(\"tif/L7_ETMs.tif\", package = \"stars\")) # Landsat 7 ETM+ band semantics: https://landsat.gsfc.nasa.gov/the-enhanced-thematic-mapper-plus/ # set bands to values 1,2,3,4,5,7: (x1 = st_set_dimensions(x, \"band\", values = c(1,2,3,4,5,7), names = \"band_number\", point = TRUE)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point values x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] #> band_number 1 6 NA NA NA TRUE 1,...,7 # set band values as bandwidth rbind(c(0.45,0.515), c(0.525,0.605), c(0.63,0.69), c(0.775,0.90), c(1.55,1.75), c(2.08,2.35)) %>% units::set_units(\"um\") -> bw # or: units::set_units(µm) -> bw # set bandwidth midpoint: (x2 = st_set_dimensions(x, \"band\", values = 0.5 * (bw[,1]+bw[,2]), names = \"bandwidth_midpoint\", point = TRUE)) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE #> bandwidth_midpoint 1 6 NA NA udunits TRUE #> values x/y #> x NULL [x] #> y NULL [y] #> bandwidth_midpoint 0.4825 [um],...,2.215 [um] # set bandwidth intervals: (x3 = st_set_dimensions(x, \"band\", values = make_intervals(bw), names = \"bandwidth\")) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE #> bandwidth 1 6 NA NA udunits NA #> values x/y #> x NULL [x] #> y NULL [y] #> bandwidth [0.45,0.515) [um],...,[2.08,2.35) [um] m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 5.75 10.5 10.5 15.25 20 #> dimension(s): #> from to offset delta point x/y #> x 1 5 0 1 FALSE [x] #> y 1 4 0 1 FALSE [y] st_get_dimension_values(s, 'x', where = \"start\") #> [1] 0 1 2 3 4 st_get_dimension_values(s, 'x', center = FALSE) #> [1] 0 1 2 3 4 st_get_dimension_values(s, 'x', where = \"center\") #> [1] 0.5 1.5 2.5 3.5 4.5 st_get_dimension_values(s, 'x', center = TRUE) #> [1] 0.5 1.5 2.5 3.5 4.5 st_get_dimension_values(s, 'x', where = \"end\") #> [1] 1 2 3 4 5 st_get_dimension_values(s, 'x', max = TRUE) #> [1] 1 2 3 4 5"},{"path":"/reference/st_downsample.html","id":null,"dir":"Reference","previous_headings":"","what":"downsample stars or stars_proxy objects — st_downsample","title":"downsample stars or stars_proxy objects — st_downsample","text":"downsample stars stars_proxy object either skipping rows, columns bands, computing single value (e.g. mean) sub-tiles involved","code":""},{"path":"/reference/st_downsample.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"downsample stars or stars_proxy objects — st_downsample","text":"","code":"st_downsample(x, n, ...) # S3 method for class 'stars' st_downsample(x, n, ..., offset = 0, FUN) # S3 method for class 'stars_proxy' st_downsample(x, n, ...)"},{"path":"/reference/st_downsample.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"downsample stars or stars_proxy objects — st_downsample","text":"x object class stars stars_proxy n integer; dimension number pixels/lines/bands etc skipped; see Details. ... arguments passed FUN (e.g., na.rm = TRUE ignore missing values FUN mean) offset integer; offset(s) downsampling, pixels, starting offset dimension; smaller equal n FUN function; given, downsampling apply FUN subtiles","code":""},{"path":"/reference/st_downsample.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"downsample stars or stars_proxy objects — st_downsample","text":"n == 0, downsampling takes place; 1, every second row/column/band skipped, 2, every second+third row/column/band skipped, etc. Downsampling stars_proxy object returns stars object, equivalent calling st_as_stars(x, downsample = 2), downsamples first two (x y) dimensions. Downsampled regular rasters keep dimension offsets, cell size (delta) n[]+1 times larger, may result (slightly) different extent. Note terra's aggregate fact=2 corresponds st_downsample(x, n = 1, FUN = mean): fact one larger n.","code":""},{"path":"/reference/st_downsample.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"downsample stars or stars_proxy objects — st_downsample","text":"","code":"(m = matrix(1:121, 11, 11)) #> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] #> [1,] 1 12 23 34 45 56 67 78 89 100 111 #> [2,] 2 13 24 35 46 57 68 79 90 101 112 #> [3,] 3 14 25 36 47 58 69 80 91 102 113 #> [4,] 4 15 26 37 48 59 70 81 92 103 114 #> [5,] 5 16 27 38 49 60 71 82 93 104 115 #> [6,] 6 17 28 39 50 61 72 83 94 105 116 #> [7,] 7 18 29 40 51 62 73 84 95 106 117 #> [8,] 8 19 30 41 52 63 74 85 96 107 118 #> [9,] 9 20 31 42 53 64 75 86 97 108 119 #> [10,] 10 21 32 43 54 65 76 87 98 109 120 #> [11,] 11 22 33 44 55 66 77 88 99 110 121 (s = st_as_stars(m)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 31 61 61 91 121 #> dimension(s): #> from to offset delta point x/y #> X1 1 11 0 1 FALSE [x] #> X2 1 11 0 1 FALSE [y] st_downsample(s, 1) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 1 28.5 61 61 93.5 121 #> dimension(s): #> from to offset delta point x/y #> X1 1 6 0 2 FALSE [x] #> X2 1 6 0 2 FALSE [y] st_downsample(s, 1)[[1]] #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 1 23 45 67 89 111 #> [2,] 3 25 47 69 91 113 #> [3,] 5 27 49 71 93 115 #> [4,] 7 29 51 73 95 117 #> [5,] 9 31 53 75 97 119 #> [6,] 11 33 55 77 99 121 st_downsample(s, 1, offset = 1) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 13 37 61 61 85 109 #> dimension(s): #> from to offset delta point x/y #> X1 1 5 1 2 FALSE [x] #> X2 1 5 1 2 FALSE [y] st_downsample(s, 1, offset = 1)[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 13 35 57 79 101 #> [2,] 15 37 59 81 103 #> [3,] 17 39 61 83 105 #> [4,] 19 41 63 85 107 #> [5,] 21 43 65 87 109 st_downsample(s, 1, offset = c(0,1)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 12 36.5 61 61 85.5 110 #> dimension(s): #> from to offset delta point x/y #> X1 1 6 0 2 FALSE [x] #> X2 1 5 1 2 FALSE [y] st_downsample(s, 1, offset = c(0,1))[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 12 34 56 78 100 #> [2,] 14 36 58 80 102 #> [3,] 16 38 60 82 104 #> [4,] 18 40 62 84 106 #> [5,] 20 42 64 86 108 #> [6,] 22 44 66 88 110 st_downsample(s, 1, FUN = mean) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 7 31 55 55 79 103 #> dimension(s): #> from to offset delta point x/y #> X1 1 5 0 2 FALSE [x] #> X2 1 5 0 2 FALSE [y] st_downsample(s, 1, FUN = mean)[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 7 29 51 73 95 #> [2,] 9 31 53 75 97 #> [3,] 11 33 55 77 99 #> [4,] 13 35 57 79 101 #> [5,] 15 37 59 81 103 st_downsample(s, 1, offset = 1, FUN = mean) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> A1 19 43 67 67 91 115 #> dimension(s): #> from to offset delta point x/y #> X1 1 5 1 2 FALSE [x] #> X2 1 5 1 2 FALSE [y] st_downsample(s, 1, offset = c(0,1), FUN = mean)[[1]] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 18 40 62 84 106 #> [2,] 20 42 64 86 108 #> [3,] 22 44 66 88 110 #> [4,] 24 46 68 90 112 #> [5,] 26 48 70 92 114"},{"path":"/reference/st_extract.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract cell values at point locations — st_extract","title":"Extract cell values at point locations — st_extract","text":"Extract cell values point locations","code":""},{"path":"/reference/st_extract.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract cell values at point locations — st_extract","text":"","code":"st_extract(x, ...) # S3 method for class 'stars' st_extract( x, at, ..., bilinear = FALSE, time_column = attr(at, \"time_column\") %||% attr(at, \"time_col\"), interpolate_time = bilinear, FUN = mean )"},{"path":"/reference/st_extract.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract cell values at point locations — st_extract","text":"x object class stars stars_proxy ... passed aggregate.stars geometries exclusively POINT geometries object class sf sfc geometries, two-column matrix coordinate points rows, indicating extract values x bilinear logical; use bilinear interpolation rather nearest neighbour? time_column character integer; name index column time date values matched values first temporal dimension (matching classes POSIXct, POSIXt, Date, PCICt), x, dimension reduced. useful extract data cube values along trajectory; see https://github.com/r-spatial/stars/issues/352 . interpolate_time logical; time interpolated? FALSE, time instances matched using coinciding last preceding time data cube. FUN function used aggregate pixel values geometries intersect one pixel","code":""},{"path":"/reference/st_extract.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract cell values at point locations — st_extract","text":"class matrix, matrix extracted values returned; otherwise: x dimensions x y (raster), object class stars POINT geometries replacing x y raster dimensions, case, object sf extracted values.","code":""},{"path":"/reference/st_extract.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract cell values at point locations — st_extract","text":"points outside raster returned NA values. large sets points extraction needed, passing matrix may much faster passing sf sfc object.","code":""},{"path":"/reference/st_extract.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract cell values at point locations — st_extract","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") r = read_stars(tif) pnt = st_sample(st_as_sfc(st_bbox(r)), 10) st_extract(r, pnt) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 12 60.75 74 72.51667 87 150 #> dimension(s): #> from to refsys point #> geometry 1 10 SIRGAS 2000 / UTM zone 25S TRUE #> band 1 6 NA NA #> values #> geometry POINT (298340.2 9114943),...,POINT (289531.4 9111471) #> band NULL st_extract(r, pnt) %>% st_as_sf() #> Simple feature collection with 10 features and 6 fields #> Geometry type: POINT #> Dimension: XY #> Bounding box: xmin: 288950.3 ymin: 9111189 xmax: 298340.2 ymax: 9119338 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> L7_ETMs.tif.V1 L7_ETMs.tif.V2 L7_ETMs.tif.V3 L7_ETMs.tif.V4 L7_ETMs.tif.V5 #> 1 97 88 67 14 13 #> 2 82 66 74 49 107 #> 3 66 54 46 73 79 #> 4 80 68 69 77 117 #> 5 87 85 104 87 120 #> 6 90 83 65 13 13 #> 7 63 46 38 65 83 #> 8 110 101 114 74 150 #> 9 80 68 74 54 110 #> 10 80 65 65 44 84 #> L7_ETMs.tif.V6 geometry #> 1 12 POINT (298340.2 9114943) #> 2 82 POINT (293918.4 9114415) #> 3 42 POINT (293485.2 9118749) #> 4 86 POINT (294440.9 9114839) #> 5 79 POINT (295209 9118813) #> 6 12 POINT (295048.9 9111189) #> 7 50 POINT (289649.4 9116888) #> 8 128 POINT (295730.3 9119338) #> 9 88 POINT (288950.3 9111816) #> 10 71 POINT (289531.4 9111471) st_extract(r[,,,1], pnt) #> Simple feature collection with 10 features and 1 field #> Geometry type: POINT #> Dimension: XY #> Bounding box: xmin: 288950.3 ymin: 9111189 xmax: 298340.2 ymax: 9119338 #> Projected CRS: SIRGAS 2000 / UTM zone 25S #> L7_ETMs.tif geometry #> 1 97 POINT (298340.2 9114943) #> 2 82 POINT (293918.4 9114415) #> 3 66 POINT (293485.2 9118749) #> 4 80 POINT (294440.9 9114839) #> 5 87 POINT (295209 9118813) #> 6 90 POINT (295048.9 9111189) #> 7 63 POINT (289649.4 9116888) #> 8 110 POINT (295730.3 9119338) #> 9 80 POINT (288950.3 9111816) #> 10 80 POINT (289531.4 9111471) st_extract(r, st_coordinates(pnt)) # \"at\" is a matrix: return a matrix #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 97 88 67 14 13 12 #> [2,] 82 66 74 49 107 82 #> [3,] 66 54 46 73 79 42 #> [4,] 80 68 69 77 117 86 #> [5,] 87 85 104 87 120 79 #> [6,] 90 83 65 13 13 12 #> [7,] 63 46 38 65 83 50 #> [8,] 110 101 114 74 150 128 #> [9,] 80 68 74 54 110 88 #> [10,] 80 65 65 44 84 71"},{"path":"/reference/st_geotransform.html","id":null,"dir":"Reference","previous_headings":"","what":"get or set the geotransform, or rotation matrix — st_geotransform","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"get set geotransform, rotation matrix","code":""},{"path":"/reference/st_geotransform.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"","code":"st_geotransform(x, ...) st_geotransform(x) <- value # S3 method for class 'stars' st_geotransform(x) <- value"},{"path":"/reference/st_geotransform.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"x object class stars dimensions ... ignored value length 6 numeric vector, 2 x 2 (scaled) rotation matrix","code":""},{"path":"/reference/st_geotransform.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"get or set the geotransform, or rotation matrix — st_geotransform","text":"","code":"# using the \"classical\" rotation matrix, see https://en.wikipedia.org/wiki/Rotation_matrix : rot = function(theta, dxdy = c(1., -1.)) { th = theta / 180 * pi matrix(c(cos(th), sin(th), -sin(th), cos(th)), 2, 2) %*% matrix(c(dxdy[2], 0, 0, dxdy[1]), 2, 2) } l = st_downsample(st_as_stars(L7_ETMs), 9) # save time in plotting st_geotransform(l) = rot(20, c(28.5, 28.5)) # clockwise, 20 degrees, scale by cell size plot(l[,,,1]) m = rot(20, c(1, 2)) g = expand.grid(x = 0:4, y = 0:4) plot(g[1:2], asp = 1) text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4) g = t(m %*% t(as.matrix(g))) points(g, col = 'red') text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4, col = 'red') m = matrix(1:20, 4) s0 = st_as_stars(m) s = s0 # dy > 0, clockwise rotation: st_geotransform(s) = rot(10, c(1,1)) plot(s0, reset = FALSE) plot(s, add = TRUE) # dy < 0, counter clockwise rotation, + expansion in x-direction: layout(1) s0 = st_as_stars(st_bbox(s0), dx = 1) s0$values = 1:20 s0 #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> values 1 5.75 10.5 10.5 15.25 20 #> dimension(s): #> from to offset delta x/y #> x 1 4 0 1 [x] #> y 1 5 5 -1 [y] plot(s0, reset = FALSE) s = s0 st_geotransform(s) = rot(10, c(2,1)) plot(s, add = TRUE)"},{"path":"/reference/st_intersects.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"spatial intersect predicate for stars and sfc object — st_intersects.stars","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"spatial intersect predicate stars sfc object","code":""},{"path":"/reference/st_intersects.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"","code":"# S3 method for class 'stars' st_intersects(x, y, sparse = TRUE, ..., as_points = NA, transpose = FALSE)"},{"path":"/reference/st_intersects.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"x object class stars y object `st_geometry` method: class `sf` `sfc`, `stars` object `sfc` dimension sparse logical; TRUE, return sparse logical matrix (object class `sgbp`), FALSE, return logical matrix ... ignored, passed `st_intersects.sf` curvilinear grids as_points logical, grid cells considered points (TRUE) polygons (FALSE)? Default: FALSE warning emitted transpose logical; transpose `sgbp` object returned?","code":""},{"path":"/reference/st_intersects.stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"`sgbp` object sparse = TRUE, logical matrix otherwise","code":""},{"path":"/reference/st_intersects.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"spatial intersect predicate for stars and sfc object — st_intersects.stars","text":"curvilinear grids always converted polygons, points grid boundaries may intersect two cells touched; grids cell boundary corner belongs one cell.","code":""},{"path":"/reference/st_join.stars.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatially join a stars and an `sf` object — st_join.stars","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"Spatially join stars `sf` object","code":""},{"path":"/reference/st_join.stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"","code":"# S3 method for class 'stars' st_join( x, y, join = st_intersects, ..., what = \"left1\", as_points = NA, warn = TRUE )"},{"path":"/reference/st_join.stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"x object class stars y object class sf, one can coerced st_as_sf join join function, return sgbp object; see details ... arguments passed join function \"left1\", \"right\" \"inner\"; see details as_points logical; controls whether grid cells x treated points, cell areas; st_intersects.stars method default derive x's metadata, else assume areas. warn logical; TRUE, warn 1--many matches \"left1\"","code":""},{"path":"/reference/st_join.stars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"\"left1\", object class stars (first) value y spatial instances x","code":""},{"path":"/reference/st_join.stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Spatially join a stars and an `sf` object — st_join.stars","text":"one match single x value, first matching record y taken (warn TRUE warning raised). \"inner\", object class sf matching records x y.","code":""},{"path":"/reference/st_mosaic.html","id":null,"dir":"Reference","previous_headings":"","what":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"build mosaic (composite) several spatially disjoint stars objects","code":""},{"path":"/reference/st_mosaic.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"","code":"st_mosaic(.x, ...) # S3 method for class 'stars' st_mosaic( .x, ..., dst = tempfile(fileext = file_ext), options = c(\"-vrtnodata\", \"-9999\", \"-srcnodata\", \"nan\"), file_ext = \".tif\" ) # S3 method for class 'character' st_mosaic( .x, ..., dst = tempfile(fileext = file_ext), options = c(\"-vrtnodata\", \"-9999\"), file_ext = \".tif\" ) # S3 method for class 'stars_proxy' st_mosaic( .x, ..., dst = tempfile(fileext = file_ext), options = c(\"-vrtnodata\", \"-9999\"), file_ext = \".tif\" )"},{"path":"/reference/st_mosaic.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":".x object class stars, character vector input dataset names ... input stars objects dst character; destination file name; VRT file references source file(s), see details options character; options gdalbuildvrt command file_ext character; file extension, determining format used write (\".tif\" implies GeoTIFF)","code":""},{"path":"/reference/st_mosaic.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"stars method returns stars object composite input; character method returns file name file mosaic; see also GDAL documentation gdalbuildvrt","code":""},{"path":"/reference/st_mosaic.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"gdal function buildvrt builds mosaic input images; input images can multi-band, higher-dimensional data cubes stars objects multiple attributes; note `stars` method, `dst` file may contain references temporary files going removed termination R session. uses gdal_utils internally call buildvrt; executables external R called.","code":""},{"path":"/reference/st_mosaic.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"build mosaic (composite) of several spatially disjoint stars objects — st_mosaic","text":"","code":"x = read_stars(system.file(\"tif/L7_ETMs.tif\", package = \"stars\")) x1 = x[,100:200,100:200,] x2 = x[,150:300,150:300,] plot(st_mosaic(x1, x2))"},{"path":"/reference/st_raster_type.html","id":null,"dir":"Reference","previous_headings":"","what":"get the raster type (if any) of a stars object — st_raster_type","title":"get the raster type (if any) of a stars object — st_raster_type","text":"get raster type () stars object","code":""},{"path":"/reference/st_raster_type.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"get the raster type (if any) of a stars object — st_raster_type","text":"","code":"st_raster_type(x, dimension = character(0))"},{"path":"/reference/st_raster_type.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"get the raster type (if any) of a stars object — st_raster_type","text":"x object class stars dimension optional: numbers names dimension(s) get per-dimension type","code":""},{"path":"/reference/st_raster_type.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"get the raster type (if any) of a stars object — st_raster_type","text":"dimension specified, return spatial raster type: one NA (object raster dimensions), \"curvilinear\", \"rectilinear\", \"affine\", \"regular\". case dimension(s) specified, return one \"regular\", \"rectilinear\" (irregular numeric), \"discrete\" (anything else).","code":""},{"path":"/reference/st_raster_type.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"get the raster type (if any) of a stars object — st_raster_type","text":"categories \"curvilinear\" \"affine\" refer relationship pair spatial (raster) dimensions.","code":""},{"path":"/reference/st_raster_type.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"get the raster type (if any) of a stars object — st_raster_type","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) st_raster_type(x) #> [1] \"regular\" st_raster_type(x, 1:3) #> x y band #> \"regular\" \"regular\" \"discrete\""},{"path":"/reference/st_rasterize.html","id":null,"dir":"Reference","previous_headings":"","what":"rasterize simple feature geometries — st_rasterize","title":"rasterize simple feature geometries — st_rasterize","text":"rasterize simple feature geometries","code":""},{"path":"/reference/st_rasterize.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"rasterize simple feature geometries — st_rasterize","text":"","code":"st_rasterize( sf, template = guess_raster(sf, ...) %||% st_as_stars(st_bbox(sf), values = NA_real_, ...), file = tempfile(), driver = \"GTiff\", options = character(0), align = FALSE, proxy = FALSE, ... )"},{"path":"/reference/st_rasterize.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"rasterize simple feature geometries — st_rasterize","text":"sf object class sf template optional; stars object desired target geometry, target geometry alignment align=TRUE; see details file temporary file name driver driver temporary file options character; options vector GDALRasterize align logical; TRUE, template used geometry _alignment_, informing target resolution offset proxy logical; proxy object returned? ... arguments passed st_as_stars","code":""},{"path":"/reference/st_rasterize.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"rasterize simple feature geometries — st_rasterize","text":"`template` `stars` object, non-NA cells covered `sf` receive value `template`; see also argument `align`.","code":""},{"path":"/reference/st_rasterize.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"rasterize simple feature geometries — st_rasterize","text":"","code":"demo(nc, echo = FALSE, ask = FALSE) (x = st_rasterize(nc)) # default grid: #> stars object with 2 dimensions and 12 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> AREA 0.042 0.108 0.142 1.451932e-01 0.181 0.241 30904 #> PERIMETER 0.999 1.461 1.716 1.786110e+00 2.004 3.640 30904 #> CNTY_ 1825.000 1907.000 1989.000 1.998403e+03 2085.000 2241.000 30904 #> CNTY_ID 1825.000 1907.000 1989.000 1.998403e+03 2085.000 2241.000 30904 #> FIPSNO 37001.000 37049.000 37101.000 3.710042e+04 37153.000 37199.000 30904 #> CRESS_ID 1.000 25.000 51.000 5.071206e+01 77.000 100.000 30904 #> BIR74 248.000 1323.000 2648.000 3.791637e+03 4139.000 21588.000 30904 #> SID74 0.000 3.000 5.000 7.891985e+00 10.000 44.000 30904 #> NWBIR74 1.000 297.000 844.000 1.246210e+03 1396.000 8027.000 30904 #> BIR79 319.000 1606.000 3108.000 4.852046e+03 5400.000 30757.000 30904 #> SID79 0.000 3.000 6.000 9.584098e+00 13.000 57.000 30904 #> NWBIR79 3.000 360.000 1058.000 1.604642e+03 1524.000 11631.000 30904 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 461 -84.32 0.01925 NAD27 FALSE [x] #> y 1 141 36.59 -0.01925 NAD27 FALSE [y] plot(x, axes = TRUE) # a bit more customized grid: (x = st_rasterize(nc, st_as_stars(st_bbox(nc), nx = 100, ny = 50, values = NA_real_))) #> stars object with 2 dimensions and 12 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> AREA 0.042 0.108 0.142 0.145536 0.181 0.241 2373 #> PERIMETER 0.999 1.470 1.716 1.789032 2.004 3.640 2373 #> CNTY_ 1825.000 1908.000 1989.000 1999.761325 2088.000 2241.000 2373 #> CNTY_ID 1825.000 1908.000 1989.000 1999.761325 2088.000 2241.000 2373 #> FIPSNO 37001.000 37049.000 37101.000 37100.327750 37151.000 37199.000 2373 #> CRESS_ID 1.000 25.000 51.000 50.663875 76.000 100.000 2373 #> BIR74 248.000 1323.500 2648.000 3790.530263 4139.000 21588.000 2373 #> SID74 0.000 3.000 5.000 7.905976 10.000 44.000 2373 #> NWBIR74 1.000 289.000 844.000 1246.116483 1396.000 8027.000 2373 #> BIR79 319.000 1606.000 3108.000 4848.231062 5386.000 30757.000 2373 #> SID79 0.000 3.000 6.000 9.574419 13.000 57.000 2373 #> NWBIR79 3.000 360.000 1058.000 1602.740769 1524.000 11631.000 2373 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 100 -84.32 0.08867 NAD27 FALSE [x] #> y 1 50 36.59 -0.05415 NAD27 FALSE [y] plot(x, axes = TRUE) (ls = st_sf(a = 1:2, st_sfc(st_linestring(rbind(c(0.1, 0), c(1.1, 1))), st_linestring(rbind(c(0, 0.05), c(1, 0.05)))))) #> Simple feature collection with 2 features and 1 field #> Geometry type: LINESTRING #> Dimension: XY #> Bounding box: xmin: 0 ymin: 0 xmax: 1.1 ymax: 1 #> CRS: NA #> a #> 1 1 #> 2 2 #> c..st_sfc.st_linestring.rbind.c.0.1..0...c.1.1..1.....st_linestring.rbind.c.0..........0.05...c.1..0.05...... #> 1 LINESTRING (0.1 0, 1.1 1) #> 2 LINESTRING (0 0.05, 1 0.05) (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = NA_real_)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> values NA NA NA NaN NA NA 100 #> dimension(s): #> from to offset delta x/y #> x 1 10 0 0.1 [x] #> y 1 10 1 -0.1 [y] # Only the left-top corner is part of the grid cell: sf_extSoftVersion()[\"GDAL\"] #> GDAL #> \"3.4.1\" plot(st_rasterize(ls, grd), axes = TRUE, reset = FALSE) # ALL_TOUCHED=FALSE; plot(ls, add = TRUE, col = \"red\") plot(st_rasterize(ls, grd, options = \"ALL_TOUCHED=TRUE\"), axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = \"red\") # add lines to existing 0 values, summing values in case of multiple lines: (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = 0)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> values 0 0 0 0 0 0 #> dimension(s): #> from to offset delta x/y #> x 1 10 0 0.1 [x] #> y 1 10 1 -0.1 [y] r = st_rasterize(ls, grd, options = c(\"MERGE_ALG=ADD\", \"ALL_TOUCHED=TRUE\")) plot(r, axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = \"red\")"},{"path":"/reference/st_res.html","id":null,"dir":"Reference","previous_headings":"","what":"obtain (spatial) resolution of a stars object — st_res","title":"obtain (spatial) resolution of a stars object — st_res","text":"obtain resolution(s) stars object: default (absolute) x/y raster dimensions, optionally delta dimension parameters","code":""},{"path":"/reference/st_res.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"obtain (spatial) resolution of a stars object — st_res","text":"","code":"st_res(x, all = FALSE, absolute = !all)"},{"path":"/reference/st_res.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"obtain (spatial) resolution of a stars object — st_res","text":"x object class stars logical; FALSE return vector x/y raster resolution absolute logical; works = FALSE; TRUE return absolute resolution values, FALSE return delta values","code":""},{"path":"/reference/st_res.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"obtain (spatial) resolution of a stars object — st_res","text":"= FALSE vector x/y raster resolutions, otherwise list delta values","code":""},{"path":"/reference/st_res.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"obtain (spatial) resolution of a stars object — st_res","text":"","code":"st_res(L7_ETMs) #> x y #> 28.5 28.5 st_res(L7_ETMs, absolute = FALSE) #> x y #> 28.5 -28.5 st_res(L7_ETMs, all = TRUE) #> $x #> [1] 28.5 #> #> $y #> [1] -28.5 #> #> $band #> [1] NA #> if (require(starsdata)) { paste0(\"netcdf/\", c(\"avhrr-only-v2.19810901.nc\", \"avhrr-only-v2.19810902.nc\", \"avhrr-only-v2.19810903.nc\", \"avhrr-only-v2.19810904.nc\")) |> system.file(package = \"starsdata\") |> read_stars(quiet = TRUE) -> x st_res(x) |> print() st_res(x, all = TRUE) |> print() } #> Loading required package: starsdata #> x y #> 0.25 0.25 #> $x #> [1] 0.25 #> #> $y #> [1] -0.25 #> #> $zlev #> [1] NA #> #> $time #> Time difference of 1 days #>"},{"path":"/reference/st_rgb.html","id":null,"dir":"Reference","previous_headings":"","what":"reduce dimension to rgb (alpha) hex values — st_rgb","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"reduce dimension rgb (alpha) hex values","code":""},{"path":"/reference/st_rgb.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"","code":"st_rgb( x, dimension = 3, use_alpha = dim(x)[dimension] == 4, maxColorValue = 255L, probs = c(0, 1), stretch = NULL )"},{"path":"/reference/st_rgb.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"x object class stars dimension dimension name number reduce use_alpha logical; TRUE, fourth band used alpha values maxColorValue integer; maximum value colors probs probability values quantiles used stretching \"percent\". stretch logical character; TRUE \"percent\", band stretched 0 ... maxColorValue \"percent clip\" method using probs values. \"histogram\", \"histogram equalization\" performed (probs values ignored). stretch NULL FALSE, stretching performed. character values interpreted \"percent\" message printed.","code":""},{"path":"/reference/st_rgb.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"dimension's bands mapped red, green, blue, alpha; different ordering wanted, use [.stars reorder dimension, see examples. Alternatively, can use plot.stars rgb argument create three-band composition.","code":""},{"path":[]},{"path":"/reference/st_rgb.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"reduce dimension to rgb (alpha) hex values — st_rgb","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) st_rgb(x[,,,3:1]) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> L7_ETMs.tif #> Length:122848 #> Class :character #> Mode :character #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] r = st_rgb(x[,,,c(6,5,4,3)], 3, use_alpha=TRUE) # now R=6,G=5,B=4,alpha=3 if (require(ggplot2)) { ggplot() + geom_stars(data = r) + scale_fill_identity() } r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = \"percent\") plot(r) #> Error in image.stars(x, ..., axes = axes, breaks = breaks, col = col, key.pos = key.pos, key.width = key.width, key.length = key.length, main = NULL): rgb plotting not supported on this device r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = \"histogram\") plot(r) #> Error in image.stars(x, ..., axes = axes, breaks = breaks, col = col, key.pos = key.pos, key.width = key.width, key.length = key.length, main = NULL): rgb plotting not supported on this device"},{"path":"/reference/st_rotate.html","id":null,"dir":"Reference","previous_headings":"","what":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"Transform rotated long/lat regular grid unrotated curvilinear grid","code":""},{"path":"/reference/st_rotate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"","code":"# S3 method for class 'stars' st_rotate(.x, lon0, lat0, north = TRUE, ...) # S3 method for class 'sfc' st_rotate(.x, lon0, lat0, north = TRUE, ...) # S3 method for class 'sf' st_rotate(.x, lon0, lat0, north = TRUE, ...)"},{"path":"/reference/st_rotate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":".x object class stars lon0 longitude rotated pole degrees lat0 latitude rotated pole degrees north logical; TRUE pole refers North pole, otherwise South pole ... ignored","code":""},{"path":"/reference/st_rotate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"curvilinear stars object coordinates regular long/lat (North pole lat=90)","code":""},{"path":"/reference/st_rotate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Transform rotated pole long/lat regular grid to unrotated curvilinear grid — st_rotate","text":"","code":"if (require(\"starsdata\") && require(\"maps\")) { # data downloaded from https://esgf-data.dkrz.de/search/cosmo-rea/ nc = \"netcdf/ts_EUR-6km_ECMWF-ERAINT_REA6_r1i1p1f1_COSMO_v1_mon_201801-201812.nc\" f = system.file(nc, package = \"starsdata\") m = read_mdim(f, \"ts\") print(m) # NOTE this function is obsolete when reading m as # m = read_mdim(f, \"ts\", curvilinear = c(\"longitude\", \"latitude\")) if (require(RNetCDF)) { x = open.nc(f) lon = att.get.nc(x, \"rotated_latitude_longitude\", \"grid_north_pole_longitude\") lat = att.get.nc(x, \"rotated_latitude_longitude\", \"grid_north_pole_latitude\") close.nc(x) print(c(lon = lon, lat = lat)) } else { lon = -162 lat = 39.25 } m1 = st_rotate(m, lon, lat) print(m1) h = function() maps::map(add = TRUE) plot(m1, downsample = c(10, 10, 5), axes = TRUE, hook = h, mfrow = c(1, 2)) # curvilinear grid: downsample for plotting speed m2 = st_warp(m1, crs = st_crs(\"OGC:CRS84\"), threshold = .1) plot(m2, hook = h, mfrow = c(3, 4)) # regular grid: plots fast } #> Loading required package: maps #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> ts [K] 277.3233 284.7061 286.1046 286.5914 288.003 296.9786 #> dimension(s): #> from to offset delta refsys values x/y #> rlon 1 848 -28.43 0.055 NA NULL [x] #> rlat 1 824 -23.43 0.055 NA NULL [y] #> time 1 12 NA NA Date 2018-01-16,...,2018-12-16 #> Loading required package: RNetCDF #> lon lat #> -162.00 39.25 #> stars object with 3 dimensions and 1 attribute #> attribute(s), summary of first 1e+05 cells: #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> ts [K] 277.3233 284.7061 286.1046 286.5914 288.003 296.9786 #> dimension(s): #> from to refsys values x/y #> rlon 1 848 WGS 84 [848x824] -44.67,...,65.06 [x] #> rlat 1 824 WGS 84 [848x824] 21.95,...,72.61 [y] #> time 1 12 Date 2018-01-16,...,2018-12-16 #> curvilinear grid #> Warning: using Euclidean distance measures on geodetic coordinates #> downsample set to 5"},{"path":"/reference/st_set_bbox.html","id":null,"dir":"Reference","previous_headings":"","what":"set bounding box parameters of regular grid — st_set_bbox","title":"set bounding box parameters of regular grid — st_set_bbox","text":"set bounding box parameters regular grid","code":""},{"path":"/reference/st_set_bbox.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"set bounding box parameters of regular grid — st_set_bbox","text":"","code":"st_set_bbox(x, value, ...)"},{"path":"/reference/st_set_bbox.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"set bounding box parameters of regular grid — st_set_bbox","text":"x object class dimensions, stars stars_proxy value object class bbox ... ignored","code":""},{"path":"/reference/st_sfc2xy.html","id":null,"dir":"Reference","previous_headings":"","what":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"replace POINT simple feature geometry list x y raster","code":""},{"path":"/reference/st_sfc2xy.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"","code":"st_sfc2xy(x, ...)"},{"path":"/reference/st_sfc2xy.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"x object class stars, class sf ... passed .data.frame.stars","code":""},{"path":"/reference/st_sfc2xy.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"replace POINT simple feature geometry list with an x y raster — st_sfc2xy","text":"object class stars POINT list replaced x y raster dimensions. works points distributed regular rectilinear grid.","code":""},{"path":"/reference/st_tile.html","id":null,"dir":"Reference","previous_headings":"","what":"Specify parameters to load raster in blocks — st_tile","title":"Specify parameters to load raster in blocks — st_tile","text":"Helper function specifying block parameters (nXOff, nYOff, nXsize, nYSize) required RasterIO argument read_stars","code":""},{"path":"/reference/st_tile.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Specify parameters to load raster in blocks — st_tile","text":"","code":"st_tile(img_rows, img_cols, x_window, y_window, overlap = 0)"},{"path":"/reference/st_tile.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Specify parameters to load raster in blocks — st_tile","text":"img_rows number input raster rows (integer) img_cols number input raster columns (integer) x_window number rows block (integer) y_window number columns block (integer) overlap number overlapping pixels (integer)","code":""},{"path":"/reference/st_tile.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Specify parameters to load raster in blocks — st_tile","text":"matrix specified nXOff, nYOff, nXsize, nYSize parameters every block","code":""},{"path":"/reference/st_tile.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Specify parameters to load raster in blocks — st_tile","text":"","code":"if (FALSE) { # \\dontrun{ tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") r = read_stars(tif, proxy = TRUE) tiles = st_tile(nrow(r), ncol(r), 256, 256) for (i in seq_len(nrow(tiles))) { tile = read_stars(tif, proxy = FALSE, RasterIO = tiles[i, ]) # write tiles to separate files write_stars(tile, dsn = paste0(i, \".tif\")) } } # }"},{"path":"/reference/st_transform.html","id":null,"dir":"Reference","previous_headings":"","what":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"transform geometries stars objects new coordinate reference system, without warping","code":""},{"path":"/reference/st_transform.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"","code":"# S3 method for class 'stars' st_transform(x, crs, ...) st_transform_proj.stars(x, crs, ...)"},{"path":"/reference/st_transform.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"x object class stars, either raster simple feature geometries crs object class crs target crs ... ignored","code":""},{"path":"/reference/st_transform.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"simple feature dimensions, st_transform called, leading lossless transformation. gridded spatial data, curvilinear grid transformed grid cell (centers) returned, also lossless. convert regular grid new CRS, use st_warp (general lossy). array values contain geometries array whole class `sfc` non-missing CRS, array geometries also transformed.","code":""},{"path":[]},{"path":"/reference/st_transform.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"transform geometries in stars objects to a new coordinate reference system, without warping — st_transform","text":"","code":"geomatrix = system.file(\"tif/geomatrix.tif\", package = \"stars\") (x = read_stars(geomatrix)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> geomatrix.tif 74 107 123 126.765 132 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 20 1841002 1.5 WGS 84 / UTM zone 11N TRUE [x] #> y 1 20 1144003 -1.5 WGS 84 / UTM zone 11N TRUE [y] #> sheared raster with parameters: -5 -5 new = st_crs('OGC:CRS84') y = st_transform(x, new) plot(st_transform(st_as_sfc(st_bbox(x)), new), col = NA, border = 'red') plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) image(y, col = heat.colors(12), add = TRUE) plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) plot(st_transform(st_as_sfc(x, as_points=FALSE), new), add = TRUE)"},{"path":"/reference/st_warp.html","id":null,"dir":"Reference","previous_headings":"","what":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"Warp (resample) grids stars objects new grid, possibly new coordinate reference system","code":""},{"path":"/reference/st_warp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"","code":"st_warp( src, dest, ..., crs = NA_crs_, cellsize = NA_real_, segments = 100, use_gdal = FALSE, options = character(0), no_data_value = NA_real_, debug = FALSE, method = \"near\", threshold = NA_real_ )"},{"path":"/reference/st_warp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"src object class stars source raster dest object class stars target raster geometry ... ignored crs coordinate reference system destination grid, used dest missing cellsize length 1 2 numeric; cellsize target coordinate reference system units segments (total) number segments segmentizing bounding box transforming new crs use_gdal logical; TRUE, use gdal's warp warper, gdal_utils options character vector options, passed gdalwarp no_data_value value used gdalwarp no_data (NA) writing temporary file; setting use_gdal TRUE leads warning debug logical; TRUE, remove temporary gdalwarp destination file, print name method character; see details options; methods near work use_gdal=TRUE threshold numeric; distance threshold warping curvilinear grids: new cells distances larger threshold assigned NA values.","code":""},{"path":"/reference/st_warp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"method one near, bilinear, cubic, cubicspline, lanczos, average, mode, max, min, med, q1 q3; see https://github.com/r-spatial/stars/issues/109 gridded spatial data (dimensions x y), see figure; existing grid transformed regular grid defined dest, possibly new coordinate reference system. dest specified, crs , procedure used choose target grid similar projectRaster. entails: () envelope (bounding box polygon) transformed new crs, possibly segmentation (red box); (ii) grid formed new crs, touching transformed envelope East North side, (cellsize given) cellsize similar cell size src, extent least covers x; (iii) cell center new grid, matching grid cell x used; match, NA value used.","code":""},{"path":"/reference/st_warp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system — st_warp","text":"","code":"geomatrix = system.file(\"tif/geomatrix.tif\", package = \"stars\") (x = read_stars(geomatrix)) #> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> geomatrix.tif 74 107 123 126.765 132 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 20 1841002 1.5 WGS 84 / UTM zone 11N TRUE [x] #> y 1 20 1144003 -1.5 WGS 84 / UTM zone 11N TRUE [y] #> sheared raster with parameters: -5 -5 new_crs = st_crs('OGC:CRS84') y = st_warp(x, crs = new_crs) plot(st_transform(st_as_sfc(st_bbox(x)), new_crs), col = NA, border = 'red') plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) image(y, add = TRUE, nbreaks = 6) plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) plot(st_transform(st_as_sfc(x, as_points=FALSE), new_crs), add = TRUE) # warp 0-360 raster to -180-180 raster: r = read_stars(system.file(\"nc/reduced.nc\", package = \"stars\")) #> sst, anom, err, ice, r %>% st_set_crs('OGC:CRS84') %>% st_warp(st_as_stars(st_bbox(), dx = 2)) -> s plot(r, axes = TRUE) # no CRS set, so no degree symbols in labels plot(s, axes = TRUE) # downsample raster (90 to 270 m) r = read_stars(system.file(\"tif/olinda_dem_utm25s.tif\", package = \"stars\")) r270 = st_as_stars(st_bbox(r), dx = 270) r270 = st_warp(r, r270)"},{"path":"/reference/st_xy2sfc.html","id":null,"dir":"Reference","previous_headings":"","what":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"replace x y raster dimensions simple feature geometry list (points, polygons = rasterize)","code":""},{"path":"/reference/st_xy2sfc.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"","code":"st_xy2sfc(x, as_points, ..., na.rm = TRUE)"},{"path":"/reference/st_xy2sfc.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"x object class stars as_points logical; TRUE, generate points cell centers, else generate polygons ... arguments passed st_as_sfc na.rm logical; omit (remove) cells entirely missing valued (across dimensions)?","code":""},{"path":"/reference/st_xy2sfc.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) — st_xy2sfc","text":"object class stars x y raster dimensions replaced single sfc geometry list column containing either points, polygons. Adjacent cells identical values merged; see st_rasterize .","code":""},{"path":"/reference/stars_sentinel2.html","id":null,"dir":"Reference","previous_headings":"","what":"Sentinel-2 sample tile — stars_sentinel2","title":"Sentinel-2 sample tile — stars_sentinel2","text":"Sentinel-2 sample tile, downloaded reads four 10-m bands: B2 (490 nm), B3 (560 nm), B4 (665 nm) B8 (842 nm)","code":""},{"path":"/reference/stars_sentinel2.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sentinel-2 sample tile — stars_sentinel2","text":"","code":"stars_sentinel2"},{"path":"/reference/stars_sentinel2.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sentinel-2 sample tile — stars_sentinel2","text":"object class stars_proxy (inherits stars) dimension 10980 x 10980 x 4.","code":""},{"path":"/reference/stars_subset.html","id":null,"dir":"Reference","previous_headings":"","what":"subset stars objects — stars_subset","title":"subset stars objects — stars_subset","text":"subset stars objects","code":""},{"path":"/reference/stars_subset.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"subset stars objects — stars_subset","text":"","code":"# S3 method for class 'stars_proxy' x[i, downsample = 0] <- value # S3 method for class 'stars' x[i = TRUE, ..., drop = FALSE, crop = !is_curvilinear(x)] # S3 method for class 'stars' x[i] <- value st_flip(x, which = 1)"},{"path":"/reference/stars_subset.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"subset stars objects — stars_subset","text":"x object class stars first selector: integer, logical character vector indicating attributes select, object class sf, sfc, bbox, stars used spatial selector; see details downsample downsampling rate used case stars_proxy object value array dimensions equal x, vector value recycled array ... (logical integer vector) selectors, matched order, select individual dimensions drop logical; TRUE, degenerate dimensions (one value) dropped crop logical; TRUE parameter spatial geometry (sf sfc) object, extent (bounding box) result cropped match extent using st_crop. Cropping curvilinear grids supported. character integer; dimension(s) flipped","code":""},{"path":"/reference/stars_subset.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"subset stars objects — stars_subset","text":"st_flip flips (reverts) array values along chosen dimension without(s) changing dimension properties","code":""},{"path":"/reference/stars_subset.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"subset stars objects — stars_subset","text":"object class sf, sfc bbox, spatial subset covering geometry selected, possibly followed cropping extent. Array values cell centre inside geometry assigned NA. class stars, attributes logical, cells x corresponding NA FALSE cells assigned NA. Dimension ranges containing negative values NA may partially supported. assignment (replacement form, [<-), argument needs either () stars object logical attribute(s) dimensions matching (possibly recycling) x, case TRUE cells replaced /value recycled dimensions arrays x, (ii) length-one integer character vector indicating array replace, case value may stars object vector array (recycled).","code":""},{"path":"/reference/stars_subset.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"subset stars objects — stars_subset","text":"","code":"tif = system.file(\"tif/L7_ETMs.tif\", package = \"stars\") x = read_stars(tif) x[,,,1:3] # select bands #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 21 58 70 70.36041 83 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 3 NA NA NA NA x[,1:100,100:200,] # select x and y by range #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 13 54 65 67.21531 77 252 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 100 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 100 200 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x[\"L7_ETMs.tif\"] # select attribute #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 1 54 69 68.91242 86 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA xy = structure(list(x = c(293253.999046018, 296400.196497684), y = c(9113801.64775462, 9111328.49619133)), .Names = c(\"x\", \"y\")) pts = st_as_sf(data.frame(do.call(cbind, xy)), coords = c(\"x\", \"y\"), crs = st_crs(x)) image(x, axes = TRUE) plot(st_as_sfc(st_bbox(pts)), col = NA, add = TRUE) bb = st_bbox(pts) (xx = x[bb]) #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> L7_ETMs.tif 3 56 73 70.87303 89 255 #> dimension(s): #> from to offset delta refsys point x/y #> x 158 268 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 245 331 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA image(xx) plot(st_as_sfc(bb), add = TRUE, col = NA) image(x) pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) buf = st_buffer(st_sfc(pt, crs = st_crs(x)), 1500) plot(buf, add = TRUE) buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), crs = st_crs(x)) image(x[buf]) plot(buf, add = TRUE, col = NA) image(x[buf, crop=FALSE]) plot(buf, add = TRUE, col = NA) # with i of class stars: x[x > 75] # generates lots of NA's; pattern for each band #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> L7_ETMs.tif 76 82 90 94.40052 101 255 443210 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x[x[,,,1] > 75] # recycles a single band template for all bands #> stars object with 3 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's #> L7_ETMs.tif 1 63 79 74.98075 93 255 318960 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] #> band 1 6 NA NA NA NA x = read_stars(tif) # replace, using a logical stars selector: cuts all values above 90 to 90 x[x > 90] = 90 # replace a single attribute when there are more than one: s = split(x) names(s) = paste0(\"band\", 1:6) # rescale only band 1: s[1] = s[1] * 0.75 # rescale only attribute named \"band2\": s[\"band2\"] = s[\"band2\"] * 0.85 # create a new attribute from a numeric vector: s[\"rnorm\"] = rnorm(prod(dim(s))) s #> stars object with 2 dimensions and 7 attributes #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. #> band1 35.250000 50.2500000 58.500000000 57.878219426 66.7500000 67.500000 #> band2 27.200000 46.7500000 56.100000000 56.776205555 67.1500000 76.500000 #> band3 21.000000 49.0000000 63.000000000 62.777008987 77.0000000 90.000000 #> band4 9.000000 52.0000000 63.000000000 58.940544413 75.0000000 90.000000 #> band5 1.000000 63.0000000 89.000000000 71.285092146 90.0000000 90.000000 #> band6 1.000000 32.0000000 60.000000000 56.662127182 88.0000000 90.000000 #> rnorm -5.096659 -0.6759559 -0.004252816 -0.003659307 0.6699726 4.216072 #> dimension(s): #> from to offset delta refsys point x/y #> x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] #> y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] lc = read_stars(system.file(\"tif/lc.tif\", package = \"stars\")) x = c(orig = lc, flip_x = st_flip(lc, \"x\"), flip_y = st_flip(lc, \"y\"), flip_xy = st_flip(lc, c(\"x\", \"y\")), along = 3) plot(x)"},{"path":"/reference/write_stars.html","id":null,"dir":"Reference","previous_headings":"","what":"write stars object to gdal dataset (typically: to file) — write_stars","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"write stars object gdal dataset (typically: file)","code":""},{"path":"/reference/write_stars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"","code":"write_stars(obj, dsn, layer, ...) # S3 method for class 'stars' write_stars( obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), type = if (is.factor(obj[[1]]) && length(levels(obj[[1]])) < 256) \"Byte\" else \"Float32\", NA_value = NA_real_, update = FALSE, normalize_path = TRUE, scale_offset = c(1, 0) ) # S3 method for class 'stars_proxy' write_stars( obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), scale_offset = c(1, 0), type = \"Float32\", NA_value = NA_real_, chunk_size = c(dim(obj)[1], floor(2.5e+07/dim(obj)[1])), progress = TRUE ) detect.driver(filename)"},{"path":"/reference/write_stars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"obj object class stars dsn gdal dataset (file) name layer attribute name; missing, first attribute written ... passed gdal_write driver driver driver name; see st_drivers options character vector dataset creation options, passed GDAL type character; output binary type, one : Byte eight bit unsigned integer, UInt16 sixteen bit unsigned integer, Int16 sixteen bit signed integer, UInt32 thirty two bit unsigned integer, Int32 thirty two bit signed integer, Float32 thirty two bit floating point, Float64 sixty four bit floating point. NA_value non-NA value represent R's NA value target raster file; set NA, ignored. update logical; TRUE, existing file updated normalize_path logical; see read_stars scale_offset length 2 numeric vector scale, offset values: raw values computed raw = (value - offset) / scale written dsn; scale offset values written dsn else warning raised chunk_size length two integer vector number pixels (x, y) used read/write loop; see details. progress logical; TRUE, progress bar shown filename character; used guessing driver short name based file extension; see examples","code":""},{"path":"/reference/write_stars.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"write_stars first creates target file, updates sequentially writing blocks chunk_size. case obj multi-file stars_proxy object, files written layers output file dsn","code":""},{"path":"/reference/write_stars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"write stars object to gdal dataset (typically: to file) — write_stars","text":"","code":"detect.driver(\"L7_ETMs.tif\") #> [1] \"GTiff\""},{"path":"/news/index.html","id":"version-06-7","dir":"Changelog","previous_headings":"","what":"version 0.6-7","title":"version 0.6-7","text":"c.stars() verifies semantic equivalence objects’ CRS; #703 initial support read_mdim() work proxy = TRUE; #659","code":""},{"path":"/news/index.html","id":"version-06-6","dir":"Changelog","previous_headings":"","what":"version 0.6-6","title":"version 0.6-6","text":"CRAN release: 2024-07-16 skip cubble tests cubble version 0.3.1; https://github.com/huizezhang-sherry/cubble/issues/30 st_transform.stars transforms geometries array elements mutate.stars (others) handle attribute names spaces ; #689 st_crop() gains argument normalize; set TRUE st_normalize() called returned value; #685, #686 constrain reading full GEOLOCATION arrays case 2-D; #678","code":""},{"path":"/news/index.html","id":"version-06-5","dir":"Changelog","previous_headings":"","what":"version 0.6-5","title":"version 0.6-5","text":"CRAN release: 2024-04-04 fix st_as_stars.Spatial() Spatial gridded objects non-square grid cells, see https://github.com/r-spatial/gstat/issues/123 add prcomp() methods stars stars_proxy objects, working attributes last dimension st_rasterize() align=TRUE returns NA values data; #668 read_mdim() reads tables composity type, returning data.frame case; #659 st_rotate() transforms rotated grid back curvilinear grid unrotated coordinates. aggregate.stars() deals functions return one number, putting new dimension like st_apply() st_as_stars.data.frame() st_as_stars.sf() better handle non-raster data cubes plot.stars() resets layout needed (one sub-plot, key present) fixed st_as_stars.im(); #648 st_crs<-.stars() less critical existing CRS class crs c.stars() single (valid) argument along specified adds dimension; #646 st_join.stars() keeps attributes x complete; #643 st_as_stars.list() requires named list, set names array dimensions present","code":""},{"path":"/news/index.html","id":"version-06-4","dir":"Changelog","previous_headings":"","what":"version 0.6-4","title":"version 0.6-4","text":"CRAN release: 2023-09-11 plot.stars() fill argument shifts unused plotting space sub-maps bottom right side plotting area plot.stars(), key.width default sensitive par(\"ps\"), pointsize graphics parameter plot.stars() image.stars() sensitive cex.axis, axes key (requires sf >= 1.0-14); #642 move lwgeom dependency Suggests; using st_transform_proj() vector data cubes requires loading lwgeom first","code":""},{"path":"/news/index.html","id":"version-06-3","dir":"Changelog","previous_headings":"","what":"version 0.6-3","title":"version 0.6-3","text":"CRAN release: 2023-08-11 st_downsample() argument offset pixel-shift downsampled images st_downsample() argument FUN compute sub-tile aggregates; #604 st_as_stars.bbox() retains factor values; #640 fix CRAN error test script st_crop() works (warns) case crop area overlap area object; #638","code":""},{"path":"/news/index.html","id":"version-06-2","dir":"Changelog","previous_headings":"","what":"version 0.6-2","title":"version 0.6-2","text":"CRAN release: 2023-07-12 split.stars() accepts stars objects multiple attributes; #635 [.stars() supports NA values dimension ranges vector geometry (sfc) dimensions, resulting empty geometries st_extract() supports extracting points values curvilinear grids (proxy); #632 read_mdim() reads curvilinear rasters (geolocation arrays), far full extent/resolution st_as_stars.stars() accepts curvilinear argument lon/lat array names present .x consistently use OGC:CRS84 instead EPSG:4326 setting values = NULL st_set_dimensions() removes dimension values gracefully handle plotting global coverage curvilinear grids; #632 image.stars() plots images (e.g. cross sections) x /y singular absent; #628 st_as_stars.cubble_df() adds conversion cubble; cubble::as_cubble() methods converts back [<-.stars() accepts indicator (numeric length character) array replaced; #626 plot.stars() gains argument key.lab set legend key label (requires sf >= 1.0-13)","code":""},{"path":"/news/index.html","id":"version-06-1","dir":"Changelog","previous_headings":"","what":"version 0.6-1","title":"version 0.6-1","text":"CRAN release: 2023-04-06 remove rgdal dependency read_stars() fixes combining bands different block sizes; #623 st_warp() gets (proper) default value threshold; #618 read_mdim() reads “raster” single pixel (point) [.stars(), r[x] allows x logical stars object [<-.stars_proxy() clones environment, r[r > 100] = NA don’t get infinite recursion realizing r read_stars() avoids reading raster twice determine choose proxy; proxy can now set (defaults ) number cells (bands * rows * columns) data read memory returned stars_proxy object; #609 fix using RasterIO read_stars() proxy=TRUE; #608 plot.stars() hook function can handle arguments row, col, nrow, ncol, nr, value bbox; #600 fix handling categorical rasters colors without category labels; #595, fallout #565 fix subsetting proxy objects time range; #596","code":""},{"path":"/news/index.html","id":"version-06-0","dir":"Changelog","previous_headings":"","what":"version 0.6-0","title":"version 0.6-0","text":"CRAN release: 2022-11-21 write_stars() writes scaled /shifted values using argument scale_offset; #589 aggregate.stars_proxy() implements aggregation non-spatial objects (lazily) fix [.stars_proxy() selecting dimension 3 higher; #561 plot.stars(), col can also palette function st_res() returns spatial resolutions, optionally dimension resolutions; #557 thanks Krzysztof Dyba read_stars() shortens band array names contain common start ending, unless names become empty shorten=FALSE set; e.g. shorten=\"B\" puts B shortened array names printing stars dimension tables omits fields NULL NA values, unless print(..., = TRUE) given improve reading categorical rasters, now avoids calling factor(); #565 thanks Krzysztof Dyba read_mdim() read bounds arrays coordinates using bounds attribute, accepts bounds argument specify attribute missing time() returns time stamps time dimension st_cells() returns cell index set point coordinates, provided sf sfc object; #558 reading & writing vector data cubes: read_mdim() reads CF compliant vector geometries, reconstructs sfc dimension; write_mdim() writes . write_mdim() uses GDAL multidimensional array API; read_mdim() uses arguments offset, count step read sub-arrays strided arrays (requires sf >= 1.0-9)","code":""},{"path":"/news/index.html","id":"version-05-6","dir":"Changelog","previous_headings":"","what":"version 0.5-6","title":"version 0.5-6","text":"CRAN release: 2022-07-21 export read_mdim(), reader using GDAL’s multidimensional array API (sf <= 1.0-8) remove tos_O1_2001-2002.nc packaged datasets keep source package size 5 Mb .POSIXct.stars() converts PCICt dimensions POSIXct values. improve handling PCICt 360 365 day calendars; read read_mdim (requires sf >= 1.0-9) read_stars() reads factor levels better attribute table; #484 thanks @ailich read_stars() puts band names band_meta DESCRIPTION= tags values; improve handling categorical rasters, exchange terra; #484 plot() handles auto colors better factor arrays read_ncdf() handles units formally setting crs; #533 print message dimensions proxy objects reflect unevaluated operations; #530 passing na.action = na.omit geom_stars() removes NA values; #532 read_stars() detects curvilinear grids automatically; #513 st_warp() warps curvilinear grids (using Euclidean distances coordinates); #513 Ops.stars() errors (common) dimension identical; #506 guess_raster() accepts empty rows/columns sparse grids; #509 speed rgb plotting; #503 Added new helper function st_tile() specify block parameters (nXOff, nYOff, nXsize, nYSize) required RasterIO argument read_stars(); #492 thanks Krzysztof Dyba","code":""},{"path":"/news/index.html","id":"version-05-5","dir":"Changelog","previous_headings":"","what":"version 0.5-5","title":"version 0.5-5","text":"CRAN release: 2021-12-19 st_as_stars.bbox() creates empy raster file proxy = TRUE; #489 st_rasterize() option align = TRUE use template aligning new raster ; #489 adrop.stars() missing dimensions longer drops x/y raster dimensions; #485 aggregate.stars() propagates units arrays; #477","code":""},{"path":"/news/index.html","id":"version-05-4","dir":"Changelog","previous_headings":"","what":"version 0.5-4","title":"version 0.5-4","text":"CRAN release: 2021-11-19 c.stars() fails tries merge arrays different units; #475 NetCDF files, read_stars() uses long_name array name; #475 add rename() method; #470 refresh CRS packaged L7_ETMs.tif; #466 .data.frame.stars() works mixed regular rectilinear dimension; #458 plot.stars() plots curvilinear rasters color table, without table col argument passed; #456 st_extract() accepts matrix points argument, performance important; see e.g. https://github.com/rspatial/terra/issues/341 fix bug st_crop() cropping area larger grid; #455 export st_downsample(), e.g. used tmap; https://github.com/r-tmap/tmap/issues/597 argument downsample plot.stars() st_as_stars.stars_proxy() st_downsample() effect (removed one-offset ). st_redimension() works curvilinear grids; #441 downsample propagated subexpressions like r[r < 50] = NA predict.stars() obtains argument drop_dimensions , TRUE, drops dimensions prediction data.frame; #362 extend options st_rgb(), #432, Gabo Gaona allow subsetting [ using labels, e.g. band names.","code":""},{"path":"/news/index.html","id":"version-05-3","dir":"Changelog","previous_headings":"","what":"version 0.5-3","title":"version 0.5-3","text":"CRAN release: 2021-06-08 read_stars() accepts function (list functions) first argument, allowing saving stars objects read package directories resolving platform-dependent paths run-time handle categorical rasters starting value 0 (adding 1, warning); #428 add %% method; #424 read_stars() gains argument tolerance control tolerance dimension value comparisons; #414 binary Ops (like +, -, * etc.) work stars_proxy objects; #390 st_rasterize() rasterizes multiple attributes, handles factors (sf >= 0.9-9) write_stars() deals better stars_proxy objects; #404 fix regression reading stars_proxy objects; #379 add [<- (partially) .na methods stars_proxy objects; #402 add replace_na() methods; #402","code":""},{"path":"/news/index.html","id":"version-05-2","dir":"Changelog","previous_headings":"","what":"version 0.5-2","title":"version 0.5-2","text":"CRAN release: 2021-03-17 read write factor levels GDAL category names; write color table; #392 handle normalize_path choosing proxy; #391 ignore units different units across bands subdataset speed st_rgb() using faster st_apply() approach; #315, #390 improve handling crs Spatial objects (avoid loss wkt comments) correctly write band subsets smaller proxy objects; #291 write arbitrarily cropped proxy objects; #291 speed st_apply() function provided works chunks time; #390 warn breaks = “quantile” results single class; #388 fix [ bug selecting bands proxy objects; #388 stars_proxy objects, write_stars() writes objects multi-layer file; #385 multi-file proxy objects can st_warp()ed use_gdal = TRUE; #385","code":""},{"path":"/news/index.html","id":"version-05-1","dir":"Changelog","previous_headings":"","what":"version 0.5-1","title":"version 0.5-1","text":"CRAN release: 2021-01-25 fix weird GDAL-related bug stars2 vignette read_ncdf() take time mid-points regular intervals, starting points; #378","code":""},{"path":"/news/index.html","id":"version-05-0","dir":"Changelog","previous_headings":"","what":"version 0.5-0","title":"version 0.5-0","text":"CRAN release: 2021-01-19 fix handling rasters color tables; #375 st_apply() methods stars_proxy objects handle … ; #374 add st_bbox(), st_crs() methods terra’s SpatVector objects; https://github.com/r-tmap/tmap/issues/536 add st_bbox(), st_crs() st_as_stars() methods terra’s SpatRaster objects; https://github.com/r-tmap/tmap/issues/536 allow multi-resolution attributes stars_proxy objects (e.g., gray scale sentinel-2 bands); see vignettes 2 7 examples. plot() defaults categorical color scale plotting factor variable; https://github.com/r-tmap/tmap/issues/526 st_extract() extracts space-time points time_column specified, handles time intervals; #352 add [[<-.stars method, now called $<-.stars, array names can set programmatically add transmute() methods plot.stars() calls droplevels factor array NA levels; #339 read_stars() reads NaNs NA; #333 improve st_extract() method stars stars_proxy objects; interpolation options reduced bilinear; #322, #279, #290 better handle categorical rasters start value 1; #329 plot layout can controlled mfrow = c(nr, nc) argument stars_proxy objects normalized path; #331 cropping selecting bbox treats cells always small polygons; #330 add faster st_extract() method stars objects; #322 added vignette: “raster functions map stars functions”, Sebastien Rochette; #122, #325 fix bug dimension values field downsampling; #324 write_stars() also writes band names; #323 add rgdal Suggests: call_list entry stars_proxy object carries proper calling environment; #309 st_as_sf.stars() copes zero attribute (empty) stars objects add st_set_bbox() generic, set raster extent, motivated #315 set tic, great help @pat-s, #313 get rid proj4strings representing coordinate reference systems; #312 (x, “Spatial”) correctly handles dimension values different one read_stars() now sets BANDNAME GDAL metadata item, else band’s GetDescription() band’s dimension values st_as_stars.data.frame() reads simple tables (non-raster data) dims length less 2 band descriptions band dimension values dimension tables simpler, shown properly Rstudio st_rgb() gains probs argument, cut stretch based quantiles (x, \"Raster\") merges multiple attributes converting raster brick","code":""},{"path":"/news/index.html","id":"version-04-3","dir":"Changelog","previous_headings":"","what":"version 0.4-3","title":"version 0.4-3","text":"CRAN release: 2020-07-08 fix bug st_as_stars.Raster; set crs one assigned raster; https://github.com/r-tmap/tmap/issues/471 add s2 Suggests: new function st_rgb() collapses (reduces) dimension rgb hex value; #302","code":""},{"path":"/news/index.html","id":"version-04-2","dir":"Changelog","previous_headings":"","what":"version 0.4-2","title":"version 0.4-2","text":"CRAN release: 2020-07-01 aggregate.stars() handles arrays NA values now correctly; brought #299 Thorsten Simon aggregate.stars() gains argument exact , TRUE, calls exactextractr polygonal aggregation; #289 read_stars() reads subdatasets dimensions equal first, warns ignoring others; #296 make copying dimensions somewhat easier; #295 st_as_stars.Raster() tries read file raster object -memory object. write_stars() normalizes path, read_stars already ; #293 merge() proxy objects acts, longer lazy; #290 st_as_stars.Raster() returns proxy object raster layer disk add st_extract() extract e.g. time series grids point locations; #279; #290 read_stars() chooses value proxy depends data dimensions; #281 x/y range subsetting stars_proxy objects now reads range, similar crop already . st_warp() preserves levels colors; https://github.com/r-tmap/tmap/issues/429 st_crop() works bounding boxes larger downsampled bounding box; #276 st_crop() non-zero default epsilon (bounding box shrinkage) exclude cells touching crop bounding box; #275 image.stars() (hence plot.stars) gains extent argument setting extent plot; https://github.com/r-spatial/sf/issues/1193","code":""},{"path":"/news/index.html","id":"version-04-1","dir":"Changelog","previous_headings":"","what":"version 0.4-1","title":"version 0.4-1","text":"CRAN release: 2020-04-07 st_warp() (stars native) flips longitudes full cycle; #256, #264, #269 handle axis order st_transform (requires sf >= 0.9-1) depend sf 0.9-0 adapt cubelyr split-dplyr; add cubelyr Suggests:; https://github.com/hadley/cubelyr/issues/2 add droplevels() method handle color tables, category tables raster attribute tables read GDAL; #128, #245; https://github.com/r-spatial/mapview/issues/208 handle dimension crs specially, proxy objects now. handle new-style crs objects upcoming sf, moving away proj4strings handle full crs objects refsys element spatial dimensions, rather proj4string st_raster_type(x) reveals raster type x; #248, https://github.com/r-tmap/tmap/issues/368 add st_as_stars.OpenStreetMap() method; #241 @mtennekes add st_flip() flip arrays along one dimensions without changing dimension properties add .owin() method convert (2D raster) stars objects spatstat owin; https://github.com/r-spatial/sf/issues/1233 temporal aggregation, aggregate.stars now also takes arguments like “week”, “month”, “5 days” add st_as_stars() method xts objects; improve .xts stars objects skip tests solaris","code":""},{"path":"/news/index.html","id":"version-04-0","dir":"Changelog","previous_headings":"","what":"version 0.4-0","title":"version 0.4-0","text":"CRAN release: 2019-10-10 plot() now uses data figure breaks, order also find extremes; #216 st_mosaic() creates mosaics spatially disjoint rasters; #210 #205 large refactoring read_ncdf, David Blodgett Mike Sumner, affecting #199, #89, #30, #86, #175 allow funny units like m s**-1; #201 add contour() method stars objects; #196 plot uses rasterImage default available; #194 x y raster dimensions can set unset xy argument st_set_dimensions; #190 retain factor levels dimension values set st_set_dimensions; #188 add conversion stars_proxy Raster: #193 make plotting multiple curvilinear grids work plot default cell borders case curvilinear, rotated sheared grids robustify handling units allow read_ncdf() ignore bounds scale applied wrongly multi-band images; #189, requires sf >= 0.7-5 .nc now recognized correctly write_stars write NetCDF file; #186 [ subset now works correctly negative logical indices; #184, #185 NA values float32 grids now correctly detected; #182, requires sf >= 0.7-5 cropping stars_proxy object now works; #179 st_apply() can now loop Raster layers; examples #176","code":""},{"path":"/news/index.html","id":"version-03-1","dir":"Changelog","previous_headings":"","what":"version 0.3-1","title":"version 0.3-1","text":"CRAN release: 2019-04-23 st_as_stars.bbox now ncells pretty argument, better choose default raster dimensions geom_stars now works stars_proxy objects, needs downsample set; #21 NA values Float32 rasters now read correctly read_stars; #182 handle bounds, given, read_ncdf provide time parsing (POSIXct, PCICt) read_ncdf; #115","code":""},{"path":"/news/index.html","id":"version-03-0","dir":"Changelog","previous_headings":"","what":"version 0.3-0","title":"version 0.3-0","text":"CRAN release: 2019-02-24 add st_area method return raster grid cell sizes; #99 fix st_warp use_gdal=TRUE, allowing multi-band warps add st_get_dimension_values get values particular dimension (meaningful); #100 allow setting intervals dimension values; see examples st_dimensions add st_contour, clean st_as_sf; #99 experimental color table support; https://github.com/r-spatial/mapview/issues/208 rewrote vignettes, added vignettes; #99 deprecate st_write.stars write_stars; #96 use “native” R array-factor support support PCICt 360- 365-day calendars; #29 remove import ncdf4 favor RNetCDF, now line practice ncmeta package. Thanks David Blodgett motivation testing (see #87, #94). st_as_sf uses date/time column names appropriate allow missing trailing comma’s subsetting: [1,,] [1,] now . move rlang Imports: ; rewrite [ subset using rlang. add conversion Spatial* classes, including gridded ones, taking care factor variables depend sf 0.7-2 add logz support log-scale keys plot image","code":""},{"path":"/news/index.html","id":"version-02-0","dir":"Changelog","previous_headings":"","what":"version 0.2-0","title":"version 0.2-0","text":"CRAN release: 2018-10-25 vignettes now use external package, starsdata, larger dataset examples support [<-.stars e.g. mask values; support .na.stars replace NA masks support cut methods factor arrays (plot, subset); #56 add st_rasterize, uses GDALRasterize rasterize sf object; #13 st_as_sf.stars now uses GDAL(F)Polygonize give regular sheared grid grid cells points, returns contour bands using GDALContourGenerateEx (requiring GDAL 2.4.0) case cells points; #13 support curvilinear grids; see #54 data_model vignette add vignette stars_proxy objects work stars_proxy objects defer processing st_apply jobs subsampling; #50 allow reading sections raster, raster lower resolution, selected bands; #48 allow reading vectors (arrays) 2^31 elements; #48 fold higher dimensions third dimension coercing Raster; #40","code":""},{"path":"/news/index.html","id":"version-01-1","dir":"Changelog","previous_headings":"","what":"version 0.1-1","title":"version 0.1-1","text":"CRAN release: 2018-07-25 add meta data reader read_stars","code":""},{"path":"/news/index.html","id":"version-01-0","dir":"Changelog","previous_headings":"","what":"version 0.1-0","title":"version 0.1-0","text":"add merge (merge attributes array dimension) split (split dimension attributes) interface sf, raster spacetime improve plotting handle logical arrays plot add st_apply, analogous apply add cropping/masking used x[buf] buf sf, sfc bbox object; masking x[buf, crop = FALSE] add Ops (+,-,/ etc) Math (sqrt, pow, sin etc) methods add dimnames dimnames<- methods stars objects downsample large grids plot pixels actually shown can plot rectilinear grids (plot rgb images regular grids) rgb argument image works [ array-like subsetting works; first index attribute selector","code":""},{"path":"/news/index.html","id":"version-00","dir":"Changelog","previous_headings":"","what":"version 0.0","title":"version 0.0","text":"interface 9 C++ gdal utils gdal_utils() (now part sf)","code":""}]