mysql函数计算两个坐标之间的直线距离

创建mysql 函数 用来计算坐标距离

 
SET GLOBAL log_bin_trust_function_creators=1;
 
DROP FUNCTION GetDistance;
 
DELIMITER $$
 
-- 计算两点直线距离 传入参数
-- 返回距离 单位为米
CREATE FUNCTION GetDistance (lat1 DOUBLE ,lng1 DOUBLE ,lat2 DOUBLE ,lng2 DOUBLE )
	RETURNS DOUBLE
BEGIN
	DECLARE radLat1 DOUBLE ;
	DECLARE radLng1 DOUBLE ;
	DECLARE radLat2 DOUBLE ;
	DECLARE radLng2 DOUBLE;
	DECLARE a DOUBLE;
	DECLARE b DOUBLE;
	DECLARE p DOUBLE ;
	SET p =  PI();
	SET radLat1 = lat1 * (p)/ 180.0;
	SET radLng1 = lng1 * (p)/ 180.0;
	SET radLat2 = lat2 * (p)/ 180.0;
	SET radLng2 = lng2 * (p)/ 180.0;
	SET  a = radLat1 - radLat2;
	SET  b = radLng1 - radLng2;
	RETURN  1000 * ROUND (2 * ASIN(SQRT(POW(SIN(a/2),2) + COS(radLat1)*COS(radLat2)*POW(SIN(b/2),2))) *6378.137  * 10000 ) /10000;
END$$

测试语句

SELECT GetDistance( 39.911146,116.433593  ,39.911033,116.437677) AS distance
 
348.9
 
/**
	 * 获取两点之间的距离
	 * @param a
	 * @param b
	 * @return
	 */
	public static double GetDistance(Location a,Location b){
 
		try{
 
			String jsstring = " function GetDistance( lat1,  lng1,  lat2,  lng2){ " +
				"if( ( Math.abs( lat1 ) > 90  ) ||(  Math.abs( lat2 ) > 90 ) ){" +
				"        return 0;" +
				"}" +
				"if( ( Math.abs( lng1 ) > 180  ) ||(  Math.abs( lng2 ) > 180 ) ){" +
				"        return 0;" +
				"}" +
 
				"var radLat1 =  lat1 * Math.PI / 180.0;" +
				"var radLat2 =  lat2 * Math.PI / 180.0;" +
				"var radLng1 =  lng1 * Math.PI / 180.0;" +
				"var radLng2 =  lng2 * Math.PI / 180.0;" +
				"var  a = radLat1 - radLat2;" +
				"var  b = radLng1 - radLng2;" +
				"var 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 *6378.137 ;" +
				"s = Math.round(s * 10000) / 10000;" +
				"return s*1000;" +
				"}";
 
			ScriptEngineManager mgr = new ScriptEngineManager(); 
			ScriptEngine engine = mgr.getEngineByName("JavaScript");
			engine.eval(jsstring); 
			Invocable inv = (Invocable) engine;   
			Object ob = inv.invokeFunction("GetDistance",a.getLat(),a.getLng(),b.getLat(),b.getLng());
			if(ob instanceof Double ){
				return (Double)ob;
			}
		}catch(Exception e){
			log.error(e.getMessage(),e);
			return -1;
		}
		return -1;
 
	}

QQ图片20131023114314

原创文章,转载请注明: 转载自海波无痕

本文链接地址: mysql函数计算两个坐标之间的直线距离

文章的脚注信息由WordPress的wp-posturl插件自动生成

此条目发表在server分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论链接可以 移除 nofollow.