geo-经纬度计算
经纬度计算, 本质上是球面三角函数的应用, 将数学公式转换为代码的过程,
站在前人的肩膀上, 自己又补充了一点:
package com.iwhere.easy.travel.tool;
public class GeoTools {
public static String getScopeByGeoLevel(Integer geolevel) {
return (( - geolevel) * ) + "公里";
}
public static double getAngle(double lat1, double lng1, double lat2, double lng2) {
double x1 = lng1;
double y1 = lat1;
double x2 = lng2;
double y2 = lat2;
double pi = Math.PI;
double w1 = y1 / * pi;
double j1 = x1 / * pi;
double w2 = y2 / * pi;
double j2 = x2 / * pi;
double ret;
if (j1 == j2) {
if (w1 > w2)
return ; // 北半球的情况,南半球忽略
else if (w1 < w2)
return ;
else
return -;// 位置完全相同
}
ret = * Math.pow(Math.sin((w1 - w2) / ), )
- Math.pow(Math.sin((j1 - j2) / ) * (Math.cos(w1) - Math.cos(w2)), );
ret = Math.sqrt(ret);
double temp = (Math.sin(Math.abs(j1 - j2) / ) * (Math.cos(w1) + Math.cos(w2)));
ret = ret / temp;
ret = Math.atan(ret) / pi * ;
if (j1 > j2) { // 1为参考点坐标
if (w1 > w2)
ret += ;
else
ret = - ret;
} else if (w1 > w2)
ret = - ret;
return ret;
}
/**
* @param lat1
* 纬度1,参考点
* @param lng1
* 经度1,参考点
* @param lat2
* 纬度2
* @param lng2
* 经度2
* @return 方向
*/
public static String getDirection(double lat1, double lng1, double lat2, double lng2) {
double jiaodu = getAngle(lat1, lng1, lat2, lng2);
if ((jiaodu <= ) || (jiaodu > ))
return "正东方";
if ((jiaodu > ) && (jiaodu <= ))
return "东北方";
if ((jiaodu > ) && (jiaodu <= ))
return "正北方";
if ((jiaodu > ) && (jiaodu <= ))
return "西北方";
if ((jiaodu > ) && (jiaodu <= ))
return "正西方";
if ((jiaodu > ) && (jiaodu <= ))
return "西南方";
if ((jiaodu > ) && (jiaodu <= ))
return "正南方";
if ((jiaodu > ) && (jiaodu <= ))
return "东南方";
return "";
}
/**
* 获取方位角描述
* 前一个点
* 参照点
* 目标点
* @author wenbronk
*/
public static String getAzimuth(double preLng, double preLat, double referLng, double referLat, double poiLng,
double poiLat) {
double jiaodu1 = getAngle(preLat, preLng, referLat, referLng);
double jiaodu2 = getAngle(referLat, referLng, poiLat, poiLng);
double jiaodu = jiaodu2 - jiaodu1;
if (((jiaodu <= && jiaodu > ) || jiaodu > ) || ((jiaodu >= - && jiaodu < ) || jiaodu < -)) {
return "正前方";
}else if ((jiaodu <= && jiaodu > ) || (jiaodu >= - && jiaodu < -)) {
return "左前方";
}else if ((jiaodu <= && jiaodu > ) || (jiaodu >= - && jiaodu < -)) {
return "左侧";
}else if ((jiaodu <= && jiaodu > ) || (jiaodu >= - && jiaodu < -)) {
return "左后方";
}else if ((jiaodu <= && jiaodu > ) || (jiaodu >= - && jiaodu < -)) {
return "后方";
}else if ((jiaodu <= && jiaodu > ) || (jiaodu >= - && jiaodu < -)) {
return "右后方";
}else if ((jiaodu <= && jiaodu > ) || (jiaodu >= - && jiaodu < -)) {
return "右侧";
}else if ((jiaodu <= && jiaodu > ) || (jiaodu >= - && jiaodu < -)) {
return "右前方";
}
return "";
}
/**
* 判断是否在后方
* @author wenbronk
*/
public static Boolean isBehine(double preLng, double preLat, double referLng, double referLat,
double poiLng, double poiLat) {
double x1 = referLng - preLng;
double y1 = referLat - preLat;
double x2 = poiLng - referLng;
double y2 = poiLat - referLat;
// 求 (x1, y1), (x2, y2) 向量的夹角的cos值
double cos = (x1 * x2 + y1 * y2) /
(Math.sqrt(Math.pow(x1, ) + Math.pow(y1, )) + Math.sqrt(Math.pow(x2, ) + Math.pow(y2, )));
if (cos >= ) {
return false;
}
return true;
}
public static void main(String[] args) {
String str = getDirection(, , -, -);
System.out.println(str);
}
}
geo-经纬度计算的更多相关文章
- sql server2008根据经纬度计算两点之间的距离
--通过经纬度计算两点之间的距离 create FUNCTION [dbo].[fnGetDistanceNew] --LatBegin 开始经度 --LngBegin 开始维度 --29.49029 ...
- 利用JS实现的根据经纬度计算地球上两点之间的距离
最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距 ...
- php根据经纬度计算距离和方向--摘录自http://haotushu.sinaapp.com/post-520.html
define('EARTH_RADIUS', 6367000);//需定义的静态变量 function getRadian($d) { return $d * M_PI / 180; } functi ...
- iOS根据2个经纬度计算距离
#pragma mark - calculate distance 根据2个经纬度计算距离 #define PI 3.14159265358979323 +(double) CalculationDi ...
- TSQL 根据经纬度计算两点间的距离;返回米(m)
-- ============================================= -- Author:Forrest -- Create date: 2013-07-16 -- Des ...
- cesium根据经纬度计算距离
var startLatitude = 36;var startLongitude = 120; var endLatitude=34; var endLongitude=121; var start ...
- java工具类(六)根据经纬度计算距离
Java实现根据经纬度计算距离 在项目开发过程中,需要根据两地经纬度坐标计算两地间距离,所用的工具类如下: Demo1: public static double getDistatce(double ...
- php根据地球上任意两点的经纬度计算两点间的距离 原理
地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为6356.755千米,平均半径6371.004千米.如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R.如 ...
- IOS根据两个经纬度计算相距距离
//第一种苹果自带的 CLLocation *orig=[[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self double ...
- java通过经纬度计算两个点的之间的距离的算法
通过两个点的经纬度计算距离 从google maps的脚本里扒了段代码,没准啥时会用上.大家一块看看是怎么算的. private const double EARTH_RADIUS = 6378.13 ...
随机推荐
- 20145232 韩文浩 《Java程序设计》第5周学习总结
教材学习内容总结 处理异常 教材中使用一个简单的程序,用户连续输入整数最后输入0结束后显示输入数的平均值. 但有时,用户会没有按常规出牌输入不正确的信息,例如"30"输成" ...
- QT中的线程与事件循环理解(1)
1.需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理.Qt 使用QThread 来管 ...
- java中逗号分隔的字符串和List相互转换
1.将逗号分隔的字符串转换为List String str = "a,b,c"; List<String> result = Arrays.asList(str.spl ...
- jQuery插件初级练习4
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- ORACLE EBS常用表
http://www.cnblogs.com/quanweiru/archive/2012/09/26/2704628.html call fnd_global.APPS_INITIALIZE(131 ...
- 分形之皇冠(Crown)
皇冠分形曲线 核心代码: static void FractalCrown(const Vector3& vStart, const Vector3& vEnd, Vector3* p ...
- 一场关于 .net core 和 .net framework 编码的案情分析
案情背景 目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台.在做新项目的时候,有个功能需要对接到旧项目那 ...
- ServiceStack DateTime数据类型转Json出现的困扰
执行dotnet-new selfhost sstest 创建项目,然后打开解决方案 修改ssTest.ServiceModel中的Hello.cs,在HellopResponse中添加时间属性,然后 ...
- Oracle.ManagedDataAccess.Client.OracleException:“ORA-00936: 缺失表达式”
static void Main(string[] args) { string sql = "insert into StudentC(Stuid, Stuname, Stupass) v ...
- UWP 多语言的三个概念
首先了解一下 RFC4646 和 BCP-47 是什么东西: RFC4646 The name is a combination of an ISO 639 two-letter lowercase ...