确定是否经度和;纬度坐标位于英里和公里半径范围内

时间:2014-04-16 16:44:40

标签: javascript arrays search geolocation forerunnerdb

只使用伪代码或JavaScript,任何人都可以描述确定对象数组中哪些项目的最佳方法:

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

在英里或公里的给定半径范围内?

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

如果您可以描述一种索引策略,可以加快对阵列的查询速度,那么

奖励积分。我从头开始编写ForerunnerDB数据库,因此可以灵活地将答案集成到代码中,但主要关注的是查询性能。

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

2 个答案:

答案 0 :(得分:1)

我想在How do I calculate distance between two latitude-longitude points?

中会或多或少地回答这个问题

无论如何,使用现成的API(例如HERE Maps API's geo-coordinate class)可能比自己创建计算功能更容易。

答案 1 :(得分:0)

以下是使用Haversine formula的简单“直接”方法:

//This function takes in latitude and longitude of two location and returns the distance between them as the crow flies (in km)
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

我看到的唯一优化是为纬度和经度添加切线,以删除远离搜索区域的结果。

P.S。我非常喜欢ForerunnerDB,迫不及待地想看看与地理相关的功能