- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 rstac 访问所需边界框和日期范围内的 Sentinel-2 数据并计算 NDVI。当我使用 {terra} 包时,这对我来说相对[*]干净且直接,但我想使用 {stars} 语法(更多关于为什么更进一步)。
首先,通过快速 {rstac} 查询来获取数据的 URL:
library(rstac)
library(sf)
library(stars)
library(terra)
bbox <- st_bbox(c(xmin=-86.94663, ymin=33.43930,
xmax=-86.67684, ymax=33.62239),
crs=4326) # Birmingham, AL
matches <-
stac("https://planetarycomputer.microsoft.com/api/stac/v1/") |>
stac_search(collections = "sentinel-2-l2a",
bbox = bbox,
datetime = "2019-06-01/2019-08-01") |>
get_request() |>
items_sign(sign_fn = sign_planetary_computer())
这会返回大量匹配项和适当的元数据,为简单起见,我只从属性元数据中选择一个 eo:cloudcover 较低的 (#59):
best_img <- matches$features[[59]]
现在我将使用 vsicurl无需下载整个文件即可访问红色和近红外波段的机制。这些图像比我的搜索框大得多,因此我还想裁剪掉那些我不会使用的像素,以避免不必要的计算。
我的第一步很丑陋。要使用 {terra} 裁剪我的图像,我需要一个 SpatVec cookie-cutter 来传递到 crop()
。我已经有bbox
上面作为 sf 类型边界框,我执行以下操作以将其放入与 Sentinel2 资源匹配的投影中,但这感觉非常 hacky。我想要一个简洁的、纯粹的版本,但这可行:
red <- read_stars( paste0("/vsicurl/", best_img$assets$B04$href) )
bbox_proj <- bbox |> st_as_sfc() |> st_transform(st_crs(red)) |> vect()
无论如何,在手中裁剪矢量,terra 中的 NDVI 计算非常优雅且快速(在使用最少 RAM 的良好网络连接上):
red <- rast( paste0("/vsicurl/", best_img$assets$B04$href) ) |> crop(bbox_proj)
nir <- rast( paste0("/vsicurl/", best_img$assets$B08$href) ) |> crop(bbox_proj)
ndvi_fun <- function(x, y) (x - y) / (x + y)
ndvi <- lapp(c(nir, red), fun = ndvi_fun)
ndvi |> plot()
所以我的主要问题是使用 {stars} 进行相同计算的等效语法是什么?到目前为止,我只提出了下面的代码,特别是仅在使用 local
时才有效。我必须首先创建副本(因此毫不奇怪,速度也慢得多!)
# ugh why can't we combine these in a single read_stars?
red <- read_stars( paste0("/vsicurl/", best_img$assets$B04$href) )
nir <- read_stars( paste0("/vsicurl/", best_img$assets$B08$href) )
bbox_proj <- bbox |> st_as_sfc() |> st_transform(st_crs(red))
# combine 'by hand' and then crop...
remote <- c(r1,r2, along=3) |> st_crop(bbox_proj)
# ugh! ugh! why do we have to use local copy for this to work??
stars::write_stars(remote, "test.tif")
local <- read_stars("test.tif")
# Um, I think this is correct NDVI method, hope I didn't reverse the bands...
# also surprised this is considerably slower and uses much more RAM
calc_ndvi <- function(x) (x[2] - x[1])/(x[2] + x[1])
ndvi <- st_apply(local, 1:2, FUN = calc_ndvi)
plot(ndvi, col = rgb(0, (0:100)/100, 0))
我肯定在我的 star 语法中遗漏了一些东西,这导致它变得更慢,表达起来更冗长,并且只有在 st_apply()
时才起作用。运行于 local
复制而不是 remote
对象。
如果它在 {terra} 中工作,那么问为什么在 {stars} 中这样做也许是合理的——部分原因是我学习 star,但我也是一名讲师,总是觉得教我的学生两个 sf 很麻烦和 terra 语法。如果您在不重新投影边界框 CRS 的情况下尝试上述裁剪,terra 也不会警告错误匹配的 CRS,这是学生常见的错误。在这两种情况下,我发现裁剪边界框的重新投影也比我喜欢的更麻烦。特别是访问文件“两次”似乎很尴尬,一次读取 crs,然后再次裁剪,我希望可以有更优雅的语法,但还没有弄清楚。
最佳答案
这并不能回答你的问题,但这里有一个更简洁的 terra 方法,使用 project<SpatExtent>
我在terra 1.6.31(目前是开发版本)中引入的方法。
library(rstac)
library(terra)
#terra 1.6.31
bbox <- c(xmin=-86.94663, ymin=33.43930, xmax=-86.67684, ymax=33.62239)
matches <- stac("https://planetarycomputer.microsoft.com/api/stac/v1/") |>
stac_search(collections = "sentinel-2-l2a",
bbox = bbox, datetime = "2019-06-01/2019-08-01") |>
get_request() |> items_sign(sign_fn = sign_planetary_computer())
best_img <- matches$features[[59]]
获取第一个数据源,并将经/纬度搜索范围投影到数据的坐标引用系。请注意(新)参数 xy=TRUE
的使用指示 bbox 数字的顺序为 (xmin,ymin,xmax,ymax ),而“terra”默认情况下需要 (xmin,xmax,ymin,ymax)。
red <- rast( paste0("/vsicurl/", best_img$assets$B04$href) )
e <- ext(bbox, xy=TRUE) |>
project("+proj=longlat", crs(red))
裁剪第一个数据源并下载并裁剪其他数据源
red <- crop(red, e)
nir <- rast( paste0("/vsicurl/", best_img$assets$B08$href) ) |> crop(e)
并使用数据
ndvi_fun <- function(x, y) (x - y) / (x + y)
ndvi <- lapp(c(nir, red), fun = ndvi_fun)
以上使用lapp
很棒,但是,对于这样的简单函数,下面的速度更快
ndvi <- (red-nir) / (red+nir)
如果您要使用lapp
,你可以考虑这样做
rednir <- paste0("/vsicurl/", c(best_img$assets$B04$href, best_img$assets$B08$href)) |>
rast() |> crop(e, names=c("red", "nir"))
ndvi <- lapp(rednir, ndvi_fun)
关于r - 使用 {stars} 包对 Sentinel-2 数据进行远程 (vsicurl) 计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74048891/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!