javascript - 确定经度和纬度坐标是否在以英里和公里为单位的半径内

标签 javascript arrays search geolocation forerunnerdb

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

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

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

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

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

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

最佳答案

这是一个使用 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,迫不及待地想看到与地理相关的功能

关于javascript - 确定经度和纬度坐标是否在以英里和公里为单位的半径内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115375/

相关文章:

c# - 弹出时禁用主页

javascript - 在 javascript oops 中存储值并重用它

javascript - jQuery 未检测到点击链接

javascript - 修改每个可能的 DOM 元素的原型(prototype)

javascript - 在 forEach 数组中使用 for 循环

Javascript 数组声明 : new Array(), new Array(3), ['a' , 'b' , 'c' ] 创建行为不同的数组

c# - 在字符串中查找关键字和关键短语的算法

Python - 在字典中使用 numpy 数组作为键的替代方法

spring - 使用 jquery 和 spring mvc 进行即时搜索

search - 为 Microsoft Graph 创建一个等效于 "contains"的筛选器查询