使用纬度和高程而不是纬度和经度绘制栅格
Plot raster with latitude and elevation instead of latitude and longitude
我正在使用 R,我有一些问题可以解决这个问题:
我有 2 个栅格(相同区域、相同分辨率、相同范围、相同 crs):
栅格 A: (纬度, 经度, values_A)
class : RasterLayer
dimensions : 832, 541, 450112 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : -122.2458, -117.7375, 35.0625, 41.99583 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
names : values_A
values : -753.4842, 0 (min, max)
栅格 B:(纬度、经度、海拔)
class : RasterLayer
dimensions : 832, 541, 450112 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : -122.2458, -117.7375, 35.0625, 41.99583 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
names : dem
values : 40, 4176 (min, max)
然后我需要获取光栅 A 的绘图作为海拔和纬度的函数(x= 海拔,y= 纬度,像素值 = values_A)。
此外,我可能需要聚合具有相同纬度和相同高度的像素,例如使用均值函数。
你对如何用 R 解决这个问题有什么建议吗?
谢谢!
首先,我生成了一些示例数据,这些数据可能与您正在查看的内容类似。将来在您的问题中包含这样的内容会很有帮助,这样答案将解决您在特定数据集中可能遇到的任何怪癖。
df.values <- data.frame(lat = seq(44, 45, 0.01),
long = seq(90, 91, 0.01),
value_A = round(rnorm(n = 101,
mean = 10,
sd = 5),
0)
)
df.elevate <- data.frame(lat = seq(44, 45, 0.01),
long = seq(90, 91, 0.01),
elevation = round(rnorm(n = 101,
mean = 200,
sd = 50),
0)
)
接下来的步骤将使用 dplyr 包中的函数完成。所以安装它,如果你还没有,然后像这样将它加载到你的环境中:
library(dplyr)
听起来您想将这两个单独的数据集合并起来,以便您可以一起操作和显示它们。由于两个数据集都具有在纬度和经度级别收集的值(高程和 value_A),因此这些将是您的连接变量。如果您不熟悉这种数据操作,dplyr 的文档非常有用:(https://dplyr.tidyverse.org/reference/join.html).
df.join <- left_join(df.values, df.elevate, by = c("lat", "long"))
至于为每个独特的海拔和纬度对获取汇总值(如平均值),请尝试分组汇总。这又是来自 dplyr,但我使用管道以 "tidy" 的方式完成了它。如果你不喜欢烟斗,我建议你看看这篇文章:(https://www.datacamp.com/community/tutorials/pipe-r-tutorial)
df.smooth <- df.join %>%
group_by(lat, elevation) %>%
summarise(mean_A = mean(value_A, na.rm = T))
使用它,您可以通过更改 summarise 中的函数来更改您想要的汇总统计类型。例如,您可能只想取最高值。
df.smooth <- df.join %>%
group_by(lat, elevation) %>%
summarise(mean_A = max(value_A, na.rm = T))
如果您有任何其他问题,请对此答案发表评论。
您可以像这样设置示例数据
library(raster)
A <- B <- raster(nrow=83, ncol=54, ext=extent(-122.2458, -117.7375, 35.0625, 41.99583))
values(A) <- rep(1:nrow(A), ncol(A))
values(B) <- 1:ncell(B)
这是一个解决方案
x <- cbind(elevation=values(B), latitude=yFromRow(B, 1:nrow(B)), values(A))
r <- rasterFromXYZ(x)
或使用一些现有数据
B <- getData("alt", country='CHE')
A <- init(B, "y")
x <- na.omit(cbind(elevation=values(B), latitude=yFromRow(B, 1:nrow(B)), A=values(A)))
您可能想要进行一些舍入
x[,1] <- round(x[,1], -2)
x[,2] <- round(x[,2], 1)
r <- rasterFromXYZ(x)
plot(r, asp=NA)
我正在使用 R,我有一些问题可以解决这个问题: 我有 2 个栅格(相同区域、相同分辨率、相同范围、相同 crs):
栅格 A: (纬度, 经度, values_A)
class : RasterLayer
dimensions : 832, 541, 450112 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : -122.2458, -117.7375, 35.0625, 41.99583 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
names : values_A
values : -753.4842, 0 (min, max)
栅格 B:(纬度、经度、海拔)
class : RasterLayer
dimensions : 832, 541, 450112 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : -122.2458, -117.7375, 35.0625, 41.99583 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
names : dem
values : 40, 4176 (min, max)
然后我需要获取光栅 A 的绘图作为海拔和纬度的函数(x= 海拔,y= 纬度,像素值 = values_A)。
此外,我可能需要聚合具有相同纬度和相同高度的像素,例如使用均值函数。
你对如何用 R 解决这个问题有什么建议吗?
谢谢!
首先,我生成了一些示例数据,这些数据可能与您正在查看的内容类似。将来在您的问题中包含这样的内容会很有帮助,这样答案将解决您在特定数据集中可能遇到的任何怪癖。
df.values <- data.frame(lat = seq(44, 45, 0.01),
long = seq(90, 91, 0.01),
value_A = round(rnorm(n = 101,
mean = 10,
sd = 5),
0)
)
df.elevate <- data.frame(lat = seq(44, 45, 0.01),
long = seq(90, 91, 0.01),
elevation = round(rnorm(n = 101,
mean = 200,
sd = 50),
0)
)
接下来的步骤将使用 dplyr 包中的函数完成。所以安装它,如果你还没有,然后像这样将它加载到你的环境中:
library(dplyr)
听起来您想将这两个单独的数据集合并起来,以便您可以一起操作和显示它们。由于两个数据集都具有在纬度和经度级别收集的值(高程和 value_A),因此这些将是您的连接变量。如果您不熟悉这种数据操作,dplyr 的文档非常有用:(https://dplyr.tidyverse.org/reference/join.html).
df.join <- left_join(df.values, df.elevate, by = c("lat", "long"))
至于为每个独特的海拔和纬度对获取汇总值(如平均值),请尝试分组汇总。这又是来自 dplyr,但我使用管道以 "tidy" 的方式完成了它。如果你不喜欢烟斗,我建议你看看这篇文章:(https://www.datacamp.com/community/tutorials/pipe-r-tutorial)
df.smooth <- df.join %>%
group_by(lat, elevation) %>%
summarise(mean_A = mean(value_A, na.rm = T))
使用它,您可以通过更改 summarise 中的函数来更改您想要的汇总统计类型。例如,您可能只想取最高值。
df.smooth <- df.join %>%
group_by(lat, elevation) %>%
summarise(mean_A = max(value_A, na.rm = T))
如果您有任何其他问题,请对此答案发表评论。
您可以像这样设置示例数据
library(raster)
A <- B <- raster(nrow=83, ncol=54, ext=extent(-122.2458, -117.7375, 35.0625, 41.99583))
values(A) <- rep(1:nrow(A), ncol(A))
values(B) <- 1:ncell(B)
这是一个解决方案
x <- cbind(elevation=values(B), latitude=yFromRow(B, 1:nrow(B)), values(A))
r <- rasterFromXYZ(x)
或使用一些现有数据
B <- getData("alt", country='CHE')
A <- init(B, "y")
x <- na.omit(cbind(elevation=values(B), latitude=yFromRow(B, 1:nrow(B)), A=values(A)))
您可能想要进行一些舍入
x[,1] <- round(x[,1], -2)
x[,2] <- round(x[,2], 1)
r <- rasterFromXYZ(x)
plot(r, asp=NA)