android 两点距离计算公式,Android 计算地球上任意两点(经纬度)距离
方法一:
/**
* 计算地球上任意两点(经纬度)距离
*
* @param long1
* 第一点经度
* @param lat1
* 第一点纬度
* @param long2
* 第二点经度
* @param lat2
* 第二点纬度
* @return 返回距离 单位:米
*/
public static double Distance(double long1, double lat1, double long2, double lat2) {
double a, b, R;
R = 6378137; // 地球半径
lat1 = lat1 * Math.PI / 180.0;
lat2 = lat2 * Math.PI / 180.0;
a = lat1 - lat2;
b = (long1 - long2) * Math.PI / 180.0;
double d;
double sa2, sb2;
sa2 = Math.sin(a / 2.0);
sb2 = Math.sin(b / 2.0);
d = 2
* R
* Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)
* Math.cos(lat2) * sb2 * sb2));
return d;
}
方法二:(恋家厨房中用的)
private const double EARTH_RADIUS = 6378.137;
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;
s = Math.Round(s * 10000) / 10000;
return s;
}
工具类:
import android.util.Log;
import com.baidu.mapapi.model.LatLng;
/**
* Created by SRain on 2015/10/16.
*
* 计算两点间距离
*
* 路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法。
* 如果是计算任意两点的距离,有两种方法:
* 一种利用勾股定理计算,适用于两点距离很近的情况;
* 一种按标准的球面大圆劣弧长度计算,适用于距离较远的情况。
*/
public class CalculateDistanceUtils {
static double DEF_PI = 3.14159265359; // PI
static double DEF_2PI = 6.28318530712; // 2*PI
static double DEF_PI180 = 0.01745329252; // PI/180.0
static double DEF_R = 6370693.5; // radius of earth
/**
* 利用勾股定理计算,适用于两点距离很近的情况;
*
* @param lon1
* @param lat1
* @param lon2
* @param lat2
* @return
*/
public double GetShortDistance(double lon1, double lat1, double lon2, double lat2) {
double ew1, ns1, ew2, ns2;
double dx, dy, dew;
double distance;
// 角度转换为弧度
ew1 = lon1 * DEF_PI180;
ns1 = lat1 * DEF_PI180;
ew2 = lon2 * DEF_PI180;
ns2 = lat2 * DEF_PI180;
// 经度差
dew = ew1 - ew2;
// 若跨东经和西经180 度,进行调整
if (dew > DEF_PI)
dew = DEF_2PI - dew;
else if (dew
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;
}
/**
* 按标准的球面大圆劣弧长度计算,适用于距离较远的情况。
*
* @param lon1
* @param lat1
* @param lon2
* @param lat2
* @return
*/
public double GetLongDistance(double lon1, double lat1, double lon2, double lat2) {
double ew1, ns1, ew2, ns2;
double distance;
// 角度转换为弧度
ew1 = lon1 * DEF_PI180;
ns1 = lat1 * DEF_PI180;
ew2 = lon2 * 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
distance = -1.0;
// 求大圆劣弧长度
distance = DEF_R * Math.acos(distance);
return distance;
}
/**
* 按标准的球面大圆劣弧长度计算,适用于距离较远的情况。
*
* @param atLatLng 当前位置
* @param guideLatLng 景点位置
* @return
*/
public static double GetLongDistance(LatLng atLatLng, LatLng guideLatLng) {
double ew1, ns1, ew2, ns2;
double distance;
// 角度转换为弧度
ew1 = atLatLng.longitude * DEF_PI180;
ns1 = atLatLng.latitude * DEF_PI180;
ew2 = guideLatLng.longitude * DEF_PI180;
ns2 = guideLatLng.latitude * 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
distance = -1.0;
// 求大圆劣弧长度
distance = DEF_R * Math.acos(distance);
return distance;
}
/**
* 按标准的球面大圆劣弧长度计算,适用于距离较远的情况。
*
* @param atLatLng 当前位置
* @param longitude 景点位置
* @param latitude 景点位置
* @return
*/
public static double GetLongDistance(LatLng atLatLng, double longitude, double latitude) {
double ew1, ns1, ew2, ns2;
double distance;
// 角度转换为弧度
ew1 = atLatLng.longitude * DEF_PI180;
ns1 = atLatLng.latitude * DEF_PI180;
ew2 = longitude * DEF_PI180;
ns2 = latitude * 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
distance = -1.0;
// 求大圆劣弧长度
distance = DEF_R * Math.acos(distance);
// Log.e("distance", "atLatLng" + atLatLng.latitude + " " + atLatLng.longitude + "\n" + "longitude:" + longitude + "latitude" + latitude + "\n dis:" + distance);
return distance;
}
/**
* 比较景点信息
* 当前位置是否在景区中
*
* @param atLatLng 当前位置
* @param longitude 景点位置
* @param latitude 景点位置
* @param radius 景点范围半径
* @return
*/
public static boolean isAtRange(LatLng atLatLng, double longitude, double latitude, double radius) {
boolean b = false;
// 获取当前位置和景区位置的距离
double distance = GetLongDistance(atLatLng, longitude, latitude);
if (radius > distance) {
b = true;
}
Log.e("-----distance-----", "\n distance:" + distance + "\n radius:" + radius + "\n b:" + b);
return b;
}
}
android 两点距离计算公式,Android 计算地球上任意两点(经纬度)距离相关推荐
- JAVA 计算地球上任意两点(经纬度)距离
/*** 计算地球上任意两点(经纬度)距离* * @param long1* 第一点经度* @param lat1* 第一点纬度* @param long2* 第二点经度* @param lat2* ...
- 由经纬度计算地球上任意两点的距离
由经纬度计算地球上任意两点的距离 在地球上,城市的地理位置.GPS定位.一些地标的地理位置等是由经纬度给出的,本文主要根据两个地理位置的经纬度,来计算两个地理位置之间的距离. %计算城市间距离 zb= ...
- 计算球面上任意两点间的球面距离(C++实现)
文章目录 1 预备知识 2 原理描述 3 代码实现 1 预备知识 在求解此问题之前首先要明确一下几点: (1)两点间的球面距离: 球面上两点间的最短距离,即球心与球面上两点所确定的平面与球面相交,得到 ...
- 根据地球上任意两点的经纬度计算两点间的距离
http://blog.chinaunix.net/u/6776/showart_694778.html 地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为6356.755千米, ...
- Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现
目录 方式一:自定义公式计算 方式二:geodesy计算距离 方式三:geotools计算距离 两个点的经纬度 latitude纬度 longitude经度 地点 22.678611 113.8056 ...
- 怎么用Python计算地球上任意两个用经纬度表示的点的弧面距离?
这是来自知乎上的问题.问我的时候,恰好我在写一个和向量计算相关的文章,于是灵光乍现,顺手写了这样一个答案.该算法未经严格验证,请谨慎参考.具体思路如下. 将两个点的经纬度换算成空间坐标: 计算地心与两 ...
- php 计算两点时间距离,PHP计算地球上两点之间的距离(示例详解)
给定经度和纬度,求地球上两点之间的距离.首先我们需要了解该问题的解决思路,然后再用PHP代码来实现计算. 此问题可以用半正矢(haversine)公式求解: 大圆距离或正交距离是球面(或地球表面)上两 ...
- 根据经纬度计算地球上两点之间的距离——Haversine公式介绍及计算步骤
目录 摘要 1.半正矢公式(Haversine Formula)介绍 2.半正矢公式应用 3.半正矢公式计算 3.1 主要思路 3.2 计算步骤 3.2.1 平面向量计算方法 3.2.2 空间向量计算 ...
- 给定经纬度计算距离_根据经纬度计算地球上两点之间的距离js实现代码
利用JS实现的根据经纬度计算地球上两点之间的距离 最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面 ...
- C语言入门实战(2):求平面上任意两点之间的距离
这是<C语言入门实战>系列的第2篇. 上一篇:C语言入门实战(1):准备开发环境.快速上手main()函数 下一篇:C语言入门实战(3):秒数转换为时:分:秒 文章目录 题目 提示 参考代 ...
最新文章
- mysql的判断更新_mysql判断记录是否存在,存在则更新,不存在则插入
- 栈的链式存储及常用操作
- hyperv的安装与使用
- C++:18---const关键字(附常量指针、指针常量、常量指针常量)
- svm算法原理_机器学习——分类算法(1)
- 学术前沿 | Texar-PyTorch:在PyTorch里重现TensorFlow的最佳特性
- ★LeetCode(429)——N叉树的层序遍历(JavaScript)
- redmin3 忘记管理密码找回方法
- Origami 用于Quartz 的免费的交互设计框架
- cross_val_score 如何对孤立森林_泸县九中开展 “森林草原防灭火”主题班会活动...
- 【ML小结8】降维与度量学习(KNN、PCA、因子分析、LDA)
- 快速突破面试算法之分治算法篇
- c语言编写一个用户登录界面,怎么用C语言编写个登陆界面?
- 可以上传、下载文件的SSH客户端软件--SecureCRT绿色版
- 口袋之旅html5超强账号,《口袋之旅H5》攻略:各大排行榜冲榜攻略
- 初探PHP开源采集器----蓝天采集器
- Vue中使用防抖与截流
- Dilworth 定理
- 百家号平台中的问答功能,自媒体人可以这样玩!
- 2023江南大学计算机考研信息汇总