使用 tidyterra::geom_spatraster_RGB() 而不是 terra::plotRGB() 绘图时 SpatRaster 上出现白点?

问题描述 投票:0回答:1

我正在制作这个岛屿的地图,每当我尝试使用 tidyterra::geom_spatraster_RGB() 绘制它时,都会出现这些白点,并且图形比我使用 terra::plot_RGB() 时更苍白。我肯定想使用 ggplot 来绘制这些数据,因为我想使用另一个数据框中的点,并且我使用 geom_point 来绘制它们。我最终还想应用 ggmagnify (geom_magnify()) 来制作地图插图以放大岛上的特定区域(我已经开始工作,但唯一的问题是小白点!!)。

我的目标输出是 SpatRaster 或我可以在 ggplot2 中使用的东西,它没有白点或云阻碍岛屿的地质/海岸线。 (基本上是 terra::plot_RGB() 图,除了可在 ggplot2 中使用)。

我对 GIS 总体来说还很陌生,尤其是 R 中的 GIS,提前感谢您的帮助!

tidyterra::geom_spatraster_RGB() output (with white dots/ paler)

terra::plotRGB() output (ideal but not in the format I know I can use)

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")
r ggplot2 terra tidyterra
1个回答
0
投票

白点是由于原始图像中缺少像素(颜色/值)引起的。

首先,获取图像(请注意,我必须将 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")

enter image description here

白点是可见的,但让我们检查一下这些层:

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)

enter image description here

可能还有几个点,您可以使用

focal()
或类似功能增加
w=5
功能中的窗口数量。

© www.soinside.com 2019 - 2024. All rights reserved.