计算两个GPS坐标点的距离
计算两个GPS坐标点的距离,第一个参数是第一个点的维度,第二个参数是第一个点的经度
http://yuninglovekefan.blog.sohu.com/235655696.html
/**
*
*/
package utils; /**
* 坐标计算的工具类
*
* @author ywf
*
*/
public class PositionUtils { private static final double EARTH_RADIUS = 6371.004;
static double pi = 3.14159265358979324;
static double a = 6378245.0;
static double ee = 0.00669342162296594323;
static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; /**
* 将一个点坐标转换为百度坐标
*
* @param point
*/
public static double[] transBMapPosition(double wgLat, double wgLon) {
if (wgLat == 0 || wgLon == 0)
return null;
double[] MarsGPS = transform(wgLat, wgLon);
double x = MarsGPS[1], y = MarsGPS[0];
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
MarsGPS[0] = z * Math.sin(theta) + 0.0060068;
MarsGPS[1] = z * Math.cos(theta) + 0.0065054;
return MarsGPS;
} // World Geodetic System ==> Mars Geodetic System
private static double[] transform(double wgLat, double wgLon) {
double[] ret = new double[2];
ret[0] = wgLat;
ret[1] = wgLon;
double mgLat, mgLon;
if (outOfChina(wgLat, wgLon)) {
mgLat = wgLat;
mgLon = wgLon;
ret[0] = mgLat;
ret[1] = mgLon;
return ret;
}
double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
double radLat = wgLat / 180.0 * pi;
double magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
mgLat = wgLat + dLat;
mgLon = wgLon + dLon; ret[0] = mgLat;
ret[1] = mgLon;
return ret;
} private static boolean outOfChina(double lat, double lon) {
if (lon < 72.004 || lon > 137.8347)
return true;
if (lat < 0.8293 || lat > 55.8271)
return true;
return false;
} private static double transformLat(double x, double y) {
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
+ 0.2 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
return ret;
} private static double transformLon(double x, double y) {
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
* Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0
* pi)) * 2.0 / 3.0;
return ret;
} /**
* @param lat1
* 纬度
* @param lng1
* 经度
* @param lat2
* 纬度
* @param lng2
* 经度
* @return
*/
public static double getDistance(double lat1, double lng1, double lat2,
double lng2) {
double radLat1 = lat1;
double radLat2 = lat2;
double a = lng1 - lng2; double s = Math.acos(Math.cos(radLat1) * Math.cos(radLat2)
* Math.cos(a) + Math.sin(radLat1) * Math.sin(radLat2));
s = s * EARTH_RADIUS * 1000 * Math.PI / 180.0;
return s;
} /**
* @param lat_a 维度
* @param lng_a 经度
* @param lat_b
* @param lng_b
* @return
*/
private static double gps2m(double lat_a, double lng_a, double lat_b, double lng_b) { double pk = (double) (180/3.14169); double a1 = lat_a / pk; double a2 = lng_a / pk; double b1 = lat_b / pk; double b2 = lng_b / pk; double t1 = Math.cos(a1)*Math.cos(a2)*Math.cos(b1)*Math.cos(b2); double t2 = Math.cos(a1)*Math.sin(a2)*Math.cos(b1)*Math.sin(b2); double t3 = Math.sin(a1)*Math.sin(b1); double tt = Math.acos(t1 + t2 + t3); return 6366000*tt; } /**
* 每个点元素为经度,纬度
*
* @param node1
* @param node2
* @return
*/
public static double getDistince(double[] node1, double[] node2) {
return getDistance(node1[1], node1[0], node2[1], node2[0]);
}
private static double rad(double d)
{
return d * Math.PI / 180.0;
} public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double 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 * EARTH_RADIUS*1000;
//s = Math.round(s * 10000) / 10000;
return s;
}
public static void main(String[] args) {
double distance = getDistance(36.74114227294922, 119.14092225294847, 36.70890173661081, 119.12844896818463);
System.out.println(distance);
System.out.println(gps2m(36.74114227294922, 119.14092225294847, 36.70890173661081, 119.12844896818463));
System.out.println(GetDistance(36.74114227294922, 119.14092225294847, 36.70890173661081, 119.12844896818463));
double[] rs = transBMapPosition(36.699466705322266,119.0972188313802);
System.out.println("百度坐标:" + rs[1] + "," + rs[0]);
}
}
计算两个GPS坐标点的距离的更多相关文章
- PHP计算两组经纬度坐标之间的距离
定义π define('PI',3.1415926535898); define('EARTH_RADIUS',6378.137); 计算两组经纬度坐标 之间的距离 /** * 计算两组经纬度坐标 之 ...
- 计算两个GPS坐标的距离
场景:已知两个GPS点的经纬度坐标信息.计算两点的距离. 1. 距离/纬度关系 GPS: 22.514519,113.380301 GPS: 22.511962,113.380301 距离: 284. ...
- 计算2个GPS坐标的距离
本文转自 http://blog.csdn.net/ztp800201/article/details/44676867 Java 计算两个GPS坐标点之间的距离 1. Lat1 Lung1 表示A点 ...
- 微信lbs---返回两个经纬度坐标点的距离
微信开发:lbs附近的商家,在数据库里记录商家的坐标,lbs设置里管理搜索半径,查询的时候,查询 客户当前坐标的半径内的所有商家列表.个人喜欢不一样,我选择了执行sql ,毕竟效果高点.微信开发必须得 ...
- 【机器学习实战】计算两个矩阵的成对距离(pair-wise distances)
矩阵中每一行是一个样本,计算两个矩阵样本之间的距离,即成对距离(pair-wise distances),可以采用 sklearn 或 scipy 中的函数,方便计算. sklearn: sklear ...
- php计算两个经纬度地点之间的距离(转)
php计算两个指定的经纬度地点之间的距离,这个在做计算给定某个地点的经纬度,计算其附近的商业区,以及给定地点与附近各商业区之间的距离的时候,还是用的到的.下面是具体的函数代码以及用法示例. 关于如何获 ...
- 计算两个latitude-longitude点之间的距离? (Haversine公式)
问题描述 如何计算纬度和经度指定的两点之间的距离?为了澄清,我想要距离公里;这些点使用WGS84系统,我想了解可用方法的相对准确性.最佳解决方案 这个link可能对您有帮助,因为它详细说明了使用Hav ...
- GPS坐标定位与距离计算
Android获取当前位置(GPS和网络定位) 1.比较: GPS准确度高但耗电多,网络定位耗电少但准确度低 2.代码 ①添加权限: AndroidManifest.xml: <!-- 两种pr ...
- 通过两个GPS计算两个GPS点的距离
public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat ...
随机推荐
- BZOJ 3384 上帝与集合的正确用法
上帝与集合的正确用法 [问题描述] [输入格式] 第一行一个T,接下来T行,每行一个正整数p,代表你需要取模的值. [输出格式] T行,每行一个正整数,为答案对p取模后的值. [样例输入] 3236 ...
- Manjaro Linux下使用powerline
作为linux的重度使用者,vim和bash的使用也非常平凡,总想有点不同,感觉千篇一律的提示符已经看的厌倦了.作为广大网友的推荐的powerline可以为bash和vim的提示符美化增色不少.下面请 ...
- Python 数据类型-2
序列 包括:字符串 列表 元组 索引操作和切片操作 索引操作:可以从序列中抓取一个特定的项目 切片操作: 获取序列的一个切片,即一部分序列 序列的通用方法: len() 求序列的长度 + 连接2个序列 ...
- CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】
B. Powers of Two You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i, ...
- Swift 基础部分(建议掌握OC字符串知识的翻阅)
更新说明: Swift 目前已经发布到4.0版本了,以前写的这整个Swift学习系列的文章,有很多的不足之处,我会重新整理整个系列文章,也是相当于重新复习一遍Swift,后面系列文章的改动之处全都会做 ...
- Xamarin XAML语言教程Visual Studio中实现XAML预览
Xamarin XAML语言教程Visual Studio中实现XAML预览 每次通过编译运行的方式查看XAML文件效果,需要花费大量的时间.如果开发者使用XAML对UI进行布局和设计,可以通过预览的 ...
- POJ 1961 Period KMP算法之next数组的应用
题意:给一个长度为n的字符串,如果它长度为l(2 <= l <= n)的前缀部分是由一些相同的字符串相接而成,输出前缀的长度l和长度为l时字符串重复的最大次数. 例如字符串为: aaaba ...
- 泽熙学到的 z
叶展,原泽熙投资总经理助理,现任齐鲁证券资产管理公司总裁助理,齐鲁星空.星汉等集合理财投资经理. 导读:三年前,我加入了泽熙投资,正式成为一名职业投资者.做职业投资者一直是我的理想.在股市中用眼光和头 ...
- mac下安装好sencha cmd后每次都需要输入source ~/.bash_profile
解决办法: 在终端输入vim ~/.zshrc加一句 source ~/.bash_profile
- vue2.0 仿手机新闻站(二)项目结构搭建 及 路由配置
1.项目结构 $ vue init webpack-simple news $ npm install vuex vue-router axios style-loader css-loader -D ...