关闭

sql 数据库计算经纬度

标签: sql
473人阅读 评论(0) 收藏 举报
分类:

1.也是从网络上找的方法辣
实质就是在 数据库 创建一个函数,供调用啦

CREATE FUNCTION [dbo].[fnGetDistance]
 --LatBegin 开始经度
 --LngBegin 开始维度
(@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) 

 RETURNS FLOAT 

 AS  --距离(千米)

 BEGIN              

 DECLARE  @Distance      REAL 
 DECLARE  @EARTH_RADIUS  REAL 

 SET @EARTH_RADIUS = 6378.137 

 DECLARE 

 @RadLatBegin REAL,@RadLatEnd REAL,@RadLatDiff REAL,@RadLngDiff REAL 

--在这里判断  如果数据有问题的话   就直接返回出去
 IF  @LatBegin = 0 OR @LngBegin =0 OR  @LatEnd= 0 OR @LngEnd = 0

    BEGIN
    SET @Distance = 10000

    END

--没有问题就继续 计算
 ELSE

     BEGIN

 SET @RadLatBegin = @LatBegin *PI()/180.0 
 SET @RadLatEnd = @LatEnd *PI()/180.0
 SET @RadLatDiff = @RadLatBegin - @RadLatEnd 
 SET @RadLngDiff = @LngBegin *PI()/180.0 - @LngEnd *PI()/180.0 
 SET @Distance = 2 *ASIN(
         SQRT( 
            POWER(SIN(@RadLatDiff/2), 2)+COS(@RadLatBegin)*COS(@RadLatEnd)*POWER(SIN(@RadLngDiff/2), 2)
              )
          ) 
 SET @Distance = @Distance * @EARTH_RADIUS 
 SET @Distance = Round(@Distance * 1000, 3) / 1000

     END

 RETURN @Distance 

END

在网络上看到的那个方法,没有做输入数据的判断,因为有时可能会传入0,或者是 null 这样的参数, 但是万一传入了,我试了下。还是会有输出值的,所以就稍微判断了一下
当输入的是 0 的时候 就直接给他 返回 10000 就好啦。

调用方法
` SELECT ID,CompanyName,CompanyAdress,CompanyContact,Latitude,Longitude,Phone,CompanyDescribe,CompanyShort,OfficePhone , ROUND(dbo.fnGetDistance(

#{Longitude},#{Latitude},tb_FirmInfo.Longitude,tb_FirmInfo.Latitude

),2) as Distance FROM tb_FirmInfo
WHERE CompanyType = 3`

传入的是 精度,纬度, 精度,纬度 进行计算出来的一个值,
然后我又在外面 round 取了一下精度 ,小数点后2位,
这个函数算出来的是千米单位。

2. 再就是写代码的方法了。 有时候也会用到 在计算经纬度这里。

public static final double Range = 3.0;//地球半径

    private static final double EARTH_RADIUS = 6378.137;//地球半径

    private static double rad(double d)
    {
       return d * Math.PI / 180.0;
    }


    //计算用户和出租司机距离
//  double  dis = CommonUtil.GetDistance(Double.valueOf(latitude), Double.valueOf(longitude), 
//                                       Double.valueOf( resultMap.get(i).get("latitude").toString()),
//                                       Double.valueOf( resultMap.get(i).get("longitude").toString()));

    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;
//         convert.ToInt32(s);这个是 是四舍五入
        return s;
    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:374092次
    • 积分:6819
    • 等级:
    • 排名:第3663名
    • 原创:284篇
    • 转载:79篇
    • 译文:3篇
    • 评论:115条
    欢迎加群
    Android交流群号:460115164 希望大家能在一起交流和学习。
    最新评论