Topics

All news & informations

緯度経度をデータとして扱う

エンジニアブログ
最近はGoogleMapsの影響か、緯度経度をデータとして扱う機会が増えてきています。
RCMSでも緯度経度はデータの切り口として、重要視しています。
(他には、時間(日付)・人などがあります)

RCMS
http://www.r-cms.jp/

日本であればここにたくさんデータがあるので、この辺を活用して、
国土数値情報ダウンロードサービス

GoogleMapsAPI
Yahoo!地図情報
などとつなぐといろいろなサービスが展開できますよね。
まあ、そうやってGoogleさんに位置情報をせっせと送信することになるのですが。。

以下は、うちで使っている緯度経度関係の関数です。
※今のところ、間違いを見つけてはいないのですが、正しい保証はありません。
<?PHP
/*
 * 2地点間の距離を緯度経度データから割り出す
 * gmap_x :A地点の経度
 * gmap_y :A地点の緯度
 * gmap_x2:B地点の経度
 * gmap_y2:B地点の緯度
 * return (km)
 */
function getDistanceFromGPS($gmap_x,$gmap_y,$gmap_x2,$gmap_y2){

  $gmap_y = 3.1415926535*$gmap_y/180;
  $gmap_x = 3.1415926535*$gmap_x/180;
  $gmap_y2 = 3.1415926535*$gmap_y2/180;
  $gmap_x2 = 3.1415926535*$gmap_x2/180;


  $gmap_y = $gmap_y - ((11.55/60)*3.1415926535/180)*sin(2*$gmap_y);
  $gmap_y2 = $gmap_y2 - ((11.55/60)*3.1415926535/180)*sin(2*$gmap_y2);

  $c=cos($gmap_y)*cos($gmap_y2)*cos($gmap_x-$gmap_x2)+sin($gmap_y)*sin($gmap_y2);
  $s=sqrt(1-$c*$c);
  $t=$s/$c;

  $z=atan($t);
  $z=6369*$z;

  return $z;
}

/*
 * 緯度経度を度=>度分秒 or 度分秒=>度に変換
 * map_num :緯度経度
 * return 緯度経度
 */
function changeGPSUnit($map_num,$type = 0){

    if($type == 1){
        //度分秒=>度
      $arrMap_num = split(".",$map_num);
      return $arrMap_num[0] + $arrMap_num[1]/60 + $arrMap_num[2]/3600;

    }else{
        //度=>度分秒
        $EH = floor($map_num);
        $EM = floor(($map_num - $EH)*60);
        $ES = round(($map_num - $EH - $EM/60)*3600,1);

        return $EH.".".$EM.".".$ES;
    }
}

/*
 * 緯度経度を日本測地系=>世界測地系 or 世界測地系=>日本測地系に変換
 * ln :経度
 * la : 緯度
 * return 緯度経度
 */
function changeGPSWJ($ln,$la,$type = 0){

    if($type == 1){
        //日本測地系=>世界測地系
        $lng = $ln - $la * 0.000046038 - $ln * 0.000083043 + 0.010040;
        $lat = $la - $la * 0.00010695 + $ln * 0.000017464 + 0.0046017;
        return array("lng"=>$lng,"lat"=>$lat);

    }else{
        //世界測地系=>日本測地系
        $lng = $ln + $la * 0.000046047 + $ln * 0.000083049 - 0.010041;
        $lat = $la + $la * 0.00010696 - $ln * 0.000017467 - 0.0046020;
        return array("lng"=>$lng,"lat"=>$lat);

    }
}
?>