如何在Node.js项目中调用Mapbox API计算两个坐标点之间的距离
Node.js中使用Mapbox实现两点距离计算的实现方案
Mapbox官方提供的Node.js SDK没有内置直接计算两点距离的getDistance方法,你可以根据自身需求选择以下两种方案实现:
方案1:本地计算球面大圆距离(直线距离)
如果只需要两点的空中直线距离,不需要实际道路通行距离,无需调用Mapbox接口,本地使用半正矢公式直接计算即可,性能更高:
// 封装球面距离计算函数,返回值单位为公里 function getGeoDistance(coordA, coordB) { const rad = d => d * Math.PI / 180.0 const radLatA = rad(coordA.lat) const radLatB = rad(coordB.lat) const a = radLatA - radLatB const b = rad(coordA.long) - rad(coordB.long) let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLatA) * Math.cos(radLatB) * Math.pow(Math.sin(b/2),2))) s = s * 6378.137 // 地球半径,单位为公里,要返回米的话乘以1000即可 return Math.round(s * 10000) / 10000 } // 调用示例 const coordA = {lat : 33.968123, long: -118.419454} const coordB = {lat : 33.997223, long: -117.929145} const distance = getGeoDistance(coordA, coordB) console.log(distance)
方案2:调用Mapbox Directions API获取实际路线距离
如果需要驾车、步行、骑行等实际通行场景的距离,调用Mapbox Directions API实现,基于你已完成的SDK初始化,封装方法如下:
// 给初始化的mapbox实例挂载getDistance方法 mapbox.getDistance = async function(coordA, coordB, profile = 'mapbox/driving') { // Mapbox接口要求坐标格式为 [经度, 纬度],注意不要传反 const coords = [ [coordA.long, coordA.lat], [coordB.long, coordB.lat] ] const response = await this.directions.getDirections({ profile: profile, waypoints: coords, geometries: 'geojson' }) // 返回路线的距离,单位为米,可自行转换为其他单位 return response.routes[0].distance } // 调用示例,和你预期的使用方式完全一致 const coordA = {lat : 33.968123, long: -118.419454} const coordB = {lat : 33.997223, long: -117.929145} const distance = await mapbox.getDistance(coordA, coordB) console.log(distance)
注意事项
- 调用Directions API需要你的Mapbox令牌对应账号开通了相关接口权限,调用量会按照官方规则计费
- 可通过第三个参数指定出行模式,可选值包括
mapbox/driving(默认,驾车)、mapbox/walking(步行)、mapbox/cycling(骑行)、mapbox/driving-traffic(含实时路况的驾车路线) - 接口返回的多条路线默认第一条是最优路线,若需要其他路线可自行修改返回逻辑
内容的提问来源于stack exchange,提问作者Jake Smith
相关产品推荐
相关产品推荐

