4

Exif の経度と緯度のデータを Google フレンドリーな 10 進数値に変換しようとしています。多くのチュートリアルを読みましたが、何もうまくいかないようです。私はこれを完全に間違っているかもしれません。

次のように Exif データを正常に取得します。

$exif_data = exif_read_data($path . '/user/images/4.jpg');

$egeoLong = $exif_data['GPSLongitude'];
$egeoLat = $exif_data['GPSLatitude'];
$egeoLongR = $exif_data['GPSLongitudeRef'];
$egeoLatR = $exif_data['GPSLatitudeRef'];

そこから、値の次の配列になります。

deg Long: 118/1
min Long: 2147/100
sec Long: 0/1
Longitude Ref: W

deg Lat: 34/1
min Lat: 433/100
sec Lat: 0/1
Latitude Ref: N

そして、この関数を実行して 10 進数値を取得します (Stackoverflow でこの関数を取得しました)。

$geoLong = gpsDecimal($egeoLong[0], $egeoLong[1], $egeoLong[2], $egeoLongR);
$geoLat = gpsDecimal($egeoLat[0], $egeoLat[1], $egeoLat[2], $egeoLatR);

function gpsDecimal($deg, $min, $sec, $hemi) {
    $d = $deg+((($min*60)+($sec))/3600);
    return ($hemi=='S' || $hemi=='W') ? $d*=-1 : $d;
}

次の結果が返されます...これは、座標を海の真ん中に置きます...私が写真を撮った場所ではありません。

緯度: 41.216666666667 経度: -153.78333333333

私が間違っていること、またはこれを達成するためのより良い方法を誰かに教えてもらえますか。どんな助けでも大歓迎です。

4

2 に答える 2

3

同じ式を見つけましたが、私にとってもうまくいきませんでした。私が最終的に理解したこと、そして私にとってうまくいったことは次のとおりです。

function toDecimal($deg, $min, $sec, $hem) 
{
    $d = $deg + ((($min/60) + ($sec/3600))/100);
    return ($hem=='S' || $hem=='W') ? $d*=-1 : $d;
}
于 2012-08-24T07:17:30.043 に答える
1

最良の近似は(Googleマップによって変換された座標に基づく)であることがわかりました

$deg + ($min/60) + ($sec/36000000)
于 2014-08-29T18:59:17.593 に答える