**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;
}