FITファイルの緯度経度はどれ? — semicirclesという整数単位と、度へ戻す計算・測地系

,

FITファイルの緯度経度はどれ? — semicirclesという整数単位と、度へ戻す計算・測地系

FITファイルの緯度経度はどれ? — semicirclesという整数単位と、度へ戻す計算・測地系

FITファイルの position_lat / position_long は、度ではなく semicircles(セミサークル)という単位の32bit整数です。度に戻すには 度 = semicircles × 180 ÷ 2³¹ を掛けます。測地系はGNSSがそのまま出すWGS84。つまり「単位が度でないだけで、中身はふつうの緯度経度」です。485072248 のような見慣れない整数が出てきても、変換式さえ分かれば怖くありません。


まず、実物を見てみる

GPSウォッチやサイクルコンピュータの活動データをデコードすると、レコードにこんな値が並びます。

position_lat:   485072248
position_long: -882385675

緯度が4億、経度がマイナス8億。度でも度分秒でもミリ秒でもありません。これが semicircles です。

変換式を当てると、

生の値 × 180 ÷ 2³¹ 意味
485072248 40.658286° 北緯40.66度
−882385675 −73.960713° 西経73.96度

ニューヨーク・ブルックリン付近です。ちゃんと緯度経度でした。


semicircles とは何か

定義はシンプルです。

180度 = 2³¹ semicircles(= 2,147,483,648)

「セミサークル(半円)」という名前は、180度=半周を 2³¹ に割り当てたことから来ています。

変換式は2本だけです。

度          = semicircles × (180 / 2^31)
semicircles = 度          × (2^31 / 180)

係数を先に出しておくと計算が楽になります。

向き 係数
semicircles → 度 × 8.381903171539307e-8
度 → semicircles × 11930464.711111111

たとえば東京駅(北緯35.681236度・東経139.767125度)を semicircles にすると——

semicircles
緯度 35.681236 425693727
経度 139.767125 1667486753

戻すと 35.68123600 / 139.76712503 で、小数第7位まで一致します。


なぜ度ではなく整数なのか

理由は3つあります。

1. 32bitに収まる

sint32(符号付き32bit整数)の範囲は −2,147,483,648 〜 +2,147,483,647。ちょうど −180度 〜 +180度に対応します。64bitの倍精度小数を使わずに、全経度をぴったり表現できる設計です。

2. 1cmの分解能がある

1 semicircle が何メートルに当たるかを計算すると、

  • 1 semicircle = 180 ÷ 2³¹ = 約 0.0000000838度
  • 赤道上の経度方向に換算して 約 9.3 mm
  • 緯度方向も 約 9.3 mm

約1cm。GNSSの民生機器の測位精度(数m)に対して十分すぎる細かさです。ログのファイルサイズを抑えつつ、精度は落とさない——という割り切りです。

3. 整数演算で済む

腕時計やサイクルコンピュータの中の小さなプロセッサでは、浮動小数点演算が重い(あるいは苦手)ことがあります。座標を整数で持てば、足し算・引き算だけで距離の概算や境界判定ができます。組み込み向けの設計思想がそのまま単位になっている、という見方もできます。


測地系は?——WGS84。ただし「だから何もしなくていい」ではない

FITのpositionは、機器のGNSS受信機が出力した座標をそのまま格納したものです。GNSSが素で出す座標はWGS84(実運用上はITRF系と数cmレベルで一致)。GPX・KML・GeoJSONと同じ状況です(この3形式が測地系を選べない理由は別記事にまとめています)。

日本国内の業務でこのログを使うなら、そのまま図面や成果に混ぜてはいけません。

  • WGS84(=おおむねITRF今期)と JGD2011 / JGD2024 は別の座標系
  • 日本では地殻変動により、元期と今期で数十cm〜1mクラスの差が出る
  • 平面直角座標へ落とすなら、投影の前に測地系を揃える

順番は「semicircles → 度(WGS84) → 測地系変換 → 投影」です。単位変換と測地系変換は別物なので、混同しないでください(WGS84とJGD2024の関係ITRF今期から元期への変換)。

民生機器のGPS座標とWGS84・JGD2011・JGD2024の関係を示した図


つまずきやすいところ

無効値をそのまま度に直してしまう

FITでは、値が取れなかったフィールドに型ごとの無効値(invalid value)が入ります。sint32 の無効値は 0x7FFFFFFF(=2,147,483,647)。

これをうっかり変換式に通すと——

2147483647 × 180 / 2^31 = 179.99999992°

「北緯180度」という、存在しない座標ができあがります。トンネル内や測位開始直後のレコードで起きやすいので、変換前に無効値を落とすのが鉄則です。

デコーダによっては無効値を自動で None / null に置き換えてくれます。使っているライブラリがどちらの挙動なのかは、最初に1回確かめておくと安全です。

符号の扱いを間違える

sint32 は符号付きです。西経・南緯は負の値で入ります。符号なし32bitとして読むと、西経73.96度が「東経286度」に化けます。上の例の -882385675 を符号なしで読むと 3412581621 になり、変換すると286.04度。地図に置くと大西洋のはるか西、太平洋のどこかへ飛びます。

度分秒と取り違える

FITの値は10進度でも度分秒でもありません。「小数点の位置がおかしいだけ」と思って /1e7 で割ると、48.5度というもっともらしいけれど間違った値が出ます。もっともらしい値が出るのが一番やっかいで、地図に置くまで気づけません。

このあたりは度分秒と10進度の変換と同じ注意です。「この数字はどの表記か」を先に確定させる。

GeoConverter Proの手入力画面。度分秒で入力した座標をJGD2024へ変換した結果

桁落ちさせる

float(単精度)に入れると有効桁が7桁程度しかなく、cm級の情報が消えます。semicirclesは整数のまま保持し、度へ直すときは double を使ってください(浮動小数点と座標精度)。


GPX / TCX に変換したときの関係

FITを他形式へ書き出すと、座標は10進度になります。

形式 座標の持ち方 測地系
FIT semicircles(sint32) WGS84
GPX 10進度(属性 lat / lon WGS84固定
TCX 10進度(LatitudeDegrees / LongitudeDegrees WGS84

変換そのもので情報は落ちません。semicirclesの分解能は約1cm、GPXで小数7桁書けば約1.1cmなので、ほぼ等価です。ただし書き出し桁数を6桁に丸めるツールだと約11cmまで粗くなります。cm級の話をしているときは、桁数を確認してください。


まとめ

  • FITの position_lat / position_longsemicircles180度 = 2³¹ semicircles
  • 度 = semicircles × 180 ÷ 2³¹(係数 8.381903171539307e-8)、逆は × 11930464.7111
  • sint32 に −180〜+180度がちょうど収まり、分解能は 約9.3mm
  • 測地系は WGS84。日本の業務で使うなら JGD2011 / JGD2024 への変換が別途必要
  • 無効値 0x7FFFFFFF を変換すると 179.99999992度。先に落とす
  • 符号なしで読むと西経が東経に化ける。/1e7 で割るともっともらしい誤りになる
  • GPX / TCX は10進度。小数7桁あれば情報は落ちない(6桁だと約11cmまで粗くなる)

「見慣れない整数が入っている」ときは、たいてい単位が違うだけです。単位さえ確定すれば、あとはいつもの測地系の話に戻ります。

出典

  • Official Garmin FIT C SDK(position_latFIT_SINT32 / units: semicircles として定義されている): https://github.com/garmin/fit-c-sdk
  • Garmin FIT files – Units and records(0x80000000 = 180度): http://kofa.mmto.arizona.edu/garmin/garmin66i/fit/units.html
  • Record the latitude and longitude format of the message — Garmin Forums / FIT SDK: https://forums.garmin.com/developer/fit-sdk/f/discussion/280125/record-the-latitude-and-longitude-format-of-the-message
  • What CRS does the python sdk decode to — Garmin Forums / FIT SDK: https://forums.garmin.com/developer/fit-sdk/f/discussion/325061/what-crs-does-the-python-sdk-decode-to-eg-position_lat-485072248-position_long–882385675
  • 世界測地系 — 国土地理院: https://www.gsi.go.jp/sokuchikijun/datum-main.html

係数(8.381903171539307e-8 / 11930464.711111111)、9.3mmという分解能、東京駅の semicircles 値、179.99999992度、286.04度は、いずれも 180 / 2^31 の定義から本記事内で計算した値です。無効値の扱いはデコーダの実装によって異なるため、使用するライブラリの挙動を実データで確認してください。記述は2026年9月時点のものです。


GeoConverter Proの主要画面

度に直したあと、JGD2011・JGD2024・平面直角座標へ変換するところまでを1本で扱えるアプリを作っています。

GeoConverter Pro(座標変換アプリ・iOS)
https://apps.apple.com/jp/app/geoconverter-pro/id6761740960


次に確認する


開発者より: アプリ・Kindle本・オープンソースの一覧は GitHub: amru195704 にまとめています。


お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。誤記・不正確な情報がございましたら、コメント欄よりご指摘いただければ、確認のうえ修正いたします。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

トップへ戻る