首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript Haversine错误

Javascript Haversine错误
EN

Stack Overflow用户
提问于 2014-05-07 18:50:27
回答 3查看 240关注 0票数 1

因此,我已经得到了Haversine公式,沿着从Google检索到的路径查找位置,如下所示,使用英里数。

代码语言:javascript
复制
var R = 3959 //in miles;
var lat1 = result.routes[0].overview_path[index].k.toFixed(5);
var lat2 = locations[index2].lat;
var lon1 = result.routes[0].overview_path[index].A.toFixed(5);
var lon2 = locations[index2].lng;
var deltaLat = (lat2-lat1).toRad();
var deltaLon = (lon2-lon1).toRad();
var a = Math.sin(deltaLat/2)*Math.sin(deltaLat/2) + Math.cos(lat1) * Math.cos(lat2) *
                Math.sin(deltaLon/2)*Math.sin(deltaLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R*c;

但是当它使用点(例如) 36.64756,-97.34593 (位于威奇托,KS和达拉斯TX之间的某个地方)和39.933321,-91.409415 (位于伊利诺伊州昆西)时,我的距离不到20英里。显然这是不对的。我无法用其他值复制这个错误--我偶然发现了这个错误。

这是toRad原型,顺便说一句-

代码语言:javascript
复制
if(typeof(Number.prototype.toRad) === "undefined") {
Number.prototype.toRad = function(){
    return this * Math.PI / 180;
};
}

我最初的猜测是某个地方出现了浮点溢出,但我一直无法用toFixed隔离或减轻它。有人有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-07 19:25:39

我相信你的方程式是错的。下面是您可以与之比较的javascript版本:http://www.movable-type.co.uk/scripts/latlong.html

不同的是你的条款Math.cos(lat1) * Math.cos(lat2)。您需要首先将lat1lat2转换为弧度。

票数 2
EN

Stack Overflow用户

发布于 2014-05-07 18:57:44

toFixed返回带有值的字符串,记住这一点。

tofixed.asp

票数 2
EN

Stack Overflow用户

发布于 2018-05-17 00:37:14

您可以在这里使用我的包为您计算:https://www.npmjs.com/package/haversine-calculator

代码语言:javascript
复制
const haversineCalculator = require('haversine-calculator')

const start = {
  latitude: -23.754842,
  longitude: -46.676781
}

const end = {
  latitude: -23.549588,
  longitude: -46.693210
}

console.log(haversineCalculator(start, end))
console.log(haversineCalculator(start, end, {unit: 'meter'}))
console.log(haversineCalculator(start, end, {unit: 'mile'}))
console.log(haversineCalculator(start, end, {threshold: 1}))
console.log(haversineCalculator(start, end, {threshold: 1, unit: 'meter'}))
console.log(haversineCalculator(start, end, {threshold: 1, unit: 'mile'}))

请看一看,我认为这段代码比手动执行代码更容易维护和灵活。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23525930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档