找到某个坐标在某个周长内的最快方法是啥?

Posted

技术标签:

【中文标题】找到某个坐标在某个周长内的最快方法是啥?【英文标题】:What's the fastest way to find which coordinates are in a certain perimeter?找到某个坐标在某个周长内的最快方法是什么? 【发布时间】:2016-04-22 21:55:25 【问题描述】:

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

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

【问题讨论】:

您的坐标是纬度/经度还是 x/y 英里? 【参考方案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 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 英里的点数组结束。 我可能在公式方面有错误(我更像是程序员而不是数学家)。因此,请仔细检查它们是否适用于我添加了链接的 Wikipedia 文章。

【讨论】:

将 1 英里距离转换为“度数距离”而不是转换每个坐标点不是更快吗?假设 1 英里对应 0.001 度的距离,那么我们只需检查 (d.lat - ref.lat)**2 + (d.lon - ref.lon)**2 &lt; 0.001**2,这需要较少的整数计算。我的提议可能是错的,只是问问。 为了提高速度,您可以根据最小/最大纬度和经度进行简单的“提前”边界框检查,以丢弃大部分点,只对通过的点进行昂贵的距离计算它。 @Delgan 不完全正确 - 不同纬度的英里距离不同。例如 - 在纬度 38N/S - 经度度数为 69 英里,而在纬度 90N/S - 经度度数达到 0 英里。 @samgak 是的,你是对的。我应该(并且将)将其添加到我的答案中

以上是关于找到某个坐标在某个周长内的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式安装或更新到最新版本的全局包的最快方法是啥?

在向量中找到最长的“连续数字”条纹的最快方法是啥?

在C中找到整数中最高设置位(msb)的最快/最有效方法是啥?

在C中找到整数中最高设置位(msb)的最快/最有效方法是啥?

计算用户平均速度的最快方法是啥?

找到不规则形状多边形的“视觉”中心的最快方法是啥?