求距离最小值的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小时内删除。