PROJ 6.0 竟对 R 的空间分析生态造成如此大的影响

后升级版SF工具包采用新PROJ6.0C及更先进软件库技术,显著扩宽我们的学习及运用领域。值得注意的是,虽然PROJ与R中的proj4均基于PROJC库,但两者间具备各自的特点并且可以独立运行。

借助Proj6.0C库中的最新科技成果(特别是WellKnownText,简称WKT以及升级版WKT2),我们得以实现全新的地球参考球体数据输入方式,显著提高坐标系的精度和稳定性,使之具备更强的扩展能力。这类创新性的格式设计以标志性的特殊字符标记为特点,使编码过程更加直观明确,从而全面提升了我们的坐标系统性能。

load(url("https://github.com/mgimond/Spatial/raw/main/Data/Sample1.RData"))

rm(list=c("inter.sf", "p.sf", "rail.sf"))

sf对象的坐标系统提取

library(sf)

新版本sf工具包提供了便捷的空间参考系统信息获取渠道,只需运用st_crs()函数,即可瞬息之间获取所需信息。不需要复杂的编码过程,只需简单操作,犹如当代神探,瞬间掌握特定位置详尽数据资讯。特别的是,这一功能甚至也支持自定义EPSG码输出或者根据大地基准面和投影法生成字符串,从而做到数据个性化识别。

sf_extSoftVersion()[1:3]
##    GEOS    GDAL  proj.4 
## "3.9.1" "3.2.1" "7.2.1"

栅格对象的坐标系统提取

st_crs(s.sf)  
## Coordinate Reference System:
##   User input: EPSG:26919 
##   wkt:
## PROJCRS["NAD83 / UTM zone 19N",
##     BASEGEOGCRS["NAD83",
##         DATUM["North American Datum 1983",
##             ELLIPSOID["GRS 1980",6378137,298.257222101,
##                 LENGTHUNIT["metre",1]]],
##         PRIMEM["Greenwich",0,
##             ANGLEUNIT["degree",0.0174532925199433]],
##         ID["EPSG",4269]],
##     CONVERSION["UTM zone 19N",
##         METHOD["Transverse Mercator",
##             ID["EPSG",9807]],
##         PARAMETER["Latitude of natural origin",0,
##             ANGLEUNIT["degree",0.0174532925199433],
##             ID["EPSG",8801]],
##         PARAMETER["Longitude of natural origin",-69,
##             ANGLEUNIT["degree",0.0174532925199433],
##             ID["EPSG",8802]],
##         PARAMETER["Scale factor at natural origin",0.9996,
##             SCALEUNIT["unity",1],
##             ID["EPSG",8805]],
##         PARAMETER["False easting",500000,
##             LENGTHUNIT["metre",1],
##             ID["EPSG",8806]],
##         PARAMETER["False northing",0,
##             LENGTHUNIT["metre",1],
##             ID["EPSG",8807]]],
##     CS[Cartesian,2],
##         AXIS["(E)",east,
##             ORDER[1],
##             LENGTHUNIT["metre",1]],
##         AXIS["(N)",north,
##             ORDER[2],
##             LENGTHUNIT["metre",1]],
##     USAGE[
##         SCOPE["Engineering survey, topographic mapping."],
##         AREA["North America - between 72°W and 66°W - onshore and offshore. Canada - Labrador; New Brunswick; Nova Scotia; Nunavut; Quebec. Puerto Rico. United States (USA) - Connecticut; Maine; Massachusetts; New Hampshire; New York (Long Island); Rhode Island; Vermont."],
##         BBOX[14.92,-72,84,-66]],
##     ID["EPSG",26919]]

对于高精度网格对象采用Raster工具箱的CRS()函数进行细粒度分析,以获取更加精准的结果。然而,由于现阶段软件暂无生成规范化WKT字符串的功能,可能会对使用体验产生一定影响。不过无需担忧,通常我们可以采取指定EPSG编码来建立全球性的坐标系统,以此确保数据在全球范围内的准确性和精度。这种方法简单而有效,是解决类似问题的理想方式。

EPSG代码与WKT字符串的对决

PROJC最新功能提供两种设置坐标系方式:直接输入EPSG编号及运用WKT字符串进行精密定义。前者简便快捷,而后者则能更精确自如应对各类复杂环境。例如,elev.r所用坐标系统采用广泛使用的通用墨卡托投影第十九分带,参照NAM1983大地基准进行定位,保证在球体范围内的精准数据定位。

library(raster)
crs(elev.r)
##  CRS arguments:
##  +proj=utm +zone=19 +datum=NAD83 +units=m +no_defs +ellps=GRS80
## +towgs84=0,0,0

手动指定坐标系统的魅力

在处理无原始坐标的数据时,利用ST_Set_Crs()函数手动设置坐标参考系统是理想之选。虽然WKT字符串中的PROJCRS和BASEGEOGCRS参数可能存在波动,但不会影响数据的精准定位。在方便之时,引用EPSG代码进行赋值更具有效性。

栅格数据的投影定义

除了SF元素,通过使用PROJ4格式化字符串来设置栅格数据的投影参数同样是非常有效的方法。这种方式操作简便,只需要运用CRS()函数就能完成。然而,当空间对象本身缺少精确的坐标数据时,就必须依靠定期更新的EPSG编码,以此快速确认栅格坐标系统,从而保证数据在地球表面的准确定位,避免不必要的误差。

重现软件中已定义坐标系统的参数

s.sf <- st_set_crs(s.sf, "+proj=utm +zone=19 +ellps=GRS80 +datum=NAD83")

为了保证数据维度的精准定位,我们首先需要选择具有内置地理位置系统参数的修复软件,如ArcGIS,从中获得WKID/EPSG编码并上传至网络服务器以便后续查询。例如,当使用ArcGIS时,只需通过坐标系属性便可轻松获取所需的WKID编码。虽然这一过程相对繁琐,但却能够确保我们的数据在世界各地的精确查找。

st_crs(s.sf)
## Coordinate Reference System:
##   User input: +proj=utm +zone=19 +ellps=GRS80 +datum=NAD83 
##   wkt:
## PROJCRS["unknown",
##     BASEGEOGCRS["unknown",
##         DATUM["North American Datum 1983",
##             ELLIPSOID["GRS 1980",6378137,298.257222101,
##                 LENGTHUNIT["metre",1]],
##             ID["EPSG",6269]],
##         PRIMEM["Greenwich",0,
##             ANGLEUNIT["degree",0.0174532925199433],
##             ID["EPSG",8901]]],
##     CONVERSION["UTM zone 19N",
##         METHOD["Transverse Mercator",
##             ID["EPSG",9807]],
##         PARAMETER["Latitude of natural origin",0,
##             ANGLEUNIT["degree",0.0174532925199433],
##             ID["EPSG",8801]],
##         PARAMETER["Longitude of natural origin",-69,
##             ANGLEUNIT["degree",0.0174532925199433],
##             ID["EPSG",8802]],
##         PARAMETER["Scale factor at natural origin",0.9996,
##             SCALEUNIT["unity",1],
##             ID["EPSG",8805]],
##         PARAMETER["False easting",500000,
##             LENGTHUNIT["metre",1],
##             ID["EPSG",8806]],
##         PARAMETER["False northing",0,
##             LENGTHUNIT["metre",1],
##             ID["EPSG",8807]],
##         ID["EPSG",16019]],
##     CS[Cartesian,2],
##         AXIS["(E)",east,
##             ORDER[1],
##             LENGTHUNIT["metre",1,
##                 ID["EPSG",9001]]],
##         AXIS["(N)",north,
##             ORDER[2],
##             LENGTHUNIT["metre",1,
##                 ID["EPSG",9001]]]]

总结:sf工具包的未来

借助最新版的SF工具包和PROJ6.0C库,我们得以充分利用其强大的综合性能。不论是获取地理信息的单位,或者是转换栅格数据的投影格式,均能够通过这两者达到高效率的流程简化。尽管应用过程中可能遇到挑战,但只要合理运用相关技巧,即可轻松应对。在此,我想请教大家一个问题:关于未来工作中的坐标系统设定,您更倾向于采用EPSG码还是WKT字符串作为定义方式呢?期待您在评论区留下宝贵意见并分享您的实践经验。

s.sf <- st_set_crs(s.sf, 26919)

发表评论