From 1bab21aca537c9497cb359aa08b5fc19e8f0a88c Mon Sep 17 00:00:00 2001 From: edzer Date: Thu, 17 Oct 2024 07:09:13 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20r-spatia?= =?UTF-8?q?l/stars@809f9f57267d65329f8ef80d9ddec7430f2fb4db=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 18860 -> 18903 bytes .../figure-html/unnamed-chunk-10-1.png | Bin 115156 -> 115194 bytes .../figure-html/unnamed-chunk-12-1.png | Bin 23543 -> 23579 bytes news/index.html | 3 ++- pkgdown.yml | 2 +- reference/aggregate.stars-2.png | Bin 23392 -> 23347 bytes reference/read_stars.html | 4 ++-- reference/st_rasterize-3.png | Bin 23173 -> 22924 bytes reference/st_rasterize-4.png | Bin 22084 -> 21920 bytes reference/st_rasterize-5.png | Bin 22998 -> 23340 bytes search.json | 2 +- 13 files changed, 17 insertions(+), 16 deletions(-) diff --git a/articles/stars2.html b/articles/stars2.html index a0a9775e..d334dd36 100644 --- a/articles/stars2.html +++ b/articles/stars2.html @@ -282,7 +282,7 @@

Stars proxy objects## downsample set to 18

##    user  system elapsed 
-##   0.988   0.182   0.682
+## 0.992 0.158 0.664

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: 0x558ca486c110> +## <environment: 0x55bcdd2b7048> ## ## [[2]] ## x[i = i, 1:10, 1:10, , drop = drop, crop = crop] ## attr(,".Environment") -## <environment: 0x558ca48214e8> +## <environment: 0x55bcdd2705f0>

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: 0x558ca44ed4b0> +## <environment: 0x55bcdcf39ea8> ## ## 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.709   0.166   0.380
+## 0.697 0.171 0.389 diff --git a/articles/stars5.html b/articles/stars5.html index 06b8626e..13df6420 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. -## file2b7969044047 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 +## file28283dba2a29 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 ## Max. NA's -## file2b7969044047 [1/km^2] 21.24828 4808 +## file28283dba2a29 [1/km^2] 21.24828 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. -## file2b7969044047 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 +## file28283dba2a29 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 ## Max. NA's -## file2b7969044047 [1/km^2] 21.24828 4808 +## file28283dba2a29 [1/km^2] 21.24828 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. -## file2b7969044047 [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 +## file28283dba2a29 [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 ## Max. NA's -## file2b7969044047 [1/km^2] 21.24828 36155 +## file28283dba2a29 [1/km^2] 21.24828 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 dde78065168de64adb93003f2791341656646b5e..99cddec4e8b8717f414c591ba83b4196c3db69db 100644 GIT binary patch literal 18903 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�UO8;@gO$KTannXGLRh#ZJJHU|~ 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%0Dc1uUzO< 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 literal 18860 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]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 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 63805497fecabfa4c67e31c9c6d932c64bb60d58..2178404265451de1680050111789177de3a7ec10 100644 GIT binary patch literal 115194 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

Changelog

version 0.6-7

-
  • Ops.stars() (math ops) now also recycle arrays in the first argument; #718

  • +
    • st_extract() if used with GDAL 3.10.0 uses InterpolateAtPoints, allowing for cubic and cubicspline interpolators (requiring sf >= 1.0-19).

    • +
    • Ops.stars() (math ops) now also recycle arrays in the first argument; #718

    • c.stars() verifies semantic equivalence of objects’ CRS; #703

    • initial support for read_mdim() to work with proxy = TRUE; #659

diff --git a/pkgdown.yml b/pkgdown.yml index 3a0e31f0..0131a2ba 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -10,4 +10,4 @@ articles: stars6: stars6.html stars7: stars7.html stars8: stars8.html -last_built: 2024-10-16T20:16Z +last_built: 2024-10-17T07:06Z diff --git a/reference/aggregate.stars-2.png b/reference/aggregate.stars-2.png index d9aa8d4937bad45cb1f4ff03b62ef7ea1562b495..9b645ea3817a02da6534992d41e06c73babc30d2 100644 GIT binary patch literal 23347 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 literal 23392 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 diff --git a/reference/read_stars.html b/reference/read_stars.html index 0b9ff5f4..83f63d6f 100644 --- a/reference/read_stars.html +++ b/reference/read_stars.html @@ -240,7 +240,7 @@

Examples#> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. -#> file2645372f54b6.tif 1 30.75 60.5 60.5 90.25 120 +#> file22ed3fb59914.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] @@ -255,7 +255,7 @@

Examples#> stars object with 2 dimensions and 1 attribute #> attribute(s): #> Min. 1st Qu. Median Mean 3rd Qu. Max. -#> file2645372f54b6.tif 33 36.75 65.5 65.5 94.25 98 +#> file22ed3fb59914.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 97992b5165e00e0089923dd43537e9692c82ca97..89ffd75679c16eb8df1cc66a41da308090d7538d 100644 GIT binary patch literal 22924 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 z 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 a;Xi-T%#J51*}E@;%<^>gb6Mw<&;$UYW?p^( literal 23173 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 diff --git a/reference/st_rasterize-4.png b/reference/st_rasterize-4.png index 4ac2947796963dba963dcd8e1fd4f67681c92e7f..e33a2d0cb68db6b6350435abe61ef08b6413d35f 100644 GIT binary patch literal 21920 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 literal 22084 zcmeIac~q0v*DwCyY!TGbih#h^+Dfe`SY#Gx>p-mnDv*E(1W^!~#V`ayQiu3$5%RTG zKoC$-h9p3cnGh1CN-dKJ4Yy+{0=2|+>wInGz4=w1Jt`Io0Rf41SP6`G$G6s=oH3hn%L z-HFi9%jX{3nS1&Cu{PA?yjhiBvCXj%B=lCwCze(GmG`@g*5N+U{`0eY-~9B+it9iA z@Z%4k4h=f>sBYYx9Z=k**zH^>T*)3bVyt;b~9+a8SD|~ zcv_U#JFoVQWvn)2Pv%WjOeWV@8y=HwLIat3l7bGha!f_>bixS~)5bGi=Urot=3P7` z>a{bbz=2t{19<#i+lG@esw{;Wcl~|KgAV!h{vK|OlzFWv!Bd)JF{f;F(cZECllVw? zvUr0s+lsyTLHuZccWrq+yMBDD<7h*uYvR$~8M6O)(xL{C$zIi1eR+SOpl8Qxnp3*6~VCRIF|vjxa86JeQYj4#o9>#0-Z?N)c%wcR;hb+c%c4SU{bdKMt|C4v6j?lg**V z9bU4-?jO~^Tq~;a=PObz=Aus!5|X=CmzzXp;0n!(f?Oy^jhkgvQ_aQ*|A(CF32k73 z@(#n<{ya<8Rl9cH76DGcE1EJNkvf&B5~V`%9onm0Szp&kC5`C9tCWAtmHBy)hjM!( zSSlZ>lR?jS<=;U0bVu+TKOcqlc^E{Pf8sXX(gt?=}Mgr|&dUHc;z;Fl0tT>rj z->{Xf>=E|_%0Ijn^GxqTeezf}1IKw~L`M~ztk*X6J@;U_OZ^&jZ@TSe87@^FvM9MI zK3Le!@Ut(Nbd~<;5N>Q+(ALc4?I~CtFIZn$_(LORK-f?JBQ5-W>vmSW07<* zkrT3g=!m_vP?+IC&k9r<;gpxfI~g5JN6yd}rzoeC$xW>t>nAIeO$NKOs(PKmy?DeL zHxDRhW8y~K|GH^n7&IF$KYRySMMxk-IFx$1x>d9iw$IyqM_ z$sLv4zMv4O<}!PQFWTrgZVH9w*&hvL4XWO>x{>2)@3SPbs?uiBZPcB44Hp-g8IUwe zW6SeV4$~TER_4fd%i&IW_`aA2}JFjNF@0n_NR~k;A z{UUVKqs;CArL-)$Ai&{ebR)UdN@7nC@f?D(Q)0Q4Yhs#%MD(KA>9P~Uf1rZyjFTC3 z)hL6ebA`pB15-J+cB!M+U&&%*A?nCymFlj*(uCgwNkU*sLrNiD-5^idL*5+6xhKC7 zp)yR1NufRbrqu30TMIL?*tKSr82%4ZxD3S=X~DgEprX5 zw*8u*=%U@u;7n@&ON}e^>mHxfa=MY1p~)y4lrD}M1VsrW|FV;bM@Ij|$9A=L>S*aA z93SGrrq(fo^+j>sO{Oh^ei0ozULH_|79YPH^;8&T|D&5FaN>4$G6|iz(NO zl`nlI>e)RK9_gd74t29yWU0lSlk1sz=heguarPBk_YEq2bM73pn_MTPunPr|)~rCq zudcos(qWVmUVFE9-ujJkfc=b!L<*7fWuBP(h zg+#3i1`KmHSI(|(81SIBAwS)8VD&W@Yt zG6I8BebWu68v~AVMz_2e_1CXxGtlk}x>FXCR6ExRVrE=oS7t0{e<{UBsTAk!T^OA( zE^ZgP%OsMJS@%G>tqVUfg_c(<30Lq8k|WetQA2~E5Y=B->WwF+A5SC)Ot?x-Q2drh zJq<8(naLIX;h(4Rn(TNa^%b&YPD^J_c~H@v{9|FM_hO<;?hFX%2!D6Wx_Gy}j;A=a z0ltF6HEPSCY_~0Po%Nx)s$)%Iuee0jBlqAJIBxXOft=3qxXoQEW4Ci^0jGbkT3+ER zA=eIFI-TgEGoAc>)78;fQ8KSyky-7j>sq8F>hw#bT$EClTroruMOQh#dYck$2r^dM z`-2q!D!XQpO-+%}F*14oxy27OZ?58M3nx`E<#dtnsDY$Cy{%=EC=0Q9O!|&U7gwbB znIP0*b}Lm@(OhZ!*JRJN`36b}Y4*ybI<9F!WHX%n1%<3AQ!1REh0SJx-N$i|D4W(2 z3w-Yf=m%S0`86?=7ezZ6>>)bk>rfzUW(@2qg3GrzO-?R(ITQEt7h0g?{@T27-hhxQ z3vRAV74M_ z^EZ&-`$TIGC%kVD8#fgZjCTv2S7rFlex3GVN!L29 zdlRDm!gdpV$Jx(Oow*SFa0Ye$PmKWt+4B4q>bCdJx{hy;yrt17CA_Zt_S%TKNz0wb z_U|tptq{)9@FwJlri099;j_Qc{x$s%v&|KgwbBc5ibs0}?kv{Hb4C|mHD9G&le!0r zxym(CMsniOwhXhPk?8i8(%)z)YymTSdt=gUW_4olv}!Ta zibwos$7&?3&O3NI*T?r|v3hHiZ_~P;TMSeW7v;1(nxMM=NE7LliQ8SbvRvV`*)W|c zv=8)0km^qVqw&fXW^YG`@hHA5!YetnOjOcXt_=P@cW-Ii_eXxXp4~Q|ajmcSeron% zG76HNw;;JgQN~aa^0G2;>qWEuw#}zvj%&*sV}0HYOKzh|5b>sI@4lGJ+IutUg!1My zax6m4zWvo}hy0-f<7a9U6QplwH~)&;dup2Sn+}?Q1{$cUl)`+wvU6UmC+qd(%Mo^} z9L+VrFRj8=JgjX;=>+^I&8Q}px?9J@lQ^3!`yMp6F;N#7Ecx%=9r`MtnS*w5PiEDothaf2xtzYS% zpWiVrj5Tw(+d0M&nv0ff?_Lbm;$0cwv|VjJHTwW;)8YBX^HMsGAxlkAi(HH1 z6l7*8$&e^)BZ=x zh0gSlxcyQ~ojLVYE!}XtulE|r>a;(}(!Ma1Ny@^&_7zZ}^z=AdP=foEGtQb&74zFfH$ zL2&3dD;g|W;dbGFCVEOKsm0Q5?mf4+6PR*J0c*BX9H2;=yL{AOI`_EmzO%-0`a!8v z)-fM!ExH@Z1GbNS0qdX+0J<`UB?p=)>kX@)&2Dc10H?}{LsG8GTUc$96ogRS7rm@= z4(uEHXO+>QdCZx@g=`_xvQqJ8oFv(SVHg&W}Ebg_N8Qy<(d|5T4Y`ows zZ;r!ltnbyxQ~aZARfFY~IJXF|ZPL4regjckj@I*EMfi)N3{#qtD3PJ_qKloDg$@Ow zjiAsoq~!T?hp75IPx5i8r;bp4fH;@gAH4U9;M&5q>?6$Pi7q#w)nG+-dPr?~Krto2N#3s9ky&iZgR`~gy!y!fQHi*wm+SJvyh3HaiXF5<@d0vqV^{AOyjk>bFX#deXbn(UdiJjQy2IiSjMy1&@Y) zxZvbYR%{VN%!zD);pgo9pg1NgGIQ~TZ4U&1BVmQ@WqzK5Qn{On*nd~u5yW6fg0tsD zq+H;L=VEFd$la2R-E0si5dLSe;>Dc$(}l6I;x{?<=p)4nbF-G*$BJj-fFpg9=24H) zEL#)~mG=1D$kbP84#U4#CH$p6xsJPx;JI&yMLhVD@YU@)&9KWprkv$~6PXPf+0EXy zq5;Z3v~g)U4uD*;L_Vnl$VZpRy8wC8HT#ir7o)>A zE$w>J+s&a+yupE5O>;6|u@cQQ-0$RS7k#}7s6f@)I=FK4QOVjRg)OB*A`>8#Vc~-WT@Crh$notJCqAU%tAV*J+?B>TiuZ?FW=gX(}*+Ju* zr$y-!9_6oU@Z>pN(}!GzK#hsW{uEZ~Y`wS|Rg4^iqu>2>YFX6csWV#OIqhdnhQ^lm zed*^Qf2M&&oQAgBk`;i>_!pOq^AnJBbct-50|v2L<_EY5#aB2;h0Zh_`^dJzl{Wes zX5f(xCzroO)-)MhnYn(6d<@QcBgU->xHHX`$QvMeiM!dgRx@hf(vamq$t}hhOH>#b zr}+q`)fP>l)yxum3=r(#=ZFn5F%d^vIEE-Uy?m|9Slic13j7A0gTMj#e^IKFZSHPUWCLQ7%|Ki zNS51$zcK{6QaxiIuhg9|<*aXhe`jaegxI>VyrW(vhl&_3?TjNiG4F0U_<(VHuyNT} zW3O={IW4|F0aE%B>FgYh<0Q9M9RdcCe)$>%3F@wIcMo!BHoeiH65pBGfT6g9x`gFmBGs396M&r^ z0H!_A(FlGD@^Gsu;#D7q$uH-scYgi`r6h21|;-{T1~#+AwWgEmOt@Dp6&S* zJo0}9Yi|BaC*;6oM(I+Oo8hJ<90bbR{PQ^E#{CPBo6KQw<^KxeNR-zhpaB(CW|yAuh1sOYJ40^ z6(>zWJwcsVO!}VqJ@GWCdOSt`-1&c!0Xy{;*cq>FwtV$kDHaDaJ6_GoV;Iezk>P9N zDETCQ<|IG?$E9Q9!zj^t3`PW&DX?Vo*`Cg~1B~8_=WBhMjtc#Y9n0j;BR+`}^=??B z{!z+AQ}cV($x^eR38*e>FMK5=U9TaoD3>$7V20Pl_j>r_K!hLZWhm167tb_ZSjXud zBp)LlCq_tF;!%dv?R&6~%Ki;_!j>BEL$@U1YoeHqO!;b*QmhJeNdjWT` zmo2c>rnBjt?;1Ll+02}^;i}QnX34(0!sjv`fz}9E_&nIyClbNL{PBr~eiJwk3OA#r3@zX;VB#_Ubwl z!9CK;(ouhoTZui667z9BE*P^c442fix6f8C-0oDq*V1)YJn|(@`73|g|7YS$S*o9C zJRPOuYm6P#5B20&ApHu=^LCJ4w9rG@3!0%U;S08rq*;G==G=?UM7QGIpfP>Irdv}75^dV~8 z+6T9#7xu>K9=!$=Uz>W*oO6q&gBg~lkEgGTQQ86mHDT z&R`dR;{&?vW8zz!+&r%r$xb}GKy9L9oVF!Y>9{>ng@Pr+^+8AyPm(^d?M>p}83#L= zea4=cOay_Q>RFwtA<6TkcnB_NSGAwde5#nS?FPeo?bJOL^|<|!BI;Co-G{$gf%y$h z?O&4vrRnFe?+{4l{ z4}e(0IM~`=_~!BhO}A0QL$YAcUOXOeY$$*+>@Vm(?IRnfg>~|JaWtxA#4vPp`jgqD zU?S*!h?mFo!Hv=i@CLu${;wiptW-y9>m=yFmQHoPjj9nxpn;50yoBlJC3wFE+w!+z z)LT)}{@S6Y{z3g{Zf_ZLH*0d9 zcoAT}>)dT1a602kw(%Za9>ajq=@xjW&AO#1c4kaurr5hZ_aq00-#X z4(bO_CtqK82VVVfQTw(-H6frymQQ+qT?ts06bVoJ_AljWVww0A`p`W>kt?=E>%hAJ zkSqs=88`>`8kx1Vi0n#~iB%}sAV`{vviCNbFx@=xdslEIEFt9&C72gK7&-yYSt~w{ z6LygkpJoY!5d6UkSKru|FOu5aedq z+}G=Xh(WIyT?9wJu^Eg5Q5L~cFBORD%K&r0Wo*;~UI`#p-vN?)GBz3j{Zin7 zTs@eWtAB^&yc>|L3CR|lxsVKiEn;2QwhOd zZxWDupzP|5jUZAJQlV^)o)nUyZ1WEw8e=f>7_4Zh5Jn=d7a&Sw9|A_;N3;W9M0%j) zzLwhv@{}Be{@Yyugs%_c4>D{6rjB?;1FI4~4F(>K>^usrIx$+ga&mN*x!N zmzrqyTLUwn1jzzfZF`=t;EOMb{ZO6e21SH;X}pO)#D5PlL_hu@j0hgF6e29W0==G{7(rU$s1|!^!;pLI~cKodoc4Ei2O~=!Zahw{jGPER~^EWOS7K{ z^3G+xOKi)vayz%?SIGv#diqCyyk6j-+0eqv#e?$K9lBrtcE>2QQjJkr?M zOej+_)eX{92BYx0QJyEcV;ywwzBSM`n=0-AM7HeBJ17tq1=2$oJ+h~n`6YA-5_;c)!=WwAL`tb1$4Ig)w^B4bhAJd@kBwX z8=omze_Zm%I+z5#62U;Pi-K%p;uT{mCbJ9lr&n`~C^K8dN@=HZbr6JPODiyI-twxc zBXvrGQ=Tbo=PL!`mz~2DBHuCh82SC!Oc{nHm;7PmY`Voi@wmt>4ytA?T_43uhwxlK zftN!=J=-qkXpV`8nZ83~IcWx)tJh9A*Id`^fNVFs8zZ?w{zQB{f56yk1<$z1@s#qS z)DZ1rG~?9yB)6tk(Y3g)m+LHBKayof^S}fMF2HZ83E5x0E|EK-P5SAf^Wx6X(bS0H zr0=ESfquMFd9L`X#T@WjEGAQjqkgaWg;!+cPd*4>L;sFy?j!kau_JJEP?Ld(horRt zw}?};bxvBL8GEl(kK%$oYf2(sZBQlOmv_-Xg;f(7 zyF0M!-)%Xc(*+#x5yWcL)c;oWz5_*Xm_hKA-^I>@Df6FiN7!_51{%pSs(wvwtdP@e zQPK(NOYyI^D40mkbxWYwS*TdKc-N6BK;j>T+xwC2ESOIwD98}6mFzU!1f$z04?T9)=91!nD1qSI6MRr^gNm@jE#gpWen}PS5K@pFz7@(nP!NAA4 zV@EAwPt=~_Hd!(Gi?~5t4%{q}E^fF_I=25ikTBTa!U=zq{f_l^hgRq$j#~gOfIJq5 zPa03*COtB69ZaJa?8^Q5`ffS*umNCdVAXrKA8ib{NJ)@h5i|5;#ya z1Hc~yenusNo%B2*Ux6on{Oa>qMh4wTH2%*jpyCK-h7|AiV-fcCJd!K9_QFNVNMi|{ z^>wxshjtH`KuZzE^{*z`IPk-|mtw}Rd%i);^(h6fME8n{v_dkGc zTQDcZ7q+q66pUb;nSQvMCFU?|aFKdk^*wRFST6oZ+aTMGI_RgLi9bLb_qC+lB{iGE zMS1--w3QvU4d08iz=|0<6OH!Ny9|rPdgu|X0Oq$s9stg7x0vB%j9gz|yLZ)+;#~Kf zY~W3Z*D^SdwLv+L6JIv#U+N$Ah%1}&7t{pcB;Hy_ERr6{4-gOTXDiypO6Ngf?iYT2;rtp3Yd5`4A*^o+s}Z#S^|Tx)r|^}?HB(o#8=;_ zFa+$APww)W6l1p?2kbqV^w{WPJ{%&v&`A5-?*x zGAgG13S@?w+uW+y3S_^7QR-RDA;=D!3H&qdzXBGBB$2*6i*11AE6AcfG68}MR@PIS zqG^yFwB8W@knItWoG~a#uxtMvz6zyh=2mM4vJURg^ja9Y$B%8}X;wHGY%$?fr19k`|k=6{09e{l+WS{*T!i6>F*s0G$ zH3n_-!AohVD~MJQKpZVrG3j(Q?%VEgIO=vitJ+~T zWs`#d7By|N#rvWaao0HX_&=Uq10$r2On}RYnVj;Wsa=tE6A>Cn*cRCT!<^yo9w%&Z zB1=6^bI{^M{_b(Y7ALaQ!zk8gp#fdESIAMzukg*;oY;ht>Jx{XcT)fjm*B+p^8S7EX< zx;8cN@(cyMYI&rl5J0&w%xUMmFY*;_`HJ->pb?4H2S}L7k-cC?XJLbsc?V6aCT%BV zMmpj}aE!7X;rC!l)qvQ2WP~j;NsCC#$=n|fHsmK@&5$7P`$M!k8StshUxDSQS>dZB zO$`5{b^`~shx9kG+4}NHS?ZMNBsZEyhSK0LQ7-|G8(^&VbUI0PCboz>(Hak4EWg@h zxlmN3T3Dx81)>J@4nmE0`njU|Qn?8_%%pq7G5zq$GsNtLi=YJP1Eo5`_p1PRKDpH- zf;5Y!`G6cORcKix0XSg`tzh1Me7TSTZX~)kUC`>q$%=)ilr6M(24JgfgR?S!4gtjO zu*^Dz0)3D2m_l$zaSQNw#0R< zS5&~m73!`E_w@}Y;m{jF6UmoW=-H7Q(>6PDYCY%({hvZYe|41Xe#-8Xe_YW9Yx4*+ zr>>%w=)U$`-UGQ@{1W0F!V#}@VEF`adJa#;G=-yicqhBUlWynN#FyO$2kT3P6E)#K zA{$d!tWXm;Pq9*S0A^Z#H0H;9FdLsr3;cytl}duNUHnG;Il6j;O#yKd*7iu+!145RHXJ#);WD=p#p7k?F4X!E zYs7odS*Fa>j5T%f3cynQpWt?4ulZl?Nf91`90l;@|2($AfEoXbwnqn=-1U3QL;iw#f-28i4&@b`1LSAYH)S#%7vWoE|~ zbb?vH3ywhWOwbEj8{c6d;4$*eirMbK>*oEOS-`oDU=HIAzK#4((1x%Q#x<`3AiL#| zZ2fI_W7nPq{vB{+%KrfywHkbr;w+jPVX?}#Sa2Hh0 zO__OgluX&3O|4)`%KSv^w@s<&Rjj4933f^N44ZITxDfA9LFzoG2=)~Da;r!!W6JfO zy|`X{q4ky8xZI~##?Nu#iD`zRmB4p_kvb7MRRS6K+tO zTj1;vI|V|hGb;7ml+&McoYL9Fil(-ABN=P2SZ-ylb^3Dun)~Z`rWbKPIcFG`o-6-_ zN8R`X5||8Tn!T~(y|{an2rglgOl%reM!U=J5g_j5S#iAb3b?NO+WZ%+F|TX7x?CJ z?9Bz}QuCWI7A?qP1Zz5ki3wN342v)i0`~7Pfu2wx%s0r+p8%2FjL9HE8FS`vbXGOl zT|69u+M*O@qlch6b=2ve9r2>7Zbvr&GMg|%NGIQF3#-Jsj51ta@$NEJeSMYuJ8Ac> zxmg7&N;3ir0IPK*_S#`^`OQ<^C@&G;a83#@Aw};WQ@nY8WI5fC`ZJ--IEr(ZmjmGhm;UbIuEada8Vv(!4HiEcg>mdmFjVe2w zKYR-{u?ms-pr7Z@<`w1IKlTFa2%{AeTXuMvkh0fKHM*;kTWPn~juP5rz}5h_NTHeg z1l!lfuU8+6>e$rp=dT>^TyQG&vw9p4dWc(F@;6f%u&&b5Cn=2aBcm$4mTriP5&w$U>NI@7rQ%$bH(A!@$H7F`WU$uSks;0mzSrZ$X7X@n7B^F8l^XwdfKR5BC4Ucq!DBqMD7bo3`8Zh%%x!&O3 z*AwmYVCUjAO>VZI{$$Wz~JofpiS?>O|%m>RFN%KCA;*u z6Ytu^Oblo1daeN(2*yric$49@ijKYuG%jlkXq6NT2RH1Nbmu!aN9O$i5JUFKvO?hw zU|{5#soiVeE2ExHcJCZ{fqyAAkO9zv(k(Hor+M2+((L;~ho%%FwJKq8#uyZ*{eJ7> zML1timtpJs#th*xa>OT~Bf8~QIPA{{g3=-JtdtvLG%FO}bQh0Lbk3-DNLM4%;7$yf zh((Had}L&8_9g(Xq3Ni@wgH_$hv^b*hB&yb(;;d=`WW6}ol!r5yUsJ+;$y^M;=mY~ z+8*qs$;?CiL>z$9E77aq3U2?Ne&H!!U*F?oc74bv!^@Egtm+_eVjmrB(nALfe&`pK z`gu822VUcN(u;HP-2D1Rxj=l}z6eA{JZ7z%nIE-<&7Kr*2h~42M7{zq!3hD%c4$(G z--;*1gR~L@hARu8?jah7!m|n31*{K&19J5IZ`3%7^oG?Ffe%B(bo3xMk_b0POFeY~ z5b^WOaT1SSM!O7_okpk*@bn3p_~T2Ty$z27$^;C$)r#s!mgB(4Py|XMx=4G(9R2Fp zbKT8f=>Vk6euSCC)#cM^)yJ{;BgAN8^OZo6kMBt`>En!>3pl#QPNNZ|%lt4u@$uOF zz1YTwPe{_>{8^JJP+~0g4v>PgVE?@BoN3>IPD?vyes}TFKqi)9tC0mZX5<#bJllu* z+On9g-@)Z&ub;4Q`oTA4n+@{@*sCS3`|?Ro#};+$Co~a42#gw3@60b>lYI^P3sL@3drbR}nD(rR?ANxv__AW5B}p~T^e=UE_qCMEGngF4e)Jcu zty8bS1?uWE@vcMytHatOFYhg=yS#!h9nyggOrftKOL#oTRy=B(-yA#W?R!$$d4&j~ zKDf{Z8VI2`fs^#*;oMlNv&1&5yhLB=h&USPNcDxC8>F@ALEN-aY~uc7iV^Xkcn5mZ zU`p&z6%a~GWJKa>tX6RFcDQ3e3j*v<2Shi^A$Q!Yi1D(y;W!S_a?T zh}oP0E2HZ$6Cg~8rOaUvM{ubCKfzOJgq;P%@pB=FKyVOM^>tzIeFGZ?i5Q6SA_83r zZkVo|pCL;O#uBj=C^ZLLC2a#4G|#04O5T`zujIDn5M8HcHjFYfTGqDHi@(vD!!1Y`z z><}xc?JZbAA@N^>m0*7gCxnO~W-tXeGJ&3*aQ+WrzXBZ4LY7L5B^w(32!>LklAyr% znC$99@J-AV{2uI0On9FWeDgEx%>f8BvBC*4*Mnqm84*O_=a3ug@gWn}!BSuc#t6S1 zlHmz32wB$v89M<+_#dI-@B|o;;f+D;1Q?JZ_ic>3l?KVMTZQl^Aop#IyEPq>vBb)s zfZWAP+|Ahfq(t?*Sm%7a%a7jf%2^o6Rr>Hy)#cS3>2tTK7_&t0)s1si2QyY8TbfBZ zKc1YeIfHn8UYI0h_Tp;H zfS_uCIQh91ILdTm9Cy5#p}VU-UGQc)mlL|)@f<+dUdMI)lV;+~>Q^Dv9oZ}m#Qu#I zI2~O=sz+g?ehH}(zQBx)-NPKf78OIP1Rrc^Fr*p=yY&d6ZX)~pyh0E97DKlZZO=Gd zO==oAF~WS`G%sXDL$Ie=soybQuN-`dVg6(rIGF*B31)VIxg%m8hz;@%hM)E#p>V@X z@N3d1;&Ma#!4lF@X#=>@B1I)QdjI!Y2>&_^%t(4Khq@)q%obCPOG{7jrKE~QQC z&EZY(!T3?DFmPSwv~(6-Z#}3~JY5^Afds(@FTx%K!B&Ph4%s%yeJJOO_oJiC)m8~p zCyC!n7r`OSLVmKNmjf4Gmr2K>8DYT%B-fn=bNwaqbD%ZxOk5FeG=(bx1$bmhBQqfM z+9C3(Z@=G#@Yi7ujcWoB&5fQ`J8Cn>MIWMt&c^EQD@p(}u@LHI2mqSy^)%!2 zqdwoT@DwXM${TIPG9(s@jqH;^LpLKs$(<8g{>FxGuPQ%B%rT@-MJ+)78y=f)-GN5c z=4BUj8zXEN%yj5p@Xgb)`9YdPeB2v7bmyVbyuJW`guen?CuS%}jXB{H+(d7w0h(X) zs#y;$^Pr&YcTHqeauhVbmLfV8t&Y4jddi<$K<=+EVjqGROb-y%V;6T>kCDM;WrF2~M`n{OA>-4Sz$K3Q8)Un$RDI}QpS z2yu}tr4xRz&!k*s{`yzM9L{DjSx)8Sfu4upKHej~(z zt}%Z%mIV5^1$76TzSQ13A?p6Q96>%8!oLg9o7mTu^34h)b{n?$r>d)8&-i=zI?m1P z6DK4~73g92u}})}C#f-$^6gbsEXS!dx!%spq4xDjDtB@yG&IyC=illPetw88PFLwz57WZBc@<*)Yp9~vPLeX<<)iR`mW*2<)k=46{k>Q zz%)r~=gsh!J48*t{-Q<0s(fH{8{zCeQy{EmI8kRh;yJ*u6dsAvH9(pFj@a_MynnJZ z{7?PlYWe)7P>s228P1I5caj|TxT>|4j83NPUS^Z)#84HA^E{2cqjvFybGhPXMjq3# z;l)o>?$mmQaha;+(zur%fVX8~KMs#hrmejGoEEt~2H7;;*x8x1!Zd4Pjn}4YaTn|| z!Go!NOL*7)<-!3bbJHo%ngg-*r>q_;;0oZ=dK-jR@F5&*JDoyvXE>*&72>Wj?3n|H zoFN@4An0pIywMbiKF8w5JRYaMy#8T5Ga!+sM4zLt&^j$2 zYmXc+WfJ&}QJgwC`pHQs9hrLo3O*(3+`lF+vN*X+eoVR`{@Ep$gY!KGTGF0GRZ-r0 zoLl6Ye}a$%-22ku>T~gDoBTMQ#^GziL|)|THgL603XUO5&^XJm$rnZRBioCx*%Lal zzI?5G-#L>GTC{0vn;UDuR{1zKoR`H0#Rtf54zL)#)H$<%GU>=wskr0NsM{de(eRV_ z7l<*>^M`ZX8AIdw!#lF8L0SVxpIbrX_)jnwko$B1`M<)r;5&lb?f((L1zhal$^Q%J z77on>L;rW6E&F7IfuTC!o+pw?r@jjS`{63|oRNIn!~@b$RPA08IUF4>EuckZa)&F$ z-oQ8S1~`)D?x!F{u5G~4uDLTMz85zl=#Ja;>a*d$l5>0<9+EDApV0ibcu`WyEG>=5 zd{YZ_`QPB#R8f8kY$!P?dN%yZU0>JB zZ#FY=)1FOi66-4UY-L$JH^9{SI^*otC0{`I*i0a$|S;SCBlr%jp^9eybMRL+Q4Sz4s57T z6IEH2*pIO2)XDgWifkz7ljM@rlv!(f=g3EK`tfW<*5VhAabc{QqkXH{_N_5fw@1DB z;_^+)(w{#>of+Boa^6>Np{b|IE4FkrfN5>Zyku56b4fYo($6hV)to|g(xjII$qlEU zI8p@x|6%;2j;}@(uC6BCfV&4C-Bk@kPn?b0eb8T}X>SZi)3NYr2 zvqym?6STc{_58qpRQF&=yLzTs>S7Jwtv+oud)(WYtQq;}S**j^iABb6r80>a*W`Cp z*VRTCmzJaUZCWMhC~7ZrEomHN7q;xunOo1ICA2%t=8jU)(_nG3>CX-WbD;!Fho1(cas%yjp^m7${zTg&! zyx&T(8rQUMG&i9mhJPLyXzq*gZG_ui#)d<{%lLoU#!Mvbq^z|a3@RbLT`_Ffc+QQX zauJap8%-&`0w-4MkD9MyFOJyCS`%}Z<5Iv1>3SP$wEQ6-TeHlsdc3=Q_Oj18Csjtj zJN=b-tcPK8ot)&;WdCjMz%!nr;r@_7FSM`a-6L^jc-nGP9-Q44O)m#vFTXS76{ecw z`S}~BANiWlbBz0cP|R2jkOQ28!y3j7ti~z9Qh#QmzUq_NYg&r$m2E|WKz*y3Rk0cW zJt4B|IeE2L=M>HDHIFuImfZq3vzo!rX2&~|xFn+V_1N$ceXG7zvGo7?{S!_8dwQ%B zu1jh@ww2G$@ZK1;#An;rc=s;Xs_7T??AQIwdA0^EJT$6c21mx266)Ii-RUr!dIOun zwW%jgEKcmIG>)_wkK5G{F|l|@kG`_C7c9Y9u&_^kMr@y)T$6e0Y_0;asxawshWqWv z5I20{$c4SblxXFfzJ)+~m*iyA_Fhl_(#G=1zp6)>furLVMw*#rK=+n?9U3V$tua@s zHkj{h*(cKo3vy%8S2T39HKdk4VTsbd1q*uD+$F0y>pD^et$F&R_`9Z+^SyAHcK_;s zo3M|N@L%Zu`1ex-QCkJRIpv2rz18J(iJ7Z;dvkNHnl)VMa8LfSXp)PD=v-fIT9eS` zFl)55h>r~NoZ7QaO*4REU0XE!a$q>D5q$R) z2)z~3;oReFe$Xs(__ST$^be{>;1augpg*UP)V)U@Kj+1fiuX8&%noZ&790jg3d9a* znRSEhV3qU7nHc-UM(R7Ovbx}tff}3);QFoA21Q^eR(zX+Mb|N+!^cZ@A3zFv;F8Nj z5B@>-tO@(JokVn&zBD9T^BI{S(x#SE1#KtSc;PBOiEojw>C5$Q!!!~Jrpv4;BK9kl zlLy6Jd4l*MI+v4k@Q)DG%!AT7opF1Aez~Ks@_Z9dQzNmtVI(&vZRJEV*f`&2o#p!g zgZH#uaD3#5rS<;}64(DbDp1>4;Mj=z)rWquzbDuz;HD7!gHaJUI2eT~GQz|Z`*u0j ziF+UKCEX7&K%a7j9^yRTC{Z-F+m7Bjn4!V{6u|40O}?PLF!B2FW$xlTGyjWve4`=I zF99Fw=h)B8Kws)OXgmD>g#TykQ56Zg*{0cM$ulW}s3xtH-OJOTSU1k3PBki~<|Zr7 zP@9b6U;pelS57CsJZ!S7{xdIq*1kCDb%lKuc14@I#X}WSll|JX*G!VZ5;c8DuCU{u#pNB+&T@F$}~$?raz6ut9_+r z3?JQ7nx-i&3?1fj^d4xZfF-_u%CiLDaq{9;_5szACStVk(m3_(1-B;R%rx*UBr(<6 z8!HO_w{Quo7|~d~9E?T)`}JEtcdJs~)5hpWezZcV+tR)n|eWqyX#|?%h4nZCaKR%Ftv)S`BVY*k=~G zrkapD=V=^Sn^;4mN^hbRhPH>gR&EkFsopPLJkB{B&jor>*Y2ws${3rme^5Xye6vko zRTayv=gFUMYfL^N?JSQLIX;XID9jz0C{2M#n4C=biTuR$)XQfb;QH!HkdfS&KF|7< zPp$+4oq@RU+DiG4#29C_ZePesZ=O}pXrxho+xze<%VjRnVSS|uzPh7n(uMRL(zO*) zL<1+Lnec&t?y)|tUx0H6yHwr)0~_Be=~0{P#GM|qHve-yS(U`Z31moceb8T*n>4zB2G@ifs_7Am%z?DcUyXDV`T7o>`9K zbko|Mx}ti~@}wfU$a&O^l^pylk&kN|t}l|em(QBH)J0~do22HbML^mst4o5IYTNW) zO(b(GXw*))N*w8ceVelDz~7un zd+yFOvz}0My#HKT5ld?F>$Gerel>GvZ>&nRBoj26F43(8l!Fw37sV%`D`)&rxG~E$ z_sP7uR#)S0hAOFB_tA z-H&E(A8Q(4iM0L;_LIBkd2L1*CQc3ruCXgj4IP$)AM4p0sJO~pntiOA9pLt|DRO=; zQ@m?-mrmOF4BD)poZPEleI)*HlTqEkJLxhc2>vC6qvG81S)G~}$?CoZT=L^thXY^@r^?!{JkRF6?5P z8lCG)AF4LeKX2G3!sY4bNXl{@n(7HVlkeA8%Te)AeuuAcy7^Zp(f2&CQ3*77(DER{ z(B3IgbFz6LDg3W0KBFF@&`qhRv$<1Ri>N@#j+6&oE`w0;o`vulSXR*xE za-8OD!h7|FXBgrZ)H>++2G-rOw45?C)+ck1EWqtR2{@gu5?7(d*4(_q|Gp4-dXCeq zO}N>)KuRamI&{s>srTs5G{Qt#%?s7qz)^edkx#3~zmpDuQ%m(R<*6>U_ebCZpb}M~QOwl;}w0Bj3f$BHEKcj_Y&Jp(rMHOjXb63Pi@V4RDTT8L6)ViT-p^H8*KPgQE5ybNFkokV#){P|r z{(>fQQC&lwjagST+#gzZ5F9s}0ULB(jtwX=Y%h!TPn@ zR*RSZBOreJuIXs&oBH_~8fX3bnz~|=n{*sa9GJ&To9KB1-z&|FDFe?sUXL=}B8F$K zY?FV$3>9O}1b-Qa!<(|dubdz57azX4N!wyCbNo#+!^dvUvfNK_oO^L~Rg>$Y!b-g` zI58t|{s?^&oF5X>H6pcm(>!K?Su=-8DN+^4AJVu+0eWp8>TOEoSH))fQ*Ru)qkNO< vKec2+klw1E|N4!lKPBVBz0n=wtM1LKzwK0?zWDJqaf#0^ zgYDl+|H^*jBJh>E1b_MCqhAhwU%L2f`n4~9%1W&8E(+^h`(YAKspLh()U~TrFAM8u z2ht}w{WJ5aRlJb&>Rt&)7)5F4hlrG!R4C;C%YXb&8tF?_WIQQ^l%SZGlA>}|FQkvI z4vH>aQu=M-QIgHK^#my375^iXexJHDS;6I2?kZkICY?YBK$E1J8dZhD%-?Nm}nmL|G9m~uBPw>O6E zYKj-MES!;^(37j^dekMeN}<08XJOb$q8>+Y^ry-6(YJ%fWD) zTJ^}d!ElR4Y@O4Lk9M4rJ&0hLt&ro48bXVXSLr+%;l!ZpB1*))OnYHWv8SwNNI1xv z>_N4lC zjKVzQ^uO3D{k-PF=;JHpK9mpL>(8bfF~@1xCrm?YWc6cBEh!TjUZLs>m+j($OPv!J zgU38o;hfW>B(JBnn%ha^(xfds&$uTE&L*y7-z)65Fe!ss9+ZAl)jO*mbz@(Na)=Z% z_;Cods_m30#b1vn-{N#dQ39vHQ-kqRBR;U1Jo%RV9>W>jhf2au#k{=THJywWgT4o-i%HxBHCp zV?6_N)dg$yPES5-`Rw4}z{-0KuMQ|KUQXK?JIcrB8ap=}N`B};H#?l z>{QfMUfmXU%<_x@SRCPqhBHmLBb?m9=n*{Trk|5;4J_*2g_=1}oO3&2`5h%Szd!TE zBUeqz1zu20h@4WtjxLJg>xXfsdtyIo1Z!|tY^pLyjT5qVad(&VM0jW6#5w-ia^p>^ zKeq5n|9Lh&{b*EGKWN)6ZOV$V?J>F1J1}?{^)}2K5_u#pHk+u+U!yfo=Y(uggS3d3 zw^I{n)LIz2$#qHOZblIE<=O)0z=KEJRhurE%)HA&ON{1k zNv-tkQUe;LeB8tG$hngKg|S@D0e-tf^fOklxxYg*R$?zOu*_(h?WWk&>cn@?m$bO>*Rx8G9#Ro(hb&p7s@geaamCwOC$ zxlrZN=bC(c@A(MdShJVIO|@2rx9ZVeVsv&E+UVf|Jv6L-aKc2h}z{O0C***~=^#O&>xm~BG4cZ=(s zQbQf97DCc{#+_Xw9)fkp@N14n_eu;LCT3d7ib`q%%gfeFCUc}&H4tr3%eqW0ExNc96MpRr8bK>5p#p`>O zMI-fc(b`YiPdpKqM-nc(WJh+ksvgY`Qsm((S;+Iw+W5NLuGMLjn)W;Ql6p^ODg*u0h z|KlXYD;LH~>Tnl~0(w1b!Ziu1I=$MrqFWo|3hYv(9LXH(`kbBU#gxT#%Fu98 zb&*6uPFCE~D{E(w4=Th_rtRY!c+`Eop6Rz}dt9RMGRc(c-LdkyXPvaR!f9fQ>Oxd5 zXSd>4Yjska`cZ0xW7YlO-a$H3G(2CM{Ul~KX^GIyiO)|8SPbu2V&ki0`=2dq$;z(h zT;DuaBkTu`+~NX0jasxY)}iocL$wmXhr%Wy+zg2qQyhBZ4AyOU$X z85{Z+*jdA_$xAv$nITvDEW>60q?;A<>Kdj@%bXL14uKBQk|dMC>mz0jQ&+w06NQBX zi_Xt$glnz)%Th|MTF3Ys^bG2!O`lRd5__b&%^vBa^Nq1#)<*M%m+hPbD?Oa@s%7_D z296sw{7q%SJ02?baYfYEjCi z!}4!^`cD!{T^hW`)6g3XudDCs8{DD%wN(H1z70L0apPxlCLT!GM>&5s4)9eAiQ zYJ5UyrVYGyU+}8KN6vWs+P_eVQsgpupPH+$ zws2THkg2u~o=nJ4+|aWymJN2Qa+e`05n1zRdS0i^HmB^t0N`k>PgPS-{Y){cZX2q^ z3_raic@;x&Ojjbv_`Cn*FTJFCqnMGRdU>6+L~3DFk~EVgvJITPpDWxEwk2F1Sy%l{ zXTY1x6QwGPPS5_xjFY3a^pl>6 zIW5xK-+7A<>oFWd4sq&onEdqHZa3M!9n2^}^p2iv!`Xk>#H@J)*vol6&Dz%4`(dH( z71MG5u-eDbJ!R?S4rzO~fdka{8e9tS8Nue_nnqm5dU{;RE63zlNx|a-XfW79$FX>l z<}$C}J@a8o?#|h)h9!Fmp}Tc*o8;2ux)yT!FUm_hse-I_qw(rLIh2lFLjf(fN6bFT zb@1#BbXYu`7h|7*cCL_1n}LDUv;`;JcVpHcwH%ARO96pH_nkPHeC=Fe!~9ancyqKu zhtaw4xVc*&;XnGq=1zd3s&lf>eYCf}E7w zex&1LK|N2S#PLe*^rWY~`fz5h zSFKkkk0B(q%<_91r@uWXHnbkCpKXo1lGx^Jv`Jhg9qcnsxgoXM!pm$P>5Z&!%rj02 zQ+RA)QX4xp-I;JQE$EgpKkgHLkJ?dvaZ$Pl;AVc_{;(7q^M{)0)Up zkC?H5@k@>kZiWbLQwDoPr>Y_*d3b~R*tn+rV}#hY!6Y?mXDsFB2>z)i$$NE6RL8?0 zUVv}e%V(-TLuy7OKi7W#UY7MoZeX*z6GZuSa*nl{_pWwO$FSi!nLN&X5NtCg`zL~R zaM0>>WD)V@$IFpkjAeYX>Ha$*@qQr zxBII#c^{gcY?5`}{U8LPnKZmxA&Yww*{b8)X*6iI8YyCO)~3e2Sg?z(8%)zPI2jzn zAvjG=_9mxxm!`^b%HkJ6{T~WT7gjszwgxtHS`>{R6Kdbtk4Xm~qQ{+F!9mqByU-A13b?Ick(49n3Li&TS*tcJk7O+(8IG@wZ%N zZ|EIVUEiPE^6*i(S)^EZIaBho+U%SDnJZENk|nld*HBTfZDA-Qq_!t1FG|e0#M{}v zU^c!}X&%#dh}>OBH>(V>?`Q_`C9;6q@@~az0YfKxMj?MX)e(b6HM(vCA?n;_IYw4siOs@S1BQ*Uy5=#zAM<^B6R&2Q3GdS2<#qcK~U96|L5 z$w%S7Mwy7#ZZ7X&+0JVT@?M>psbK1zS$LI2A^XPh?b8Ny`PIA) zdI;j@;vi026F0Xk`Sqd=E-t1iaq0rY7X%>k!4A!{rf)mWe;&(cZS4@aEiB*c6{wb7 zN&*!MkPiPS60zTy3{^jk^)-eMY3x%SZ9(!#HcQo(rTbk;tI7`|bi`%j3BmQS zZUrL{-x&Q-qq$S`llZWXkd|_~P{h(13b4L}@r0!Rr+kX^watQifmdDuB6SfnQ(X0Yb4+sAg<&TeRvzzxx zGS)2^sH`YkxGa6Jt9J!}2~RF>*<<={wy|A(GrNoza{AcGkJ|BSA}Nei;Y}Jl8nM!r z(8*O*No|Y*M6vxV=oNVRl@0=T_!PR{z+)9inVonhDMPO}cwFF|{4}LJ$b-&qBD0!w zC$?tmw=$WsJG6fFVo9fKoDWvVNbmlBNL}Ntxbv{*qXV?{rYP@S` z1^3XWDQC_NPyNm_!v|B$x9ymIY+`H#Ui=B4hYxVmInpiewt4F>B*#aC$4G*K%Yj>h z>m#qEN$z%^fCseFZL;M$Pe7ThmtJ#_lCCI5w=>FAjnWlKS7Et;8w6zd#vx|7n*A3! zQo)wuP-h=g&5V@V9SLPblD2^H=v|PsC5I?1X0V;(`m6=hN4uYC%)+%s^oD-{31{F$ zg5(u(=%B2#(v}Gqkec@y>>m z@DKjF2f@UbA7N`h^SNw!*Y_Z?L6BJwFeYHR4fx4o0)cm|!-{K^ynYVQGNa1yei!#e-m)LaX+&t+M6O z`?Ng1OfVoOX?aKhkH9V1ex+Y*(q)mfk0Ze27oT7fc>vZ$5E3GYWl58+t#-=^{{cLb zwZyhy!ddMCzXjt4wdrIFP(slftsFQ&v8bh}`6Ol8*j`MIILv z&`Q3m_Hj6TtTiWhU~l|1?6GYM;3r#)iP!vT%Ch77a3 zFpB7GK;fe0VGkBit0mqB*uB!K=^rqT^9?56tuJKDCrq?*90wG_FEH@};bRZ&4n%VRbUVKgIdokTFW{Y@-V}AOhMf&X<7dPh|MtKuX!e} zkjDFh0e0|+wfeXUj-0ZlQkD;hn1p+9KlV->P!!qsy!m~m*C1ut>}CrniOZCahvJ`I zzG1#@{vK2NEHSk)SZwy{4U`sHW}#LQ|{Y z%4u8coMfKj5T!KOx#`|p&UkQknIYnLM?3BjVTdA8Fx%fmF0MZvs8;SWa40Rc=AyqAh}n$si~kxJ zRM#Huz^{i^5_~YFO(X%Oy~7kwG+URlte_ZEyb5Srdty|-HtBwiX_6%e9I7x|A({c( zBWR_d0Ba&zVdBp&OE93>Y569+vPQ-+yC<#zeEC0PeA5A6?g>m}{<#OiNW-_7KpwjR z4+v+#A@>H4Z(;V!HQg**Zu>85;Js*vwVELU)^%Eu&p;mD7>|`eB)&B!#|E%IqN$c0 zus37|GYYOXFz_OCj3W6LAV;fqS-OBn@>xtg_kCbsg?1JwUh;3+$G}$;E40)r;Nx@H z<0Nn#Sb^9yMO%P)f-f=smjE?QIAPO_K|wyz3bGAQ?9wX42=LgT-P%pS*e$PO?CjTq z1?Xzo{RYGf(JJ9HKs@_fN6Xw1=c-u0;N}H_VodrfID-O}wE-~YoM<_t{0a@GyZf8t z&8o^mOIxHx44iLuTg3=f7he*n4pQtHECIm~nQ(#hC*98|GtoK*gPFECjZzqmP7ehA zxKOXer9T)E{>mCt|6o=QfN}^o7wVL8LU2yGhh9jE9;y!8Dz{)TtILLNCMY}fzL|4o z;BkffOf^ijx7TG2l;|MPclt|9i&S5FW)!NlsR}t*il_J~ZsdnA-D1BUEi!kG=CR1V z0zZZ(P;i?ZO**2uwrLDX2mKO}Sqw`2y-ptt(aUSvTF3zk2})(iywYN~%G$ybhX!=% zr6C^25;ckW;a~{S7b+hxFAjtEJGOWryXvte&}KffTr^yi)ZgqiR+rB# zEZ4qwhVP$%_v(D6Gk70Z#iqX4-x=sS>-X;@a0Omhw@$UCyi3P(y z$F*@)A+{YsP)#SGHm({&lHIXu?*UE^w`|v)G4$61+a1}tRc&-Uv@q5M2n;jP< zSJcU!krkzVfue=JUB2O>K^65mAhXp05Xn-O%5zU%oaWh(4U5SyyFwb?Y&ZUhXGMl6 zg9V~FqEFw&9QL^8mWC?LLjU;=Ja#F9kMHc#5vJp9LKNz2!DIn5(o?R!n6wetC(R`B zHo1FK#Ob`G9~VsOLrHZmUM#o zh{Y4ly4)RyPY6~;ABi*TLNzKI)3gTlRvMo4;Ar0in!cIXQ-HQ%u zOAGHll$g?eDrJ5i*V!+Rl^EbEoIW@T<{=a|=^}+!k7s9HaGa&6`#Tgz9^4BEUB_<_7aa;N%U*4Y5nE+WX z2gYq2RlrUEdvtv7z*51-d*}xHWTMl>aEs!<1|Hcq7Q8+GxZkEbQop=7gYznD4|v7; z9oPp!1kQhWKGV>p?aF`k0;H6@Fb?Q+P4W?A48RguwTG9>Ew+Wqg)AL;^3XN%o6#jK z3q}x~pTUZXi?>cKeN!mos9L3s^eA7~PMCKt)r56j09VgiAE6JD0iOhB6q8uoX+YnD>%Ed-3TZwEH2We7tPBHowzDG@U1)m6PNf3OiUU9hYg;uGRtFkmC8Svre)(|I_NUvStHJLl@9RyJ$ldj%71Mn$-k zmp$2m5RYRtDEfP_ zs&e8SG%o$W%`5BYX*c%Mf6NJ4}oI`C$r-!P+ zE#?qTq>+6Xu1-_*JXXgQCw~zD(Np|qATSEzXJ1C()w?@R^=C_LM+@oTsy|LYJZ9`f zK9lO4Ca{aE$~>8uAiBin%hw(U>V4K0-H|` zm^-=#}b@(Q!wHS9H2=B=tJ`?dVchg~wrNA%vsQ_(vE@HZ=M>$2EOFba{J^`?VWl*}PuuoHF9dPuLdi1u=rw zJn!#aLOD(Pdvx~M{vOvIu460EDEfE|Q{wPeU?rcatRLk`2t!g3Wj zBl@QBoDo+6&BWVcU>Q68I#?Ds zq+Bp=Z#V4kpixe2m3bZjGu@0>2?n#wOUcs8?6Ui1@6nh|4+NDZnG0{>pDAyiUfbon zjJ8RuKwo~60YbpM0AB}8O}qrfXYqjeTrwuU2gn@|CoI#LfFPK)2~)=!;C5)$n0K4q z2!!K*rF{&%8!ZxBRXRxekbPR#FuNdbz*cn@vaZ5duY^1%F&-O0DuOg%!~~EMAw@bE zyFy6Zim__}z5p51DrqZ_!!{0MXARUyE5$Oz30o+~cI>e}WL=6SE)yVGMEH@~$B$q&SF49Rqpn!t%5eUjpLnZSa71 zgOmuFU5*j|2-Sqgr1pcvoKdXX3}J=B)1?zfRSmjlq{<`Ov#r@DpZU40#gc0Nawumu zHphNI$PK~D8qpZz9T;O1$haSqa|;y63)5X6oI{OeoCHvdL$u{LSbamZgA;Rs}mmEU0XZ5izxR!b^?_GSDT)Evtn%s2cw%=2hBLHdg5i8f_qgKspSD4M^RyK|t#<%S6V{XGMwbkXmQT*~87Cb9h)onlc%3f18gBY@?M2^HgomoXr8n%m0sbFm zKuurizO$>t*Kx7?^k3|hjvoa!HRPoRv~-&?G(^3R*C_zKf2K~&)T4?w7+!-l8-x`N z@|wo73<{~klpQ4iX_-iPtjYivS3IO?z{n23-ADv^l`!?4LNLCQ`kbzk58O|+IHM$E znHSvqfheXAX--cx$_$-!iVuYiKMH-Un1 z5&kKW{F;%>e4fvhq0S)Y!sW|6o7<+r9+b{BC>Hb#E(4aJ7&~`bVS+aL+t7Q;Uk&x* zs6m1+fCdok;0zP$Y5+uwGjHs|i=M8HiSsWd1YcwC^IlXRRmABT5YwYN+MwkW1N%lg zLDEpu^e6enC@9+68bDbV8tSkBlndWGVP`rWlq(Qcb6V^(+w67pd^|-ny=(smU_y6b z60~ZN!EjO(uW%x>f%E-4YZey9W`uDL^K7G;55Xac|L;i^;#B*F+wzfDut!2qxG=T{ z0BY``Bfqq)`3y|faBR~Gc_5uym0R9HFn6qar5=Sr@+z8wQ&z{~1b>c5>g~*!LLBEh`5Kzp{-({!uX^eT$+EcHkso)iq=+s_*}8 zb_MHi2yqD*OJQ}$0Dym0(mZ;hKe!BRz1Mt!?nhVo=iQEV+9cV9R_dME2r^zG^j0+Y zAd0u59(6@^jB0*pz&S@Yl^sUg_s!g|i+(o60-bM+kiNCi)OzwBBc6c11x;s|2ZV}P z_1^h*rkZgN6-vD6yom(djN6^&my!v;Sy;M=H~He&M|9 zlaVCg7KWz&19U5bL12Z8p&y^c>eU-z-ammQ!||)3E1^Q% zgrNaMbphg-3~;f6u-YMH`x+zO13?d{WFZrN@Ry}49HxPwkN698p(^Y?0SlRY4TL|0 zZ{gJUpm5yZ00>6(vGlwERz>1jkTL5^=qk^_s|wmy$l7=xWNjRe4TLgtmjT3&7)N7| z4`7dBy3bt(1Fa>7i1i`XCZ<7t@ic&Dkgi>jAFQ7t1W#-r0tY5yqLxD^UVtSksv@|; zAt)-p0tkX&zb?REKSB-^aJz#L&qHOXpv>G;klDmKzzm6kh?BJjPIn0+Kw=)`OTg+G z>5wmXH^%J-vJ^#2d0s#x6PBAy6Ya!)>vRfHSmU+v2*Q8EjFV43wW`&4`R* zzy1E~hu>~3I{y9FzfOH24!Z83yNBhy@-)5X^t98TR@pz@jQPujd-TZOO_7C+|NMT- zrS%E@=Eu6#K0iOb`<2UQANu|J_5Lque&>R|wf^#3?%t5tqluC{j*W6OF|;RbRwXR& zJ(BLx>neHKE|O}eD2lr%nstA|MwZ96o|B4?=jTbQ)i{Y??9hHBrT zW1#JVsV5O;W3=O#y7i&uTk1j<$ry_(m|gFO3+~ztCxN*ULf8$rtOO>t+&j*^V-7jcAqS_c zaE`B_oO}Y5g5d+CAa22kS75~8(hy-;W5nS08sWM@1Lkjp#N$w8;udT=SZ$`&W1MRs zaUaIn4RR&~V#F9{E66z-W_h%FjPrJk7~{MRawZr-;$n=m733WK1tk6h<6H@e12E3p zFwTcDVvO@v$Qi1FbrvpqBgSkyd~Xb~C~F6N+GK+Y1Dw352lJjEYO`nqpMr*?WHVs@C%8yXKutf3H9R$U>xYJT?BT#Ps7XEF^_47BZgMt=(oWEsBQuV@?x}fW|46H>La7M{;g&;qfOLzl zuaM{Y%U`}z)VOx19RYRMOuvoeDjqMt!gd3~{d)k%S=0@E6X`6ngiMXWRg?AoE;`lo zwOzT(>uGSpIqyKDd?a0F?Z>YDU%QrXN4RJX#RPnRCbY};`Ya?SDp=ZiQEZpY%PJ=w#K z;P^nefmmM1-@pNhWdN+LBVF*;o;V0KK(MakUmtldy(boLLeHF{-k_XP_7XjTSkQUW zUfbtzRZpd_q=!*4{em-DLv;wPs$ta7Yi`Gu++PHmfT0!Xiu}#Wu%}AM|IhQKQ;HjC znu)tCpw!Rf2D_Dgjl5U!>#9D0!Y)A*V6|om@1c97ag3U(nrfMAPf`lbz`wW3 zy4uvkRC4i@?~Sj)rwka{BhKrAyR?Tnvjf%S&>KY6RcXG77r3~ps$qtNdR%+fr=P=X zI>tQ$tOLdrB%lMF&erLKP{o9Fe1)Wq!LDMH7Zpi5xhoLvXPD$}Ssw^>J9!qx8GFy4 zLtA)~ysPn+2(k@A0Pd+xpQid6nJIlE^+Juze7$5ipd6UiB8-UdhXwAQAucx^jSVH8 z+jDdfE*7O&R{=vtC$GY3;9Sb5zVr|WPYw4ca1mw;!xF-X`hJ+=cR?wnM1c0MFn42d zxAYH?CdSOirzpmjLCq|Odt22Y04~fMd<0r8mb70dA6C>#Z-~o9{(=yb+di?MCG^(x zMBUxm0TR!^&I}xB@>efl2_2YkT>ui$8}W^}LVQFHuleL6{}(lS9CiP&W(7jSjtF6m zcf(1S(O~oj9gpvqPc?(vionuxARu;Sk5uJdOPMlFjJk0^H6R_5PNU&Q0yKU1jp|LZ zsJGdI$;;@DUzh0C6mm3+uL3 z5O^Rih9Ke*A441A)=q@H2ZS!5#{jhWEj%#yd{z_OvVn7Hof`-#*9%!2hQK8g>n}Ll z@OO|iR-r-$q41WQAUmv)hWHEIAFdBv-d=3NWC($=`%}ag-XyVzP)^(5;m@zJpR1r4 z-$2ep7%REUF%}Mx1#Fi=kQcB*-VH%0vM(Quvo*)Y#Xw?XjMx$q+hfFa7%_xiNH=W7 zvE70ZM?vD%81YU>?1vF!T|WCT&fOSiSpC+Pzqy}b#9u(-b#TwLojBVdKtQsg7FWXq zq%Bde#-4V;ec;2`gAiaro~w_s*a7iI!w*pV1rTqs^x!0{OHhmJ;0Du<*QY-N@)Az8 z&-R0FnN1_V#A*pCFj<8|{|n zi}L;G%48Rrj3EpNJ{%kjJUKz9dI z@o%Np@Iox0471Fa&n9m@MG(VI_}>MX>EuyBZxwTmv7|1RoV7Sq%RCE<>4DTtk&ngA}VA6jpPly&0h%=c^q^5Y#+C` z#l^ZM!jUy5#Sb`WZ5zjbK(jj~ zX8gDLlt+dL>kzioQ9017V?ab!7F_ztk$xdu7Pgh zzTG*B^=KD84`*hgS-hnmXOxh5B==}i_XIoi;dn%~lK;VSz zmG$kuHd_xa)5Q#)6PuyDv^&s#=rH95`{qGDr)FW%VVeOUzKQiWSe$?npmp2bT>zrP z)(&ujLAF7=2@@7=pMoXm5e7$B1uZ%ft_^XAXJapRHu$bkau z0mBTqeSpO9(iI`jLSiXK44Wuul^F3DB)+932H##9idA%ZRcy^t)xzKUWtvCQOVjh^ z`@%f_bs|fUiQzGYffZG^sBP@l#x~GP=zFs^p zaFzuKaOy*f=hOWWIE{ps1|k=>m6jJk5@jbAU!a3y$ENxPJ9=s!ODk7^mY{-5(8yUk z0mzVVGV`jFv|gJuyM)-UO}zdwM|doj|tK21b;PR|;o8;hMR!>plufr|RwfmT5SBQ1%I;y!7d^T#cX`Xyj?EXEN@``(2` zP=h&?#njUvwHj=kZgr>Q1DKVdM~~ofojm#h0DD+L1R+@EgAc2hq5)7FWQ0QFfJIc` zczT~&fsec#F_?nYAe>2HTPixjc=t=~pnWb71P@y;gWT7@8^4r6m2Yq*P`Q=MMhnYn`uhIs40qA6k# z12ULE`Z;vPE!#dZ-HhSs0TP&^JO7LDiinPaPqe+!e92BpAzc&xV>su}gTw01-#b^( zuH2Ep6HA8IR`m;S&h{h!21A0^i@87T{zX~HIH(qB^EIT3c^F&{krl(!)0d=Q*S9bH zJ@*mP4O)yrVlMG3U-$=LE~^v~MG3Ljtxr}Bl9<27G@ zMh$BU=aLZ`hKh-GB@V-`HnDg6V^Nji%E5mB@`*XnhD0P$KzJ@Ypq9?54EzgM6aEXh zM3;fnnkE*vNnfJ*C0-3;Wlu=qR_dye|D!&`MlD`wjz)>Y3o~vqvcfF|1z}E z>H#i-ARKWyrld)R4sh<0$LHpmw?hIbRSR$CB+fVxVZndHW!F$0W5zJ%ar{A&w7@PD z7wkT|1{eS=)gwg4X3&Z^iN>I>(Zk{dYeTQ(qg2viMedn#P^g3TBqaW?&4CWa?`ot6 zQ3hi?Wp1d~pIO}l+B#_%Vntl8{y$7|h~ZeIGVc28ObUY|=HdK|*J&$&2zPql9T4qo zv3wjc2k4snDdqwBun4bpm0Vao*48YLWB@#ATQTuiu)c4JrKz;dAmk9RyoGiR{)AOf zg!ThKkgU()4k7uV=BBM~Ah*DG8Z=kTKNP_xk}(Xi60d@BMeDF}ks#<2^`Q+SCm``A zE%ACld_qfH0EuC73ZWf_#2;eBV~}{emKc_{Z)u6kAn~UdaT+B47$e>QiB~}^g;-t$ zPzl582;oaG?n6ui1PAyNvm(NWV5t+B=j7f2A(aRlegNKw(0dRIgRE#U3I9WElH(wK z;KHUSz}W)u$OXM_V8gEfEyl0Lw9y3$m$VyN)++&PV+=kJaZq2dvk}BjkW~<2{}4h% z!Bg$jr+^aqsTc5i>JAAKg9G`hp-ZXYqzbqq>I?e7^ zjG8UpD{Fm2vTBa1X+H66FJaXZRfo%VPn{x~Y36taoYhG3Ba>F7>VkKI(wSO!&b)l6 zyj@13sCB6E&lupW07L{YZ}&_pFEx{Izgy~* ztA*DKUqm(z-FdSW0QBK|&ceC- zh5t|oaE(@EE6`U_v&)9~kn`t)Lh4L6uuipNz0>a#N#&^dl76b0(T(bb|XF%8(6g( z4D8TSzxFn@M}qZk8>m+P-=yMKh;|^PrB{FpKHyQuzDs_eT4F)>$XRZO)L|f!dt?)6C(AaP1fBnFyYJ09qUHeVR=W{` zLpg2aZ*Nqa80IBB1`(PStkqZP{}Nfy)@cu!6+qcA*LIpO_*jRLlGkhII6^>-VMjQ~ zg+aN~1Iwx%Gh#A!s+;i3Sl|OW@TRJM^O+R+Tka{0tW&j; zhTXv-EW6}2sXcn=UPfbXx#ptuILf2v_M-I@8jjbgUL|K3|Z>@oVk$(?_iSsstwNFYX0&$%tAa9T{?p1X=Wt+k$KzxcQ zxV!SHJfEje4L;XZF(?biIdl&*NZk_n2r^)u32nv@gBiIdL)9W3t~(Z?C8 z{b5zXIrn9Qw`?~YNC~LGc{zGY{*xI2Dt<0(T?XEt8l--AwtqRdN1Xw_m9ozc`3PaW z{svtWorV<0P)RJe@MpTqh`h|}&!Xnm!?))aFYIQDsVVSr#0H9vyc*qO&zZoo8qi-=Lr$$9-`Jm7%dTP5pXtO8 zxtyN|VFGy5YxWH1fE4G2zn+xBT=bB~F`=$bLEqAD=9&mg@@8a$@9RL;Yd;EQ`Bn4u z4QWws4Ig(ubx-YO3PU|!{VW$9oUES3H98NJjr=aXE1i%I?GAMIFAd`SMJC^9p?bN; zTfw;yqeyU+Zj$3Jh-Gck81xUc9`)d*$!er$!51kv(HlH*(80;b&wj=vE4o}hIpw4) zuWq9ZyHxnc4eaRa-G7|K{R*@ia-{&Wa!2w$-df`sBlCr|BnqyyaUzQ{|5-$fya((cPC znTeTA$#X;foFp+w|KL;pM2GjHb4y>&QT0ek zXh*V3=M~g~vBqiO-H1&3WJMpg9jw~_562mDpBS29v{&i-OwBQ*6%tN7F_LnVU7=di z`5ash)fsZyRn@y}KA?RgMB(PZJ?rj2N2ea4&`Zw?eDUpsQb*0!6?-Sl83xwmPmtA# z8mSrHm+<~uWaDT8>h<`^2E-zw|1+LjBRNCC-#s$>KMG_E`$)lx`RzT>5B~rEFWzAd z!!)Gy?wj*q^W01ia@rP7lLAS571yK@48MR>YubL>ynfW#Unga1?#%Wlx~#}#e4`WD zit=W4r!vGCA?gJm5(sNGzb#du^A;`!+-*hu<5Ib41juxVHR4{%yceTa!rj~ zocboLVCf+an0QKYxg|PghG`!(^8&poJ%3Lb!9bbfWMHD~v) zyu?UAUH@Q4gk0W6U*qR@@}VoEVd~8<{d(TKI7vn-+Y0oK$BP8Xg-(0@&tN5%;bdWV zR1d(qUE+63F3D_DXO-k=*JDH%-yTG@#zDHZQdB6)2%XEuzSK%qNTOX}SE+3kkiagg zcLqJuMtOL^5R9`cfrm35I=>+HfQQRm>DYnc9Z-&m*Vk^zGJddjObXCyCQ7D&+K_;8vINLVtJvRgqt=k@ItWg!0N zk?5AC3z+PlFZaI-ok}lj@Bn*3tR41X*YuX(Cz#q)waBS0(2VWpd88ZbN!E^V56TI) zs$Ap;*qp^(2;|Ar<51_So*m6U@+NS>(UXE1$t!EKpLfl^{=0-Od?fa`3`z8-8wD^G zaU?-n=h4aZ>#F0FTq`-?yOKpT;f;k=|J4mmVt5HTlf1`)c-cl?S=KbE`u18@o!nbG zPBl619HXc)$3aU5)=A z(G;w!x?nyMC6pY z!eVEr%X&LQ7rH+Gy`764hfCf*i+&ASDCNW6X8cIF@jDCypf+V#=MopV$BN<{`gS6d ztM+wmZwcaXau7;MRbZvvHg#1&0h#A%h!J~ZE!N*xbrahDY+0vb2Xny<>S!_c>sLX4 zo~0jNgu73$f~-(k#+%QzI?{LP{waDuUo+#_xV;-Ryq>Cj(wi3!@-r7@I|Z0(ZWt)V zL%gPMd^w*(5P9n5bd6Gf#&Gd_QO1u&c}GK7V+$X-*SYc{ zAZUR8uuja0tU1`>LVWg011cI~zGxy&mRtK_={x2y<7p4?4YVIxmT4oMzmJ3?&vkDdEo*N#)}1#UcH w7{X0#2E(5zXX5ZIl4h%67Tb~j_n@w#xav!bYdhY*1qOp0nd)#L2uVPYXc&TG2qc8uy-)nz`+MH|zVE&Fzsu*-8g|xMd+oK? zUhBKo+K0_Gl}q>+5%^CznZ?N)3y-~4&@sm<$>Nu-jq zPv4}aR*EUrGu3^f6fyXeAV{V5U3{+;JdPK9 zpCzdpJ7gw%L)f!dHzt`HF8czr%L=%om&u2CCa+q(iul*Fh9bYLYkUCqC05uDFkNZNJH_ zlxqV{BEoQoxp-5Q+sGOq2JfMb!MB~EPeeB~1diS@de^!_%ca$hhB60~nrJlB9T1B2Sf2r#$5r+y20uRbNW)TqB)%H{{;2m6mXQ zrpqBiZhca%pGK7ZnbzwoF8ddH3z>e!_db%(nN<}C4 z+(9Y9FMXcvaDY{R2}(ZjGWW^7)qx1v$f0>^9fG9Ibh(u&MBTwx z6g5Fa#dZyYp^nTKv(l#gA@`+cnRMY3M)cd=)d2x9Z3*QRLH*2Rg^!QHpe%;sW9L65 z$wf1omtItxd0U=c$kEN6;^=mqG1l1$HF9Ej=SrXrygQLS)|WHXXx?UCkn)k_;1$cB zS(y>(PYTtWC&1|MHtMd2u$aO#OnpF0>-qq zWF$lM>US~QK%mM-od=@kj$9$#al4WuL$8$YUrN|AB#1i2+HZJ^f8x25C}miekP|w( zJ`hMiCbZs8eK4Nr-I0~=QJtn-hpwBP=V#j_OPB@FF8`?3<|vWu;dpl6u4FAb)gDNRsG3U!&8YD2?~o{vx2*+ zZ?q;7;-oBGL{V1;wjwKZt2*#q(r~?xXUL(#m zqdv-k7}neFSNj*==9Y`LyEQl_oML4~TF>*Y|2=t2`9klInBz(qolvZQqOO;Y<~7Z3}`po_jD~j3DL@r>SVlEPB<7GOHEx6f`1qlPEM``NhZOl`bwR z>3=nU({}u+-Sk4=Jp<;Og}O3VH2Ggkzg`sySUn383cMnuvMZHe6Ur?wZ?G z!*@ncdK&bND1I3_dFy1yPAAYO9^(=a7t`lVNe7YB`9QPX!MT0$#(+TZmREh%2Q zKnNn;d0X$E^s?Wel^90I5s@5=jAAPgdwM}ajCASc2v4jAT1v| zjteu2c@<|cueeH}A7OphW*Nzw88cE*6(Mu!>2<0LDvz9;#dkXzNRyA}wfPgyE<0=c z%B#~dj&{5*KQP~PLtZNG&|f*b#jHFja!EIGQ_Ru15?Nf(!=031=h2>tx#dhrUjl_B z2%RZ71I0YEcwTk@7p9CFPOP(@FLSD$-iqUtxln8DQ)r`89X6JFDazp^^9C&C@nY52 z@*ac!&jN?$C9L#Vcv$eirbM+kC*|*C#w#a^7wqnwq#_2x=& zL+0YXr|M&|!*+1u&6e`89-c~McnFJEcMD9CRjH>~9g)@|-78adZ_V$QE>yRV&2V

b6h%o3aA9w;elE(ld66RzOKmMd^WPNz?mJzFi9 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

Jg7Fifo@Sj-y2Z}#@Hz$nJ$V~; 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 diff --git a/search.json b/search.json index 228cbf3b..bff7eb2a 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"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.988 0.182 0.682 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.709 0.166 0.380"},{"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. ## file2b7969044047 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 ## Max. NA's ## file2b7969044047 [1/km^2] 21.24828 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. ## file2b7969044047 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 ## Max. NA's ## file2b7969044047 [1/km^2] 21.24828 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. ## file2b7969044047 [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 ## Max. NA's ## file2b7969044047 [1/km^2] 21.24828 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.2 ## 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":"library(dplyr) library(stars) 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 prcomp predict print # [25] pull rename select show # [29] slice slotsFromS3 split st_apply # [33] st_as_sf st_as_stars st_crop st_dimensions<- # [37] st_downsample st_mosaic st_normalize st_redimension # [41] st_sample 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 # y 1 118 NA NA WGS 84 # 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) library(ggplot2) a |> setNames(\"precip\") |> st_set_dimensions(2, name = \"tm\") |> units::drop_units() |> as_cubble(key = id, index = tm) -> 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)"},{"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()"},{"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/en/latest/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. #> file2645372f54b6.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. #> file2645372f54b6.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, resampling = c(\"nearest\", \"bilinear\", \"cubic\", \"cubicspline\") )"},{"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 resampling character; resampling method; method cubic cubicspline, `stars_proxy` objects used GDAL version >= 3.10.0","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) r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = \"histogram\") plot(r)"},{"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 4"},{"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":"Ops.stars() (math ops) now also recycle arrays first argument; #718 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.992 0.158 0.664 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.697 0.171 0.389"},{"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. ## file28283dba2a29 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 ## Max. NA's ## file28283dba2a29 [1/km^2] 21.24828 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. ## file28283dba2a29 [1/km^2] 0.2545072 1.225631 1.932222 3.345918 3.825745 ## Max. NA's ## file28283dba2a29 [1/km^2] 21.24828 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. ## file28283dba2a29 [1/km^2] 0.2545072 1.225631 1.932222 3.344805 3.825745 ## Max. NA's ## file28283dba2a29 [1/km^2] 21.24828 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.2 ## 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":"library(dplyr) library(stars) 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 prcomp predict print # [25] pull rename select show # [29] slice slotsFromS3 split st_apply # [33] st_as_sf st_as_stars st_crop st_dimensions<- # [37] st_downsample st_mosaic st_normalize st_redimension # [41] st_sample 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 # y 1 118 NA NA WGS 84 # 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) library(ggplot2) a |> setNames(\"precip\") |> st_set_dimensions(2, name = \"tm\") |> units::drop_units() |> as_cubble(key = id, index = tm) -> 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)"},{"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()"},{"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/en/latest/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. #> file22ed3fb59914.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. #> file22ed3fb59914.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, resampling = c(\"nearest\", \"bilinear\", \"cubic\", \"cubicspline\") )"},{"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 resampling character; resampling method; method cubic cubicspline, `stars_proxy` objects used GDAL version >= 3.10.0","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) r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = \"histogram\") plot(r)"},{"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 4"},{"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":"st_extract() used GDAL 3.10.0 uses InterpolateAtPoints, allowing cubic cubicspline interpolators (requiring sf >= 1.0-19). Ops.stars() (math ops) now also recycle arrays first argument; #718 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":""}]

85S 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 bd|ep#&))T4)suYiO;Lv}j+s}OdR+fs=!gM< 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 8b33b506c452d77e14fea48f4f5b1820252c6840..79f53e1b909478256c2ee006ec7ee7ab1d314e18 100644 GIT binary patch literal 23579 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 a6Dp3xG(HSvFD_zF|LHMT`x?7|OaBF4hb9pK literal 23543 zcmeFZcT|&G_bwXsQ@0ATQB6zOi25~@;_-itKp1PE9`sgg*M76Ae2AV>`X zMZicEl%Ajv2sM#VLI~w9wz_}keA{#Xxc}WT&O3%0A@6$ET64~4KJ%F?d2(G(gZVJW zVF(1m4AZ=30DvJQ%jBz$QcOi+FwRN z=?i#xI@HxtXj?!2;=UGnNllqcTs|Mpnj8_WEou?)^R5+r{UX{-X4{0-kM-J&kFDDE zaMhzF(@(G7dh1p{C3Jr;&j-JKukYVKV{;Sbs+=xR7QJE=LT zJE=P~j+dEYMK179JQ2E>^SThbs)W`AGyD6pIm(krWQM6E5a*yf&xrb{&1NOV{ky;F z?0y2x7a8kD8}3}{uY*~kzflH9kz;p!Mg1Z)_gwWF)PO7wJI*z5F-@+l(?WWx@n=;bzooKwGRH9}e{a>6IDT0SGTBa4OTE9s02y74-!pT2*As%8>J5!G-#q>wMMUsf5#DB{e}?dT+8n%k`K?!zSgh5D53mT|s|UF(Er**oJGDRDZ(68S-y;Y}R@ zUbF7BRMydO-(34)LPSr59fy3 zq_O2RJIyNgBU;zIy{t#3E_J{%lZlPO7Zl3$mN4U~#6!Y_LGQ5(I78$n8k(FNq&to# zY9e{LavEJ%mdBt)uU!qVy^sg<*CTt? zV4haKqbyoff8nSG(=THI{df@^r$J~~xP8=(234fpwaN)`U~MS#gr>n!?^pkf+ z92?X)-!i_ZZ!2wIi6VttF)w1}@uU_}H<#mJR?~SF&w@0fSTS4Dbw0+=F z32#_*sGaGVg*(|$-p=pQGL2`{rl;am^_NnyifTt^@F*qW*5#38JFN{${s*4M0QD^; zRW;k4hz!Qy%g14tQtdv^ZL>Y9aTct*5j7rf^<|dv%CLbZPzS|zsgHS?dB|?n>CdNo zrIu+gDOqDjBaYWvA{BE#XoQcm#rH$yG?#kX=L4}Sg3e*3yYbJh$ls!u+welJ5FY!r z@mAE0Fva$5mx%b4VE1|r&&K>7S>3u1BRN`ILDo_1QLoW3nlIe;zz&MG2HUQ#T09u( z9x|R8VErun!=SzwuXt&>uH{y!t7}8q%MZefq|8|r4J$dD2HOE`hP9ztro(?IP><@Z zI+oX?@~WlBXH^cibH5GILuv@Z&5)+~AD)ussI}d!7)A80vXb(}?3k|zizw3fGMMLu zM{BXbL=c;-s>WtUmETSlc9d=U<+?o<(^Ion>~-Z{ps2ohj(_fIK5|o+ zRAEa_An(P`-CZPDj!a9uX0)1*8;@XX?p^|pjB!qDX{e$<^J^jnjyf`4hfMobF9RG2 zE6DJUPDfP@uaQ(fc#<}udM`8gQVjGJA9(to3<@vnpVl`T3b=6?6P`ICk5R@2n${vZ z9xsXl;DeN3AF=u>cIwnl{e(&&jK)h-?XSch+D}jwS^ZXk7#Nqp_k6QORL?q->~!;y zn2Mea#!6L4(_xS8J5lFi!u6yk*2Ye+EPLm!TEh}p6+2^*q1dV(36q6(xNv5FcUZh$ zAkXS0wQks``?4>uQ;l!fF`+&LPjzl{gG9c@q49!uYn3A30mvj3cs=wl)6W~3$M`bd zu#TGUI=F33f-GdggHwJh(xcAhI`-9oTkzWOBA?r2?HQcDV4bwuo@s5^wm|EvPsuMo z9Kq|tpN*I648M+lc`j(NR`(GCU}(7C#+rn%x(s<`H9YTwQb`93lrE7m)uhSl+FKO( zc_~D+ddoC->Vf=n)JnX#Sa_B1CVo>7>9sIM&b0HJjdNXH4hgB=B8o2}&f?MzEU0#V zOXpb%h860f&;e;4VdMu!@}#t{<0y;IB$HL%Q#l(0Y^Nu9^{M(YHCx$!r{u%yoVWP3 z=HvW$8m=N$^_CRe^Vh9*bfPZB?j-VY)-PUw)E{ zDAlEDPKIF{s1+ca5^`CT{q2!v$#4|0MzKazJHDx8 zWqmZyZvi2k*N=rd$E_)Rab`s3KDJ_i)=nSlTfEt-GNynN)1s*=IgB>so;xsRn=I>< zJ|Vvvcc1givY`$_FTdpYzG{YDPeq7z$6weiQW)J|SyU~wHLj^-Xj-y=hO{5%X8shY9)#AIH!74uhy{`uBMMi^Ni8W`~$9>0Lb~WZ_8N- zz9G&SJF6zO)|SD@M~0qno%#M+QHZ_;Wzk*gsmq{D7AcN~zj0=02+|8!H;w`Wt=y1# zP*ci^iR@GMnWM7tcVU4$zB^(V!-J`EZipAEvu!0+rCE!-VSGuywICAzb<4n&K9zyR z^WnOXN|LyF-|1IX-jy*;%D6!Vk93`c422IYt6a<3QSCuaJz-M`F@X!WYEVrfwn*of z=c>H&ALp-Mi*nu3|L~pW$gzb9?5Ss%xG#4rGnk`A)=_-{oXYcU+^uFBX&wmjgBYJ~ z{fTQMa`$OtZ2Lc#P5JE!m1~Ioig2xG(2ral3BJ}-t;k;-&X=#@N726VQ00^JsG)Ee zHq=zldDTi4*OSMthOO*!7E!5DIQ_QkJ?o(&fZrdj@3<1pvZzhlKbcwHv8F9=$*!2lcgj~zTORQ? zFJttg);wjjl1zq$omab&Z@uJ13b^o~Cj-!lhTs8wNzJ`Io&%NR01z{;k4*1_l@3;h zrSmykdQ>mfv0RvwSABAPHf-DD+;=i&kiuz;{%b!00kazDZ+BkoGx54dD`d)qE%Ekm zA;Ls(jEl84JDZsv^PQ4qSMHsHK<+-e(6N^itvwnl((1R2w=ftXb;vKYm&DTmP`1{kl#)?uIR?^i0qi;Jor+Sa9-Ujn-(Gj9LKwOyI05BkXE*#sNU- zUYv0FzPDGJf!ws2-S#!~xJ|yO-9gIRVB2{;DnNe#-3ix=Ki44AYCIO$aAB({Z=|&? z6YuKV9?p{$?kq&717Cm1&WcIPr*SPi3g-=~p2vA0$Dplj>u9}%i<@5w2apzqX5?72 z_2=D#61lZENA?-KHw2NX6;(XV%|K$#sJXXRG2jm}{jJHB2-U%rF$%Y3kSEe~YDJYb zGhrgz7xk*4OIDd?+onvSAs=Lvp@Za=fT^Jkl`c{`pfBz*1IP9fieXR!i9)4Q32(*TJv` zBiPV{m%a?H$p^xO2DCOc+<DrdXI`nd4A%^4scv{(wb{%@YVDppmA^rk{~$f$-T|_4 zpKq8%&~+rBUiyh5J2rD9SD5E0X^E7(?)-U*zv_$P-cY$owuC*9nXKj`m;0Y-P{`U; ze*0?QNy~w8Wt`W`+8O;}MFWS~?Jtkp88d&3Cgq<)qq56Pj}8U2zfI@Ct+zs(RNpNH zVEA#Ch7L@s7jWU4J{@eWeflrig&9$7J-IdCEySrSCz0D{S|1?;mNDt#-v!k|uX^39 z=?+^vNh)%Xr;V0w5-oomdSqS9fi`_Y|=&|w+mJ83u>w2H9p*|W?NwKT?${P#E+)zKcrWaC%jNhp3 zqq-R)9K6fiP+YTP5%j!FM!2;Zx$9b(SF62srrmo&mm8}%ingk)1c-01BZTb? zw*B6%fr66nGzKEA3;#$yA*{|6=NqzecP;#EtLFQRz5S;Qbrh|;*IV(#70nhAvVqz5 zl>qbr<{2?Wix%$t&^~tlvMW8+@6?7$I=O(3=E}l%XmvE6a^q|-4+|4)ZKVW^y|GK1 z%3c~YP#UjxW%#1o<;P`fw0-iSXk9Ay&`2GhTGqN{217N2thAh*n@KT-K=Q8LJ9RgY ze$AEcG^~8vmMvbN+S#|&1fz-xi;t{+!G;(G=Cf9doeEODY0CgfzNkI?JkC1iPO-Og zRn=yapY?}@=-KX3F_Iulr3C)b_r<090mqxFDDpegFGohU^82WfKGXX5hJkRt;j%qI}A8KB0vt%1R&E3yoPMI^aS9apDt#a zjg(r86aOycFLQdG_gE&dnLZis>PcFYPq?`AgzlTWD&(thFyNT!vk|34hsJj*5(~qm z(SYG?g7WCNb4=K_56J2cG^TCSr0ShPs9ZsB*^WgPZ<&NgxJQ)hdOw-;NLYQ9>>lWn zEX#``ll;ppt9kP_8}GD=kAnGDtI)t~y)$Oy*HCVrJ9)~Bs&<_LYXWq?{MZ{#EDJ%- z1uXHry$iJ2jRlQN)lt3;XuUEQ=qaD4q^B$^ttA1yV zO^UT;Gr5m?>Y~-a^t@KbDM9$Bryjh?*?%-mp6cJ3FrmO`e|*}>c)R~C0)Y9H-GJA0 z=i>;F^-(Z!VSKpL0g^yCBC0lyJ3I;ZT9;H(($g5{8}9A%HS$gwR6^g|yCh>#1xdW0SX0TH9Is&dD^ZLI0`Jvrg+J=e*;Ub2;YB_Pe| zPh21`3b0Qd1X^8&+(HIcJDd=fQ3*L);;92=Gv@hj1~KOm>dx?#;~*xj472cz{E(MZ zqwTX6?Ic5sX9YEv`g_W9gH+IyF+4i^Bbbk%<(hdCFPJ5Y>2mzq65U_L%k^-LnUU*Xr z`GxJ#doP_E&lH~9y(C4VHi1M_!R*s98*mXu{Q~XLqejBQE~$BM$O>m4u10MlkgA&0 zLN@-s!XSXHqA-GtEw6-j0_$ckbVm#)Csb!1mEIqp&t9@-F0AerKOvS;jV<$Sa6_8s zrp)aWu<=(|XAmW($9g7(?WDpaakTsoIgO4{@21-gFsd2`F}E$HJ>X=Pb7F(u-4fZ+ z2JaIws;!ULZw1|sa*59f{{sVUrP(%({Vk^6t-F*kt1kWd+pzG)T1SJ&hxgZ{A&`4$dTIHP zpc>OZ?%y5b|6c!h2mXJ$11}cWx*GOD%3r^xj@_Wi2P_Qr=YIkPAjAb#NdnToCbddx z?Z)4FU5}z0py|7pjS^7ocP}x42dD1Vncuo4FB3n>qZrWH^B4H3S=VlR0Thu*2D>+c zv4jl`_oOty)ueT_-h=3bEIa)NGzS1YX#-BP`=aU@0MP%hKUho)JO~*|GchsI>uO*@ zDZr@?xr^1+)ti`InNei7;{h(0g1;98UcERep-t_D2ijfJhfyQof!SSbL3?aICM72e zMdkdt1m0n^k^?K1qv*xVv@Me_kN%isv)xcKG@PCs{=BlsGi;c0t0&lmu#zX&)xcRY zxEaW?`;b=))isSC-SVV#c%Z$hT>YomY5b!{fNwW{E-o(CVbksPW6&r~o^&D(WvJNw zl9i?LnhLn@eB6&l3V7M}cgqC8j=}%B$!21~Wb&CQC4xi!a}0_@s6WudW3hf}b=Chg z7Tm;a`>zdsd;s$5FBJdjx$24vDQ~98l!L$`!9a2XZwG?|^0NEl^Lzx%lRyv7fm-YN zI3j!eumkEq07$8W+4Ede0&ifhd`7$h6f|Cowf%fL;LIQB;fdSH|fJ!2^*^d2kC3T=1mi-LqustP&9qE z4AS(qFRWiVvv0Rs2(B3N2^eTgO+Zh*eDx+wgCrXzic*roQDXWJ?YFwSzfaL|>=`Ba zyo7{x4d#suRn<^bv|UC=Ypi8GkIut#(Utgs5(t5$M4JlGE1{~-iBd4K$~!Et7Bv;x zgd|>^4EVY0Dand{p8o5%k@16{2hNphQg;G8Yjl0$*&Y#&Aji(BNw<7~VV@GM4cP)z zubWz*2m%`px%)h1bd-<;ZR)N2G6jQK8Q6#9)EE1POcoz~^<(XwV_3vsZVW=9b!Gr& znMkDEcF8ve@L=Y7)06b_d1j^0_pfh(33*jjS~3?()7urhRbG2PPbwUzybcD8A!@l> z(aU+M02bF>A?klg5vPnAQ&4-m!GBuJlolsE!G(12eYOuR^RaDrvmh4E)=@`_J$AQv zP>5c{cB`RG*TDZ-uPAEMgCu(l$XVdJ`w1wbX$B74pwEHFLgTe=tROy1E1m@m#mU9d z(UD;JVPs?k(*WLD{)bhH11TP32-_CKF;HV?aQl!JDa2q{m?|y@h4JLbxc&nT*}K$W zCW;-&LiBIYspt>sX?*7E!@>q^RtdxmnBD-Mb(iXZD+liG3Kzq-;-PhdIA7GJ5ovor zEX<#STk8HPn|opsrd>W>r4J6WSk;7X22pxCW^X|sX(lPHPA2?a&I>^Qs;jRbp?tfjL_Etfyo^?ZK%P## zyDg{ZLx~zym1})8B(5VBMbm{H*zuO#%l~UG-Q9x}Eo%AUQR_q^E@SElax>sIM`+Qn z*fI6T0xf6*8edr6!wZFbIMcI)qcDT$D*k_fEQ#o!G39H><|&85NaGA67HC7z@WET# zSx{b0pL4CR2o)c`K2m;}jvjs3IVQ+1R8!-gR98E>@+Mtg@mz9%#1cm{QM_@b?}>`s zad`m$=VN$bJ}4;5+?X|atW=MBe-9&69Jhtsyn&2HjtS%1pc%iQ#Sg8^`sRCWI!~f` z>j{{N0b4*>O4ae7$smR#3bXoDhcHAo2-dki+QL2~IwLnjkvmC50*w5W7?%^!ymD#i z>PJ>)|1>9J3zbT}wxx3C>t##J)3}#Q%&0aErplQc`$tDdm&xz0+%z*w4Ls$P$L0Lm zw4}7OyWvRU6L3<5eWnA}z4cy5CBe5_-kE?H{(>O;qAdc39bvDNh%@O8{bqcBCsT-- z)(?bzk?ZjN-TgGD^ZQm)oY?m1WOMmfBu{XxA!S=HJhKd*%{`9ri~=LuB>a=!e&x>G zA7<$_xDa%&!o$l;PPXNH^Syn`0TcW11A8Im zHUAn(AbSsor>koLMY>P$JwMZ&d71Y{JqDw6Bj)Y&v{UY)(}}4wN%yLMEc(R>!7X`X zLGm8RUD)qNGAq2TbmchH+&m`leve3!Z5hWJ*3-*Nf3ddTJtX0Y!(Gq$`T2{gPTbxs zc03?ci2wAy|Jjji(#`2iQDQ>`f@~|YV02`J1C9o97=TA>K<~3hY#1YSPf2~WO{eU0 zDHM@nY2k|kX=j4Q0$ACF9})K=_h)$h&!7(9ue30IoVH}s{jfAPHnzZ6FL%GvE!`b* zi=dI|*`Tu#Ci5)>{cdh<4%2XXA4q1pD~w1cYsg*t&nW(1#sp=U{68reCnXdcG&C|& zSgELUi#vhKj>o1P-p-`UvGnvY9JoX>=!flIV*l8Sk7EdRlv_di4#&4|Es?q`FB6y586oSa4eVC)!j1GzpJp)R;t61At~y=Vh9!=)AKJD|1%vWA>WQ(*VfkNC*1@Q z)gx0=cpKe5OS)91(Vut`e(G#IZK%S2-(X2`@d^T*AaFIq7qs5nchJcv{jahXz(|@A zfNJM|$#^6=vpP&5@YME{`4^cd;4Qw#h<bztr;sz$Xlg}lXL0n`iv@p z3H$WrD!DMb>s)Hw?=LJ^8c*^>=+ZrXRtz(|PsTX;`}-3tUpNZJhJvtYKKHBa5&mVh ze~Piw7#UY>br186x>KDZlU{vH<9V(=vV6TBH@iLMy@FEV7|B9gI>vZie*b4%@Y`!~ z62A$q&zVs!f9gY+Dqp|8fSLq^u7`MuO=rhiC-Nvafc+O`Fn*q6QY;J1#y!j4Sl+pH z6^s9%+LRs#L0nk=<)Ujw*Y-7I9y{KBo0ODvp!9gfUzVw%;vhPouCA`a18wc5mP1TF z9r6#=e*)Lsg@qgMTL3JmDM32H3A=wmhfCvM{rRaX_==LP%o^MNsY1P6MZkzH@dfT~ zZbf|o*<3?X=c{cbPOm5!ZH3XEAMWK+L8W;)I_6eax5WmX+ld(`5Kb;buHXCD;J*^f zoA0MFAO`HGwjt3)-R>0%AMlT6PbYm5J%Y>|8X97UqjNOk^|FMX{m6VJ#L74LwmOqm z>F}CT1_k~c+noI`9KQXHpTnhW-@&7u4M!j`yJQ8_EG{Pf5h2zO0BL#7mE4#cw+@kF zksNw~KHZWXzEHjH&~a0er95ii^#t=_L{V$j4}U7Svfg3#c3+l$HSv5S`H7$Dqt6xH32kE$bNYiAPja^mvW; z!cYZA@VjDZdDEL@@_OnfR{VZ!Z0wWKr<0>y^M4tBS!!TKIj;-)gx=f!^^k&rxSwVG z6HY;JTCYaWM+Aq1QuKVLUNY-jeC1|K>~#Yk(zqoh;}wwl=NrKIWbWVrLtzTpi<(zP zXSCqk=$))-k}9hDwiK6l6u(|5-&+^t-*xWg5^Ur0Y9TaS&Y>X<3JzNGYWsNh)Vra8 zXlRIx+0sY`g%-H(e!>*_GD^;lj;Z1fqLj`$pA1A1fz+Qu@ck}JEM0O7%0B*gQeuCEz^gA`zC7n5&3xJpuQA?|uK}R#94H864q1x0 zvFg>cePR=!yr5}_=3-Z!-+&&`O4Zfww&N_F`Oaj?WJb_sr0J~*%)i8+Khps@s12@ zed@PvYG8bDc?BQG++%Z>es9~6kNqRTWqocRIjdR#FDG;EDHmdna$q04)L)o(avpL% zA~7*BVP4vfdx+oD*eopY(IPl>=Y?!|`GLs&aFA3#FsUj3-5N;%e%+aVHHXK&n2FF>C}-^*5<gq_49@0E8 zX~*UB(O*?CNgc-X1t=W;SgWT*4;UGoG|u!Oqln=G@N1;)DOi~E|Ganl5sdt~4u2N6 z8a#kDHN)B?IrAEt8Qie#*M2*qyHd!<-P&C7o{z)TFSQZgYkO|`EvM`?sUeUg-9K`E zN#sA2`X^md^g%b8FnHPFs$7$~RDlTVk)ooai!-o`OwmV=iyp`++Gyx3U))@XREKN1 z(u>(n!5R$Fqui*m7d_ikwF#iiw?L}$ZP@E<4DiU3mYkgIOo+5KO;8T{ZZqCaql~MT zkgGnvn7wD5uli;-#EXX{I4K%Vej`(w<%-7VL0{+SqVc+YRg~H4!ef)Y*9bdHx*Qr( z3xQj3mv=q=Y9YF(S~03Zaomd4UbK>%(xi+)E0rC3j}UG=zqWbkWvPx2CL+Mh@!OA? zUtYGP1P@v!FTi0VbnDLtF8xOE%+8AU_6a>WH9L@SsM8(rowRg#Fc4mztf5UKD3`V} zovekncrqN15?{98en0jWpoYVkj*gDl zjE}v74?sP{VOSB#>E~GtYAxbAN?i$B84W*2d&8CW=|7DX2Okgy3zzBIETyTnC@dob_Xld*l8UU_LRRqv!~BP zT~s)aES-@-FI*19<*B(W8b_bR_09vP#joFrHs)%pZEBIDJDZ!Ys4G2ow`nWYrMANe zsYG3v_?*)A98@3esIl890#^*F5ZaUKeDG)4(?%PB`lbzlx^7pF>S;K#Pv&gWy>F=} zDgjfDkcsih4JUFx^8$po~o7j_*=^Yk+a=!UIkQ)5)yllgFW_q*kd2p$O z)()s7$}D+9MmPZMi`%p-$T+?Zx!ULH;u6acL zMN&Ubpa2xUCnF56zn<|gZWFS`=VqMWF(_4%8PF=jlu9s`DYZAL;0ci_y*Diy9*CS4f@Kq z0~}nv)mWB}dBwp!u+p?@oA9H5`@cxsZ@#lK^PNnQAz5q*W+X|w)F1DX@vOS4I>BQj z#guBI>MpWf%(RhSuw2Phc-zO%R9-#HQ#ammD0=R3NQzTu3)nb$Y}O5LW)EYTk6Aj! z`#!h)clA>6DBk66;Hg#=zfnP*N=F~vG^B+_xYLPc$?huIn?@~R)rrhe zp6r8so98d!{cEWq7BqT`A9M5-b0BBb#==G0qjWiLRG*uB3{Oc?3yKf66RAHhCZ;P^ zojuo60CpFPxCGiL&0#H8j{hp{eswuA8Ua1=3BUn<^7-{mu%v)v&dB{5C;X?sCSL5c zF+fePcZ;;t6x!ZuQYjmr7u>p4^~Y&!2<{Rkd5jRi`RvPRRg*-~ws^xI^5y+iK;Wm1 zv|hrLO>#aP9o3GLh;IAW>MPraUDIzyz81WuBxyc1+pL?mt>}_!(uXN9Gcxrz>(5q` z2OSDPJXfS#-|vfdy=in{(YSqOD_>=`KxXBkf{c8U?cWtfibzxZMXzYCWKcE^8>h+N z`P!^wcjQ1Tzfr6yq}$=Ym;CuAD>Eupdg3e$FncDvR{=q|KsVa`9OudLW*gniwv_W$ z=YgVwL%%IIRR++EcG=MuuX~x7*$a*4X_fS9Y@+oja@Zx4Y@sC1`?P^}g9^$HYm>5&)0+9*9zc6s>D_PzO!{oEZN(fdMlGteRJ zaoj~EVkwcJOaRJQbBwg|nvKa85OPv+-mls*cBczp<#?r~r8Nx5w8eU}=O5rt+EaM( zzonboJ)kA-(f8pXE6bx>yD=+xv{Qq7oDw2GZQK6w<46AvUG&D`PJ%$PMW6r9M6^Vv zq5jE^wzf9^4xli-sTK=x3oG1glqC05p`uwiegXLnexIroWGxzgDzvL^k zUzLwQcGlUsl>|v#TnqS z2TpDQwF}Fpxr@Dh&T4q2q!kYZ_)$%DwZleV@IUGGm(x6P`Kkbt=SnJ2IQjHRD!WBL z17Mph%Jtghdxd7`Njifa0^Fz6+{)UTVkQ)o)fln0?X$VQ1Z3scw{$DYI7Vg9Z+P$k zo#qaHzOt@PJ~<_-exBL*{FRt9M*l{I#|QHAB81s}pX+_%Ot{`EZO_&=+oSYZO6((B zswdbPAf~?K40ts6mtdpM>ZSIFY5`y$;emVdO1TD~>TFlOEUB)kA>khlj1-Y{%oB6C zKoZc{RxFqsSDV~qHi>g{sZUHi5zc!>?Kg{kQ32?Y?5EEOu5E%Vx3y!g^nZb`ntQY8 zXruT~>LB*p5H`=J#)&kAKlUENzo>l(DmC@3#p|STwH1<#)2CnV@lUt%9|iA1(5;(3 z-n43k3yG;ot@~F@HKxBxS0+00U2sdb@WEjk%AL98eO~qj019JB#`!IbH|^9^O`Az~A%BdGM4O&k|a7?nxz2Ilz+d;ZVCg00E z3#ZT&LmQZ)LEB&n68+)7fm9eYMht5|^)X zU%K;RVDnX1m+o`y^&9{dvek`wB>KSC$Qw&9Ps$4&0su<~8_rYKq2473GlxlsnQpBw zK$dixOo~N~YBwbMhNh*rH-PrXERAS8SoQSFh!sKc66#;MA4u+Nj|&r6mLL1TK8wfeLe@WkrR+;4J8wRM@4~m;dmuWptj=!@n{7W22JU|=Ff#6M zIZp0z%H4olR#v4eVWzP=ck_O$4ma}{$OPL08C0D#DXAU0S9A6{LwY}NI99gH4(U(yt zJpOp!U-hi7>e=Pz@V~Ux*b2@_U(}8MswQymO9q_vQ^YBwS9qzt5C3z*;LpzDb2o~T zs5P19*MzSp8f66@xH2yN?DFNwy;_$KOTSzQx^Z?C@8FfXU}e=g#%WC%q7A92kTw^3 zG&txn@rX@}QTrYx8XeJSXfBwjWIa>uI$Uk+XNgr# zaPqh)w%Oj8{B#6WrfvB+!o@tuwu|dklg*9VgnIv0|1SZpgE&BPSJ@s#Ya*r(OpYsOP zewX*Zu=3KPrj_ZVVbnUPgaG}^eE*2c_r2u-4(sBc!((_?dEfcWmKx8xCw}egJw}GA z8k2BLWoK~XrAwDy6>$ZYZ2LMa&4$iR7 z2+P~@*bs$<2?J$l(+{aH=G*eKjdgO_5f&zCsyo7~M_q(r75dW}VAK;ZtPJSThVtR! z1?ghZCvASVLBpE(aZOrOnd2nT?nc2f^{K-atrsz8ahxc30eYc@8aN)&4G$eH#x z@uF+~V77wTObs{=e-jjYo*SaIA+MmU?9uR$Z*g()jpaM7u3)Rjt3jWGEUr#$MN-{C zk11A(^Jt`YYr$WUVAO-u)@kxG_=pLv2YOl%?%(F`B>>kz1`5$Lp-syhmsB%|w5h_s zES~=q!04L=7LJR8xSr`kTZSoeGr!Z5EQs5J?#SSLVPRgS+1x&e7)oZ%pI}G*!%cbX4Qi|t;9LeIULeU<8FVgcEU(zNC5P)PT)N~^ zj%*io#CaxaCc|<*x$I9Yj=xp*1_-dsCKu4RRIQDlINDeyQd3o2r8$hF{$h_ecM(y@ zy8Zsaxq}?v-$Jd?M3!lh2Q>6~?_!{=WzH{#D^n76fB1DLDU#Z{fJbXm!ADW)>Fw*U zq2c1V9+C+48`yXU!j+%?-$^5ZxWwBLG)0)g3E= zT4xk#Mg$7dW9{2FmthghC$oR9zo`jDya*$piDGqgZ?MZ7Zal!#2~bt6CMyR9(tK6G zX^~LpOG==4jbj^M+gI|WejLl_v>Y2Ab|nU6T_cf5@r^O*gx4R&tn@3XUPVrmrN}W$ zGip3?vjZ9~hy%~W`&!WKVc_FJ<66|B=#wvgJXxCjX3#36oF3_O!n(Y;M~LnW3oD7R z@0#2Zpcf5VgC;qr&zBj5HqzN=)vFOK+z`N}J}sC)VArs-8j(TJyTk9gqR1wBCWt&9B`6I;%eAg z(}Y8uYCkZ?WvpLcb<1X%BDA!J{YY^3;@@XkAU9(USwVtga33Pz{%0q?Ei4o-9*dF| zov>9pe80<{F6KWQe16~J%}81b0L@t+;5n^{kYd&2KRObR`hG~(=bnM!vGM3Kn@|u9 zvo&OjY$;#>!p2$rpPB6b{{Cw14|F>HGoqoPf!X9;p;4?)idyGYW%Zm-1{DtFwwan# zbJL*BI;)|duvWOanbtoj0DpUrp&8d6sraE-mpmWov%5&DuO^tI^fj z*?HLKZr2hWoJyc(K~A+?D-oHj~=-et)mp6Lj zPTW-jbQ3T8+nv7IRyEjIZ*48yQT#!)$*pT(epP|971B9W2Oho?DrIdQg%1YH+ zt!dw|unJZh zEF`2MS8E_TccplQI3JLVcD4*cn+Nt!+yFM@D1CW8`u%igRM_4*=buI4br9&g*P~;g z4dG`Z++m!rCfAwM(Gk&}d`tYbjxTqthOADsTS_(CC09@R@5LO2w+jcB&^h87HlMxG zNpoQ8i^p#E&d$!3xH66&J^Ef_4_o(tC)Iz*0QjU1#7Hon_VM-U3V%{<9Emu9SWt@_ zq|kUh1Ldtb?oxL>{dr$`!S53MT@!qrZ~o#j8&CiCGv|xkR$~-ZRnZKEmT!0Fu#S^b zPP5dl4|erDtP{%R%K7>EiAi)?a3iCr)RDU@>IOLW5P-hY^}B%~X1%M9Eylol1q}6^ z8xIo8VNR`bMin0)M;cgKS(((2tFva^MQRG`}Qc(CXf|vgtx+)7LT2?z(2>HPrBFeam;F9+(o)@W%KmWNMF?+01b}( zElj^7Uy#q9AScaXzug(K5x9=W;czXBIXO8eMQshixwR1T{8*i@^ZrDO0*?7JA8mb& zV{KoJ@>Luyhy8A&Y+8@9u;hyib21&^q(5mcvar$$32w9+6)29G+DLO&Dz!b?!(4ld zTk5DWKY!ueYA`1~q)z@zIZIDx?8@X90uTeRD2Il zQ5=_bA!n>Q+3Vah0IcA;d&Tt^`2(#eHl6qT1V#u1?9wJ!;T?f58R_Xd_&`6u&o%&VoBq`YbrQ^bKYibW#QN()cF1gZp<7{yxV>8C-$BD70=+~7N2xRUYX|pQiOXI9xq3S#flN<8JAN-wXgrdhOl`OrALv$2~Z| zIwF2A?$3^=G3q&H@j?^#bO+yPM!@E|IwW~i_dM(Re+!k%MIdT#cZH*78&YuT__B-_sm3)GDFDU0+J^=fWebh z+H53WWgQDLN@S00cLgja&g>pp>UT?LHw=8=LMD@a_Lp2wwr7uMu^koYl-{njvanDZ zBLL!%!^I&@_r1swYgYK5n?n8BKz5dUY!3M+3;kn>e~b)b>T;~$#n7Ja?rD{_rKP3M z80C5o{BjUuD{NH2uRBPPqCi|yp^f<((v%qsmCPmv@o#N<0}f@#Eh26MnEj?@%x!=Ag>GbIWQm1!RSQ)xhu7pZT~e&?#pjubTmI2r5KnN*aMw*={BO`& z?sVY6y{WV#9Py5?e70YLx<@Pd_!K1GOg1XZb8__=$6)UphTnzP_gbHEDDEjv`kkvo zICF20UBM5WP5QRJzTUPB*58uY`*7C<7LU2y_@em;P?!^@7kF6@Gz7Y)+L| zQc6!%y#z9?+^r6!;6_5rA})Pwd3ianr6f~KSVma`Dp*#3)QtVjAbdkOqwIsGj!*^BcSi&>*=77$@FDw`Q-z@>c0Oi zMHL&B4TcaIpIkm02;hx0^vEJ&=Hp;px{1A2ATT`Vu)79q|GsY8gYgh4IyHa;l`xFz zcPsEGuobQ5LC4c~o47)CI@AQHgjk5puj(drd36>XktCf?X6V8Q$;1W}#@22e)H_B< zivH{G7vy%|$RPvbF*xnbv!?e`3_kT~Lz$1Z7EgMj#fQen(e?jn9Go{cYdboB+vM4U z^#e)YqX+YM&f?^B>pE+|xBNh@r5tzqVW5ZKfC{xn@>;+ARayl%3V?6=fJ@@Pn<1?= zsTCHw^H^n^oFKg(>ZM0zL19vf-59x-KO?)0MvCsjTkBBsQ99xta6ViJii;$YLyJU) zO5%1hND;f6_u<>OZ=a{0Jb3%H%`p~r<497e#Ply)+6X|dC*gt~-MYb4S$a_Pd$om{ z1QeI=bK>pySx#}98Ire7W$P2vI<-jsJ7c=8Lg=LU?pFeV1CZkvs<)DTe0>AQz`64E z)wP6WlYhs|Q-^1zBOiwRzYfAba>$F9rs zD=I3AnNWi-cU1sdIW`pbM%tOxk~_)g)Sj53T$1|#{W8D4mMg)OInFIYm2xz;_a z-(o-|h=p|w4b{m=4H^w?1_AKU@0O`4+pAv5xF=+v^f`hWtEh zG@7WG2KtRf*vK*PSxZ}&9-=*^;_f456j9Oh(oW)hKX4$r1>*5oe;>ngZu+$pV>thZx0n~esDkx1)iH$I;)c+~xLwAPO zj@L!mu8(kH37N!LIg9Yn+uM(z<0#_3Xtv#A^s?imH*+9`aAL6BuD!ioE_0kh<1GDu z+PT)Krmie}u!R{E)MYy=PrFne3jz%Yr633@$PkvGKuRcrz<^>AG7G~?5Hdc93@8OA zFq8&RD}qJ@Bs`K-(_%$P9iZhM5P2yJOCksah{4%6kQ51P{?A&yzi)2t-TT{nfBQT8 zoDbP|+b`4XhRk|Di}Xtov~BvC{MO=*b{9U`Hq%x|$l6`RU0i5=^uWKqxl20zXkMKC zwr{2jb{|HhKU;1Ld0+K;PMO+#`>t)bsC-zhuyptn3}48q1&jYyc1`Y+gO+=TuJK!* z`W>~ENF?;!?t6p|gGH+dy2X0^GvS#^iC8W;SpxP+Pnb!Ke)V7DN(Mx=0qb;5;I~%? ztkWdb_O%ZW57R`B(&Uu8i;*#;+D4ta5IMtJ!g0_QULeIR*! z-=rq9IS3!lxkwtVNYkg;x%r68sTPXA{$WhCbu zc+B@~(Yi4cd5KxJO+=`b_GsBH_P}i7DBZW$JlIVB#y(gpPqcO-4Q8Z~OoGFfa5$gGXBdnfGYhzrUuS%RhQ`?hvD<$=d&_fA5{1U8^>On89n zeSVCNd^ZX6KR4P+2ML{x%H#IDlK?4h)9=eM^u1Z)|B;V&gPA{Q{q?nZl_f?Oj zx@a*Jsbqd6+BtXceXJFu=h0P>b zbjrxc=jj`I$A(N8bv7|CV!;uJCDBQv1MAxPt673f9X1ZU*HyqKTWMR9nijfydh*$# zp`q(P5W<_Q+SCub*#Eq9QKj2?&0Y+h294UxeLliaU!_=Y&0Cn4q*7^_`-RM_SM`&t zBw*=1s(%TE{VHXzioj|<>OQ^(A%idkusA0U(Ly9w`BRoV$j&F>R?Rt{`+8!vGGj!~ zK+_^^Sa}QeN_2Aavsm?rYy5f+zyiAWf4EGY2@|fXP*(y1#_gycJp#cUNezgCrdJyre|z0hw^&&+S=x`Mbd1->4$f6Y^9k2O_3UAghop63q?zdTXBp z-iEt$5OpDcjm8`9T%zgw9hTFUeSU~qQ)vX0P5tke^u z@1IIw!z>wumnxdOF07rBk@&i-m5H{Z&BMbZ>R4ZtQmKpw^%@#LZrcDaQ zzdY7ZcdAVjIqg}Zl(PKZ$L^56OX0+cuohVrmO`-Wk__hfgB_$)mmwYY=I`-9P<1Dv zTMi+hVkCE#f{`x$tl|)1{%e+RV8YFbEuH7F*K%^teJTzJOBGe0h9ivpmnW9qTM|Lf z)gUE#=iS<&r`J!e+S*HmwH5v&GsIg^#M+A17f~BGH?KNPKk)%4^U8s0ST+l=OI*oj3z1ys$g2 zxBO=4>TfH()r*}>37cSBPC80@YTQdlHXNTjfEf#WEz*yeTtVHNz?~U`WQr)=FSEIW zqj|@pI2*N>S?a4nPB!<>#LgGf$9v6-DNBf{&`+LSNY|7J-R_(DpLhimVd^!?VbKfm zN)msUYFB!fw*|awVs?YPt2sDp>>{j%(Dl~DSdxh;)Bz`*ERCE;#_eSMcHFrPi0TxY z3SucW#fq#W=M8d5%k`ah??`N>>($uE$Vg}PIj9BV0;VdW&L}BDvLJ{E{am*u0HkJ3 zB?l`0N(K%W7>}$inc#4_Tt`t1Lb*!MtMd6XLUtn%mXE_0iJG(qHes;0r^oN+!vYLT zkxG@zp(7Tef;XH7u6b^_+Ly*fFW`J%y%-9G^6rP4%c-;9G8pq5bu@;Pmst5HE7(h@ zn+kGLfdyls%QL@0A2`fT-QfyQZL+Lx^f4gky zR_o|E6{?rKtScTTiyv=dnn|}nz!`8hLx@|rx}r84HNg3{Y9y;e*9guB^?*@?j}NG! z3WAa`+_NEbvMf!7`*E;UK1%7UJXrzYbtgttKYJ!lP%g_hSRnjy{b7OsI|~H;?QM!@ WbI`sYkGRT~6Wm-poXZaco&PToRUdc& diff --git a/news/index.html b/news/index.html index 3ca5c78b..ca36c039 100644 --- a/news/index.html +++ b/news/index.html @@ -45,7 +45,8 @@