做GIS这行九年,见过太多人死磕R语言。为啥?因为免费啊,开源啊,还能批量处理。但说实话,刚上手那会儿,我也被折磨得够呛。今天不整那些虚头巴脑的理论,就聊聊咱们普通人怎么用最笨但最稳的办法,搞定r语言读取geo数据这个问题。
先说个真事儿。上个月有个做城市规划的朋友找我,说他在R里读shapefile,报错报得亲妈都不认识。我一看,好家伙,他用的还是十年前的代码,而且文件路径里带了中文。R这玩意儿,对中文路径简直是“深恶痛绝”,除非你特意去配置环境,否则大概率直接崩给你看。所以,第一条铁律:路径全英文,文件夹名字别带空格。这能解决80%的初学者问题。
再说说格式。很多人以为GeoJSON或者GeoPackage是万能的,其实对于R语言来说,shapefile依然是兼容性最好的,虽然它由多个文件组成(.shp, .dbf, .shx等),容易丢文件,但胜在稳定。如果你非要读GeoJSON,记得用sf包,别用老掉牙的rgdal了,那玩意儿早就被淘汰了,别去网上搜教程还照着做,那是坑人。
这里得插一句,r语言读取geo数据的时候,坐标系是个大坑。我见过太多人把不同坐标系的数据直接叠在一起,结果地图歪得亲妈都不认识。比如你有个北京的图,坐标系是EPSG:4326,另一个是EPSG:3857,直接画出来,点能飘到太平洋去。所以在读入数据后,第一件事不是画图,而是检查crs(坐标系)。用st_crs()函数看一眼,不对就st_transform()转一下。这一步省不得,否则后面所有的分析都是废纸。
关于速度,很多人抱怨R读大数据慢。确实,如果文件超过100MB,用传统的read_sf可能会卡死。这时候,建议用terra包或者直接转成sqlite数据库再读。别硬刚,工具要选对。我有个客户,搞全国土地利用数据,几十个G,用sf包读了半小时,改用terra包后,几秒钟搞定。这就是经验,不是理论能告诉你的。
还有个小细节,属性表里的空值。R里遇到NULL或者NA,处理起来挺麻烦。特别是当你做空间连接(spatial join)的时候,如果关联字段里有空值,结果集可能会莫名其妙少很多行。这时候,得提前清洗数据,或者在连接时设置参数忽略空值。别等到画图发现少了一块,才想起来去查原因,那时候黄花菜都凉了。
最后,说说可视化。很多人用ggplot2画图,觉得高大上。但说实话,对于复杂的地理数据,ggplot2有时候力不从心,尤其是处理投影变换的时候。这时候,推荐用tmap或者mapview包。tmap做静态图很强大,mapview做交互式地图很方便,直接在RStudio里就能预览,不用导出来再打开浏览器,效率提升不止一点点。
总之,r语言读取geo数据这事儿,难在细节,易在逻辑。别被那些复杂的代码吓到,先从简单的shapefile入手,把路径、坐标系、属性表这三个基础打牢,后面自然就顺了。别信什么“一键导入”的神话,那都是骗小白的。老老实实读文档,多试错,才是正道。
希望这些大实话,能帮你少走点弯路。毕竟,头发已经够少了,别再因为读个数据掉几根。