`
liuxing87327
  • 浏览: 82788 次
  • 性别: 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、js或mysql计算高德地图中两坐标之间的距离

    在本文中,我们将探讨如何利用Java、JavaScript(JS)以及MySQL来计算高德地图中两个坐标点之间的距离。首先,我们需要了解的是,高德地图使用的是WGS84坐标系,这是一种全球通用的地理坐标系统,它以经纬度来表示...

    Java通过经纬度坐标获取两个点之间的直线距离的示例

    本文主要介绍了Java通过经纬度坐标获取两个点之间的直线距离的示例,通过示例代码详细介绍了计算两个点之间的直线距离的方法,对大家的学习或者工作具有一定的参考学习价值。 一、经纬度坐标获取两个点之间的直线...

    mysql函数-根据经纬度坐标计算距离

    在MySQL数据库中,计算两个地理位置之间的距离通常涉及到地理坐标系统,即经纬度。经纬度坐标是地球表面位置的标准表示方式,其中经度表示东西方向,纬度表示南北方向。本篇文章将详细介绍如何利用MySQL的内置函数和...

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

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

    java 日出日落时间计算

    下面我们将深入探讨这两个版本的实现原理以及它们在实际应用中的价值。 首先,让我们来看Java版本的日出日落时间计算。Java提供了丰富的库来处理日期和时间,如Java 8引入的`java.time`包。通常,计算日出日落会...

    已知一点坐标和经纬度求其它经纬度坐标或相应坐标经纬度

    经纬度坐标系统使用两个角度来定义地球表面上任意一点的位置:经度(Longitude)和纬度(Latitude)。 - **纬度**:范围从 -90° 到 +90°,其中0°代表赤道,+90°代表北极点,-90°代表南极点。 - **经度**:范围...

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

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

    数据库中的二维数据在坐标系中描绘其关系曲线Jsp网页版

    标题 "数据库中的二维数据在坐标系中描绘其关系曲线Jsp网页版" 涉及的是如何使用JSP(JavaServer Pages)技术在网页上展示从数据库中获取的二维数据的关系曲线。在这个场景中,数据库存储了两列数值,它们可能是成对...

    省市区县中心点坐标 20181130

    描述中提到的“SQL Server 的版本和 MySQL的版本”表明该数据集可能提供了两种数据库系统的版本,这可能是因为开发人员或研究人员在不同的环境下使用了这两种数据库系统来存储和管理这些坐标数据。SQL Server是微软...

    shp文件解析java实现

    本篇文章将详细讲解如何使用`meteoInfo`和`geotools`这两个Java库来解析`shp`文件,提取其中的数据,并获取边界线数据、中心点坐标以及最大和最小经纬度值。 `meteoInfo`是一个专门处理气象数据的Java库,虽然它的...

    java源码包2

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

    Oracle sdo_geometry空间坐标系转换

    在讨论具体的转换方法之前,我们首先需要了解两个基本概念:大地坐标系和投影坐标系。 - **大地坐标系**(Geographic Coordinate System):这是一种使用经度和纬度来定义地球上任意一点位置的坐标系统。在Oracle中...

    ISODATA java代码工程

    1. **合并步骤**:如果两个类别的距离小于某个阈值,那么这两个类别将被合并为一个新的类别。 2. **分裂步骤**:如果一个类别的标准偏差(或其它聚类度量)超过某个阈值,那么这个类别会被分裂为两个新的类别。 在...

    java源码包3

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

    基于java的一些地理围栏算法实现 .zip

    接着,我们需要一个方法来计算两个地点之间的距离。这里可以使用Haversine公式,它基于地球的半径来计算地球上两点之间的大圆距离。在Java中实现如下: ```java public static double distanceInKm(Location loc1, ...

    JAVA编写的AE二次开发程序

    2. **距离量算**:这项功能允许用户计算两个地理对象之间的直线距离、最短路径距离或其他类型的网络距离。在GIS中,这通常涉及到几何对象的坐标计算,以及考虑到地形和障碍的网络分析。 3. **数据库连接**:此程序...

    三角质心定位法--JAVA算法的实现

    在JAVA中实现这个算法,首先需要定义一个`Coordinate`类来表示二维坐标,通常包含`x`和`y`两个属性,以及相关的操作方法,如计算两点间距离、拷贝坐标等。例如: ```java public class Coordinate { private ...

    Java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+数据库).zip

    2. **Swing或JavaFX**:这两个是Java用于构建GUI的库。开发者可能使用其中之一来创建俄罗斯方块的游戏界面,包括游戏区、控制面板、得分显示等元素。 3. **游戏算法**:项目中的核心算法包括方块生成、旋转、下落、...

    数据库geometry导出成矢量shape

    实现这个功能的两个关键步骤是: 1. **坐标点表导出成矢量Shape**: 这一步涉及从数据库中读取包含点坐标的数据表,通常是通过SQL查询获取。每条记录可能代表一个点的坐标(经度和纬度)。然后,使用GIS库(如GDAL...

Global site tag (gtag.js) - Google Analytics