R:以公制格式计算沿子午线的长距离

R:以公制格式计算沿子午线的长距离,r,distance,r-raster,map-projections,R,Distance,R Raster,Map Projections,我想计算5弧分分辨率的全球光栅中所有像素到赤道的距离。由此产生的距离应以米为单位,考虑到地球的曲率,并且不应因地图投影而扭曲 小区域(如个别国家)的应用通常通过选择适合给定区域的EPSG代码来克服地图投影引起的扭曲威胁。因为我的应用程序覆盖了整个全球,所以这个技巧不起作用。然而,我并不需要一张能充分显示地球各个方面的地图。我只需要一个不会扭曲每个像素与赤道最近点之间距离的投影,即不会扭曲沿子午线的距离的投影。就我而言,板块卡雷投影(“+proj=longlat+datum=WGS84”)符合该标

我想计算5弧分分辨率的全球光栅中所有像素到赤道的距离。由此产生的距离应以米为单位,考虑到地球的曲率,并且不应因地图投影而扭曲

小区域(如个别国家)的应用通常通过选择适合给定区域的EPSG代码来克服地图投影引起的扭曲威胁。因为我的应用程序覆盖了整个全球,所以这个技巧不起作用。然而,我并不需要一张能充分显示地球各个方面的地图。我只需要一个不会扭曲每个像素与赤道最近点之间距离的投影,即不会扭曲沿子午线的距离的投影。就我而言,板块卡雷投影(
“+proj=longlat+datum=WGS84”
)符合该标准。根据这些信息,我尝试了以下代码:

r_res <- 1/12
r <- raster(resolution = c(r_res, r_res), crs = "+proj=longlat +datum=WGS84")
p <- as(r, "SpatialPoints")
equator <- st_sfc(st_point(c(-180,0)), st_point(c(0,0)), st_point(c(180,0))) %>% st_combine() %>% st_cast(., "LINESTRING") %>% st_sf(., crs = 4326) %>% st_transform(crs = "+proj=longlat +datum=WGS84") %>% as(., "Spatial")
d <- gDistance(p, equator, byid = T)
dmin <- apply(d, 2, min)
r[] <- dmin 
然而,在这种情况下,我不确定
gDistance()
是否纠正了Mollweide投影所隐含的距离失真

我知道到赤道的距离可以用经验法则来计算:
纬度*111公里
。然而,对于需要更高精度函数的应用程序来说,这种近似值太不精确

如果有人能提供一些建议,那就太好了。请随意使用距离函数,而不是
gDistance()
。只要距离没有扭曲,以米为单位测量,并考虑到地球的曲率,我就可以使用任何功能,无论是从
sf
gdistance
graster
geosphere
rgeos
还是任何其他软件包(对于非常大的光栅来说,这不是内存安全的)

这里有一种方法(对于非常大的光栅来说,内存不安全)

r_res <- 1/12
r <- raster(resolution = c(r_res, r_res), crs = "+proj=longlat +datum=WGS84")
r <- projectRaster(r, crs="+proj=moll +ellps=WGS84")
p <- as(r, "SpatialPoints")
equator <- st_sfc(st_point(c(-180,0)), st_point(c(0,0)), st_point(c(180,0))) %>% st_combine() %>% st_cast(., "LINESTRING") %>% st_sf(., crs = 4326) %>% st_transform(crs="+proj=moll +ellps=WGS84") %>% as(., "Spatial")
d <- gDistance(p, equator, byid = T)
dmin <- apply(d, 2, min)
r[] <- dmin 
library(raster)
r_res <- 1/12
r <- raster(resolution = c(r_res, r_res), crs = "+proj=longlat +datum=WGS84")
# latitudes for one column
lats <- cbind(0, yFromRow(r, 1:nrow(r)))
#distances (in km) for one column
dist <- pointDistance(lats, cbind(0,0), lonlat=TRUE) / 1000
# assign to all cells
d <- setValues(r, rep(dist, each=ncol(r)))
x <- init(r, "y")
f <- function(i) { pointDistance(cbind(0, i), cbind(0,0), lonlat=TRUE) / 1000} 
z <- calc(x, fun=f)