java 两个点球面距离_计算球面两点间距离实现Vincenty+Haversine

vincenty公式  精度很高能达到0.5毫米,但是很慢。

Haversine公式半正矢公式,比vincenty快,精度没有vincenty高,也长使用。

-------------------------------------------openlayers中实现的Vincenty----------------------------------------------------------

角度转弧度

/**

* Function: rad

*

* Parameters:

* x - {Float}

*

* Returns:

* {Float}

*/

OpenLayers.Util.rad = function(x) {return x*Math.PI/180;};

弧度转角度

/**

* Function: deg

*

* Parameters:

* x - {Float}

*

* Returns:

* {Float}

*/

OpenLayers.Util.deg = function(x) {return x*180/Math.PI;};

a 长半轴

b短半轴

c 扁率

/**

* Property: VincentyConstants

* {Object} Constants for Vincenty functions.

*/

OpenLayers.Util.VincentyConstants = {

a: 6378137,

b: 6356752.3142,

f: 1/298.257223563

};

WGS-84

a = 6 378 137 m (±2 m)

b ≈ 6 356 752.314245 m

f ≈ 1 / 298.257223563

GRS-80

a = 6 378 137 m

b ≈ 6 356 752.314140 m

f = 1 / 298.257222101

Airy 1830

a = 6 377 563.396 m

b = 6 356 256.910 m

f ≈ 1 / 299.3249646

Internat’l 1924

a = 6 378 388 m

b ≈ 6 356 911.946 m

f = 1 / 297

Clarke mod.1880

a = 6 378 249.145 m

b ≈ 6 356 514.86955 m

f = 1 / 293.465

GRS-67

a = 6 378 160 m

b ≈ 6 356 774.719 m

f = 1 / 298.247167

给定两个地理坐标(经纬度)返回km距离

/**

* APIFunction: distVincenty

* Given two objects representing points with geographic coordinates, this

*     calculates the distance between those points on the surface of an

*     ellipsoid.

*

* Parameters:

* p1 - {} (or any object with both .lat, .lon properties)

* p2 - {} (or any object with both .lat, .lon properties)

*

* Returns:

* {Float} The distance (in km) between the two input points as measured on an

*     ellipsoid.  Note that the input point objects must be in geographic

*     coordinates (decimal degrees) and the return distance is in kilometers.

*/

OpenLayers.Util.distVincenty = function(p1, p2) {

var ct = OpenLayers.Util.VincentyConstants;

var a = ct.a, b = ct.b, f = ct.f;

var L = OpenLayers.Util.rad(p2.lon - p1.lon);

var U1 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p1.lat)));

var U2 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p2.lat)));

var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);

var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);

var lambda = L, lambdaP = 2*Math.PI;

var iterLimit = 20;

while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0) {

var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);

var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +

(cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));

if (sinSigma==0) {

return 0;  // co-incident points

}

var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;

var sigma = Math.atan2(sinSigma, cosSigma);

var alpha = Math.asin(cosU1 * cosU2 * sinLambda / sinSigma);

var cosSqAlpha = Math.cos(alpha) * Math.cos(alpha);

var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;

var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));

lambdaP = lambda;

lambda = L + (1-C) * f * Math.sin(alpha) *

(sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));

}

if (iterLimit==0) {

return NaN;  // formula failed to converge

}

var uSq = cosSqAlpha * (a*a - b*b) / (b*b);

var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));

var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));

var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-

B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));

var s = b*A*(sigma-deltaSigma);

var d = s.toFixed(3)/1000; // round to 1mm precision

return d;

};

-------------------------------------------end----------------------------------------------------------

Haversine公式实现

function toRadians(degree) {

return degree * Math.PI / 180;

}

function distance(latitude1, longitude1, latitude2, longitude2) {

// R is the radius of the earth in kilometers

var R = 6371;

var deltaLatitude = toRadians(latitude2-latitude1);

var deltaLongitude = toRadians(longitude2-longitude1);

latitude1 =toRadians(latitude1);

latitude2 =toRadians(latitude2);

var a = Math.sin(deltaLatitude/2) *

Math.sin(deltaLatitude/2) +

Math.cos(latitude1) *

Math.cos(latitude2) *

Math.sin(deltaLongitude/2) *

Math.sin(deltaLongitude/2);

var c = 2 * Math.atan2(Math.sqrt(a),

Math.sqrt(1-a));

var d = R * c;

return d;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

送20个鼠标垫

之前发的朋友圈,里面晒了一个鼠标垫,大家都挺喜欢的,这次决定送30个给大家,没有什么规则,直接抽奖就好了。在下方的公众号回复【1001】获取抽奖小程序。因为之前好几次抽奖,因为时间比较长导致大家忘记填写…

angularjs的表单验证

angularjs的表单验证 废话&#xff1a;angular的热度在减小&#xff0c;但是老项目依旧是angular的&#xff0c;就是不能丢&#xff0c;得会 干活直接上代码  <!DOCTYPE html> <html> <head><!-- CSS --><link rel"stylesheet" href&qu…

越老越值钱,除了程序员!

-我们见过太多靠经验、资历“镀金”的职业。司机、教师、医生、律师、会计……这些职业的薪资待遇、社会地位、声誉等等都会随着从业时间的增长而变得越来越高、越来越好。“老”这个字&#xff0c;对于这类的职业来说&#xff0c;更像是褒奖。大家对于“资深”的他们&#xff…

Visual Studio 2010授权修改

为什么80%的码农都做不了架构师&#xff1f;>>> 参见以下步骤&#xff1a; 32位的系统中&#xff0c;修改以下注册表键值 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Registration\UserName HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Curr…

Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验

Net Core平台灵活简单的日志记录框架NLogSqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLogMysql组合初体验][http://www.cnblogs.com/yilezhu/p/9416439.html]" 反响还行。有网友就说有了NLogMySql的组合&#xff0c;那如果我是用SqlServer怎么…

从单片机步入Linux之文件系统的构建

大家好&#xff0c;我是情报小哥&#xff01;本文为【从单片机步入嵌入式Linux】系列文章的第四篇文章&#xff0c;前面三篇大家有时间也可以回头阅读一下&#xff0c;本系列文章的很多知识我都会从裸机开发和理解的角度来分析&#xff0c;帮助大家迅速理解Linux系统相关的知识…

pythongui界面小程序_python界面小程序

Python支持多種圖形界面的第三方庫&#xff0c;包括&#xff1a;TkwxWidgetsQtGTK等等。但是Python自帶的庫是支持Tk的Tkinter&#xff0c;使用Tkinter&#xff0c;無需安裝任何包&#xff0c;就可以直接使用。本章簡單介紹如何使用Tkinter進行GUI編程。Tkinter我們來梳理一下概…

关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”

开发环境&#xff1a;VS2010,SQL Server2005,Windows7,使用LINQ to SQL作为ORM 运行环境&#xff1a;Windows2003(IIS6),.NET 3.5 SP1,SQL Server2000 症状&#xff1a;开发环境下一切正常&#xff0c;在运行环境中出现如下错误&#xff1a; 代码 指定的转换无效。 说明: 执行当…

由百度 “PHP薪资” 引发的思考

昨天晚上睡觉的时候百度了一下 “PHP薪资”&#xff0c;看到了各种各样的答案&#xff0c;从百度知道到知乎&#xff0c;再到各个论坛……答案也是从 2k-16k 不等&#xff08;不过说实话&#xff0c;2k是吓到我了&#xff09;&#xff0c;其中一些答案说到了在中国从事某一行业…

哈希存储 java_Java容器系列之HashMap的存储

Java容器系列之HashMap概要本文将结合Java源码总结HashMap的存储结构及其扩容策略&#xff0c;并根据这些特点给出使用HashMap的最佳实践。本文不再介绍HashMap的基本使用&#xff0c;有需要的请先学习下Java容器的基础知识。存储结构HashMap的核心问题是如何保证读写的速度&am…

你增长的年龄,是因为丢掉了快乐吗?

这是周末&#xff0c;想写一篇文章给自己的一个朋友&#xff0c;试看能否解开他不安的情绪。我朋友是我真的朋友几年前我还是很害羞的我&#xff0c;有一次开技术会上&#xff0c;他公开的介绍了我&#xff0c;我觉得是一种认可&#xff0c;当然&#xff0c;也不会有一个不喜欢…

redhat5中架设DHCP服务器与DHCP中继

作者&#xff1a;奇异果Wickey Email&#xff1a;hkb178149081163.com 实验平台&#xff1a;VMvare 系统&#xff1a;RedHat5 软件包&#xff1a;DHCP-3.0.5 模拟需求分析&#xff1a;&#xff08;暂无&#xff09; 拓扑图&#xff1a; 1. 配置DHCPServer IP与GW 2. 安装DHCP…

linux下安装jdk_mysql_tomcat_redis

目前搬我以前的笔记,每个人做笔记方式都不一样,看别人的风格,生成自己的风格1.linux安装软件和redis学习jdk --- java开发运行环境Tomcat - WEB程序的服务器Mysql -- 持久化存储数据Redis -- 数据库 &#xff0c;和MySQL原理不同//linux通用软件安装流程&#xff1a;(jdk安装)…

MCU HardFault问题查找和破解方法

一、HardFault产生原因和常规分析方法二、HardFault解决方法分析三、HardFault回溯的原理四、操作分析流程&#xff1a;1. 心里明白徒手分析法2. CmBacktrace 天龙大法五、总结一、HardFault产生原因和常规分析方法在嵌入式开发中&#xff0c;偶尔会遇到Hard Fault死机的异常&…

centos8 apache php,centos6.8安装php7 for Apache2

1&#xff0c;php for nginx就不用说了&#xff0c;我们的博客里面应该有写。 2&#xff0c;直接源码安装&#xff0c;安装apache&#xff0c;安装php7&#xff0c;安装mysql。除了麻烦一点&#xff0c;应该没什么问题。 3&#xff0c;yum的方式安装了apache和mysql&#xff0c…

php 逗号 分割字符串

介绍两个函数给你 <?php //利用 explode 函数分割字符串到数组 $source "hello1,hello2,hello3,hello4,hello5";//按逗号分离字符串 $hello explode(,,$source); for($index0;$index<count($hello);$index){ echo $hello[$index];echo "</br>&qu…

ASP.NET Core的身份认证框架IdentityServer4--入门【转】

原文地址 Identity Server 4是IdentityServer的最新版本&#xff0c;它是流行的OpenID Connect和OAuth Framework for .NET&#xff0c;为ASP.NET Core和.NET Core进行了更新和重新设计。在本文中&#xff0c;我们将快速了解IdentityServer 4存在的原因&#xff0c;然后直接进入…

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

栈是什么&#xff1f;栈有什么作用&#xff1f;首先&#xff0c;栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out)&#xff0c;数据只能在串列的一端 (称为&#xff1a;栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。根据栈…

php session警告屏蔽,PHP Session的一个警告

警告全文如下:PHP Warning: Unknown: Your script possibly relies on a session side-effectwhich existed until PHP 4.2.3. Please be advised that the session extension doesnot consider global variables as a source of data, unless register_globals is enabled.You…

flex item的width VS flex-basis

flexbox的子元素flex item的宽度&#xff0c;按照以下规则计算&#xff1a;content>width>flex-basis(limited by max/min-width)flex-basis的缺省值为auto&#xff1b;如果flex-basis的值为auto&#xff0c;那么flex item的宽度由width属性决定&#xff1b;如果没有设置…