优化邮政编码距离计算

Posted

技术标签:

【中文标题】优化邮政编码距离计算【英文标题】:Optimize zipcode distance calculation 【发布时间】:2012-08-21 18:50:52 【问题描述】:

这是我想问大家的问题

我已经有一个执行“邮政编码附近”搜索的现有系统。

这篇文章的目的是看看我是否可以优化流程。

目前,我有大约 43k 条邮政编码记录。

我当前算法的工作方式是选择 1 条记录并对 43k 条记录进行全表扫描。

有没有办法只取一个子集(纬度范围,长期范围)并以这种方式进行计算?

【问题讨论】:

你的问题有点含糊。您是在询问使用WHERE 子句吗? 【参考方案1】:

您可以从 google 或 geocoder.us(或您获取地理数据的任何地方)获取所有邮政编码的质心的纬度/经度。在 where 子句中使用它们作为缩小搜索范围的粗略指南。

【讨论】:

我知道.. 但我不知道如何获得范围示例:点 x(10,10) 距离 10 然后我可以说选择 * 从点 p 其中 p.x > 8 和 p.x 8 和 p.y 在美国,您可以计算出每纬度约 69 英里,每经度约 52 英里。这是一个简洁的计算器来检查你自己的区域ariesmar.com/degree-latitude.php 将什么转换为十进制(纬度/经度)值? 1.0 - 如果有人要求从 41/87(纬度/经度)50 英里外的物品,您可以将查询限制为查看 40 到 42 之间的纬度和 86 到 88 之间的经度。您可能需要使用较大的边距,以考虑形状奇特的邮政编码区域和靠近区域边缘的用户。【参考方案2】:

我通常做的是将我的搜索括起来加上和减去一个度数。如前所述,纬度约为 69 英里。有了经度,事情就变得有点复杂了。离北极越近,从一个经度到另一个经度的距离就越短。例如,在佛罗里达州/乔治亚州边界处,经度一度相距约 55 英里,但在加利福尼亚州/俄勒冈州边界处,仅相距约 50 英里。

您首先需要获得起始位置的纬度/经度,并且可能需要设置 4 个变量,例如:beglat、endlat、beglong 和 endlong。将 beglat 分配给起始位置的纬度减去 1 度,将 endlat 分配给起始位置的纬度加上 1 度等。对于更紧密的搜索半径,您可以选择半度或其他值。

【讨论】:

以上是关于优化邮政编码距离计算的主要内容,如果未能解决你的问题,请参考以下文章

mysql中如何根据经纬度优化这个距离查询

R中的距离计算优化

地理空间距离计算优化

[算法系列]算法一 地理空间距离计算优化

地理空间距离计算及优化(根据两个点经纬度计算距离)

地理空间距离计算及优化(依据两个点经纬度计算距离)