计算两个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 ...
 
随机推荐
- Vim查找替换及正则表达式的使用
			
原文地址:http://tanqisen.github.io/blog/2013/01/13/vim-search-replace-regex/ 简单替换表达式 :[range]s/from/to/[ ...
 - 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表
			
在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...
 - systemd 开机无法启动privoxy
			
此博客不在更新,我的博客新地址:www.liuquanhao.com ----------------------------------------------------------------- ...
 - hdu 4519(数学题)
			
郑厂长系列故事——体检 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
 - webapi net 直接更改协议头
			
1.直接更改协议头 [HttpGet] public HttpResponseMessage Users() { var sites = new object(); string str = tool ...
 - Jquery 返回json数据在IE浏览器中提示下载的问题
			
Jquery 返回json数据,IE浏览器提示下载的问题,当提交完数据后返回的本来是json数据的,在火弧里测试正常,解决方法如下 今天遇到Jquery 返回json数据,IE浏览器提示下载的问题,当 ...
 - Word Pattern - LeetCode
			
Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...
 - centos6.7下安装配置vnc
			
vnc是一款使用广泛的服务器管理软件,可以实现图形化管理,下面简单介绍一下如何在centos6.7下安装vnc. 1.安装vncserver yum install tigervnc tigervnc ...
 - Linux ClientDataSet libmidas.so.2
			
Linux ClientDataSet libmidas.so.2 DELPHI LINUX程序使用CLIENTDATASET控件,部署的时候需要libmidas.so,相当于WINDOWS程序的MI ...
 - Oracle 11gR2 RAC 单网卡 转 双网卡绑定 配置步骤
			
之前写过一篇双网卡绑定的文章,如下: Oracle RAC 与 网卡绑定 http://blog.csdn.net/tianlesoftware/article/details/6189639 Ora ...