You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中5x5网格单元与土壤样本物种分布相似性可视化异常排查

问题根源与解决方案

你的垂直条纹问题核心出在直接在WGS84地理坐标系(经纬度,球面)下创建“等距离”网格——WGS84的度数单位不是实际距离,相同经度差对应的地面距离会随纬度变化(纬度越高,经度方向的1度实际距离越短)。你用1/22.2作为网格间隔(对应约0.045度),在瑞士的纬度(45-48°N),经度方向的0.045度实际距离只有~3.4km,远小于你想要的5km,这种网格形状的扭曲会导致部分经度带的网格单元物种组成异常(比如单元面积过小,物种数不足),最终呈现低相似性的垂直条纹。

正确的做法是先将数据转换为瑞士本地的平面投影坐标系(EPSG:2056,LV95),该坐标系以米为单位,能准确创建5x5km的等距网格,再转回地理坐标系用于绘图。

修改后的完整代码

1. 重构网格创建逻辑

library(dplyr)
library(sf)
library(rnaturalearth)
library(ggplot2)

# 1. 将ref_df转换为sf对象,初始CRS设为WGS84(EPSG:4326)
ref_sf <- st_as_sf(ref_df, coords = c("lon", "lat"), crs = 4326)

# 2. 转换为瑞士LV95投影坐标系(单位:米)
ref_lv95 <- st_transform(ref_sf, crs = 2056)

# 3. 在平面坐标系下创建5x5km网格
grid_size_m <- 5000  # 5000米=5km
ref_lv95 <- ref_lv95 %>%
  mutate(
    # 提取投影坐标系下的x、y坐标
    x = st_coordinates(.)[,1],
    y = st_coordinates(.)[,2],
    # 计算网格中心坐标
    x_grid = floor(x / grid_size_m) * grid_size_m + grid_size_m/2,
    y_grid = floor(y / grid_size_m) * grid_size_m + grid_size_m/2
  )

# 4. 聚合得到每个网格的物种存在/缺失矩阵
grid_species <- ref_lv95 %>%
  group_by(x_grid, y_grid) %>%
  summarise(
    # 对每个物种标记是否存在(1=存在,0=不存在)
    across(where(is.numeric) & !c(x, y), ~as.integer(any(. == 1)))
  ) %>%
  ungroup()

# 5. 将网格中心转回WGS84地理坐标系,用于后续相似性计算和绘图
grid_species_sf <- st_as_sf(grid_species, coords = c("x_grid", "y_grid"), crs = 2056) %>%
  st_transform(crs = 4326) %>%
  mutate(
    lon = st_coordinates(.)[,1],
    lat = st_coordinates(.)[,2]
  ) %>%
  st_drop_geometry()  # 转回普通数据框用于相似性计算

2. 相似性计算与绘图(调整后)

# 假设已完成Dice-Sorensen系数计算,得到sorensen_mean数据框
grid_cells_sf <- st_as_sf(sorensen_mean, coords = c("lon", "lat"), crs = 4326)

# 获取瑞士边界并绘图
ch_map <- ne_countries(scale = "medium", country = "Switzerland", returnclass = "sf")
grid_ch <- st_intersection(grid_cells_sf, ch_map)

ggplot() +
  geom_sf(data = grid_ch, aes(color = sorensen_sim), shape = 15, size = 2) +
  scale_color_viridis_c(option = "viridis") +
  theme_minimal() +
  theme(legend.position = "bottom", axis.title = element_blank()) +
  labs(color = "Similarity", x = "Longitude", y = "Latitude")

为什么大网格能避免条纹?

当你用更大的网格(如8x8km)时,网格单元的面积足够大,能抵消球面坐标系下度数间隔带来的形状扭曲,不同经度带的网格单元物种组成差异被平均,因此垂直条纹消失。但这种方案只是掩盖了问题,只有用平面投影坐标系创建等距网格,才能得到准确的结果。

内容的提问来源于stack exchange,提问作者Elie Tièche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:49:57