0

我一直在关注这个在 MySQL 中进行地理搜索的示例(非常棒的教程!)。

这就是我想出的:

CREATE DEFINER=`root`@`localhost` PROCEDURE `geo_distance`(in _location_id bigint(20), in dist int)
BEGIN
declare mylon double; 
declare mylat double;
declare lon1 float; 
declare lon2 float;
declare lat1 float; 
declare lat2 float;

-- get the original lon and lat for the userid 
select longitude, latitude into mylon, mylat from locations where locations.location_id = _location_id;
-- calculate lon and lat for the rectangle:
set lon1 = mylon - dist / abs(cos(radians(mylat)) * 69);
set lon2 = mylon + dist / abs(cos(radians(mylat)) * 69);
set lat1 = mylat - (dist / 69);
set lat2 = mylat + (dist / 69);

-- run the query:
SELECT destination.*,
3956 * 2 * ASIN(SQRT(POWER(SIN((orig.lat - dest.lat) * pi()/180 / 2), 2) +
COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) * POWER(SIN((orig.lon -dest.lon) * pi()/180 / 2), 2) )) as distance FROM locations destination, locations origin WHERE origin.location_id=_location_id
and destination.longitude between lon1 and lon2 and destination.latitude between lat1 and lat2 
having distance < dist ORDER BY Distance limit 10;
END

问题是我不知道它是什么orig.lat以及他把它带到了哪里,也许我错过了一些东西。你能指出我的错误或建议我在 MySql 中进行地理搜索的好来源吗

4

1 回答 1

1

此处正在构建的 SELECT 查询是查找距离某个点很近(在 10 个单位内)的位置 - 我们称之为 x

orig是点 x,然后对于数据库中的每条记录,您将与origlat值进行比较,lon以查看它是否足够接近以进行加载。

在实践中,假设您正在为用户加载附近的夜总会列表,orig很可能由用户输入他们的邮政编码或类似的东西来确定......

如果您仍然感到困惑,请告诉我,我可以尝试提供更多帮助。

于 2012-05-28T05:22:37.020 回答