sql 数据库计算经纬度

来源:互联网 发布:js input 样式 编辑:程序博客网 时间:2024/06/05 11:51

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
原创粉丝点击