PHP:緯度と経度を度、分、秒でフォーマットする

どのように私はこれを変換することができます:

26.72773551940918

このようなものに:

22°12'42"N

ここでのトリックは、座標は、実際には緯度と経度です。ちょうど正しくフォーマットする必要があります。

6

4 答え

You can find functions to do that 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);
}    

?>
14
追加された
@SERPRO:違いを減らす方法を知っています学位とDMSの間の変換によって引き起こされますか?
追加された 著者 secretlm,
どういたしまして! :)
追加された 著者 SERPRO,
ありがとう!それはうまくいくようです!
追加された 著者 ragulka,

緯度/経度の座標は、基本的にはベース60の数値システムに書かれています。ここでそれらを変換する方法は次のとおりです。

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°%d'%d\"%s", $deg, $min, $sec, $isnorth ? 'N' : 'S');
}

私の関数は@ SeRPRoの関数よりも数値的に安定していると言います。

6
追加された
申し訳ありません、それはタイプミスです。
追加された 著者 Leonid Shevtsov,
@ragulka、 en.wikipedia.org/wiki/Longitude :「計算のために、西/東の接尾辞は西半球の負の記号に置き換えられます。
追加された 著者 Leonid Shevtsov,
私の答えのコードは私のものではなく、それは見つかった関数です。あなたの関数については、それが良いかどうかは言えませんが、 "$ whole"変数はどこから来たのか分かりません。
追加された 著者 SERPRO,
ねえ、私はそれが西であるか東であるかを知りたいのですか?
追加された 著者 ragulka,

ここではDMS値の緯度と経度を渡し、変換されたDMS文字列を返します。簡単で簡単

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

}
2
追加された

DMS文字列があり、それを浮動小数点数(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;
}
0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com