2011-10-28 16 views

risposta

14

Si possono trovare le funzioni di farlo here

<?php 

function DMStoDEC($deg,$min,$sec) 
{ 

// Converts DMS (Degrees/minutes/seconds) 
// to decimal format longitude/latitude 

    return $deg+((($min*60)+($sec))/3600); 
}  

function DECtoDMS($dec) 
{ 

// Converts decimal longitude/latitude to DMS 
// (Degrees/minutes/seconds) 

// This is the piece of code which may appear to 
// be inefficient, but to avoid issues with floating 
// point math we extract the integer part and the float 
// part by using a string function. 

    $vars = explode(".",$dec); 
    $deg = $vars[0]; 
    $tempma = "0.".$vars[1]; 

    $tempma = $tempma * 3600; 
    $min = floor($tempma/60); 
    $sec = $tempma - ($min*60); 

    return array("deg"=>$deg,"min"=>$min,"sec"=>$sec); 
}  

?> 
+0

Grazie! Sembra funzionare! – ragulka

+1

Prego! :) – SERPRO

+0

@SERPRO: sai come ridurre la differenza è causato dalla conversione tra Gradi e DMS? – secretlm

6

Il lat/lon coordinate sono scritti in (grosso modo) una base-60 numeral system. Ecco come li si converte:

function fraction_to_min_sec($coord) 
{ 
    $isnorth = $coord>=0; 
    $coord = abs($coord); 
    $deg = floor($coord); 
    $coord = ($coord-$deg)*60; 
    $min = floor($coord); 
    $sec = floor(($coord-$min)*60); 
    return array($deg, $min, $sec, $isnorth ? 'N' : 'S'); 
    // or if you want the string representation 
    return sprintf("%d&deg;%d'%d\"%s", $deg, $min, $sec, $isnorth ? 'N' : 'S'); 
} 

dico la mia funzione ha una migliore stabilità numerica di @ propria SERPRO.

+0

Il codice nella mia risposta non è mio, è una funzione trovata. Per quanto riguarda la tua funzione, non posso dire se sia migliore o meno, ma non so da dove viene la variabile "$ whole". – SERPRO

+0

Siamo spiacenti, questo è un errore di battitura. –

+0

Ehi, che ne dici se voglio scoprire se è ad ovest o ad est? – ragulka

1

Eccone uno in cui si passa in latitudine, longitudine in valori DMS e si restituisce la stringa DMS convertita. Facile e semplice

function DECtoDMS($latitude, $longitude) 
{ 
    $latitudeDirection = $latitude < 0 ? 'S': 'N'; 
    $longitudeDirection = $longitude < 0 ? 'W': 'E'; 

    $latitudeNotation = $latitude < 0 ? '-': ''; 
    $longitudeNotation = $longitude < 0 ? '-': ''; 

    $latitudeInDegrees = floor(abs($latitude)); 
    $longitudeInDegrees = floor(abs($longitude)); 

    $latitudeDecimal = abs($latitude)-$latitudeInDegrees; 
    $longitudeDecimal = abs($longitude)-$longitudeInDegrees; 

    $_precision = 3; 
    $latitudeMinutes = round($latitudeDecimal*60,$_precision); 
    $longitudeMinutes = round($longitudeDecimal*60,$_precision); 

    return sprintf('%s%s° %s %s %s%s° %s %s', 
     $latitudeNotation, 
     $latitudeInDegrees, 
     $latitudeMinutes, 
     $latitudeDirection, 
     $longitudeNotation, 
     $longitudeInDegrees, 
     $longitudeMinutes, 
     $longitudeDirection 
    ); 

} 
0

Ecco il contrario quando si dispone di stringa DMS ed è necessario che il numero float (contiene caratteri Unicode):

//e.g. 
$dec = dms_to_dec("-18° 51' 30.5697\""); 

/** 
* Convert a coordinate in dms to dec 
* 
* @param string $dms coordinate 
* @return float 
*/ 
function dms_to_dec($dms) 
{ 
    $dms = stripslashes($dms); 
    $neg = (preg_match('/[SWO]/i', $dms) == 0) ? 1 : -1; 
    $dms = preg_replace('/(^\s?-)|(\s?[NSEWO]\s?)/i', '', $dms); 
    $pattern = "/(\\d*\\.?\\d+)(?:[°ºd: ]+)(\\d*\\.?\\d+)*(?:['m′: ])*(\\d*\\.?\\d+)*[\"s″ ]?/i"; 
    $parts = preg_split($pattern, $dms, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 
    if (!$parts) { 
     return; 
    } 
    // parts: 0 = degree, 1 = minutes, 2 = seconds 
    $d = isset($parts[0]) ? (float)$parts[0] : 0; 
    $m = isset($parts[1]) ? (float)$parts[1] : 0; 
    if (strpos($dms, ".") > 1 && isset($parts[2])) { 
     $m = (float)($parts[1] . '.' . $parts[2]); 
     unset($parts[2]); 
    } 
    $s = isset($parts[2]) ? (float)$parts[2] : 0; 
    $dec = ($d + ($m/60) + ($s/3600))*$neg; 
    return $dec; 
} 
Problemi correlati