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

更新时间:2023-07-13 00:54:46 阅读: 评论:0

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 = Radians(lng1);
ns1 = Radians(lat1);
ew2 = Radians(lng2);
ns2 = Radians(lat2);
// 经度差
dew = ew1 - ew2;
// 若跨东经和西经180 度,进⾏调整
if (dew > DEF_PI){
dew = DEF_2PI - dew;
} el if (dew < -DEF_PI){
dew = DEF_2PI + dew;
}
dx = DEF_R * s(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) + s(ns1) * s(ns2) * s(ew1 - ew2);  // 调整到[-1..1]范围内,避免溢出
if (distance > 1.0){
distance = 1.0;
} el 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)
--t @lat1 = 31.238662--;  // point1纬度
生意不好怎么办--t @lng1 = 121.466633--; // point1经度
--t @lat2 = 31.239727--; // point2纬度
--t @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)
-- ⾓度转换为弧度
t @ew1 = Radians(@lng1)-- * 0.01745329252;
t @ns1 = Radians(@lat1)-- * 0.01745329252;
t @ew2 = Radians(@lng2)-- * 0.01745329252;
美中不足的反义词
t @ns2 = Radians(@lat2)-- * 0.01745329252;
-- 经度差
t @dew = @ew1 - @ew2;
-- 若跨东经和西经180 度,进⾏调整
if (@dew > Pi())
begin
t @dew = 2 * Pi() - @dew;
生字开头的成语end
el if (@dew < -Pi())
begin
t @dew = 2 * Pi() + @dew;
end
t @dx = 6370693.5 * Cos(@ns1) * @dew -- 东西⽅向长度(在纬度圈上的投影长度) t @dy = 6370693.5 * (@ns1 - @ns2)  -- 南北⽅向长度(在经度圈上的投影长度)
-- 勾股定理求斜边长,开平⽅根
t @distance = sqrt(@dx * @dx + @dy * @dy);
return @distance;
--print @distance
END

本文发布于:2023-07-13 00:54:46,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093435.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:长度   计算   坐标   距离   投影
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图