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

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

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. 20169207《Linux内核原理与分析》第五周作业

    这周的任务主要分为两个方面,第一方面,学习MOOC网上视频第三讲并完成配套的实验.第二方面,学习课本的第四章和第六章. 首先从实验开始讲起,前期我们对Linux内核的源码做了一个简单的了解.包括Mai ...

  2. Linux CentOS 5.5 服务器安装图文教程

    下面开始: 系统版本:CentOS 5.5 将镜像刻成光盘,设置BIOS将CDROM设置为第一启动 启动画面: 通过提示,按ENTER进入图形安装模式(E文不好的,赶紧补习去哈~~~) 我们按ENTE ...

  3. java类与继承(转载)

    关于java的类与继承面链接是一个网友总结的,还有列子我个人觉得很详细 固拿来收藏,需要的朋友可从这里访问: http://www.cnblogs.com/dolphin0520/p/3803432. ...

  4. 【滚动条】Selenium+python自动化-JS处理滚动条

    转载地址: http://www.cnblogs.com/yoyoketang/p/6128655.html --------------------------------------------- ...

  5. hdu 4939 三色塔防

    http://acm.hdu.edu.cn/showproblem.php?pid=4939 给出一条长为n个单位长度的直线,每通过一个单位长度需要 t 秒. 有3种塔,红塔可以在当前格子每秒造成 x ...

  6. 二分图匹配-HK算法

    先把代码贴上,其他南京回来再补了.. #include <cstdio> #include <cstdlib> #include <cstring> #includ ...

  7. ASP.NET Web API 框架研究 Controller实例的销毁

    我们知道项目中创建的Controller,如ProductController都继承自ApiController抽象类,其又实现了接口IDisposable,所以,框架中自动调用Dispose方法来释 ...

  8. MFC中处理UI界面时的注意点

    最近开发时,在处理界面上遇到了下面的问题: 上位机与下位机通信时,如果出现超时,弹出MessageBox提示的情况下,更新界面上的CStatic控件会出现重影. 经过调查发现 原因是由于在UI线程中处 ...

  9. Python自动化开发 - 进程、线程(一)

    本节内容 1.操作系统发展史 2.进程和线程 3.Python threading 模块 一.操系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统 ...

  10. Android-Recyclerview-使用分割线

    由于Recyclerview是在 android.support.v7.widget.包 RecyclerView,所以需要导Recycler库: 导Recycler库: 选择项目,右键-->  ...