【问题标题】:Determine if a Longitude & Latitude Co-ordinate is Inside a Radius in Miles and Kilometers确定经度和纬度坐标是否在以英里和公里为单位的半径内
【发布时间】:2014-05-31 16:13:40
【问题描述】:

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

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

是否在以英里或公里为单位的给定半径范围内?

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

如果你能描述一个索引策略来加速对数组的查询,那就加分了。我从头开始编写 ForerunnerDB 数据库,因此可以灵活地将答案集成到代码中,但主要关注的是查询性能。

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

【问题讨论】:

  • 这可能相当复杂,因为地理点是 3 维的。
  • 这个问题不能简单地改写成:如何计算两个地理点之间的距离?

标签: javascript arrays search geolocation forerunnerdb


【解决方案1】:

这是使用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
【解决方案2】:

我想How do I calculate distance between two latitude-longitude points? 或多或少会回答这个问题

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

【讨论】:

  • 同意使用第三方总是更容易,但这并不是练习的重点。我正在编写的数据库必须内置此功能,并且我必须了解代码,以便稍后进行优化和更改
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
相关资源
最近更新 更多