【发布时间】:2011-11-22 06:51:21
【问题描述】:
所以我有这个函数可以根据纬度、经度和半径参数计算最近的城市。
DELIMITER $$
DROP PROCEDURE IF EXISTS `world_db`.`geolocate_close_cities`$$
CREATE PROCEDURE `geolocate_close_cities`(IN p_latitude DECIMAL(8,2), p_longitude DECIMAL(8,2), IN p_radius INTEGER(5))
BEGIN
SELECT id, country_id, longitude, latitude, city,
truncate((degrees(acos( sin(radians(latitude))
* sin(radians(p_latitude))
+ cos(radians(latitude))
* cos(radians(p_latitude))
* cos(radians(p_longitude - longitude) ) ) )
* 69.09*1.6),1) as distance
FROM cities
HAVING distance < p_radius
ORDER BY distance desc;
END$$
DELIMITER ;
这是我的城市表的结构:
> +------------+-------------+------+-----+---------+----------------+ |
> Field | Type | Null | Key | Default | Extra |
> +------------+-------------+------+-----+---------+----------------+ |
> id | int(11) | NO | PRI | NULL | auto_increment | |
> country_id | smallint(6) | NO | | NULL | | |
> region_id | smallint(6) | NO | | NULL | | |
> city | varchar(45) | NO | | NULL | | |
> latitude | float | NO | | NULL | | |
> longitude | float | NO | | NULL | | |
> timezone | varchar(10) | NO | | NULL | | |
> dma_id | smallint(6) | YES | | NULL | | |
> code | varchar(4) | YES | | NULL | |
> +------------+-------------+------+-----+---------+----------------+
效果很好。
我想做的(伪代码)是这样的:
SELECT * FROM cities WHERE DISTANCE(SELECT id FROM cities WHERE id={cityId}, {km))
它会返回最近的城市。
关于我如何做到这一点的任何想法?
目前,我只是调用该函数,然后将 ids 迭代到一个数组中,然后在 city 表中执行 WHEREIN,这显然不是很有效。
非常感谢任何帮助。谢谢。
【问题讨论】:
-
我会看看this other question。这应该会有所帮助。
-
这将如何工作? :-)
-
lat、long 和 distance 将是传入的参数。它不准确,但应该是一个不错的估计。这需要有多准确?
-
不“时间关键”准确。当用户点击“我所在区域的用户”时。他们可以选择一个收音机,它会过滤靠近他们的城市。注意:目前它相当准确。当然有些会在几公里之外,但这没什么大不了的。确实,越准确越好!但我也想要效率。
-
公式需要包含城市表中位于一定纬度范围内的项目。
标签: mysql sql database geolocation