昨天有个读者私信我,说把坐标扔进R语言就崩,界面直接黑屏。我一看他的代码,好家伙,经纬度顺序搞反是常事,但更离谱的是坐标系都没对。今天咱们不整虚的,直接聊 geo数据导入r 时候那些让人头秃的真实坑。
很多人觉得 R 语言高端,其实操作起来全是细节。我带团队做GIS项目三年,经手的数据比吃过的米还多。最大的坑不是代码写不对,而是你以为的数据是对的。
首先得说坐标顺序。很多新手拿着GPS导出的CSV,第一列是纬度,第二列是经度。你直接读入用ggplot画图,发现所有的点都堆在几内亚湾了。这时候别慌,检查列名。通常国际标准是经纬度(经度在前,纬度在后),但国内很多系统输出的是纬经度。我在处理一批深圳的基站数据时,因为没确认这个顺序,折腾了俩小时才反应过来是顺序反了。这一步一旦错了,后面全是废数据。
接着是CRS(坐标参考系统)。这是90%的人翻车的地方。你以为导入就是个坐标,其实它还是个有“身份”的空间数据。R包里处理几何对象,最怕的就是混合投影。比如你有WGS84的经纬度数据,又想和某个投影到CGCS2000的城市地图叠加。这时候直接画图,虽然能显示,但距离计算全是错的,面积更是谬以千里。
推荐先用 sf 包,别再执着于 sp 包了,虽然 sp 老,但 sf 是趋势,语法更现代化,处理 geo数据导入r 更加顺手。举个例子:
library(sf)
假设你有一个csv,列名是 long 和 lat
data <- read.csv("my_data.csv")
coords <- st_as_sf(data, coords = c("long", "lat"), crs = 4326)
这里那个 4326 就是关键,WGS84。如果你拿到的数据是国内的,可能得转一下。很多人为了省事不转,结果做缓冲区分析,半径1公里画出来像个椭圆形,比例尺完全乱套。
再说说属性连接。有时候你导入的是面数据(比如行政边界),属性表里还有各种编码。这时候用 merge 或者 join 很容易出问题。尤其是编码格式不对,中英文混编,或者前后有空格。我有一次对接政府公开数据,发现“北京市”和“ 北京 ”在join的时候连不上。解决办法很简单,先用 stringr 包的 str_trim 清理一下,再转成统一的小写或大写。这一步能节省你50%的调试时间。
还有速度问题。如果你的geo数据超过百万条,直接在R内存里跑可能会卡死。这时候建议用 data.table 预处理,或者用 geo数据导入r 之前先切片。不要试图把整个中国的GeoJSON一次性扔进浏览器或者R里,浏览器会崩溃,R也会爆内存。
关于价格,如果你找外包做这类数据清洗,市场价其实不低。一套完整的从原始CSV到标准化GeoJSON并入库的流程,如果是标准化流程,几千块能搞定。但如果数据质量差,需要大量清洗,价格至少翻倍。别贪便宜,那些报价几百块全包的大多是套模板,遇到非标数据就歇菜。
最后给个真实建议:养成好习惯,导入前先head()看下数据,str()看下结构。别闷头就跑ggplot。确认坐标顺序、确认CRS、确认属性表干净。这三个检查做了,能避开90%的坑。
如果你正卡在某个报错上,或者拿不准坐标系该选哪个,可以留言或者私我。别不好意思,谁没踩过几回坑呢?多交流比盲目搜索效率高得多。毕竟真实经验才是硬道理。