我正在尝试使用PHP中的等角近似公式来计算两个纬度/经度坐标之间的距离,但是对于某些经度坐标,我得到的结果不同于Haversine公式(我知道这是正确的).

define('EARTH_RADIUS', 6371);

function equirectangularRad($latFrom, $lngFrom, $latTo, $lngTo) {

$latDelta = $latTo - $latFrom;

$lngDelta = $lngTo - $lngFrom;

$x = $lngDelta * cos(($latFrom + $latTo) * .5);

$radius = sqrt(($x * $x) + ($latDelta * $latDelta));

return $radius * EARTH_RADIUS;

}

似乎总是通过本初子午线而不是最短距离来计算距离.即沿赤道从坐标(lat = 0,long = -180)到(lat = 0,long = 180),距离应为零.相反,该函数返回沿赤道的地球周长;大约40030公里.

问题似乎源于$lngDelta的计算,但是对于任何编程语言,我都能找到的所有实现都使用相同的公式.我是否缺少一些重要的细节,或者此公式确实不是可替代的haversine(忽略明显的准确性差异)?

以供参考;这是我使用的haversine实现:

function haversineRad($latFrom, $lngFrom, $latTo, $lngTo) {

$latDelta = $latTo - $latFrom;

$lngDelta = $lngTo - $lngFrom;

$latSin = sin($latDelta * .5);

$lngSin = sin($lngDelta * .5);

$radius = 2. * asin(sqrt(($latSin * $latSin) + cos($latFrom) * cos($latTo) * ($lngSin * $lngSin)));

return $radius * EARTH_RADIUS;

}

解决方法:

我不知道您的公式在哪里.下面的3个公式将计算2个坐标之间的距离.

等角矩形

function Equirectangular($lat1,$lng1,$lat2,$lng2){

$x = deg2rad($lng2-$lng1) * cos(deg2rad($lat1+$lat2)/2);

$y = deg2rad($lat1-$lat2);

$R = 6372.8; // gives d in km

$distance = sqrt($x*$x + $y*$y) * $R;

return $distance;

}

编辑

修改了Equirectangular()以考虑评论.使用php abs()函数使lng值成为绝对值.当lng2从负变为正时,它开始从Haversine漂移.

function Equirectangular($lat1,$lng1,$lat2,$lng2){

$lng1 = abs($lng1);

$lng2 = abs($lng2);

$alpha = $lng2-$lng1;

$x = deg2rad($alpha) * cos(deg2rad($lat1+$lat2)/2);

$y = deg2rad($lat1-$lat2);

$R = 6372.8; // gives d in km

$distance = sqrt($x*$x + $y*$y) * $R;

return $distance;

}

Haversine

function Haversine($lat1,$lng1,$lat2,$lng2) {

$deltaLat = $lat2 - $lat1 ;

$deltaLng = $lng2 - $lng1 ;

$earthRadius = 6372.8; // 3959 in miles.

$alpha = $deltaLat/2;

$beta = $deltaLng/2;

$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;

$c = 2 * atan2(sqrt($a), sqrt(1-$a));

$distance = $earthRadius * $c;

return $distance;

}

余弦球法则

function SphericalLawOfCosines($lat1,$lng1,$lat2,$lng2) {

$lat1 = deg2rad($lat1);

$lat2 = deg2rad($lat2);

$deltaLng = deg2rad($lng2-$lng1);

$R = 6372.8; // gives d in km

$d = acos( sin($lat1)*sin($lat2) + cos($lat1)*cos($lat2) * cos($deltaLng) ) * $R;

return $d;

}

等角矩形是最简单但精度较低的.对于其他2个,要使用一个取决于所涉及的距离.请参阅此Answer.

对于短距离(大约1米或更短的距离),请使用Haversine.对于更大的距离,请使用余弦球定律.

公式结果

0,-179至0,-179等距0 km Haversine 0 km

0,-179至0,-159等距2224.526851 km Haversine 2224.526851 km

0,-179至0,-139等距4449.053703 km Haversine 4449.053703 km

0,-179至0,-119等距6673.580554 km Haversine 6673.580554 km

0,-179至0,-99等角8898.107406 km Haversine 8898.107406 km

0,-179至0,-79等距11122.634257 km Haversine 11122.634257 km

0,-179至0,-59等距13347.161109 km Haversine 13347.161109 km

0,-179至0,-39等距15571.68796 km Haversine 15571.68796 km

0,-179至0,-19等距17796.214811 km Haversine 17796.214811 km

0,-179至0.1矩形19798.288978 km Haversine 20020.741663 km

0,-179至0,21等距17573.762126 km Haversine 17796.214811 km

0,-179至0.41矩形15349.235275 km Haversine 15571.68796 km

0,-179至0.61等距13124.708423 km Haversine 13347.161109 km

0,-179至0,81等距10900.181572 km Haversine 11122.634257 km

0,-179至0,101等距8675.654721 km Haversine 8898.107406 km

0,-179至0,121等角6451.127869 km Haversine 6673.580554 km

0,-179至0,141等角矩形4226.601018 km Haversine 4449.053703 km

0,-179至0,161等角线2002.074166 km Haversine 2224.526851 km

标签:distance,geo,haversine,php

来源: https://codeday.me/bug/20191121/2048329.html

php 方法求 的近似值,PHP中的等角近似相关推荐

  1. 八种方法求π的近似值

    目录 引言 一.math库 二.蒙特卡洛(Monte Carlo) 三.黎曼和(定积分) 四.约翰.沃利斯(John Wallis) 五.格雷戈里.莱布尼茨(Gregory-Leibniz) 六.尼拉 ...

  2. matlab数值积分方法求pi的近似值及其比较

    求pi的近似值可以说是比较经典的问题了.在各种软件环境下,用过包括蒙特卡洛等各种方法求过pi的近似值.今天给大家带来通过数值积分的方法来求pi的近似值,并进行一个简单的误差分析 clear; clc; ...

  3. 【数学知识】三种方法求 [1,n] 中所有数欧拉函数(线性筛欧拉函数优化至 O(n) )

    整理的算法模板合集: ACM模板 ①直接求小于或等于n,且与n互质的数个数(求[1,n]中所有数的欧拉函数时间复杂度:O(nn)O(n\sqrt{n})O(nn​)) ②求[1,n]之间每个数的质因数 ...

  4. 用子函数的方法求一维数组中所有元素之和

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容2]用子函数的方法求一维数组中所有元素之和 #includ ...

  5. 自定义函数fac1用递推方法求n!,自定义函数fac2用递归方法求n!,主函数中输入整数n(0≦n≦10)后,分别调用函数fac1和函数fac2求n!,最后输出调用的结果值进行对比。

    自定义函数fac1用递推方法求n!,自定义函数fac2用递归方法求n!,主函数中输入整数n(0≦n≦10)后,分别调用函数fac1和函数fac2求n!,最后输出调用的结果值进行对比. 参考运行截图: ...

  6. (1)定义圆Circle类,包含radius半径属性,求面积方法,求周长方法,返返回圆对象的详细信息的方法(2)在测试类中创建长度为5的Circle[]数组,用来装5个圆对象

    import java.util.Random;class Circle{double radius;double area;double perimeter;// 面积public void ger ...

  7. Java练习题 类 先创建一个Point类,然后定义Trianglele类。在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,然后定义两个方法求三角形的周长、面积。

    先创建一个Point类,然后定义Trianglele类. 在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,再定义构造方法对这三个点进行初始化,然后定义两个方法求三角形的周长 ...

  8. java list intersect_C#编程中两个List集合使用Intersect方法求交集

    在C#语言程序设计中,List集合是常用的集合数据类型,在涉及集合类型的运算中,有时候我们需要计算2个List集合中共有的数据,即对2个List集合求交集运算.此时可以使用C#语言提供的Interse ...

  9. matlab中h无穷状态反馈控制,求教 :用LMI方法求倒立摆H无穷状态反馈控制器程序...

    求教 :用LMI方法求倒立摆H无穷状态反馈控制器程序用LMI方法求倒立摆H无穷状态反馈控制器程序 但运行出现没有合适的gama值 显示"could not establish feasibi ...

最新文章

  1. JavaScript--'data-'的用法(1)
  2. 浅谈BPM和SOA架构下的电子政务系统
  3. Java多线程之单例模式在多线程环境下的安全问题
  4. python计算单词长度_Python - 按长度打印单词
  5. Pycharm使用black作为Python代码格式化外部工具
  6. Cell子刊:高温导致男性不育的原因终于弄清楚了,短暂受热就会诱发精子大量DNA损伤...
  7. 以下实例在用户点击按钮后对字符串进行反转操作
  8. linux 跳板机得搭建
  9. 关于 java 上传,下载和导入报java.lang.IllegalStateException异常解决办法
  10. pdf和图片之间的转换
  11. 硬盘的老化测试软件,硬盘检测工具使用方法
  12. 铁路计算机工程师论文,工程技术类有关论文格式模板,关于铁路工程师职文2016年相关论文范本...
  13. xp系统计算机怎么连接到网络打印机,windows xp系统如何连接不同网段共享打印机...
  14. ClouderaManager介绍、CDH特点、ClouderaManager架构、ClouderaManager功能、Cloudera Management Service
  15. 太可怕了!人工智能逐渐取代客服?原因竟然是这个
  16. 【数据库基础知识六】内连接、外连接、自连接
  17. php管理varnish,php实现监控varnish缓存服务器的状态,php监控varnish缓存_PHP教程
  18. Python实现最速下降法(The steepest descent method)详细案例
  19. Arduino与Proteus仿真实例-ULN2003驱动直流电机仿真
  20. 让windows xp 自动登录的两种方法及脚本

热门文章

  1. 机器学习安然数据集分析报告
  2. 第二章:2.2 LTI系统解的分析
  3. 100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen
  4. dump mysql database_【MySQL Database】数据迁移工具:mysqldump
  5. linux自动删除30天前的日志文件
  6. cdoj 1070 秋实大哥打游戏 带权并查集
  7. MVCWebForm对照学习:传值方式
  8. 执行了的程序,才是你的程序.
  9. 费马小定理与素数判定
  10. 玩转Autorun.inf