求距离最小值的SQL语句
题目要求:数据库存储了位置信息(经度和纬度),现有某个位置,出与数据库已有位置最近的位置。题目限制,数据库中的位置信息特别多。
创建表:
CREATE TABLE `test`.`postition` ( `id` INT NOT NULL AUTO_INCREMENT, `longitude` VARCHAR(45) NOT NULL, `latitude` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`)); |
插入一些测试数据:
INSERT INTO `test`.`position` (`longitude`, `latitude`) VALUES ('20.3', '40.5'); INSERT INTO `test`.`position` (`longitude`, `latitude`) VALUES ('21.3', '41.5'); INSERT INTO `test`.`position` (`longitude`, `latitude`) VALUES ('19.3', '40.5'); INSERT INTO `test`.`position` (`longitude`, `latitude`) VALUES ('20.5', '40.9'); |
先不考虑位置信息量大的问题,假设某个位置为(20.3,40.5)
select * from position where mod(longitude-20.3, 2) + mod(latitude-40.5,2) =(select min(mod(longitude-20.3, 2) + mod(latitude-40.5,2)) from postition |
sql语句的功能有 |
但是当数据库中数据量很大时,效率会下降很多。基于这数据量很大,可以预设一个阀值,在某个阀值范围内查。例如阀值设为2,即给定位置与数据库里位置经度或纬度之差不大于2时,再出最小距离。
select * from position where mod(longitude-20.3, 2) + mod(latitude-40.5,2) =(select min(mod(longitude-20.3, 2) + mod(latitude-40.5,2)) from (select * from position p1 where ABS(p1.longitude-20.3)<2 && ABS(p1.latitude-40)<2) as r) |
以上对距离的计算是基于范围较小的区域,并且假设地面是平的,而经度纬度是平面坐标的基础上。事实上,基于经纬度计算距离的方法(C#实现)
private const double EARTH_RADIUS = 6378.137;//地球半径 private static double rad(double d) { return d * Math.PI / 180.0; } public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) + Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2))); s = s * EARTH_RADIUS; s = Math.Round(s * 10000) / 10000; return s; } |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论