【问题标题】:Alternative algorithm for radius zipcode search?半径邮政编码搜索的替代算法?
【发布时间】:2016-10-06 10:46:33
【问题描述】:

我有一个对 sql 数据库的查询,以查找给定邮政编码的给定半径内的所有匹配邮政编码(db 表包含经度和纬度信息)。

我使用的是我在 stackoverflow 上找到的算法:

$sql = 'SELECT distinct(ZipCode) FROM zipcode WHERE (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578) cos('.$lat.'/57.29578)(经度-'.$lon.')*(经度-'.$lon.'))/180)

它起作用了,但我发现结果并不完全符合预期。例如,如果我从 11572(纽约州海滨)进行 40 英里半径搜索,它不会返回明显在 40 英里半径范围内的许多曼哈顿邮政编码(即 10023)。

我希望有人可能有另一种方法?

谢谢,马克

【问题讨论】:

  • 尝试:其中 sqrt(pow(Latitute - '$.lat', 2) + pow(Longitude -'.$lon', 2))
  • 我可能猜想问题在于,这是测量 40 英里半径内的邮政编码中心 - 您可能想要 40 英里半径内的邮政编码和区域。这听起来可能吗?
  • 我试了一下,nmtuan,但它返回了一个巨大的列表,远远超出了给定的 40 英里半径,并导致了致命的超时异常。
  • 谢谢,gbtimmon。我明白你在说什么,但我认为这不是问题所在。从 11572 开始,方圆 40 英里的范围包含并超出曼哈顿,以至于丢失的邮政编码,无论是中心还是其他地方,都必然落在该半径范围内。

标签: algorithm search formula zipcode radius


【解决方案1】:

解决了!结果证明算法没有任何问题。我忽略了 floatval() 纬度和经度,它们作为字符串传递给公式。因此奇怪的结果。使用 floatval,结果应该是这样。也许这会帮助那些发现自己处于类似情况的人。

另一方面,我使用的 geonames 邮政编码转储肯定缺少一些邮政编码。有人知道更全面的替代方案吗?

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多