经纬度计算, 本质上是球面三角函数的应用, 将数学公式转换为代码的过程,

站在前人的肩膀上, 自己又补充了一点:

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-经纬度计算的更多相关文章

  1. sql server2008根据经纬度计算两点之间的距离

    --通过经纬度计算两点之间的距离 create FUNCTION [dbo].[fnGetDistanceNew] --LatBegin 开始经度 --LngBegin 开始维度 --29.49029 ...

  2. 利用JS实现的根据经纬度计算地球上两点之间的距离

      最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距 ...

  3. php根据经纬度计算距离和方向--摘录自http://haotushu.sinaapp.com/post-520.html

    define('EARTH_RADIUS', 6367000);//需定义的静态变量 function getRadian($d) { return $d * M_PI / 180; } functi ...

  4. iOS根据2个经纬度计算距离

    #pragma mark - calculate distance 根据2个经纬度计算距离 #define PI 3.14159265358979323 +(double) CalculationDi ...

  5. TSQL 根据经纬度计算两点间的距离;返回米(m)

    -- ============================================= -- Author:Forrest -- Create date: 2013-07-16 -- Des ...

  6. cesium根据经纬度计算距离

    var startLatitude = 36;var startLongitude = 120; var endLatitude=34; var endLongitude=121; var start ...

  7. java工具类(六)根据经纬度计算距离

    Java实现根据经纬度计算距离 在项目开发过程中,需要根据两地经纬度坐标计算两地间距离,所用的工具类如下: Demo1: public static double getDistatce(double ...

  8. php根据地球上任意两点的经纬度计算两点间的距离 原理

    地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为6356.755千米,平均半径6371.004千米.如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R.如 ...

  9. IOS根据两个经纬度计算相距距离

    //第一种苹果自带的 CLLocation *orig=[[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self double ...

  10. java通过经纬度计算两个点的之间的距离的算法

    通过两个点的经纬度计算距离 从google maps的脚本里扒了段代码,没准啥时会用上.大家一块看看是怎么算的. private const double EARTH_RADIUS = 6378.13 ...

随机推荐

  1. 20145232 韩文浩 《Java程序设计》第5周学习总结

    教材学习内容总结 处理异常 教材中使用一个简单的程序,用户连续输入整数最后输入0结束后显示输入数的平均值. 但有时,用户会没有按常规出牌输入不正确的信息,例如"30"输成" ...

  2. QT中的线程与事件循环理解(1)

    1.需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理.Qt 使用QThread 来管 ...

  3. java中逗号分隔的字符串和List相互转换

    1.将逗号分隔的字符串转换为List String str = "a,b,c"; List<String> result = Arrays.asList(str.spl ...

  4. jQuery插件初级练习4

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. ORACLE EBS常用表

    http://www.cnblogs.com/quanweiru/archive/2012/09/26/2704628.html call fnd_global.APPS_INITIALIZE(131 ...

  6. 分形之皇冠(Crown)

    皇冠分形曲线 核心代码: static void FractalCrown(const Vector3& vStart, const Vector3& vEnd, Vector3* p ...

  7. 一场关于 .net core 和 .net framework 编码的案情分析

    案情背景 目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台.在做新项目的时候,有个功能需要对接到旧项目那 ...

  8. ServiceStack DateTime数据类型转Json出现的困扰

    执行dotnet-new selfhost sstest 创建项目,然后打开解决方案 修改ssTest.ServiceModel中的Hello.cs,在HellopResponse中添加时间属性,然后 ...

  9. Oracle.ManagedDataAccess.Client.OracleException:“ORA-00936: 缺失表达式”

    static void Main(string[] args) { string sql = "insert into StudentC(Stuid, Stuname, Stupass) v ...

  10. UWP 多语言的三个概念

    首先了解一下 RFC4646 和 BCP-47 是什么东西: RFC4646 The name is a combination of an ISO 639 two-letter lowercase ...