PHPで、

下記の経度緯度を変換する為のコードを教えてください。
googlemapで利用していた経度緯度をmapfanの携帯サービスで利用したいです。
(たぶん preg_match 使うんだと思いますが。。。正規表現が勉強不足です。)

$lat = "39.710800"; //経度
$lng = "141.152435"; //緯度

■求める結果
経度:39.71.08.00
緯度:141.15.24.35

回答の条件
  • 1人2回まで
  • 登録:2008/10/19 19:01:23
  • 終了:2008/10/19 19:36:43

ベストアンサー

id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/10/19 19:20:58

ポイント50pt

入力値は、緯度・経度とも、整数部分1~3桁(符号無し)、小数部分6桁固定と想定しています。

ご質問にあった preg_match を使い、こんな感じでいかがでしょうか。

$lat = "39.710800"; //経度
$lng = "141.152435"; //緯度

$pat = '/(\d{1,3})\.(\d{2})(\d{2})(\d{2})/';

unset($arr);
$arr = array();
preg_match($pat, $lat, $arr);
if (count($arr) != 5) {
    echo 'lat error!!';
    exit(1);
}
$lat2 = sprintf("%d.%02d.%02d.%02d", $arr[1], $arr[2], $arr[3], $arr[4]);

unset($arr);
$arr = array();
preg_match($pat, $lng, $arr);
if (count($arr) != 5) {
    echo 'lng error!!';
    exit(1);
}
$lng2 = sprintf("%d.%02d.%02d.%02d", $arr[1], $arr[2], $arr[3], $arr[4]);

echo 'lat: ' . $lat . ' => ' . $lat2 . '<br />';
echo 'lng: ' . $lng . ' => ' . $lng2 . '<br />';
id:kou32rr

丁寧なコードありがとうございます。

勉強してみます。

2008/10/19 19:36:09

その他の回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/10/19 19:18:52

ポイント50pt
<?php
$lat = "39.710800"; //経度
$lng = "141.152435"; //緯度
echo preg_replace("/\.(\d{2})(\d{2})(\d{2})/",".$1.$2.$3",$lat);
echo "<br />";
echo preg_replace("/\.(\d{2})(\d{2})(\d{2})/",".$1.$2.$3",$lng);
?>|

小数点以下を2桁ずつに区切らせてます。

¥d{2}は数字2桁ずつを意味していて

  $1は一つ目

  $2は二つ目

  $3は三つ目

の値がそれぞれに入りますのでピリオドを入れた形に直しています。

id:kou32rr

ありがとうございます。

preg_match じゃなくて preg_replace の方がシンプルにいきそうですね。

2008/10/19 19:35:13
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/10/19 19:20:58ここでベストアンサー

ポイント50pt

入力値は、緯度・経度とも、整数部分1~3桁(符号無し)、小数部分6桁固定と想定しています。

ご質問にあった preg_match を使い、こんな感じでいかがでしょうか。

$lat = "39.710800"; //経度
$lng = "141.152435"; //緯度

$pat = '/(\d{1,3})\.(\d{2})(\d{2})(\d{2})/';

unset($arr);
$arr = array();
preg_match($pat, $lat, $arr);
if (count($arr) != 5) {
    echo 'lat error!!';
    exit(1);
}
$lat2 = sprintf("%d.%02d.%02d.%02d", $arr[1], $arr[2], $arr[3], $arr[4]);

unset($arr);
$arr = array();
preg_match($pat, $lng, $arr);
if (count($arr) != 5) {
    echo 'lng error!!';
    exit(1);
}
$lng2 = sprintf("%d.%02d.%02d.%02d", $arr[1], $arr[2], $arr[3], $arr[4]);

echo 'lat: ' . $lat . ' => ' . $lat2 . '<br />';
echo 'lng: ' . $lng . ' => ' . $lng2 . '<br />';
id:kou32rr

丁寧なコードありがとうございます。

勉強してみます。

2008/10/19 19:36:09
  • id:kou32rr
    求める回答にはなりましたが、
    そもそも質問が間違っていました。。。

    39.710800 = 39.71.08.00 ぢゃないんですね。。。(ToT)

    全然違う座標でした。
    http://taketan.mydns.jp/pukiwiki/index.php?cmd=read&page=PHP%2F%E8%87%AA%E4%BD%9C%E9%96%A2%E6%95%B0
    等参考にして進めています。。。
  • id:kou32rr
    また、googlemap :世界測地系
    mapfan:日本測地系
    ということでこの変換も必要みたいですね。。。無知無知。。。
  • id:pahoo
    PHPによる測地系の相互変換式については、
    http://www.pahoo.org/e-soul/webtech/php02/php02-23-02.html
    を参考にしてください。
  • id:yyr446
    「hh.mm.ss.nn」という表記は「度.分.秒.1/100秒」
    ですね。そうだとすると
    まず、39.710800の小数点以下0.710800に3600(秒)にをかけて
    ss = 0.7108 * 3600 => 2558.88
    の結果の小数点以下の2桁88がnnです。
    結果の整数部を60で割って
    mm = 2558 / 60 => 42.63333
    結果の整数部 42 が mm です。
    結果の余りが ss だから
    ss = 2558 -( 42 * 60) => 38
    となり、39.42.38.88 となります。

    最初に世界測地系(WGS)を日本測地系(tokyo)に変換しておく必要 があるので、全部まとめて、PHPで書くと

    function wgs84_tokyo($long, $lat) {
    $glong = $long + $lat * 0.000046047 + $long * 0.000083049 - 0.010041;
    $glat = $lat + $lat * 0.00010696 - $long * 0.000017467 - 0.0046020;

    $hh = floor($glat);
    $ss = floor(($glat - $hh) * 3600); 2558
    $nn = round(($glat * 3600 - $ss),2)*100; 88
    $mm = floor($ss / 60);
    $ss = $ss - $mm * floor($ss / 60);
    $clat = $hh . "." . $mm . "." . $ss . "." . $nn ;

    $hh = floor($long);
    $ss = floor(($long - $hh) * 3600); 2558
    $nn = round(($long * 3600 - $ss),2)*100; 88
    $mm = floor($ss / 60);
    $ss = $ss - $mm * floor($ss / 60);
    $clong = $hh . "." . $mm . "." . $ss . "." . $nn ;

    return array($clong, $clat);
    }
    では
  • id:yyr446
    <修正>
    全部まとめて、PHPで書くと
    <?php
    Print_r(wgs84_tokyo(141.152435,39.710800));
    function wgs84_tokyo($long, $lat) {
    $glong = $long + $lat * 0.000046047 + $long * 0.000083049 - 0.010041;
    $glat = $lat + $lat * 0.00010696 - $long * 0.000017467 - 0.0046020;

    $hh = floor($glat);
    $ss = floor(($glat - $hh) * 3600);
    $nn = round(($glat - $hh) * 3600 - $ss,2) * 100;
    $mm = floor($ss / 60);
    $ss = $ss - $mm * 60;
    $clat = $hh . "." . $mm . "." . $ss . "." . $nn ;

    $hh = floor($long);
    $ss = floor(($long - $hh) * 3600);
    $nn = round(($long - $hh) * 3600 - $ss,2) * 100;
    $mm = floor($ss / 60);
    $ss = $ss - $mm * 60;
    $clong = $hh . "." . $mm . "." . $ss . "." . $nn ;

    return array($clong, $clat);
    }
    ?>
    でした。
  • id:kou32rr
    ありがとうございます。
    思うようにできました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません