判断经纬度坐标是否在英里和公里半径内

3

使用伪代码或JavaScript,有谁能描述出最佳的方法来确定由对象数组组成的项目中的哪些项目:

{
"lat": float,
"lng": float
}

是否可以在给定的半径内查询里程或公里?

我正在向ForerunnerDB (https://github.com/irrelon/ForerunnerDB) 添加基于地理位置的查询,并希望能够从搜索中快速获得结果。

如果您能描述一种索引策略,以加速对数组的查询,则额外加分。我从头编写了ForerunnerDB数据库,因此可以灵活地将答案集成到代码中,但主要问题是查询性能。

虽然该问题涉及ForerunnerDB的新功能,但并不要求您阅读该项目的源代码或熟悉该系统,伪代码或独立的JS示例非常受欢迎!


这可能会相当复杂,因为地理点是三维的。 - wvdz
这个问题是否可以简单地改为:如何计算两个地理点之间的距离? - wvdz
2个回答

4

这里是一个使用Haversine formula的简单“直接”方法:

//This function takes in latitude and longitude of two locations
// and returns the distance between them as the crow flies (in meters)
function calcCrow(coords1, coords2)
{
  // var R = 6.371; // km
  var R = 6371000;
  var dLat = toRad(coords2.lat-coords1.lat);
  var dLon = toRad(coords2.lng-coords1.lng);
  var lat1 = toRad(coords1.lat);
  var lat2 = toRad(coords2.lat);

  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c;
  return d;
}

// Converts numeric degrees to radians
function toRad(Value)
{
    return Value * Math.PI / 180;
}

我相信这段代码可能来自这里: Function to calculate distance between two coordinates shows wrong 我看到的唯一优化是添加纬度和经度的切线,以剔除远离搜索区域的结果。
附言:我真的很喜欢ForerunnerDB,并且迫不及待地想看到与地理位置相关的功能。

这是一个真正的解决方案。你救了我的一天 +1 - Pankaj Parkar

0

同意使用第三方工具通常更容易,但这并不是本次练习的重点。我正在编写的数据库必须内置此功能,并且我必须理解代码,以便稍后进行优化和更改。 - Rob Evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接