计算两个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坐标点的距离的更多相关文章

  1. PHP计算两组经纬度坐标之间的距离

    定义π define('PI',3.1415926535898); define('EARTH_RADIUS',6378.137); 计算两组经纬度坐标 之间的距离 /** * 计算两组经纬度坐标 之 ...

  2. 计算两个GPS坐标的距离

    场景:已知两个GPS点的经纬度坐标信息.计算两点的距离. 1. 距离/纬度关系 GPS: 22.514519,113.380301 GPS: 22.511962,113.380301 距离: 284. ...

  3. 计算2个GPS坐标的距离

    本文转自 http://blog.csdn.net/ztp800201/article/details/44676867 Java 计算两个GPS坐标点之间的距离 1. Lat1 Lung1 表示A点 ...

  4. 微信lbs---返回两个经纬度坐标点的距离

    微信开发:lbs附近的商家,在数据库里记录商家的坐标,lbs设置里管理搜索半径,查询的时候,查询 客户当前坐标的半径内的所有商家列表.个人喜欢不一样,我选择了执行sql ,毕竟效果高点.微信开发必须得 ...

  5. 【机器学习实战】计算两个矩阵的成对距离(pair-wise distances)

    矩阵中每一行是一个样本,计算两个矩阵样本之间的距离,即成对距离(pair-wise distances),可以采用 sklearn 或 scipy 中的函数,方便计算. sklearn: sklear ...

  6. php计算两个经纬度地点之间的距离(转)

    php计算两个指定的经纬度地点之间的距离,这个在做计算给定某个地点的经纬度,计算其附近的商业区,以及给定地点与附近各商业区之间的距离的时候,还是用的到的.下面是具体的函数代码以及用法示例. 关于如何获 ...

  7. 计算两个latitude-longitude点之间的距离? (Haversine公式)

    问题描述 如何计算纬度和经度指定的两点之间的距离?为了澄清,我想要距离公里;这些点使用WGS84系统,我想了解可用方法的相对准确性.最佳解决方案 这个link可能对您有帮助,因为它详细说明了使用Hav ...

  8. GPS坐标定位与距离计算

    Android获取当前位置(GPS和网络定位) 1.比较: GPS准确度高但耗电多,网络定位耗电少但准确度低 2.代码 ①添加权限: AndroidManifest.xml: <!-- 两种pr ...

  9. 通过两个GPS计算两个GPS点的距离

    public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat ...

随机推荐

  1. 【POJ3667】Hotel(线段树)

    题意:有n个依次编号的元素,要求维护以下两个操作: 1.询问整个数列中是否有长度>=x的连续的一段未被标记的元素,若无输出0,若有输出最小的开始编号ans并将[ans,ans+x-1]标记 2. ...

  2. 比较全的.NET页面缓存技术文章

    原文发布时间为:2009-11-04 -- 来源于本人的百度文章 [由搬家工具导入] http://www.cnblogs.com/jacksonwj/archive/2009/07/09/15197 ...

  3. compiler related

    1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme).源程序中常见的记号可以归为几大类:关键字.标识符.字面量和特殊符号.词法分析器的输入 ...

  4. sql按照汉字首字母顺序排序(桃)

    SELECT * FROM 表名 order by CONVERT(字段名 USING gbk)

  5. [LeetCode] Valid Number 确认是否为数值

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  6. sql语句中的[]中括号(转)

    下面有关sql语句中[]的信息适用于Sql Server.Access等多种数据库. 1.sql语句中加[]是为了防止歧义,避免与系统保留关键字冲突,使计算机能识别.sql语句中有些字段可能是关键字, ...

  7. hdu 4990(数学,等比数列求和)

    Reading comprehension Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. activity dialog生命周期

    Android生命周期包括以下几个状态: onCreate(Bundle savedInstanceState):可以进行一些初始化的工作在activity第一次被创建的时候调用.这里是你做所有初始化 ...

  9. AC日记——任务查询系统 洛谷 P3168

    题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei ...

  10. java8 之CompletableFuture -- 如何构建异步应用

    什么是Future 接口 很多场景下,我们想去获取线程运行的结果,而通常使用execute方法去提交任务是无法获得结果的,这时候我们常常会改用submit方法去提交,以便获得线程运行的结果. 而sub ...