问题来源
目前 IoT 领域各种智能设备都可以采集 GPS 数据,但是设备采集到的GPS都是 WGS-84 坐标系数据,在国内不能直接用于在地图上显示,需要进行一定转换。各地图工具都有坐标转换 API 可用,但是成千上万的 GPS 数据通过 API 转换是一件很消耗资源的事,所以需要提供一种离线转换的方式。
本人在项目中曾也用过 API 转换的方式,但是当设备数量一增加,在坐标转换这一个小功能上带来了巨大的资源开销,是一件很不划算事,因此想到利用算法替换 API 方式进行坐标转换。在查阅了一些资料和自己的整理后,进行了一下总结。
大地坐标系(WGS-84)
大地坐标系是大地测量中以参考椭球面为基准面建立起来的坐标系。地面点的位置用大地经度、大地纬度和大地高度表示。大地坐标系的确立包括选择一个椭球、对椭球进行定位和确定大地起算数据。
火星坐标系(GCJ-02)
是一种国家保密插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。
所有的电子地图、导航设备,都需要加入国家保密插件。第一步,地图公司测绘地图,测绘完成后,送到国家测绘局,将真实坐标的电子地图,加密成“火星坐标”,这样的地图才是可以出版和发布的,然后才可以让GPS公司处理。第二步,所有的GPS公司,只要需要汽车导航的,需要用到导航电子地图的,都需要在软件中加入国家保密算法,将COM口读出来的真实的坐标信号,加密转换成国家要求的保密的坐标。这样,GPS导航仪和导航电子地图就可以完全匹配,GPS也就可以正常工作了。
百度坐标系(BD-09)
百度坐标对火星坐标系进行了一次加密,形成了百度坐标系。
具体实现
附上坐标转化详细 Java 版代码,Java 版本最低要求 Java 8
代码中也提供了两种判断 WGS-84 坐标点是否在国内的方法,一种是很粗略的判断,另一种较为精确,但沿海、国界周边地区可能会有误差,更高精度需要自行调整坐标点。
1 | /** |
参考与感谢
Darel Rex Finley : Point-In-Polygon Algorithm
Aimeast : 【WP7】判断GPS坐标是否在中国