Exif02.10に含まれるGPS情報についてまたも私的メモ
Count Start:2002/08/16
[全頁]A
/T
/Y
[当頁]A
/T
/Y
- ココで述べることは,2003年の暮れにJEIDAで見つけた,exif0210j.pdf(964K 172p.)を読み私なりの改積をしたもの。
- 勘違いしているかもしれません。
- IFD0 (main image)内に,[0x8769]![ExifIFDPointer]オフセットと同様に[8825]![GPS
info IFD]オフセットとして格納されている。
- 基本構造は,他のIFDと同様で,(2,2,4,4)BYTEであり,Big-endian(MM)とLittle-endian(II)の影響があり。
- カシミール3Dという秀逸したソフトがあり,これに先ほど公開されたデジカメプラグインを導入することによって,位置情報を書き込むことが出来る。
- 手順は,デジカメプラグイン[ブラウザ起動]を発動させ,左の小窓から任意の画像を地図上にDrag&Dropさせて,フロッピーマークで書き込むだけ。
- これだけなのである。
- ただし,測地系が,日本のカーナビなどで見かけるTokyoでなく,世界標準のWGS-84であることにご留意いただきたい。
- 少しなれれば,手動でTokyoに出来ますがね。
- 影響を受けるタグ
- IFD0 (main image)
- 0x0131 SoftWear "DIGICAM PLUGIN for KASHMIR3D"
- GPS info IFD
- 0x0000 GPS タグのバージョンGPSVersionID
- 0x0001 北緯(N)or 南緯(S) GPSLatitudeRef
- 0x0002 緯度(数値) GPSLatitude
- 0x0003 東経(E)or 西経(W) GPSLongitudeRef
- 0x0004 経度(数値) GPSLongitude
- 0x0005 高度の単位GPSAltitudeRef
- 0x0006 高度(数値) GPSAltitude
- 0x0012 測位に用いた地図データGPSMapDatum
- 手動時には,方向も付加させることが出来る。
- しかし今回は割愛。(2004.06.22)
- では,このGPS info IFDから,0x0000-0x0006について少しメモっておく。
- データフォーマット(以下,単純に'Type'とする。「exif0210j.pdf」より一部抜粋)
- タイプ(Type)Exif で用いるタイプは以下の通りである。
1 = BYTE 8 ビット符号無し整数。
2 = ASCII 一つの7 ピットASCII コードを納めた8 ビットバイト。最後のバイトはNULL で終端す
る。ASCII のカウントはNULL も含めた値とする。
3 = SHORT 16 ビット(2 バイト)符号無し整数。
4 = LONG 32 ビット(4 バイト)符号無し整数。
5 = RATIONAL LONG2 個。最初のLONG は分子、2 個目のLONG は分母を表す。
7 = UNDEFINED フィールドの定義により、どんな値をとっても良い8 ビットバイト。
9 = SLONG 32 ビット(4 バイト)符号付き整数(2 の補数表現)。
10 = SRATIONAL SLONG2 個。最初のSLONG は分子、2 個目のSLONG は分母を表す。
- 0x0000 GPS タグのバージョンGPSVersionID
- Type:BYTE
- Count:4
- MM/IIで,長整数(4byte)で読み込むと,0x02000000となるはず。
- これを1バイトづつ切り離し,"2.0.0.0"としよう。
- 0x0001 北緯(N)or 南緯(S) GPSLatitudeRef
- Type:ASCII
- Count:2
- 実際は,'N'か'S'しかない。
- MM/IIで,長整数(4byte)で読み込み,そのままChr()すればよい。
- 0x0002 緯度(数値) GPSLatitude
- Type:RATIONAL
- Count:3
- 分子と分母に相当するMM/IIで,長整数(4byte)が2つで1組。全体で3組ある。
- カシミール3Dでは,2組しか使っていない。
- 2組-DM表記 (例 35°20.609)
- 3組-DNS表記 (例 35°20′36.54″)
- そこで,Exif2Clipでは,3組目が0/0などであれば,2組目を分解して3組目を派生させている。
- Dim c0 as Double ' 2組目の値
- Dim c2 as Integer ' 単発の分′
- Dim c3 as Integer ' 単発の秒″
- c2=c0
- c3=(c0-c2) * 60#
- 0x0003 東経(E)or 西経(W) GPSLongitudeRef
- 0x0004 経度(数値) GPSLongitude
- 0x0005 高度の単位GPSAltitudeRef
- 0x0006 高度(数値) GPSAltitude
- 0x0012 測位に用いた地図データGPSMapDatum
- Type:ASCII
- Count:Any(不特定)
- 単なる文字列ということ。
- カシミール3Dでは,"WGS84"か"TOKYO"しか存在しない。
- さて,ゆうさんからの情報で,"TOKYO"座標で指定するmapionという地図サービスがある。
- 位置情報を"WGS84"で組み込んだ場合は,400〜500mのズレが生じるために"WGS84"から"TOKYO"へ変換しなければならない。
- これも,ゆうさんからの情報なのだが,Mac・GPS・Perlに,簡易版の変換式があった。
- 緯度Bと経度Lの数値は、度単位(D)
- BTokyo = BWGS84 + 0.00010696 * BWGS84 - 0.000017467 * LWGS84 - 0.0046020
- LTokyo = LWGS84 + 0.000046047 * BWGS84 + 0.000083049 * LWGS84 - 0.010041
- − というものだ。
- では,0x0002と0x0004を変換する手順だが,'度分秒'の3つに分けられているので,'度'一本にする。
- Dim c1 as Integer ' 単発の度
- Dim c2 as Integer ' 単発の分
- Dim c3 as Integer ' 単発の秒
- Dim c0 as Double ' 合成された度分秒
- c0=c1 + (c2 / 60#) + (c3 / 3600#)
- このような形で,一本化された値を経度緯度ともに先ほどの式に掛ける。
- "WGS84"から"TOKYO"変換後の解も一本化された値なので,分解する。
- Dim c0 as Double ' 合成された度分秒
- Dim c1 as Integer ' 単発の度
- Dim c2 as Integer ' 単発の分
- Dim c3 as Double ' 単発の秒
- c3 = c0
- c1 = Int(c3): c3 = (c3 - c1) * 60#
- c2 = Int(c3): c3 = (c3 - c2) * 60#
- 一部,c3=c0が無駄に見えるし,後で再利用する予定がないのなら,c3をc0に変更すればよい。
参考サイト