找到哪个坐标位于某个周边的最快方法是什么?

时间:2016-04-22 21:55:25

标签: javascript algorithm gps geolocation coordinates

我们说我有一个100,000坐标的数据库, 我需要找到距离某个坐标不到1英里的那些。

最有效的方法是什么?(用任何语言)

1 个答案:

答案 0 :(得分:2)

首先,我们必须编写一个基本函数来计算2点之间的距离:

function distance(lat1, lon1, lat2, lon2) {}

对于这个例子,我将函数基于投影到平面的球形地球的公式(here) 首先,我们必须计算增量(纬度和长度之间的距离)和平均纬度(纬度的平均值):

var dLat = lat1 - lat2;
var dLon = lon1 - lon2;
var mLat = (lat1 + lat2) / 2;
var earthRadius = 3959; //in miles

然后我们使用d=180/PI rad将这些转换为Radians:

dLat = dLat * 180 / 3.1415926535;
dLon = dLon * 180 / 3.1415926535;
mLat = mLat * 180 / 3.1415926535;

现在,我们使用公式将数据转换为距离:

var distance = earthRadius * (dLat * dLat + Math.pow(Math.cos(mLat) * dLon, 2));

并返回距离

return distance;

现在,只需迭代所有点并检查每个点的距离是否正常。让我们说以这种方式描述一点:

var p = {
    lat = ...
    lon = ...
}

假设有一个点列表(例如,命名点)和一个参考点(例如,名为ref)。

var result = []
points.forEach(function (d) {
    if (distance(d.lat, d.lon, ref.lat, ref.lon) <= 1) {
        result.push(d);
    }
};

您还可以检查纬度边界框 - 长度需要更复杂的计算,这只是浪费时间。您可以确定以度为1/69 deg/mile(约0.1449度)的英里数。因此,您可以检查哪个点位于此边界框之外:

var result = []
var maxLat = ref.lat + 0.1449;
var minLat = ref.lat - 0.1449;
points.forEach(function (d) {
    if (d.lat > maxLat || d.lat < minLat) continue;
    if (distance(d.lat, d.lon, ref.lat, ref.lon) <= 1) {
        result.push(d);
    }
};

然后完成距离参考点不到1英里的一系列点数。

我可能在公式中有错误(我更像是程序员而不是数学家)。因此请仔细检查他们是否使用维基百科文章我添加了链接。