在R语言中匹配格点温度数据与城市多边形并计算平均气温
实现步骤
要计算每个城市的平均气温,核心是将格点温度数据转换为空间对象,再通过空间关联匹配到对应城市,最后分组计算均值,具体操作如下:
1. 将格点数据转换为带坐标的空间点对象
你的tem是360行(对应0.5°分辨率的纬度,覆盖-89.75°到89.75°)、720列(对应0.5°分辨率的经度,覆盖-179.75°到179.75°)的格点数据,先将其整理为带经纬度的长格式并转为空间点:
library(tidyverse) library(sf) # 生成对应格点的经纬度向量 lat <- seq(-89.75, 89.75, by = 0.5) lon <- seq(-179.75, 179.75, by = 0.5) # 转换为长格式并关联经纬度 tem_long <- tem %>% mutate(lat = lat) %>% pivot_longer(cols = -lat, names_to = "lon_col", values_to = "temp") %>% mutate(lon = lon[as.integer(str_remove(lon_col, "V"))]) %>% select(lon, lat, temp) # 转为sf空间点对象,坐标系设为WGS84(EPSG:4326) tem_sf <- st_as_sf(tem_long, coords = c("lon", "lat"), crs = 4326)
2. 空间关联:匹配格点与所属城市
使用空间连接,筛选出落在城市多边形范围内的格点,并关联对应城市信息:
# 空间连接,保留落在城市多边形内的格点 city_temp <- st_join(tem_sf, city_map, join = st_within)
3. 计算每个城市的平均气温
按城市唯一标识(比如你读取的FID)分组,计算温度均值:
# 分组计算平均气温 city_avg_temp <- city_temp %>% as.data.frame() %>% # 移除空间属性,转为普通数据框 group_by(FID) %>% # 可替换为城市名称等其他唯一标识列 summarise(avg_temp = mean(temp, na.rm = TRUE)) %>% ungroup() # 可选:将结果关联回原城市地图,方便后续可视化或分析 city_map_with_temp <- left_join(city_map, city_avg_temp, by = "FID")
优化提示
如果格点数据量过大,可先裁剪格点到城市范围,减少计算耗时:
# 获取城市的边界框 city_bbox <- st_bbox(city_map) # 裁剪格点数据到城市范围内 tem_cropped <- tem_sf %>% st_crop(city_bbox) # 再执行空间连接 city_temp <- st_join(tem_cropped, city_map, join = st_within)
内容的提问来源于stack exchange,提问作者jinchi
相关产品推荐
相关产品推荐

