我查询了一个sql数据库,找到给定zipcode中给定半径内的所有匹配的zipcodes(db表包含经度和纬度信息)。
我使用的是在stackoverflow上找到的算法:
$ sql =' SELECT distinct(ZipCode)FROM zipcode WHERE(3958 * 3.1415926 * sqrt((纬度 - '。$ lat。')*(纬度 - '。 $ lat。')+ cos(纬度/ 57.29578) cos('。$ lat。' /57.29578)(经度 - '。$ lon。 ')*(经度 - '。$ lon。'))/ 180)< ='。$ radius。&#39 ;;&#39 ;;
它起作用,但我发现结果并不完全符合预期。例如,如果我从11572(纽约州欧申赛德)进行半径40英里的搜索,则它不会返回明显在半径40英里范围内的曼哈顿邮政编码(即10023)。
我希望有人可能有另一种方法吗?
谢谢,Mark
答案 0 :(得分:0)
解决!事实证明,该算法没有任何问题。我忽略了floatval()纬度和经度,它们作为字符串传递给公式。因此奇怪的结果。使用floatval,结果是应该的。也许这会帮助那些发现自己处于类似情况的人。
另一方面,我使用的geonames zipcode转储肯定缺少许多zipcodes。有谁知道更全面的替代方案?