日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 方法求 的近似值,PHP中的等角近似

發布時間:2025/4/5 php 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 方法求 的近似值,PHP中的等角近似 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在嘗試使用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

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的php 方法求 的近似值,PHP中的等角近似的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。