`
liuxing87327
  • 浏览: 81249 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java&数据库计算两个坐标的距离

阅读更多

 

1.使用Java进行计算

 

/**
 * 类功能说明:地图坐标距离计算工具类
 * Title: DistanceUtil.java
 * @author liuxing
 * @date 2013-9-8 下午10:36:03
 * @version V1.0
 */
public class DistanceUtil {

	private static double DEF_PI = Math.PI; // PI
	private static double DEF_2PI = Math.PI * 2; // 2*PI
	private static double DEF_PI180 = Math.PI / 180; // PI/180.0
	private static double DEF_R = 6370693.5; // 地球半径

	/**
	 * 
	 * 功能说明:计算两个地图坐标点之间的距离(近距离计算)
	 * liuxing 2013-9-8 下午10:42:17
	 * @param lng1 起点经度
	 * @param lat1 起点纬度
	 * @param lng2 终点经度
	 * @param lat2 终点纬度
	 * @return
	 */
	public static double getShortDistance(double lng1, double lat1, double lng2, double lat2) {
		double ew1, ns1, ew2, ns2;
		double dx, dy, dew;
		double distance;
		// 角度转换为弧度
		ew1 = Math.toRadians(lng1);
		ns1 = Math.toRadians(lat1);
		ew2 = Math.toRadians(lng2);
		ns2 = Math.toRadians(lat2);
		
		// 经度差
		dew = ew1 - ew2;
		// 若跨东经和西经180 度,进行调整
		if (dew > DEF_PI){
			dew = DEF_2PI - dew;
		} else if (dew < -DEF_PI){
			dew = DEF_2PI + dew;
		}
			
		dx = DEF_R * Math.cos(ns1) * dew; 	// 东西方向长度(在纬度圈上的投影长度)
		dy = DEF_R * (ns1 - ns2); 			// 南北方向长度(在经度圈上的投影长度)
		// 勾股定理求斜边长
		distance = Math.sqrt(dx * dx + dy * dy);
		return distance;
	}

	/**
	 * 
	 * 功能说明:计算两个地图坐标点之间的距离(远距离计算)
	 * liuxing 2013-9-8 下午10:43:21
	 * @param lng1 起点经度
	 * @param lat1 起点纬度
	 * @param lng2 终点经度
	 * @param lat2 终点纬度
	 * @return
	 */
	public static double getLongDistance(double lng1, double lat1, double lng2, double lat2) {
		double ew1, ns1, ew2, ns2;
		double distance;
		
		// 角度转换为弧度
		ew1 = lng1 * DEF_PI180;
		ns1 = lat1 * DEF_PI180;
		ew2 = lng2 * DEF_PI180;
		ns2 = lat2 * DEF_PI180;
		
		// 求大圆劣弧与球心所夹的角(弧度)
		distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1) * Math.cos(ns2) * Math.cos(ew1 - ew2);
		// 调整到[-1..1]范围内,避免溢出
		if (distance > 1.0){
			distance = 1.0;
		} else if (distance < -1.0){
			distance = -1.0;
		}
		
		// 求大圆劣弧长度
		distance = DEF_R * Math.acos(distance);
		return distance;
	}
	
	public static void main(String[] args) {
		double mLat1 = 31.24081800000000; 	// point1纬度
		double mLng1 = 121.46541700000000; 	// point1经度
		double mLat2 = 31.239946;	// point2纬度
		double mLng2 = 121.466417;	// point2经度
		
		double distanceByShort = getShortDistance(mLng1, mLat1, mLng2, mLat2);
		System.out.println(distanceByShort);
		
		double distanceByLong = getLongDistance(mLng1, mLat1, mLng2, mLat2);
		System.out.println(distanceByLong);
	}

}

 

 

2.使用SqlServer函数计算

    其他数据库版本请找到相应的函数替换后移植

 

-- =============================================
-- Author:      liuxing
-- Create date: 2013-09-10
-- Description:	计算2个坐标点的距离(短距离计算)
-- =============================================
CREATE function dbo.fn_getShortDistance(
	 @lng1 decimal(19,11)
	,@lat1 decimal(19,11)
	,@lng2 decimal(19,11)
	,@lat2 decimal(19,11)
)
returns decimal(19,11)
AS
BEGIN
	--declare @lng1 decimal(19,11)
	--declare @lat1 decimal(19,11)
	--declare @lng2 decimal(19,11)
	--declare @lat2 decimal(19,11)


	--set @lat1 = 31.238662--; 	// point1纬度
	--set @lng1 = 121.466633--; // point1经度
	--set @lat2 = 31.239727--;	// point2纬度
	--set @lng2 = 121.462745--;	// point2经度
	declare @ew1 decimal(19,11)
		, @ns1 decimal(19,11)
		, @ew2 decimal(19,11)
		, @ns2 decimal(19,11)
		, @dx decimal(19,11)
		, @dy decimal(19,11)
		, @dew decimal(19,11)
		, @distance decimal(19,11)
	-- 角度转换为弧度
	set @ew1 = Radians(@lng1)-- * 0.01745329252;
	set @ns1 = Radians(@lat1)-- * 0.01745329252;
	set @ew2 = Radians(@lng2)-- * 0.01745329252;
	set @ns2 = Radians(@lat2)-- * 0.01745329252;
	-- 经度差
	set @dew = @ew1 - @ew2;
	-- 若跨东经和西经180 度,进行调整
	if (@dew > Pi())
	begin
		set @dew = 2 * Pi() - @dew;
	end
	else if (@dew < -Pi())
	begin
		set @dew = 2 * Pi() + @dew;
	end
		
	set @dx = 6370693.5 * Cos(@ns1) * @dew -- 东西方向长度(在纬度圈上的投影长度)
	set @dy = 6370693.5 * (@ns1 - @ns2)   -- 南北方向长度(在经度圈上的投影长度)
	-- 勾股定理求斜边长,开平方根
	set @distance = sqrt(@dx * @dx + @dy * @dy);
	return @distance;
	--print @distance
END

 

 

分享到:
评论

相关推荐

    根据当前坐标(经纬度)计算附近位置-java版本

    根据已知点坐标计算附近位置,代码详细解释了三种计算策略。主要涉及日常需要解决问题,例如类似于滴滴打车实现查找附近车辆业务逻辑和贝壳找房根据指定位置筛选出附近房源,上述两场场景应用可借鉴代码中两种方法...

    java源码包---java 源码 大量 实例

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    java源码包4

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    java源码包3

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    JAVA上百实例源码以及开源项目源代码

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    java源码包2

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...

    JAVA上百实例源码以及开源项目

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...

    java jdk实列宝典 光盘源代码

    一个数据库连接池,JDBCInfo.java; 15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,...

    java俄罗斯方块项目.zip

    显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级; (2)画布、方块显示模块: 可以根据自己的需求来自己动手更改背景图片,在方块下落过程中,根据颜色的变化识别下落的方块。 (3)背景画布模块设计: ...

    语义关联词汇检索系统Beta版

    第三种运行方式,在命令窗口中,变换目录到dist所在的目录,输入java -jar SemanticSpaceDemo.jar(注意,dist目录下应该有两个文件夹:lib和Dictionary,如果没有,请从上级目录中拷贝进来)。 说明:最好用第一种...

    java范例开发大全(pdf&源码)

    实例256 带两个类型参数的泛型 513 实例257 有界类型程序示例 514 实例258 通配符使用示例 515 实例259 泛型方法使用示例 516 实例260 泛型接口示例 518 实例261 泛型实现坐标打印 519 14.2 泛型类的继承 521 实例...

    java范例开发大全源代码

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12 ...

    java范例开发大全

    实例272 判断两个网址的主机名是否一样 536 实例273 测试IP的类型 537 实例274 查找主机 538 实例275 主机所支持的协议 539 15.2 URL类的使用 540 实例276 使用URL访问网页 540 实例277 URL的组成部分 541 实例278 ...

    Java范例开发大全 (源程序)

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5...

    基于java做的俄罗斯方块项目(源码+视频+论文+数据库).rar

    显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级; (2)画布、方块显示模块: 可以根据自己的需求来自己动手更改背景图片,在方块下落过程中,根据颜色的变化识别下落的方块。 (3)背景画布模块设计: ...

    阿里云javasdk源码-MyScrew:Screw数据库文档生成,DataWay接口自动配置,JApiDocs接口文档生成,Swagger在

    阿里云java sdk源码 #项目在线访问地址 springboot-admin访问监控: scew项目: swagger地址: dataway接口配置: 1、集成SCREW数据库文档生成 我们可以通过SCREM两种方式生成文档 一种是通过在pom文件里面进行一系列...

Global site tag (gtag.js) - Google Analytics