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 ...
随机推荐
- Html5与Css3知识点拾遗(一)
1.元素 空元素: 可选的空格空格和斜杠 <img src="x.jpg" width="300" alt="pic" /> & ...
- bzoj1212(trie+dp)
开始一看多个字符串就想ac自动机,结果发现不行.果然学傻了,,,,只要建个trie然后刷表dp就行了,复杂度最坏是O(字典中最长单词长度*文章长度)的.trie的空间换时间挺不错的. #include ...
- 大道至简第一章和java理论学时第一节。感受。
这周上了本学期的第一节java课程.课件上说了一些学习java的基本思想.举了个“愚公移山”的例子.这可能就像刚接触一门新的语言,来练习输出“HelloWorld”一样,已成惯例. “愚公移山”的这个 ...
- 初始Hive
Hive 背景 引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一推MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 耗时耗力,更多精力没有有效 ...
- 方案dp。。
最近经常做到组合计数的题目,每当看到这种题目第一反应总是组合数学,然后要用到排列组合公式,以及容斥原理之类的..然后想啊想,最后还是不会做.. 但是比赛完之后一看,竟然是dp..例如前几天的口号匹配求 ...
- iOS 5 故事板进阶(1)
译自<iOS 5 by tutorials> 在上一章,你已经学习了故事板的基本用法.包括如何向故事板中添加 View Controller,通过 segues 切换 View Contr ...
- 集成算法(chapter 7 - Hands on machine learning with scikit learn and tensorflow)
Voting classifier 多种分类器分别训练,然后分别对输入(新数据)预测/分类,各个分类器的结果视为投票,投出最终结果: 训练: 投票: 为什么三个臭皮匠顶一个诸葛亮.通过大数定律直观地解 ...
- OpenvSwitch端口镜像
OVS上实现端口镜像的基本流程如下: 创建 mirror ,在 mirror 中指定镜像数据源及镜像目的地 将创建的 mirror 应用到 bridge 中 镜像数据源可以通过下面几个选项来指定: s ...
- Django(ORM查询1)
day69 参考:http://www.cnblogs.com/liwenzhou/p/8660826.html 在Python脚本中调用Django环境 orm1.py import os if _ ...
- DES/3DES/AES区别
公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用. DES 1977年1月,美国 ...