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

st_make_grid()未正确使用地图单位问题求助

问题排查与解决

核心原因:投影转换方式错误

你遇到的问题大概率是仅为对象指定了CRS,但未实际转换坐标。st_set_crs()只是给无空间参考的对象赋值CRS,不会改变坐标数值;而st_transform()才是将坐标转换到目标投影(米单位)的正确方法。如果你的原始数据是经纬度(EPSG:4326),直接用st_set_crs(4087)会导致坐标仍以「度」为单位,此时设置cellsize=50000相当于50000度,网格自然会大到看不到;而cellsize=0.5对应0.5度,看起来正常。

排查步骤

  1. 验证坐标单位
    运行st_bbox(你的sf对象)查看坐标范围:

    • 如果是米单位(EPSG:4087),DEU/FRA/GBR的坐标范围应大致为:x∈[-1000000, 1000000],y∈[4000000, 6000000]
    • 如果是度单位,坐标范围会是x∈[-10, 20],y∈[40, 60],这说明转换未生效
  2. 检查投影转换代码

    • 错误写法:
      # 仅指定CRS,未转换坐标
      sf_obj <- st_set_crs(sf_obj, 4087)
      
    • 正确写法:
      # 将坐标转换到目标投影
      sf_obj <- st_transform(sf_obj, 4087)
      

修正后的示例代码

library(sf)
library(rnaturalearth)

# 获取国家原始数据(默认EPSG:4326,经纬度)
countries_raw <- ne_countries(country = c("Germany", "France", "United Kingdom"), returnclass = "sf")

# 转换到米单位投影EPSG:4087
countries_proj <- st_transform(countries_raw, 4087)

# 生成50km边长的方格网
grid <- st_make_grid(countries_proj, cellsize = c(50000, 50000), what = "polygons")

# 裁剪网格到国家边界
grid_clipped <- st_intersection(grid, st_union(countries_proj))

# 可视化验证
plot(grid_clipped)

其他可能的排查点

  • 确认生成网格时,st_make_grid()的输入是转换后的sf对象,而非原始经纬度数据
  • 若更换CRS后问题仍存在,检查是否在后续操作中不小心将投影又改回了经纬度

内容的提问来源于stack exchange,提问作者Michael Flynn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:24:45