qgmap

概要

zaurus で動作する Google Maps の地図ビューワです。

GM_Lite/gmlMgrでダウンロードした地図データを zaurus 上で表示します。

GPSやPHSによる現在地取得に対応しています。

ファイル

ライセンス

GPL v2です。(v2 なのは何となく)

対応機種

SL-A300, SL-Cシリーズです。SL-A300, C760, C1000 で確認しています。

対応GPS機器

基本的にNMEAフォーマットのログが取得できれば使用できるはずです。
以下に動作確認したもの、動作報告を頂いた機器を示します。
動作報告を頂いた皆様、この場を借りて御礼申し上げます。

  • Holux M-241 + リテールコム BIT-BTH11H  (Bluetooth)
  • Locosys uPod (USB)
  • GlobalSat ND-100 (USB)
  • Nokia LD-3W + コレガ CG-BT2UB02CW (Bluetooth)
  • Wintec WBT-201 + コレガ CG-BT2USB02CW (Bluetooth)
  • Wintec WSG-1000 + コレガ CG-BT2USB02CW (Bluetooth)
  • IBS Japan GPS20C + IBS Japan IMUB-01 (Bluetooth)
  • Holux M-241 + IBIS Japan IMUB-01 (Bluetooth)
  • Holux M-241 + コレガ CG-BT2USB02C (Bluetooth)
  • GlobalSat BC-337(コメット3/CF) (CFスロット)
  • IODATA CFGPS2 (CFスロット)
  • Locosys BGT-31 + Ambicom BT2000 (CF Bluetooth)
  • GT-730FL-S (USB)

インストール

上記ファイルから ipkg ファイルをダウンロードし、「ソフトウェアの追加と削除」からインストールしてください。

本体、外部メディアどちらでもインストール可能です。

また、SL-A300 で iso, romfs イメージを使用するには別途カーネルモジュールが必要になります。こちらのブログエントリを参照ください。

地図データの準備

注意! Google Maps の地図データをダウンロードして使用しますが、このような使い方は Google Maps の通常の使い方ではありませんので、個人の責任で行ってください。

実用工房さんにて、公開されている GM_Lite か、wasteさんが公開されている GmlMgr を使って地図をダウンロードします。

地図のダウンロード方法等は詳しく書かれている方が多くいらっしゃいますので、Google で検索してみてください。

また、地図レシピにて各都道府県のダウンロードスクリプトを配布していますので、合わせてご使用ください。

GM_LiteやGmlMgrでは、メディアの使用容量を少なくするため、地図画像を1つにまとめて「イメージ化」することが可能です。qgmap ではイメージ化された地図にも対応しています。

初期設定

qgmap をインストールすると、「アプリケーション」タブに以下のような qgmap アイコンが追加されます。

アイコン
qgmapアイコン

このアイコンをタップすると qgmap が起動します。

初めて起動すると以下のような画面が表示されます。


初期起動画面

初回起動時は地図画像のパスが設定されていないので、上記のように地図が表示されません。

設定するために、左上のアイコンをクリックし、 「Map Path」 を選択します。

メニュー

すると、地図のパスを設定するダイアログが表示されます。

パス設定ダイアログ

地図を追加するには「追加」を押下し、イメージファイル、もしくは imgs ディレクトリを指定してください。

OKを押すと地図が表示されます。


qgmap-0.0-alpha4のスクリーンショット

これで初期設定は完了です。

使い方

タッチパネル操作で地図をドラッグでき、上下左右にスクロールさせることができます。
ダブルタップで、タップした位置にセンタリングします。

キーバインドは以下のようになっています。

  • 「I」、「O」キー ・・・ ズームイン、ズームアウト
  • カーソルキー ・・・ 上下左右にスクロール
  • 「SHIFT」+カーソルキー ・・・ 大きくスクロール
  • 「0」〜「9」キー ・・・ 保存した位置・ズームレベルに移動
  • 「SHIFT」+「0」〜「9」キー ・・・ 現在の位置・ズームレベルを保存
    ※ 0に保存した位置は起動時の初期表示位置になります。
  • 「J」キー ・・・ 緯度・経度指定ジャンプ
  • 「M」キー  ・・・  マーカー表示/非表示 (ツールチップ表示中に「0」〜「9」キーで個別ON/OFF,「Q」で終了)
  • 「SHIFT」+「M」キー  ・・・ 画面外マーカ表示モードの切り替え
  • 「.」キー  ・・・  中央に十字マーカを表示/非表示
  • 「Fn」+「C」  ・・・  現在の緯度・経度・ズームレベルをクリップボードへコピー
  • 「Fn」+「V」  ・・・ クリップボードの緯度・経度・ズームレベルを読み込み、ジャンプ
  • 「D」 ・・・  フリーハンド範囲指定モードへ
  • 「P」 ・・・  PHSカードで位置取得
  • 「G」 ・・・ GPSで位置取得  GPS位置取得中はスペースでセンタリング
  • 「S」 ・・・ POI検索
  • 「H」 or 「?」キー  ・・・  ヘルプ表示

緯度・経度指定では、緯度,経度 の順に指定します。
度の表記は、”度.分.秒” 表記と、”度.小数部” 表記が使えます。
“.” の数で判断していますので、”度.分.秒”表記の場合は、必ず秒まで入力してください。

「SHIFT」+「0」 で保存した位置はアプリ起動時の初期表示位置になります。
良く使う場所は0に登録しておくと便利でしょう。

「M」キーのマーカー表示機能はすべてのマーカを表示するとスクロールが重くなりますので、個別表示で最低限表示することをおすすめします。

「SHIFT」+「M」キーでの外部マーカ表示モード切り替えについては、動作させてみた方がわかりやすいのですが、地図的にマーカが画面のどちらにあるかを表すモードと、画面の中心からマーカの方向を忠実に指し示すモードがあります。
前者は画面を地図的に見るときに使いやすく、後者は地図の中心に自分がいると仮定したときに、目的地がどちらかを見るときに使いやすいと思います。

「D」キーでフリーハンド範囲指定モードになります。この機能は qgmap で地図上に取得する範囲を描き、ズームレベルを指定すると、GM_Lite で地図ダウンロードする際のダウンロード範囲指定コードを出力する機能です。
あらかじめ広域地図のみダウンロードして qgmap に入れておき、詳細地図は欲しい領域だけピンポイントでダウンロードしたいときに便利です。

フリーハンド範囲指定モードの詳細は2008/10/21のブログを参照ください。

「P」キーでWILLCOM系のPHSカードで現在位置を取得します。 PHSアンテナの位置を取得するので現在位置と大きく変わる可能性があります。参考程度にお考えください。

メニューから「Gamma」を選択することで、ガンマ補正値を設定することができます。zaurus の液晶は白飛びしやすいので、ガンマ補正することで視認性が高まります。

「G」キーでGPSから位置情報を取得することができます、詳細はブログの2009/1/24のエントリを参照ください。

特徴・長所

  • ネイティブアプリなので GM_Lite on Opera より軽い
  • 指定縮尺の地図がない場合は、広域の地図を拡大して使用。(最大4倍まで)
  • Fn+C, Fn+V でクリップボードに現在位置をコピー&ペーストできる
    (エディタと連携させれば、好きな所へ素早くジャンプできます)
  • フリーハンド範囲指定機能で、GM_Liteでダウンロードする範囲を手書きで指定できる
  • ガンマ補正で地図を見やすくできる
  • GPS、PHSによる位置取得が行える
  • カスタムPOI表示に対応

欠点・制限事項

  • インプットスタイルとビュースタイルの切り替えに未対応
    起動後に切り替えると表示がおかしくなります。

ToDo

未実装

  • 「?」アイコン追加
  • GPS関連
    • NMEAログ保存機能
    • 移動軌跡表示
    • GPSロガーのNMEAログを表示?
  • POI関連
    • POI編集機能
    • DBファイルの場所変更機能
  • 住所検索
    → GM_Lite相当にしたいな
  • ルート表示
  • 使い方をもっと詳しく書く

終わったもの

  • α版からの脱却 (^^;  ←0.1.0でめでたく脱却
  • マーカー表示機能  ←alpha6にて実装
    →1~9に登録した位置を画面上に表示。
  • 緯度・経度指定ジャンプ  ←alpha5にて実装
  • 初期表示位置を設定できるように  ←alpha5にて実装
    →前回終了時の位置を表示がいいか?
  • GM_Liteのように1~9キーに場所を保存できるようにしたい  ←alpha5にて実装
  • 起動・終了時に gml_mountを自動的に実行  ←0.1.6にて実装
  • 複数のイメージファイル・地図データディレクトリに対応  ←0.1.6にて実装
  • QCop対応  ←0.1.6にて実装
    → QCopで外部から緯度、経度、ズームレベルを指定できると、何かにつかえるかも。
  • フリーハンド地図取得範囲指定  ←0.1.0にて実装
  • PHSによる現在位置取得  ←0.1.2にて実装
  • GPSによる現在位置取得  ←0.1.4にて実装
    • 標高、移動速度、移動方位表示  ←0.1.5にて実装
    • 現在地自動センタリングのON/OFF切り替え  ←0.1.5にて実装
    • 現在地に移動方向を三角マーカで表示(カーナビのように)  ←0.1.5にて実装
    • 複数GPS機器設定  ←0.1.0にて実装
  • カスタムPOIデータ表示対応  ←0.2.0にて実装
  • スクロール時の引っ掛かりをなくす  ←0.2.0にて実装
    → スレッド化して、地図画像の読み出しや拡大が終わり次第随時表示するように変更する。
  • POI検索機能  ←0.2.2にて実装

ゆっくり地道に改造していきます。

免責

一応お約束で・・・^^;

無いとは思いますが、本ソフトウェアを使って起こった一切の損害の責任を作者は負いかねます。

本ソフトウェアを使用する際は At your own risk でお願いします。

更新履歴

  • 0.2.4 (2010/09/23) ipk src
    POI検索で周辺検索やキーワードなしで全検索に対応
    メモリ使用量の削減
  • 0.2.3 (2010/09/04) ipk src
    SL-A300に対応
    POI検索結果に現在地からの距離を表示
  • 0.2.2 (2010/08/15) ipk src
    各種バグ修正
    メニューを実装
    POI検索を実装
    携帯絵文字の一部をプリセットアイコンに追加
    アイコン選択ダイアログを実装
  • 0.2.1 (2010/03/13) ipk src
    各種バグ修正
    2GB以上のイメージファイルをマウント可能に
    POI追加時のプログレス表示
    プリセットアイコン追加
  • 0.2.0 (2010/01/02) ipk src
    カスタムPOI対応
    地図描画のスレッド化
    座標表示機能
  • 0.1.8 (2009/05/23) ipk src
    rootにパスワード有のときに「root権限で実行する」をチェックで自動マウント、PHS位置取得に対応
    GPS使用時にズームを行うと位置がずれるバグを修正
    2GB以上のイメージを指定できるように修正
  • 0.1.7 (2009/04/05) ipk src
    各種バグ対応
  • 0.1.6 (2009/04/04) ipk src
    自動イメージマウント機能
    複数イメージ・地図ディレクトリ対応
    複数GPS機器切り替え対応
    QCop対応
  • 0.1.5 (2009/02/14) ipk src
    GPS位置を三角マーカで表示。
    現在位置追従機能対応。
  • 0.1.4 (2009/01/24) ipk src
    GPSに一応対応。
  • 0.1.3 (2008/11/20) ipk src
    ダブルタップセンタリング機能を実装。
    ガンマ補正を実装。
  • 0.1.2 (2008/10/28) ipk src
    PHS位置取得機能を実装。
  • 0.1.1 (2008/10/21) ipk src
    フリーハンド範囲指定機能を実装。
  • 0.1.0 (2008/10/14) ipk src
    画面外マーカー表示モード切り替え機能を実装。
    ソフトウェア構造を一新。
  • 0.0-alpha7 (2008/10/10) ipk src
    クリップボード連携を実装。
    tera様の高速スクロールパッチを適用。
  • 0.0-alpha6 (2008/10/07) ipk src
    マーカー表示機能を実装。
  • 0.0-alpha5 (2008/10/02) ipk src
    緯度経度指定ジャンプを実装。
  • 0.0-alpha4 (2008/09/29) ipk src
    縮尺表示を実装。
  • 0.0-alpha3 (2008/09/22) ipk src
    拡大処理の高速化や、画像キャッシュまわりの修正。
  • 0.0-alpha2 (2008/09/16) ipk src
    ズームレベルの縮尺スライダを実装。
  • 0.0-alpha1 (2008/09/13) ipk
    初期バージョン。ただGM_Liteの地図が表示できるだけ。

qgmap alpha4 リリース

お知らせ:新しいバージョンが出ています。最新バージョンはダウンロードページ

qgmap の alpha4 をリリースします。

変更点は、ここのところの開発メモに書いていた縮尺表示です。今回はあまり革新的な変更ではありません。

画面の左下に縮尺を表示するようになりました。


↑縮尺表示が付きました

苦労して導いた式を使って計算しているので、表示している緯度に合わせて縮尺が変化します。

ここのところ、ちょっとずつqgmapのまわりに動きが出てきて、Zetaの作者のHB1様や、GM_Liteの作者のtera様などからもコメントをいただき、さらに、何気なく qgmapでググってみたところ、 2ch でも好意的に取り上げられていて、ちょっと嬉し恥ずかしといった半面、身が引き締まる思いです。

ゆっくりですが、できるだけ使える、使いやすいものを目指して開発していきますので、長い目で見守ってください。。

使いやすいと言う意味では、そろそろ ダウンロードページとか、GM_Liteでの地図のダウンロードの仕方とかを解説したページを作った方がいいですね。 2ch でも使い方が分からず困っていた方もいらっしゃいましたので。

地道にいろいろ整備していきます。

qgmap 開発メモ – 縮尺表示その2

知恵熱にやられながらも、ついに任意の緯度の緯線1周の長さを求めることができた!

高校生の自分ならもっと早く解けたんだろうな・・・。時間は残酷だぜクールフッ

結果から言うと、緯度θの半径は、こうなった。

x = a2cosθ/√(a2+(b2-a2)sin2θ)

aは地球の長半径(中心と赤道の距離)、bは短半径(中心と北極・南極点の距離)を表している。

半径がわかれば2πr で円周の長さ=緯線の長さがわかるので、後は地球1周分の地図のドット数で割れば、1ドット当たりの距離が求まる!これで縮尺表示の目処が立った。笑う

せっかく錆付いた頭をフル回転させて導いたので、記念に過程も晒しておこう。以下は自己満の世界なので読まなくていいですよ。


楕円の式は以下のようになる。

x2/a2+y2/b2 = 1 ・・・①

ここでも、aは地球の長半径、bは短半径を表す。

まずこの楕円の法線ベクトルを求める。法線ベクトルvは以下の式で計算できる。

v=(∂f/∂x, ∂f/∂y)

楕円の方程式より法線ベクトルを求める。

f(x,y) = x2/a2+y2/b2-1
v=(∂f/∂x, ∂f/∂y)=(2x/a2, 2y/b2

方向が重要で、長さはどうでもいいので、扱いやすいように、a2b2/2をかける。

v=(xb2, ya2

この法線ベクトルを自身の長さで割って単位ベクトル化すると、

v‘=(xb2/|v|, ya2/|v|)

となる。ただし、

|v| =√(x2b4+y2a4)

である。

この単位法線ベクトルと赤道面がなす角度が緯度θなので、

v‘=(xb2/|v|, ya2/|v|) = (cosθ, sinθ)
∴ cosθ = xb2/|v| , sinθ = ya2/|v|

上の2つの式と、楕円の式①を連立方程式として、x,y を θの式で表す。

式①を変形

x2b2+y2a2 = a2b2
y2a2 = a2b2– x2b2 = b2(a2– x2) ・・・②

sinθの式を両辺2乗する。

|v|2sin2θ = y2a4 = a2(y2a2)

式②を代入

|v|2sin2θ = a2(b2(a2– x2))

x2について整理すると、

x2 = a2-(|v|2sin2θ)/a2b2 ・・・③

ここで |v|2 を求める。

|v| 2= x2b4+y2a4

式②を代入

|v| 2=x2b4+a2(b2(a2-x2))

整理すると

|v| 2=b2(x2(b2-a2)+a4)

これを式③に代入

x2 = a2-(b2(x2(b2-a2)+a4)*sin2θ)/a2b2

x2について整理すると

x2 = a4(1-sin2θ)/(a2+(b2-a2)sin2θ)

1-sin2θ = cos2θなので、

x2= a4cos2θ/(a2+(b2-a2)sin2θ)

平方根を取って

x = a2cosθ/√(a2+(b2-a2)sin2θ)

同様にyも求めて、θを0~πまで回してグラフを書いたところ、楕円の図と一致したので、たぶんあってるのでしょう。

ふぅ。

qgmap 開発メモ – 縮尺表示→緯度ってなんだ?

今度は地図表示に必要な縮尺の表示を考える。

縮尺表示
↑こういうやつ

最初は単純にこのズームレベルなら、この縮尺画像みたいに、ズームレベル分画像用意しとけばいいだろうと思っていたけど、実は真面目にやると大変なことが分かった。

というのも、Google Maps は メルカトル図法(あぁ、懐かしい響き ^^;) なので、赤道上の地図の1ドットと、北極・南極に近い所の地図の1ドットは、縮尺が異なるわけだ。極に近い方が拡大されて描画されているので。

ということは、表示している緯度によって、縮尺表示も柔軟に変化させる必要が出てくると。

しかも、厳密にやるなら、標高も関わってくるのか。同じ緯度1度でも、標高が高い方が距離が長いはず。まぁ、これは標高0mで考えればいいか。

さらにややこしいのは、地球が楕円体だということ。完全な球なら、まだ計算しやすいんだけどなぁ。

Google Maps では緯度経度には世界測地系が使われている。世界測地系は GRS80 楕円体とよばれる、国際的な標準として使われている(?) 楕円体を使った測地系らしい。GPS では WGS84 楕円体を使っているらしいが、ほとんど同じと見ていいらしい。

高校以来の楕円の方程式とかをいろいろいじっていると、どんどんワケが分からなくなってくる悲しい

色々考えてるうちに、緯度ってなんだ?と、素朴な疑問が・・・。

緯度って?
緯度ってなんだ?

個人的には、楕円の中心(上図のO)と赤道(R)と、任意の地点(P)がなす角PORの角度θが緯度だと思っていた。

でも、地表上で星や太陽の高さから求まる緯度は、水平線と、地軸のなす角度φとなるはず。

あ、でも、天体の角度から緯度を求める際に水平器で水平を取るだろうから、そうすると、水平線が基準ではなく、重力の方向に対して水平が基準になるから、天体を使ってもθが求まるのか?

混乱しながらいろいろなページを見てみると、どうやらφが緯度らしい。ここのページの図がわかりやすかった。楕円体の法線(地表から垂直に出た線)と、赤道面がなす角度が緯度らしい。

これらを踏まえて、緯度から1ドットの距離(縮尺)を求めると・・・ って、想像しただけで頭から湯気が出てくる ^^;

うーん。任意の緯度の楕円体上1周の長さが計算できればいいんだけどなぁ。

qgmap alpha3 リリース

お知らせ:新しいバージョンが出ています。最新バージョンはダウンロードページ

リリースしますと宣言してからだいぶ時間が経ってしまいましたが、qgmap の alpha3 をリリースします。

SL-C1000で動作確認してます。SDカード等にもインストール可能です。

今回の修正点は主に動作の高速化です。

  • 拡大処理を独自実装して高速化
  • QPixmapCache のキャッシュサイズ変更 (1MB->8MB)
  • 拡大前の QImage をキャッシュするように変更

最後の拡大前画像のキャッシュ化は開発メモには書いてませんでしたが、QPixmapCache だけでは拡大後の画像しかキャッシュしないため、拡大する度に前の同じ画像を何度もロードし直していました。

そのため、VGA画面全部が4倍拡大の場合、ちょうどいい場所であれば1枚の画像だけロードして、それを4倍拡大すればいいものを、律儀に同じ拡大前画像を何度もロードしていました。

ただ、今回の修正の1番目と3番目は拡大補完時の高速化で、等倍地図での高速化は2番目の修正のみなので、地図の必要領域の全縮尺をダウンロードしている人にはあまり高速化は体感できないかもしれません。

私みたいに地図の容量をケチるためにダウンロード範囲を最低限までチマチマ削っている人には効果大かも (^^;

そろそろデバッグコードも綺麗に消して、バージョン 0.1 としてリリースしてもいいかなぁ。