如何从sf对象的打印表头中提取Geodetic CRS或Projected CRS信息
如何从sf对象的打印表头中提取Geodetic CRS或Projected CRS信息
嗨,我懂你想要提取sf对象在控制台打印时表头里显示的那种友好的CRS名称(比如WGS 84、WGS 84 / Pseudo-Mercator),而不是手动去读取控制台输出对吧?其实sf包本身就提供了直接的方法来获取这些信息,完全不用去解析打印文本,既可靠又高效。
下面结合你给出的示例来具体演示:
首先先创建示例中的sf对象:
library(sf) p1 = st_point(c(7,52)) p2 = st_point(c(-30,20)) sfc = st_sfc(p1, p2, crs = 4326) sfc_3857 = st_transform(sfc, 3857) nc = st_read(system.file("shape/nc.shp", package="sf"))
提取CRS的类型和友好名称
我们可以用st_crs()函数获取目标对象的CRS对象,然后从中提取对应的信息:
- 获取CRS的友好名称:使用
st_crs(your_sf_object)$name - 判断CRS是地理(Geodetic)还是投影(Projected)类型:通过
st_crs(your_sf_object)$type可以直接获取
针对你的示例代码,执行结果如下:
# 获取WGS 84的名称和类型 st_crs(sfc)$name # 输出: "WGS 84" st_crs(sfc)$type # 输出: "Geodetic 2D CRS" # 获取伪墨卡托的名称和类型 st_crs(sfc_3857)$name # 输出: "WGS 84 / Pseudo-Mercator" st_crs(sfc_3857)$type # 输出: "Projected 2D CRS" # 获取nc对象的CRS信息 st_crs(nc)$name # 输出: "NAD27 / UTM zone 16N" st_crs(nc)$type # 输出: "Projected 2D CRS"
生成和打印表头一致的格式字符串
如果你想直接得到类似控制台打印时的“Geodetic CRS: WGS 84”这种格式的字符串,可以写一个简单的小函数来实现:
get_crs_header <- function(sf_obj) { crs_obj <- st_crs(sf_obj) # 根据type判断是地理还是投影CRS crs_type_label <- ifelse(grepl("Geodetic", crs_obj$type), "Geodetic CRS", "Projected CRS") # 组合成目标格式 paste(crs_type_label, crs_obj$name, sep = ": ") } # 测试函数 get_crs_header(sfc) # 输出: "Geodetic CRS: WGS 84" get_crs_header(sfc_3857) # 输出: "Projected CRS: WGS 84 / Pseudo-Mercator" get_crs_header(nc) # 输出: "Projected CRS: NAD27 / UTM zone 16N"
这样就能精准获取到你在控制台打印中看到的CRS信息啦,完全不需要去解析控制台的输出内容,用起来非常方便。
备注:内容来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

