如何创建任意CRS的stars/raster对象交互式地图?
非WGS84坐标系(EPSG:25833)规则网格交互式地图实现问题
问题概述
我需要创建采用**EPSG:25833(米单位)**坐标系的规则网格交互式地图,存在以下疑问:
- 此前资料显示无法显示任意CRS的栅格,当前是否仍是如此?
- 能否通过plainview、leaflet、mapview、tmap或其他包实现需求?
- mapview加载非经纬度stars对象时渲染结果异常(推测sf对象渲染正确,但stars对象偏移),tmap::tmap_leaflet的表现是否更优?
示例代码
library(dplyr) library(mapview) library(sf) library(raster) library(stars) library(tmap) # 创建EPSG:25833坐标系的stars栅格对象(柏林大致范围) stars_obj <- raster( xmn=360000, xmx=430000, ymn=5790000, ymx=5850000, crs = st_crs(25833)$wkt, resolution = 10000) %>% st_as_stars() %>% mutate(layer = 1:ncell(.)) # 转换为sf矢量对象 sf_obj <- st_as_sf(stars_obj) # mapview渲染测试 mapview(stars_obj) + mapview(sf_obj) # tmap_leaflet渲染测试 tmap_leaflet( tm_shape(stars_obj) + tm_raster(alpha = 0.8) )
渲染结果
mapview渲染结果

tmap_leaflet渲染结果

问题解答
1. 非任意CRS栅格显示的现状
目前主流交互式地图包已支持非WGS84坐标系的栅格渲染,但核心是需要完成投影转换:Leaflet底层默认依赖WGS84(EPSG:4326)或Web墨卡托(EPSG:3857),所以非经纬度CRS的栅格必须转换为这两类投影之一,或由包自动处理转换逻辑。不存在完全无法显示任意CRS栅格的情况,只是需要适配处理。
2. 可用解决方案包
- tmap:推荐使用。
tmap_leaflet()会自动识别输入对象的CRS,内部完成投影转换,无需手动处理,从示例结果看渲染完全正确。 - leaflet:需手动转换栅格到Web墨卡托(EPSG:3857),示例代码如下:
library(leaflet) # 转换stars对象到EPSG:3857 stars_3857 <- st_transform(stars_obj, crs = 3857) # 渲染交互式地图 leaflet() %>% addTiles() %>% addRasterImage(stars_3857, opacity = 0.8) - mapview:对非经纬度stars栅格的支持存在缺陷,矢量层(sf)转换逻辑成熟但栅格层处理异常,不推荐用于此类场景。
- plainview:仅适合本地静态预览,无交互式功能,不满足需求。
3. mapview与tmap_leaflet的表现对比
- mapview的异常原因:处理stars栅格时未正确完成EPSG:25833到Leaflet支持投影的转换,导致栅格偏移;而sf矢量对象的转换逻辑独立且成熟,所以渲染正确。
- tmap_leaflet表现更优:自动处理投影转换,栅格与地理范围完全匹配,渲染结果符合预期,是此类场景的更佳选择。
内容的提问来源于stack exchange,提问作者chamaoskurumi
相关产品推荐
相关产品推荐

