我正在制作这个岛屿的地图,每当我尝试使用 tidyterra::geom_spatraster_RGB() 绘制它时,都会出现这些白点,并且图形比我使用 terra::plot_RGB() 时更苍白。我肯定想使用 ggplot 来绘制这些数据,因为我想使用另一个数据框中的点,并且我使用 geom_point 来绘制它们。我最终还想应用 ggmagnify (geom_magnify()) 来制作地图插图以放大岛上的特定区域(我已经开始工作,但唯一的问题是小白点!!)。
我的目标输出是 SpatRaster 或我可以在 ggplot2 中使用的东西,它没有白点或云阻碍岛屿的地质/海岸线。 (基本上是 terra::plot_RGB() 图,除了可在 ggplot2 中使用)。
我对 GIS 总体来说还很陌生,尤其是 R 中的 GIS,提前感谢您的帮助!
library(rsi)
library(tidyterra)
library(terra)
library(tidyverse)
library(sf)
annette_boundary = st_point(c(-131.5, 55.15))
annette_boundary = st_sfc(annette_boundary, crs=4326)
annette_boundary = st_buffer(st_transform(annette_boundary, 4326), 20000)
ab_sentinel2 = get_sentinel2_imagery(
annette_boundary,
start_date = "2024-10-20",
end_date = "2024-10-22",
output_filename = "sentinel2_imagery.tif"
)
ab_sentinel2_rast = terra::rast("sentinel2_imagery.tif")
ab_sentinel2_rast = terra::project(ab_sentinel2_rast, "EPSG:4326")
# plot with ggplot
ggplot(data = ab_sentinel2_rast)+
tidyterra::geom_spatraster_rgb(data = ab_sentinel2_rast, r=4, g=3, b=2,
interpolate=F, max_col_value = 5000, maxcell = 5e+05)
# plot with terra
terra::plotRGB(ab_sentinel2_rast, r=4, g=3, b=2, stretch="lin")
白点是由于原始图像中缺少像素(颜色/值)引起的。
首先,获取图像(请注意,我必须将 4326 转换为投影坐标(EPSG:6394),否则无法使用 {rsi} 函数下载图像:
library(rsi)
library(tidyterra)
library(terra)
library(tidyverse)
library(sf)
sf::sf_use_s2(TRUE)
annette_boundary <- st_point(c(-131.5, 55.15))
annette_boundary <- st_sfc(annette_boundary, crs="EPSG:4326") |>
sf::st_as_sf()
annette_boundary <- annette_boundary |>
sf::st_transform(crs = "EPSG:6394") |>
st_buffer(dist = 20000) |>
sf::st_sf()
ab_sentinel2 = get_sentinel2_imagery(
annette_boundary,
pixel_x_size = 10,
pixel_y_size = 10,
start_date = "2024-10-20",
end_date = "2024-10-22",
output_filename = "sentinel2_imagery.tif"
)
ab_sentinel2_rast <- terra::rast("sentinel2_imagery.tif")
ab_sentinel2_rast
#> class : SpatRaster
#> dimensions : 4000, 4000, 12 (nrow, ncol, nlyr)
#> resolution : 10, 10 (x, y)
#> extent : 936802.9, 976802.9, 351310.2, 391310.2 (xmin, xmax, ymin, ymax)
#> coord. ref. : NAD83(2011) / Alaska zone 1 (EPSG:6394)
#> source : sentinel2_imagery.tif
#> names : A, B, G, R, RE1, RE2, ...
现在,让我们用两种方式绘制它,同时使用 crs:
terra::plotRGB(ab_sentinel2_rast, r=4, g=3, b=2, stretch="lin")
白点是可见的,但让我们检查一下这些层:
r <- terra::values(ab_sentinel2_rast[[4]])
g <- terra::values(ab_sentinel2_rast[[3]])
b <- terra::values(ab_sentinel2_rast[[2]])
which(is.na(r) & is.na(g) & is.na(b))
#> [1] 143 144 209 224 225 226 227 307 1480 1608 2403 2416 2418 2426 2427
#> [16] 2919 2927 3003 3021 3022 3025 3223 3970 3971 4142 4151 4152 4153 4276 4277
[...]
让我们“修复”我们的栅格,用邻居的平均值替换缺失值:
ab_sentinel2_rast[[4]] <- terra::focal(ab_sentinel2_rast[[4]], fun = "mean", na.policy = "only")
ab_sentinel2_rast[[3]] <- terra::focal(ab_sentinel2_rast[[3]], fun = "mean", na.policy = "only")
ab_sentinel2_rast[[2]] <- terra::focal(ab_sentinel2_rast[[2]], fun = "mean", na.policy = "only")
并绘制它:
ggplot(data = ab_sentinel2_rast)+
tidyterra::geom_spatraster_rgb(data = ab_sentinel2_rast, r=4, g=3, b=2,
interpolate=F, max_col_value = 5000, maxcell = 5e+05)
可能还有几个点,您可以使用
focal()
或类似功能增加w=5
功能中的窗口数量。