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
相关推荐
根据已知点坐标计算附近位置,代码详细解释了三种计算策略。主要涉及日常需要解决问题,例如类似于滴滴打车实现查找附近车辆业务逻辑和贝壳找房根据指定位置筛选出附近房源,上述两场场景应用可借鉴代码中两种方法...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...
一个数据库连接池,JDBCInfo.java; 15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,...
显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级; (2)画布、方块显示模块: 可以根据自己的需求来自己动手更改背景图片,在方块下落过程中,根据颜色的变化识别下落的方块。 (3)背景画布模块设计: ...
第三种运行方式,在命令窗口中,变换目录到dist所在的目录,输入java -jar SemanticSpaceDemo.jar(注意,dist目录下应该有两个文件夹:lib和Dictionary,如果没有,请从上级目录中拷贝进来)。 说明:最好用第一种...
实例256 带两个类型参数的泛型 513 实例257 有界类型程序示例 514 实例258 通配符使用示例 515 实例259 泛型方法使用示例 516 实例260 泛型接口示例 518 实例261 泛型实现坐标打印 519 14.2 泛型类的继承 521 实例...
实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 ...
实例272 判断两个网址的主机名是否一样 536 实例273 测试IP的类型 537 实例274 查找主机 538 实例275 主机所支持的协议 539 15.2 URL类的使用 540 实例276 使用URL访问网页 540 实例277 URL的组成部分 541 实例278 ...
实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5...
显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级; (2)画布、方块显示模块: 可以根据自己的需求来自己动手更改背景图片,在方块下落过程中,根据颜色的变化识别下落的方块。 (3)背景画布模块设计: ...
阿里云java sdk源码 #项目在线访问地址 springboot-admin访问监控: scew项目: swagger地址: dataway接口配置: 1、集成SCREW数据库文档生成 我们可以通过SCREM两种方式生成文档 一种是通过在pom文件里面进行一系列...