背景
最近在和前端合作开发一个小程序LBS打卡的功能,客户方给了他们在全国的门店的地址和经纬度信息,我直接将数据导入mongo中,然后给前端返回门店经纬度在腾讯地图上标记出来。
而用户在打卡的时候,前端需要把用户当前位置的经纬度传到后台做范围匹配。然后就发现一个问题,小程序端用户定位是没有问题的,但是查询不到用户周围的门店信息。我反复确定了用户所在的位置附近200m内是有门店,就怀疑是前端上传的经纬度是有问题的,于是通过百度经纬度工具反查地址,发现和用户实际所在位置偏差很多。
地球坐标系,火星坐标系和百度坐标系
经过查阅得知,目前国内主流的坐标系有三种,地球坐标系,火星坐标系和百度坐标系。
地球坐标系,WGS84坐标系。
国际上通用的坐标系,比如GPS芯片或者我国的北斗芯片。火星坐标系,GCJ02坐标系。
经WGS84加密之后的坐标系。国内大部分导航系统采用的坐标系都是GCj02坐标系或者在GCJ02基础上修改而来。
百度坐标系,BD09坐标系。
GCJ02加密后的坐标系。
解决问题
了解到有多种坐标系之后,我就开始怀疑是小程序获取到的用户当前位置的坐标系和客户给的门店坐标系不是一致的,经过询问得知,小程序默认获取到的经纬度采用的是WGS84坐标系,而客户给我的数据是通过高德地图API转化而来,采用的是GCJ02坐标系。
之后的问题就简单了,前端统一的把WGS坐标系转为GCJ02坐标系即可。