トップ地図アプリMap > SQLiteデータベースによるGPSログ管理

SQLiteデータベースによるGPSログ管理

はじめに

1年余り前から歩数管理に SQLite を使用している。 規模が小さいことも関係しているであろうが、問題なく動作している。

新Mapアプリでは、GPSログ管理にも SQLiteを使い、プログラムを簡素化したい。

GBSログ管理にSQliteデータベースを使うに当たってのパフォーマンステスト

インデックスなし

日別のGBSログファイルはこれまで通りとする。

データベース上の項目は以下のようにする。例えば、2026年1月18日 午後1時27分15秒の場合、 date=20260118、time=132715 とする。

step(歩数)はGPSログ表示では、徒歩か車(電車、バスなど)かの区別に使う。 室内自転車を漕いでいるときの記録も残るので、必要とあらば、日別の時間や歩数も算出できる。

CREATE TABLE gpslog (
    date  INTEGER,
    time  INTEGER,
    lon   INTEGER,
    lat   INTEGER,
    step  INTEGER,
    type  TEXT 
)

数年分の過去ログを登録すると 2,165,676行、64.8MB となった。

下記、二つの空間検索を実行する。

select * from gpslog where (lon between 1360560619 and 1362290950) and
(lat between 350305590 and 351743760);
select * from gpslog where (lon between 1385238650 and 1392379750) and
    (lat between 348814250 and 358629070);

初回の検索1は1秒強、そのあとは 検索1は 16行, 実行時間 221ミリ秒、検索2は 27行, 実行時間 221ミリ秒となった。

lonにインデックスを付与してみる

create index lonindex on gpslog(lon);

ファイルサイズは 91.7MB(+42%) に増加した。

検索1は 16行, 実行時間 11ミリ秒、検索2は 27行, 実行時間 48ミリ秒となった。

別途、lat および date にもインデックスを付与して検索時間を測定した。 ファイルサイズは更に40%以上増加するだけで、空間検索時間の短縮効果は殆どなかった。

GPSログ

期間としては約11年分の GPSログがある。Windowsタブレットの時は、主に出かけたときの記録だけであるが、 スマホになってからは基本的には毎日の記録がある。 コロナ禍では、殆ど遠出をしなかったため、記録のない期間もある。

自宅近くの GPSログデータは膨大なため、過去ログの表示に数秒かかるが、自宅から遠く離れた位置では 表示は瞬時である。

今のデータは少々間引きすぎのようである。精度を上げて、ファイルサイズが数倍に増えても、 実用上問題はないであろう。

全GBSログデータベースとは別に、遠出だけのデータベースを作れば、遠出の過去ログ表示は極めて迅速に なるだろう。

精度を上げて、パフォーマンスが問題になったときは、遠出だけのデータベースを作ることにする。

現時点の問題点

高尾山の過去ログを表示使用としたとき、多分、どこかで null エラーが起きたのであろう。 アプリがダウンした。

水戸近辺に一泊旅行したとき、ボタンは二日分表示されたが、二日目のGPSログが表示されない。 一日目のログにも精度の問題であろうか、間違いがある。

先日、兵庫県に出かけたときも、GPSログ表示の精度が前システムよりかなり悪かった。 データ量を絞り込みすぎが原因かもしれない。あるいは、何か、別の原因かもしれない。

いずれにせよ、問題がいくつか残っている。

アプリのダウン[java.lang.ArrayIndexOutOfBoundsException: length=6; index=6]

色の数よりボタンの数が大きいときに対応していなかった。

修正前 Colors[n])
修正後 Colors[n%Colors.length])

一泊旅行で2日目が表示されない

1日目(4月20日)のレコードは 8357行あるが、2日目(4月21日)が 98行しかない。

4月21日のレコードの先頭は実際は前夜のもので、データベースへの登録プログラムが 前夜(20日)の98行を 21日分として登録したものであろう。21日分が捨てられたのであろう。

このような場合、前日の深夜のレコードは無視してよい。

データベースへの取り込みプログラム

精度を上げることと、その日の先頭に前日深夜のデータがあればこれを無視するように改変する。 ホテルに泊まった日に、1日中GPSログをとり続けるため、起きるのであろう。 現在のプログラムでは自宅にいる場合、動きがなくなれば GPSログをとらないので、このような問題はおきない。

見つかったGPSログデータを下に示す。2021.3.26 から 2022.1.27 および 2023.7.15から2024.9.21 のデータは見つからない。

2023年末に昭和記念公園や高尾山に行ったが、そのGBS記録が見つからない。

Windowsタブレットから Androidスマホへの転換中であり、 部分的にはGPSログデータを採っていたが、スマホには見当たらない。 どこかにセーブしているかもしれない。見つかれば取り込むが、遠出は殆どないはず。

一部の区間はダブっている。これは、改造前と改造後のアプリを同時に動かしているからである。 一方を消してもいいが、ダブっていても不都合はさほどないので、ダブって読み込んでおく。

一時、Androidタブレットを持ち歩いていたので、実質的に有効なGPSログデータは5日分だけある。

/storage/9C33-6BBD/GIS/WT/gps_log_tb    2015.04.01~2021.03.25   WT
/storage/emulated/0/GIS/gpslog          2022.01.27~2023.04.20   SP
/storage/9C33-6BBD/MapData/SP/gpslogs   2023.04.15~2023.07.14   SP
/storage/9C33-6BBD/Map5/SP/gpslogs      2024.09.22~2024.11.06   SP
/storage/9C33-6BBD/GIS/SP/gpslogs       2024.11.02~現在         SP
/storage/9C33-6BBD/GIS/AT/gpslogs       2024.11.08~2025.3.26    AT (有効データ5日分のみ)

自宅外での間引きはやめた。dateとlonにインデックスを付与したときの ファイルサイズは 205MB になった。

2024.9.22 の前のファイルでエラーがある。SPであっても歩数データがないからだろう。 この対策をしてデータ登録をやり直した。ファイルサイズは 218MB になった。