
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今期から元期への変換)。

つまずきやすいところ
無効値をそのまま度に直してしまう
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進度の変換と同じ注意です。「この数字はどの表記か」を先に確定させる。

桁落ちさせる
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_longは semicircles。180度 = 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_latがFIT_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月時点のものです。

度に直したあと、JGD2011・JGD2024・平面直角座標へ変換するところまでを1本で扱えるアプリを作っています。
GeoConverter Pro(座標変換アプリ・iOS)
https://apps.apple.com/jp/app/geoconverter-pro/id6761740960
次に確認する
- GeoJSON・KML・GPXが測地系を選べない理由を確認する — FITの書き出し先になる形式が、なぜWGS84固定なのかが分かります
- WGS84とJGD2024がどういう関係にあるのかを確認する — 「WGS84だから日本でもそのまま使える」が成り立たない理由です
- 浮動小数点で座標が何桁まで保てるかを確認する — semicirclesを度へ直すときに
doubleが要る理由の中身です - NMEAのddmm形式を度へ直す手順を確認する — 「度に見えて度ではない」もうひとつの代表例です
- 緯度1度・経度1度が何メートルになるのかを確認する(GeoPrism JP) — 9.3mmという分解能がどこから出てくるかを図で追えます
- 書籍でまとめて学ぶ: 『日本の測地系Q&A』第13章「座標データの落とし穴」(Kindle Unlimited対応)
開発者より: アプリ・Kindle本・オープンソースの一覧は GitHub: amru195704 にまとめています。
お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。誤記・不正確な情報がございましたら、コメント欄よりご指摘いただければ、確認のうえ修正いたします。
コメントを残す