做地图开发这行,十一年了。
说实话,以前我也傻。
觉得算个两点间距离,手写个公式多简单。
结果呢?代码一跑,数据对不上。
后来踩了无数坑,才明白:别跟地球曲率硬刚。
今天聊聊怎么用 eigen 库 geo 做空间计算,少走弯路。
先说个真事。
去年帮朋友调一个物流路径规划。
他非要用欧几里得距离算北京到上海。
结果导航导到海里去了。
客户差点骂娘。
这就是典型的“伪专业”。
地球是圆的,不是平的。
你用手算平面几何,误差大得吓人。
这时候,eigen 库 geo 就派上用场了。
它不是啥魔法,就是封装好的数学工具。
但好用啊。
不用你自己去推导 Haversine 公式。
也不用担心浮点数精度丢失。
我一般这么干。
第一步,装库。
别去下那些乱七八糟的源码包。
直接上 CMake,或者 Nuget,看你们项目用啥。
Eigen 本身是个头文件库,解压就能用。
但 geo 部分可能需要额外配置。
这一步别省时间,配置错了,后面全崩。
第二步,初始化坐标。
别直接用 double 存经纬度。
容易乱。
用结构体或者类封装一下。
比如 LatLon 类。
把纬度、经度、高程分开存。
这样后面调用函数,参数清晰。
我见过太多人传参传晕了。
第三个参数是半径还是角度?
搞不清楚。
封装好,调用起来心里有底。
第三步,算距离。
这里有个坑。
很多人以为 eigen 库 geo 只能算直线距离。
其实它能算测地线距离。
也就是沿着地球表面的最短路径。
代码大概长这样。
定义两个点。
调用 distance 函数。
返回米数。
别嫌麻烦,这行代码能救你的命。
以前我手写公式,算出来差了几百米。
在导航里,几米就是生死线。
几千米就是事故现场。
再说说精度问题。
float 和 double 的区别。
做地图,尽量用 double。
float 精度不够,算多了误差累积。
最后你会发现,点飘了。
飘到隔壁省去了。
这可不是开玩笑。
我有个客户,做共享单车定位。
用 float,最后车停在了河里。
运维小哥捞车捞到怀疑人生。
所以,别抠那点内存。
double 够用。
还有一个点,坐标系。
别搞混 WGS84 和 GCJ02。
国内地图大多用 GCJ02,也就是火星坐标。
eigen 库 geo 默认支持 WGS84。
如果你在国内做项目,记得转换。
不然算出来的距离,全是错的。
这一步,很多新人容易忽略。
以为库能解决一切。
其实库只负责数学,不负责业务逻辑。
转换坐标系,得自己写或者找库。
别偷懒。
最后,总结一下。
用 eigen 库 geo,核心就三点。
配置要稳,坐标要准,类型要对。
别指望一劳永逸。
代码写出来,得测。
拿已知数据跑一遍。
比如北京到上海,大概 1200 公里。
你算出来 500 公里,那肯定错了。
别信网上的复制粘贴。
那是坑。
自己写,自己测。
这才是正道。
做技术,得有点较真劲儿。
不然,产品上线,用户骂你。
老板骂你。
你也得骂自己。
所以,赶紧去试试 eigen 库 geo。
别犹豫。
早用早解脱。
这行水很深,但只要你肯钻,总能找到路。
共勉吧。