仅使用伪代码或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 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
我看到的唯一优化是为经度和纬度添加切线,以切出远远超出搜索区域的结果。
附言我真的很喜欢ForerunnerDB,迫不及待想看到与地理相关的功能