Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- linux
- html
- MYSQL
- 주식 청약 일정
- 7월 공모주 청약 일정
- Stock
- 공모주 청약
- Oracle
- codeigniter
- 공모주 청약 일정
- php
- 오라클
- 자바스크립트
- 맥
- 공모주
- SQL
- css
- 6월 공모주 청약 일정
- java
- 주식
- 자바
- 코드이그나이터
- 제이쿼리
- 리눅스
- IPO
- 주식 청약
- Stock ipo
- JavaScript
- jquery
- Eclipse
Archives
- Today
- Total
개발자의 끄적끄적
[php] 두 좌표간의 거리 구하기 예제 본문
728x90
반응형
[php] 두 좌표간의 거리 구하기 예제
<?php
/**
* 두 좌표간의 거리를 구하기(WGS84 기준)
* Get distance between coordinates in km
* @param double $lat1 : 좌표1 위도
* @param double $lon1 : 좌표1 경도
* @param double $lat2 : 좌표2 위도
* @param double $lon2 : 좌표2 경도
* return double
*/
function get_distance($lat1, $lon1, $lat2, $lon2) {
/* WGS84 stuff */
$a = 6378137;
$b = 6356752.3142;
$f = 1/298.257223563;
/* end of WGS84 stuff */
$L = deg2rad($lon2-$lon1);
$U1 = atan((1-$f) * tan(deg2rad($lat1)));
$U2 = atan((1-$f) * tan(deg2rad($lat2)));
$sinU1 = sin($U1);
$cosU1 = cos($U1);
$sinU2 = sin($U2);
$cosU2 = cos($U2);
$lambda = $L;
$lambdaP = 2*pi();
$iterLimit = 20;
while ((abs($lambda-$lambdaP) > pow(10, -12)) && ($iterLimit-- > 0)) {
$sinLambda = sin($lambda);
$cosLambda = cos($lambda);
$sinSigma = sqrt(($cosU2*$sinLambda) * ($cosU2*$sinLambda) + ($cosU1*$sinU2-$sinU1*$cosU2*$cosLambda) * ($cosU1*$sinU2-$sinU1*$cosU2*$cosLambda));
if ($sinSigma == 0) {
return 0;
}
$cosSigma = $sinU1*$sinU2 + $cosU1*$cosU2*$cosLambda;
$sigma = atan2($sinSigma, $cosSigma);
$sinAlpha = $cosU1 * $cosU2 * $sinLambda / $sinSigma;
$cosSqAlpha = 1 - $sinAlpha*$sinAlpha;
$cos2SigmaM = $cosSigma - 2*$sinU1*$sinU2/$cosSqAlpha;
if (is_nan($cos2SigmaM)) {
$cos2SigmaM = 0;
}
$C = $f/16*$cosSqAlpha*(4+$f*(4-3*$cosSqAlpha));
$lambdaP = $lambda;
$lambda = $L + (1-$C) * $f * $sinAlpha *($sigma + $C*$sinSigma*($cos2SigmaM+$C*$cosSigma*(-1+2*$cos2SigmaM*$cos2SigmaM)));
}
if ($iterLimit == 0) {
// formula failed to converge
return NaN;
}
$uSq = $cosSqAlpha * ($a*$a - $b*$b) / ($b*$b);
$A = 1 + $uSq/16384*(4096+$uSq*(-768+$uSq*(320-175*$uSq)));
$B = $uSq/1024 * (256+$uSq*(-128+$uSq*(74-47*$uSq)));
$deltaSigma = $B*$sinSigma*($cos2SigmaM+$B/4*($cosSigma*(-1+2*$cos2SigmaM*$cos2SigmaM)- $B/6*$cos2SigmaM*(-3+4*$sinSigma*$sinSigma)*(-3+4*$cos2SigmaM*$cos2SigmaM)));
return round($b*$A*($sigma-$deltaSigma) / 1000);
/* sphere way */
$distance = rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));
$distance *= 111.18957696; // Convert to km
return $distance;
}
?>
좌표A 에서 좌표B 까지의 거리 계산(km)
<?php
// 좌표A: 제주국제공항
$lat1 = '33.50674337041539'; // 위도
$lon1 = '126.49184109764144'; // 경도
// 좌표B: 한라산
$lat2 = '33.3586056496444'; // 위도
$lon2 = '126.53189806385355'; // 경도
$dist = get_distance($lat1, $lon1, $lat2, $lon2);
echo $dist.'Km'.PHP_EOL;
?>
두 지점간의 거리를 계산하는 소스 입니다.
<?php
// 좌표A: 제주국제공항
$lat1 = '33.50674337041539'; // 위도
$lon1 = '126.49184109764144'; // 경도
// 좌표B: 한라산
$lat2 = '33.3586056496444'; // 위도
$lon2 = '126.53189806385355'; // 경도
$dist = get_distance($lat1, $lon1, $lat2, $lon2);
echo $dist.'Km'.PHP_EOL;
?>
반응형
'개발 > php' 카테고리의 다른 글
[php] 워드프레스 설치하기 [펌] (0) | 2020.09.07 |
---|---|
[php/Gnuboard] 그누보드 5 설치과정 (5.3.2.6 버전) [펌] (0) | 2020.09.06 |
[php] 요일 구하기 [펌] (0) | 2020.09.03 |
[lalavel] 블레이드문법 (0) | 2020.08.31 |
[Laravel] 라라벨 설치와 디렉토리 구조 (0) | 2020.08.30 |
Comments