我是 R 用户,但 C++ 新手。我需要一个返回特定 (x, y) 坐标处的 GeoTiff 值的 C++ 工作流程。 GeoTiff 包含 1 层。该层是一个二维数组。每个单元格都包含一个浮点数 (FLT4S),它(在我的例子中)定义了特定位置的海底深度。坐标参考系是通用横轴墨卡托,单位为米。
在 R 中,使用
terra
包可以轻松读取 GeoTiff 并提取特定位置中 GeoTiff 的值:
library(terra)
# Load GeoTiff
# * This is a map of the seabed depth off the west coast of Scotland
f <- "https://raw.githubusercontent.com/edwardlavender/patter/main/inst/extdata/dat_gebco.tif"
(r <- terra::rast(f))
#> class : SpatRaster
#> dimensions : 264, 190, 1 (nrow, ncol, nlyr)
#> resolution : 100, 100 (x, y)
#> extent : 695492.1, 714492.1, 6246657, 6273057 (xmin, xmax, ymin, ymax)
#> coord. ref. : WGS 84 / UTM zone 29N (EPSG:32629)
#> source : dat_gebco.tif
#> name : map_value
#> min value : 0.1994156
#> max value : 201.8856354
# Extract value (depth) at (x, y)
# (Coordinates are in metres, matching GeoTiff)
terra::extract(r, cbind(707087.7, 6266045))
#> map_value
#> 1 191.285
如何在 C++ 中做到这一点?我知道
terra
在底层使用 C++。 terra::extract()
最终调用 SpatRaster::extract*()
C++ 函数*,但我无法弄清楚实现上述目标的最小工作流程是什么。请注意,在我的例子中,坐标对和 GeoTiff(UTM 投影)都以米为单位,这可以简化所需的代码。
*参见 https://github.com/rspatial/terra/blob/master/src/extract.cpp
主要障碍是读取 GeoTiff 并能够提取特定的单元格(行/列)。 terra 使用 GDAL 库来读取 GeoTiff,所以看看它。他们的文档有 C++ 示例。从坐标计算单元格(或行/列)的数学是基本的,还有一些关于边界坐标的附加规则。查看
terra::cellFromXY
或 terra::rowFromY
和 terra::colFromX
。 ChatGPT c.s.可能是一个更好的地方来要求最小的工作流程。在这里我们可以回答有关您的代码的具体问题,我们通常不会为您编写代码。