ここ最近ずっとAPIに関することを書いてきましたが、
APIというのは使い慣れれば便利なものではあるのですが、
当然APIごとに仕様がバラバラなので、
毎回新たに作り始めるときは、その都度パラメータや、
レスポンスデータの確認を念入りに行わなければいけません。
その中でも緯度経度のレスポンスデータだけがAPIによって特に違いが多いので、
使用する際に特に念入りにチェックしています。
例えば、取得したAPIデータの緯度経度情報を使って、
地図を表示させるサービスを使いたいとします。
そこで出てくるのは、以前にご紹介したGoogleのAPI。
GoogleのAPIだと世界測地系でdegree度単位で、
さらに小数点以下6桁まで表示という原則があります。
しかしAPIによっては出てくるデータが日本測地系で、
度分秒表記だとそのままでは全く使い物になりません。
特にリクルートが提供しているAPIに多いですね。
そこで、今回はそのでてきたデータを、
Googleの地図が使えるよう世界測地系で、
degree度単位に直すロジックを書きたいと思います。
例えば、取得した緯度経度が、
こんなデータ形式だったとしましょう。
日本測地系 N34.40.39 E135.30.10
いらないものがたくさんついていますね。
これを強引に世界測地系のdegree度単位に直してあげます。
//変数にセット $lat = 'N34.40.39'; $lon = 'E135.30.10'; //Nを消して、degree度単位に変換 $lat = str_replace('N', '', $lat); $lat = explode('.',$lat); $lat = $lat[0] + ($lat[1] * 60 + $lat[2])/3600; //Eを消してdegree度単位に変換 $lon = str_replace('E', '', $lon); $lon = explode('.',$lon); $lon = $lon[0] + ($lon[1] * 60 + $lon[2])/3600; //日本測地系を世界測地系に変換 $la = $lat - $lat * 0.00010695 + $lon * 0.000017464 + 0.0046017; $ln = $lon - $lat * 0.000046038 - $lon * 0.000083043 + 0.010040; var_dump($la,$ln); float(34.680759361886) float(135.49996873786)
小数点以下6桁の表示なので、
緯度は前から9個目以降、
経度は前から10個目以降ぶった切ってあげましょう。
$la = substr($la,0,9); $ln = substr($ln,0,10); $lat = (float)$la; $lon = (float)$ln; var_dump($lat,$lon); float(34.680759) float(135.499968)
これでGoogleのAPIで利用できる形式に変換完了です。
あと、もうひとつ多いケースで言うと、
344039 1353010
degree度単位になってはいるが、全部くっついてたりするのがあります。
そういうのも強引にぶったぎってやって下さい。
$lat = '344039'; $lon = '1353010'; //2つずつ切る $lat = str_split($lat,2); //3つずつ切る $lon = str_split($lon,3); //全部くっつける $lat = $lat[0] . '.' . $lat[1] . $lat[2] . $lat[3]; $lon = $lon[0] . '.' . $lon[1] . $lon[2]; var_dump($lat,$lon); string(7) "34.4039" string(8) "135.3010"
緯度は大体このやり方でいけますが、たまに経度がややこしかったりするので、
最悪の場合、上の切り方で1つずつ切ってあげてくっつけてもいいと思います。
あとはこの緯度経度を世界測地系に変換する上の式に当てはめるだけです。
それで完成。
APIから取得したデータはバラバラなので、
他にもあると思いますが特にこだわりがなければ、
こういう手段を使って、データを揃えてみて下さい。