1

학위에서 밀리 초로의 변환에 대한 공식을 알고 있으며 그 반대도 마찬가지입니다. 다음과 같이 구현할 수 있습니다.학위와 밀리 초 사이의 변환

protected function decimal_to_milisecond($dec) { 
     if (!empty($dec)) {   
      $vars = explode(".",$dec); 
      if (count($vars) == 2) { 
       $deg = $vars[0]; 
       $tempma = "0.".$vars[1]; 
       $tempma = $tempma * 3600; 
       $min = floor($tempma/60); 
       $sec = $tempma - ($min*60); 
       return round((((($deg * 60) + $min) * 60 + $sec) * 1000)); 
      } 
      else return false; 
     } else return false; 
    } 

function milisecond_to_decimal($sec) { 
     if (!empty($sec)) { 
      $s = $sec/1000; 
      $d = (int)($s/3600); 
      $s = $s % 3600; 
      $m = (int)($s/60); 
      $s %= 60;  
      $ret = substr($d+((($m*60)+($s))/3600),0); 
     } else return null; 
     return $ret; 
    } 

시나리오 : 나는 학위를 밀리 초로 변환하고 밀리 초에서 학위로 변환을 계속합니다. 변환 된 값은 원래 값과 약간의 차이가 있습니다. 나는 그 값이 본래의 값으로 정확하기를 바란다. 예 :

$lat = "1284146"; 
$long = "503136198"; 
$lat1 = milisecond_to_decimal($lat); 
$long1 = milisecond_to_decimal($long); 

$result1 = decimal_to_milisecond($lat1); 
$result2 = decimal_to_milisecond($long1); 
var_dump($result1, $result2); 

The output is float(1284000) and float(503136000) 

차이를 줄이는 또 다른 방법은도 및 밀리 초 사이의 변환으로 인해 발생합니까? 정말 고마워.

+0

무엇이'DMS'입니까? – DevZer0

+0

코드를 기준으로 분 - 초 - 초를 의미합니다. –

+0

@ DevZer0 : 죄송합니다. – secretlm

답변

3

360도 (경도), 도당 60 분, 분당 60 초, 초당 1000 밀리 초가 있습니다. 그래서 대부분의 아이디어는 먼저 정수로 변환 할 수 및 정수에 가능한 한 많은 작업을 수행 할 수 있도록 31 비트에 잘 맞는

360*60*60*1000 milliseconds = 1 296 000 000 milliseconds 

.

단 정밀도 부동 소수점을 사용하면 24 비트 유효 값을 얻게되며 1/10 초 (log2(360*60*60*10)23.6) 미만의 정확도가 느슨해집니다.

결과를 배정도 (유효 숫자 53 비트)로 저장하는 것이 좋습니다.

편집

내가 제시 한 것은 (내가 충분히 그렇게 말할 PHP를 모르는) $decimaldegrees을 표현하기위한 배정 밀도를 사용하는 방법이 있는지, 한 번에 변환을 수행하는 것입니다, 뭔가 같은 :

다음
$millis = (int)(round($decimaldegrees * (60*60*1000))); 

당신은 DMS에 분해 할 (그러나 이러한 변수는 코드에서 사용되지 않음) 만약에 이제까지 :

$ms = $millis % 1000; 
$sec = ($millis/1000) % 60; 
$min = ($millis/(60*1000)) % 60; 
$deg = ($millis/(60*60*1000)) % 360; 

코드를 자세히 살펴보면 소수 부분을 먼저 분리하고있는 것 같습니다. $tempma = "0.".$vars[1];
십진수 표현 문자열에서 작업하는 경우 작동 할 수 있습니다.이 경우 단일 정밀도 부동 소수점에도 적합하기 때문입니다 (log2(60*60*1000) is 약 21.8). 그래서 시작과 함께 교체 할 수 있습니다 : 문제가 다른 변환 milisecond_to_decimal에서 유래처럼 당신이 준 출력의 예에서

$deg = (int) $vars[0]; 
$frac = "0.".$vars[1]; 
$millis = (int)(round($frac * (60*60*1000))); 
$millis = deg + millis; 

, 그것은 소리, 아마도 몇 가지 연산을 정수 연산으로 수행되므로 따라서 밀리 초를 폐기 .

다시 한 번 php를 충분히 모르지만 $s = $s % 3600;은 실제로 (int)(%s)에서 작동하지 않으므로 밀리 초를 버리지 않을까요?
C 기능 fmod 또는 modf과 같은 것을 찾아야합니다.당신은 배정 밀도에 대한 액세스 권한이없는 경우

$decimaldegrees = ((double)($millis))/(60*60*1000); 

, 당신은 안전하게 구도 할 수 없습니다 double 정밀도로 그것을 할 수있는 방법이 있는지 다시 한 번

, 당신은 한 번에 모든 작업을 할 수 단일 정밀도

당신은

어쨌든 분수 부분에서 앞의 0의 배려, 나는 강하게 단위 테스트를 수행하는 것이 좋습니다 별도의 문자열 부분에서 작동해야 ... 충분한 비트가없는, 즉 테스트하는 것입니다 귀하의 두 기능을 별도로,이 방법은 y를 어떤 점이 효과적인지, 그렇지 않은 점을 더 잘 이해할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그러나 나는 당신의 생각을 분명히 이해하지 못합니다. 그것에 대해 더 자세히 설명해 주시겠습니까? 감사. – secretlm

+0

설명해 주셔서 감사합니다. – secretlm