javascript - 查找特定周长内的坐标的最快方法是什么?

标签 javascript algorithm gps geolocation coordinates

假设我有一个包含 100,000 个坐标的数据库, 我需要找到哪些距离某个坐标不到 1 英里。

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

最佳答案

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

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将它们转换为弧度:

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 度/英里(大约 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 英里的一系列点结束。

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

关于javascript - 查找特定周长内的坐标的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36803910/

相关文章:

algorithm - 生成不在一组数字 N 中的随机数 R 的最佳算法

Python:list的类似dict.get()的方法

c++ - 查找表示 GPS 路线的两条线之间的距离(MATLAB、Java、C++ 或 Python)

iphone - 基于位置的本地通知

javascript - 使用 Dojo xhr 通过 json 和文件上传发送多部分表单

javascript - 如何在鼠标悬停时创建分屏布局

javascript - $_POST 不从 .post 读取变量值

javascript - 嵌入式 JavaScript 中的特殊字符

algorithm - 我用于构建最小堆的 Heapsort 算法有什么问题?

android - 如何检查我使用 GPS_PROVIDER 或 NETWORK_PROVIDER 获得的位置是否小于 60 秒?