Conversione di Gradi, Minuti, Secondi (DMS) decimale in PHP

Attualmente, sto imparando ad utilizzare l’API di Google Maps. Da quello che ho letto, le API richiedono le coordinate di latitudine e longitudine Decimale Grado (DD).

Nel mio database, i dati vengono memorizzati come DMS.

Esempio, 110° 29′ 01.1″

Vorrei chiedere se voi ragazzi avete qualsiasi DMS DD in php. E il convertitore deve accettare da una singola stringa, come nell’esempio precedente.

Riguarda

possibile duplicato di la Conversione di Latitudine/Longitudine valori DMS (+Direzione della Bussola), corrispondenti valori di Punto Decimale in Android
Il link qui sopra è Android, ma è esattamente lo stesso principio.

OriginaleL’autore Azlan Nohara | 2014-03-11

5 Replies
  1. 10

    Si può provare se questo è il lavoro per voi.

    <?php
    
    function DMStoDD($deg,$min,$sec)
    {
    
        //Converting DMS ( Degrees /minutes /seconds ) to decimal format
        return $deg+((($min*60)+($sec))/3600);
    }    
    
    function DDtoDMS($dec)
    {
        //Converts decimal format to DMS ( Degrees /minutes /seconds ) 
        $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);
    }    
    
    ?>
    ma non so come separare l’ingresso. Ad esempio 110° 29′ 01.1″ –> diploma di Laurea 110, 29 Minuti, Secondo 01.1
    fare riferimento a stackoverflow.com/questions/1140189/…
    il post è utilizzare la funzione javascript. Io preferisco una funzione PHP, dato che è possibile recuperare i dati in phpmyadmin
    In PHP es. $var=preg_split(“/[^\d\w]+/”,$longitudine); quindi $vars[0], $vars[1], $vars[2]

    OriginaleL’autore Romi

  2. 2

    Risolto.

     <?php
    
     function DMStoDD($input)
    {
        $deg = " " ;
        $min = " " ;
        $sec = " " ;  
        $inputM = " " ;        
    
    
        print "<br> Input is ".$input." <br>";
    
        for ($i=0; $i < strlen($input); $i++) 
        {                     
            $tempD = $input[$i];
             //print "<br> TempD [$i] is : $tempD"; 
    
            if ($tempD == iconv("UTF-8", "ISO-8859-1//TRANSLIT", '°') ) 
            { 
                $newI = $i + 1 ;
                //print "<br> newI is : $newI"; 
                $inputM =  substr($input, $newI, -1) ;
                break; 
            }//close if degree
    
            $deg .= $tempD ;                    
        }//close for degree
    
         //print "InputM is ".$inputM." <br>";
    
        for ($j=0; $j < strlen($inputM); $j++) 
        { 
            $tempM = $inputM[$j];
             //print "<br> TempM [$j] is : $tempM"; 
    
            if ($tempM == "'")  
             {                     
                $newI = $j + 1 ;
                 //print "<br> newI is : $newI"; 
                $sec =  substr($inputM, $newI, -1) ;
                break; 
             }//close if minute
             $min .= $tempM ;                    
        }//close for min
    
            $result =  $deg+( (( $min*60)+($sec) ) /3600 );
    
    
            print "<br> Degree is ". $deg*1 ;
            print "<br> Minutes is ". $min ;
            print "<br> Seconds is ". $sec ;
            print "<br> Result is ". $result ;
    
    
    return $deg + ($min / 60) + ($sec / 3600);
    
       }
    ?>

    OriginaleL’autore Azlan Nohara

  3. 2

    Eccone uno in cui si passa la latitudine,la longitudine in DMS valori e restituisce il convertito DMS stringa. Facile e simnple

    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
        );
    
    }

    OriginaleL’autore bicycle

  4. 0

    Ho scritto una funzione PHP che fa ciò che la domanda chiede: converte una stringa in gradi/minuti/secondi in gradi decimali. Accetta un certo numero di formati diversi per la stringa, e gli onori direzione (NSEW).

    Ecco il codice:

    <?php
    function convertDMSToDecimal($latlng) {
        $valid = false;
        $decimal_degrees = 0;
        $degrees = 0; $minutes = 0; $seconds = 0; $direction = 1;
        //Determine if there are extra periods in the input string
        $num_periods = substr_count($latlng, '.');
        if ($num_periods > 1) {
            $temp = preg_replace('/\./', ' ', $latlng, $num_periods - 1); //replace all but last period with delimiter
            $temp = trim(preg_replace('/[a-zA-Z]/','',$temp)); //when counting chunks we only want numbers
            $chunk_count = count(explode(" ",$temp));
            if ($chunk_count > 2) {
                $latlng = $temp; //remove last period
            } else {
                $latlng = str_replace("."," ",$latlng); //remove all periods, not enough chunks left by keeping last one
            }
        }
    
        //Remove unneeded characters
        $latlng = trim($latlng);
        $latlng = str_replace("º","",$latlng);
        $latlng = str_replace("'","",$latlng);
        $latlng = str_replace("\"","",$latlng);
        $latlng = substr($latlng,0,1) . str_replace('-', ' ', substr($latlng,1)); //remove all but first dash
    
        if ($latlng != "") {
            //DMS with the direction at the start of the string
            if (preg_match("/^([nsewNSEW]?)\s*(\d{1,3})\s+(\d{1,3})\s+(\d+\.?\d*)$/",$latlng,$matches)) {
                $valid = true;
                $degrees = intval($matches[2]);
                $minutes = intval($matches[3]);
                $seconds = floatval($matches[4]);
                if (strtoupper($matches[1]) == "S" || strtoupper($matches[1]) == "W")
                    $direction = -1;
            }
            //DMS with the direction at the end of the string
            if (preg_match("/^(-?\d{1,3})\s+(\d{1,3})\s+(\d+(?:\.\d+)?)\s*([nsewNSEW]?)$/",$latlng,$matches)) {
                $valid = true;
                $degrees = intval($matches[1]);
                $minutes = intval($matches[2]);
                $seconds = floatval($matches[3]);
                if (strtoupper($matches[4]) == "S" || strtoupper($matches[4]) == "W" || $degrees < 0) {
                    $direction = -1;
                    $degrees = abs($degrees);
                }
            }
            if ($valid) {
                //A match was found, do the calculation
                $decimal_degrees = ($degrees + ($minutes / 60) + ($seconds / 3600)) * $direction;
            } else {
                //Decimal degrees with a direction at the start of the string
                if (preg_match("/^(-?\d+(?:\.\d+)?)\s*([nsewNSEW]?)$/",$latlng,$matches)) {
                    $valid = true;
                    if (strtoupper($matches[2]) == "S" || strtoupper($matches[2]) == "W" || $degrees < 0) {
                        $direction = -1;
                        $degrees = abs($degrees);
                    }
                    $decimal_degrees = $matches[1] * $direction;
                }
                //Decimal degrees with a direction at the end of the string
                if (preg_match("/^([nsewNSEW]?)\s*(\d+(?:\.\d+)?)$/",$latlng,$matches)) {
                    $valid = true;
                    if (strtoupper($matches[1]) == "S" || strtoupper($matches[1]) == "W")
                        $direction = -1;
                    $decimal_degrees = $matches[2] * $direction;
                }
            }
        }
        if ($valid) {
            return $decimal_degrees;
        } else {
            return false;
        }
    }
    ?>

    Qui è su Github con casi di test: https://github.com/prairiewest/PHPconvertDMSToDecimal

    OriginaleL’autore Todd Trann

  5. -1

    Questo funziona molto bene:

    <?php echo "<td> $deg&#176 $min' $sec&#8243 </td>";  ?> 

    dove deg, min e sec angolare coordinate.

    OriginaleL’autore Ikhu-Omoregbe Smart

Lascia un commento