在R语言中绕开Spatial对象直接转换data.frame内坐标的方法
直接在data.frame中完成坐标转换(无需Spatial对象)
当然可以!不用折腾Spatial对象也能直接在data.frame里搞定坐标转换,我给你两种实用的方法,直接对经纬度列操作就能生成英国国家格网(BNG, EPSG:27700)的新列~
方法1:用sf包(推荐,现代空间数据处理主流工具)
sf包现在是R空间数据处理的“当红炸子鸡”,操作直观还高效,完全可以轻松处理data.frame:
# 加载包 library(sf) # 补全你之前的示例数据(用几个英国城市的经纬度做例子) toconv <- data.frame( id = c("a", "b", "c"), lat = c(54.530776, 53.800755, 51.507351), # 兰卡斯特、利兹、伦敦 lon = c(-2.966053, -1.549014, -0.127758) ) # 一步到位转换:把经纬度转成sf格式→换坐标→提取新坐标→变回普通data.frame toconv <- toconv %>% st_as_sf(coords = c("lon", "lat"), crs = 4326) %>% # 声明原始坐标是WGS84(GPS常用的经纬度) st_transform(crs = 27700) %>% # 转换为英国国家格网(BNG) mutate( easting = st_coordinates(.)[,1], # 提取东向坐标 northing = st_coordinates(.)[,2] # 提取北向坐标 ) %>% st_drop_geometry() # 去掉sf的空间属性,变回普通data.frame # 看看转换后的结果 toconv
这个方法代码简洁,处理大数据也不卡,而且现在很多空间数据工具都和sf兼容,用它准没错。
方法2:用proj4包(纯向量转换,完全不碰空间对象)
如果你想彻底和空间对象划清界限,纯纯只对数值向量做转换,那proj4包的低级函数就很合适——它直接对lon/lat的数值做投影计算,完全不用创建任何空间类对象:
# 加载包 library(proj4) # 同样用示例数据 toconv <- data.frame( id = c("a", "b", "c"), lat = c(54.530776, 53.800755, 51.507351), lon = c(-2.966053, -1.549014, -0.127758) ) # 定义两个坐标系的投影参数(WGS84转BNG) wgs84_proj <- "+proj=longlat +datum=WGS84 +no_defs" bng_proj <- "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs" # 直接对经纬度向量做转换 bng_coords <- proj_transform( from = wgs84_proj, to = bng_proj, x = toconv$lon, y = toconv$lat ) # 把转换后的东、北向坐标添加回原data.frame toconv$easting <- bng_coords$x toconv$northing <- bng_coords$y # 查看结果 toconv
这个方法完全是纯数据操作,适合那些不想引入空间对象依赖的场景。
小提醒
- 两种方法都默认你的原始经纬度是WGS84(EPSG:4326),也就是常见的GPS坐标格式,如果你的数据是其他坐标系,记得调整对应的投影参数哦。
- BNG的投影参数也可以用
CRS("EPSG:27700")@projargs直接获取,不用手动写~
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

