画像のGPS EXIFを解析
カメラが記録した度・分・秒を、地図で使える40.446333333333や-79.982333333333のような十進の座標に変換します。N・S・E・Wの文字が符号を決めるので、南と西はマイナスになります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 緯度
- 40, 26, 46.8
- 緯度の基準
- N
- 経度
- 79, 58, 56.4
- 経度の基準
- W
- 緯度
- 40.4463333333
- 経度
- -79.9823333333
- 緯度 (度分秒)
- 40, 26, 46.8
- 経度 (度分秒)
- 79, 58, 56.4
画像メタデータでは、位置情報が一般的な十進座標ではなく、4個のGPS EXIFタグに分かれて保存されることがあります。この解析機能は、緯度と経度の度・分・秒、および参照方位を受け取り、値を検証して符号付きの十進緯度・経度を返します。EXIFリーダーの後段に組み込める決定論的な変換処理であり、開発、アーカイブ、調査の各業務に適しています。北と東は正、南と西は負として扱います。
GPS EXIFの生タグを入力項目へ対応させます
EXIFは撮影場所をGPSLatitude、GPSLatitudeRef、GPSLongitude、GPSLongitudeRefで表します。通常、EXIFライブラリは1番目と3番目のタグを度、分、秒の順に並んだ3個の数値として返します。DMS配列に負号を付けないでください。
符号は参照方位から決まります。小文字は大文字へ正規化されます。各配列には有限の数値がちょうど3個必要です。
分と秒は0以上60未満でなければなりません。緯度は90度、経度は180度を超えられず、上限値の場合は分と秒が0である必要があります。この検証により、不正なメタデータが地図、データベース、地理空間インデックスへ入る前に検出できます。
本機能は抽出済みタグを対象とし、画像ファイル自体は復号しません。お使いのEXIFリーダーの後段でご利用ください。
写真の十進座標を安全にご利用ください
変換後の座標はGeoJSONへの保存、地図表示、近傍検索用の索引作成、別の位置記録との照合に利用できます。座標の組を分離せず、軸の順序にもご注意ください。正規化した参照方位とDMS配列を残すと、移行作業を確認しやすくなります。
タグが存在しない場合や無効な場合は0へ置換せず、データ品質エラーとして扱ってください。緯度0、経度0は実在する地点です。本機能は非有限値、不完全な配列、範囲外の要素、極点や反子午線を超える値を拒否します。
カメラが実際にその場所にあったか、測地系の差、プライバシー上の妥当性は判定しません。写真公開前には精密な位置の開示が適切かご確認ください。
活用例
写真アーカイブを正規化
抽出したGPS EXIF配列を一貫した十進座標へ変換してから、画像コレクションを索引化します。
写真を地図上へ配置
カメラのメタデータを、地図やGeoJSONが扱える符号付き緯度・経度へ変換します。
EXIF取り込み処理を検証
壊れた参照方位や不可能なDMS要素を、本番ストレージへ保存する前に拒否します。
よくある質問
画像ファイル自体を読み取りますか?
いいえ。 EXIFリーダーで事前に抽出されたGPS EXIFタグを変換します。
DMS値はどのように変換しますか?
度に分を60で割った値と秒を3600で割った値を加えます。SおよびWの場合は結果を負にします。
分や秒に60を指定できますか?
いいえ。 0以上60未満にしてください。繰り上がりがある値は、解析前に正規化してください。
南緯や西経のときはマイナス記号を付けますか?
いいえ。度・分・秒は正の数のまま入力し、方向は参照文字に任せます。Sなら緯度が、Wなら経度がマイナスになります。
有効な参照文字はどれですか?
緯度はNかS、経度はEかWです。小文字は大文字にそろえられますが、それ以外の文字や、緯度と経度の文字の取り違えは推測せずに受け付けません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/image/exif-gps-parse \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"latitude":[40,26,46.8],"latitude_ref":"N","longitude":[79,58,56.4],"longitude_ref":"W"}'const res = await fetch("https://api.kit.forhosting.com/image/exif-gps-parse", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"latitude": [
40,
26,
46.8
],
"latitude_ref": "N",
"longitude": [
79,
58,
56.4
],
"longitude_ref": "W"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/exif-gps-parse",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"latitude": [
40,
26,
46.8
],
"latitude_ref": "N",
"longitude": [
79,
58,
56.4
],
"longitude_ref": "W"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/exif-gps-parse", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"latitude":[40,26,46.8],"latitude_ref":"N","longitude":[79,58,56.4],"longitude_ref":"W"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"latitude":[40,26,46.8],"latitude_ref":"N","longitude":[79,58,56.4],"longitude_ref":"W"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/exif-gps-parse", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"latitude": [
40,
26,
46.8
],
"latitude_ref": "N",
"longitude": [
79,
58,
56.4
],
"longitude_ref": "W"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.exif_gps_parse",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 15 |
max_megapixels | 12 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
GPS EXIFの生タグを入力項目へ対応させます
これらの配列をlatitudeとlongitudeへ、対応する方位文字をlatitude_refとlongitude_refへ指定してください。
変換式と参照方位の検証をご確認ください
各軸について、度に「分を60で割った値」と「秒を3600で割った値」を加えて絶対値を求めます。その後、方位を適用します。Nでは緯度を正、Sでは負、Eでは経度を正、Wでは負にします。応答には十進座標だけでなく、正規化済み参照方位と検証済みDMS配列も含まれるため、変換を監査できます。安定したJSONを得るため、結果は小数点以下12桁に丸められます。参照方位は厳密に検証され、latitude_refにはNまたはS、longitude_refにはEまたはWのみ指定できます。別の文字、単語、空文字列、軸が異なる方位を指定すると、推測せずinvalid_inputを返します。これにより、壊れた参照タグで写真が赤道や本初子午線の反対側へ移る事故を防げます。ネットワーク、時計、乱数、外部モデルを使わない決定論的な算術処理なので、ブラウザ、API、テスト、オフラインJavaScriptで同じ結果になります。
写真の十進座標を安全にご利用ください
この応答はlatitude、longitudeの順ですが、一部の幾何形式は逆順です。自動処理では4タグが揃った場合のみ解析し、invalid_inputは却下レコードとして扱い、元画像の来歴を保存してください。ブラウザではローカル実行でき、API自動処理は成功1件あたり$0.002です。
技術的な質問
有効な参照方位は何ですか?
緯度はNまたはS、経度はEまたはWです。大文字と小文字は区別せず、それ以外はinvalid_inputになります。
API呼び出しの料金はいくらですか?
成功した1件につき$0.002です。ブラウザでは同じ決定論的計算をローカルで実行できます。