我是MySql的新手,我想要的是创建一个程序,我可以插入任何邮政编码和距离,然后取回该距离内的所有邮政编码。我确实找到了一个公式,并试图根据我的需要重塑它,但我无法做到。我的内容如下。示例来自此处http://code.google.com/apis/maps/articles/phpsqlsearch.html。但是,我不想使用37,-122坐标,我想使用我推入程序的任何邮政编码。如果可以,我会开始赏金,但我必须等待。这一天让我整天难过,所以任何帮助都会受到赞赏。这个让我难过,因为我相信它使用了两组lat / lon而我只想要一个来自中央lat / lon的半径
SELECT state,city,zipcode,
(3959
* acos(
cos(radians(37))
* cos(radians(x(location)))
* cos(radians(y(location)) - radians(-122))
+ sin(radians(37)) * sin(radians(x(location)))))
AS distance
FROM zipcodes
HAVING distance < 25
ORDER BY distance
LIMIT 0, 20;
答案 0 :(得分:1)
您可以采用与碰撞检测样式算法相同的方法来处理此问题。通过从点找到最小和最大纬度/经度(给定半径)来检查坐标是否在边界框内,并确保在运行更多之前搜索满足一些快速评估标准(例如lat <= 1.5
)资源密集型检查。
这里有一个带有SQL和Java代码的工作示例:
http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates
总之,它说:
简单地结合条件 AND:
SELECT * FROM Places WHERE (Lat => 1.2393 AND Lat <= 1.5532) AND (Lon >= -1.8184 AND Lon <= 0.4221) AND acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon -
( - 0.6981)))&lt; = 0.1570;
大多数查询优化器足够聪明 快速执行索引扫描 找到满意的地方(Lat&gt; = 1.2393
然后继续执行一些额外的检查。在这下面的同一主题中有一些替代方法。
这对你有帮助吗?看起来你有把自己写成程序的技巧,但如果你愿意,我可以尝试为你写一个。如果是这样,您可以粘贴/发布您的表或SQL批处理脚本。