[V] - 最近距离
所有商户都有GPS坐标。当给定一个坐标,计算出离给定坐标最近的10个商户,并可再次搜索(再搜时需排除原已搜过的)。
提取算法,数据结构,缓存,存储方式,设计思想?
FIELD | TYPE | COLLATION | NULL | KEY | DEFAULT | Extra | PRIVILEGES | COMMENT |
---|---|---|---|---|---|---|---|---|
testId | INT(11) | (NULL) | NO | PRI | (NULL) | AUTO_INCREMENT | SELECT,INSERT,UPDATE,REFERENCES | 编号 |
testName | VARCHAR(64) | utf8_general_ci | NO | (NULL) | SELECT,INSERT,UPDATE,REFERENCES | |||
testLongitude | DOUBLE | (NULL) | YES | (NULL) | SELECT,INSERT,UPDATE,REFERENCES | 经度 | ||
testLatitude | DOUBLE | (NULL) | YES | (NULL) | SELECT,INSERT,UPDATE,REFERENCES | 纬度 | ||
testLatitude | DOUBLE | (NULL) | YES | (NULL) | SELECT,INSERT,UPDATE,REFERENCES | 纬度 | ||
createTime | DATETIME | (NULL) | NO | (NULL) | SELECT,INSERT,UPDATE,REFERENCES |
获取某经纬度附近dist km的商户信息,肯定要区分商户类别、经纬度、开始记录、记录数量、范围距离
DROP PROCEDURE IF EXISTS pro_getNearUser
CREATE PROCEDURE pro_getNearUser(IN mylon DOUBLE,IN mylat DOUBLE,IN begin INT,IN counts INT,IN dist INT)
BEGIN
DECLARE mylon DOUBLE;
DECLARE mylat DOUBLE;
DECLARE lon1 FLOAT;
DECLARE lon2 FLOAT;
DECLARE lat1 FLOAT;
DECLARE lat2 FLOAT;
-- 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 merchantId,3956 * 2 * ASIN(SQRT( POWER(SIN((orig.userLon - dest.userLat) * PI()/180 / 2), 2) +
COS(orig.userLat * PI()/180) * COS(dest.userLat * PI()/180) *
POWER(SIN((orig.userLon -dest.userLon) * PI()/180 / 2), 2) )) AS distance
FROM users dest, users orig
WHERE dest.userLon BETWEEN lon1 AND lon2 AND dest.userLon BETWEEN lat1 AND lat2
HAVING distance < dist
ORDER BY distance
LIMIT begin,counts;
END
作者:cripps
出处:https://beanstt.github.io
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。