本文作者:IMWeb linq 原文出处:IMWeb社区 未经同意,禁止转载
在讲h5 的geolocation API之前,让我们先了解一下当前国内地理坐标系现状
当前国内地理坐标系
- 国际坐标系:国际标准,国际地图提供商使用的坐标系
- 火星坐标系:国内标准,国际坐标系通过GCJ-02算法(非线性)加密后得到的坐标系
- 百度坐标系:百度对火星坐标系进行二次加密得到的坐标系(隐约感觉到ie的身影)
<秦始皇都快要忍不住爬起来一统天下(坐标系)了>
让我们在同一个地点,看看三种坐标有什么地理位置的差别:
代码语言:javascript复制// 百度坐标系 火星坐标系
console.log(geolib.getDistance(
{latitude:113.939446, longitude: 22.546171},
{latitude: 113.932777, longitude: 22.540639}
), '百度坐标系 火星坐标系')
// 百度坐标系 国际坐标系
console.log(geolib.getDistance(
{latitude:113.939446, longitude: 22.546171},
{latitude: 113.9279875, longitude: 22.5436215}
), '百度坐标系 国际坐标系')
// 火星坐标系 国际坐标系
console.log(geolib.getDistance(
{latitude: 113.932777, longitude: 22.540639},
{latitude: 113.9279875, longitude: 22.5436215}
), '火星坐标系 国际坐标系')
//输出 (单位:m)
785 '百度坐标系 火星坐标系'
1283 '百度坐标系 国际坐标系'
551 '火星坐标系 国际坐标系'
可以看出同一地点,采用不同地理坐标系的偏差。因为采用的是非线性算法进行加密的,所以不同地区,偏差程度不一样,详细可自行进行查阅资料,或者自行进行测试。
那么从h5 的geolocation 获取的坐标系又是什么坐标系呢?w3c标准描述如下
The Geolocation API defines a high-level interface to location information associated only with the device hosting the implementation, such as latitude and longitude. The API itself is agnostic of the underlying location information sources. Common sources of location information include Glob al Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs, as well as user input. No guarantee is given that the API returns the device's actual location.
大致的意思是可以从 GPS、IP 地址、RFID、WiFi、蓝牙 MAC 地址、GSM/CDMA 卡 ID 等获取当前位置信息,具体获取的地理位置根据浏览器实现和设置有所不同。获取的坐标系为国际坐标系。
h5 获取的是国际坐标系不是不好吗?这个问题没有确定答案,主要取决于你开发的应用服务于国内,国外,还是国内外通用。举个栗子:
A同学开发一款移动应用,需要获取用户当前位置,根据当前位置去后端拉去用户周围的门店。简单,用h5 geolocatin 获取当前位置再去,后端拉去一下数据不就行行了。然而第二天就有用户用户投诉:我眼前就有1家门店,返回的门店却是1000m外的门店,难道有人山寨你们?A同学很是头痛,经过一番调查发现,国内坐标系还有多种,而h5 获取的坐标系和后端存储的门店坐标系不一致。
为了避免这种问题可以使用第三方地位服务