Google Maps もどき Google Map の画像のURLをみてみるとなかなかわかりやすいので (サテライトのほうは数字ではないのでちょっと面倒か?) 利用した地図アプリを作ってみました。 Google Maps APIを使っているわけではなく、 単にHTTP GETしているだけです。 Googleに問い合わせてみましたが返事はありません。 (11/26 20:00ごろ http://www.google.co.jp/support/bin/request.py?form_type=user&stage=fm&user_type=user&contact_type=other_user&continue=%E6%AC%A1%E3%81%B8 から 01toGoogle.txt の内容を送ってみました。) 問題があれば消します。 ・使い方 ■基本 起動し通信を許可ししばらくすると 前回の地図ないし渋谷のある一区画の詳細地図が出てきます。 上下左右に移動させることができ、 画面の中心が地図がないところにいくと 動的にその場所の地図を読み込みます。 実機では読み込みにそれなりに時間がかかります。 地図の読み込みに失敗することもあります。 すでに地図を読み込んでいる場所については、キーリピートが有効です (キーを長く押すと速く移動します, Canvas,hasRepeatEvents()==true の機種のみ, WX310SAはtrue, WTK2.2のエミュレータはfalse)。 地図を読み込みに行くと1秒キーリピートが無効になります。 FileConnection Optional Package 1.0 Specificationを実装している 機種では、地図をファイルとしてキャッシュすることが可能です。 「9」キーないしソフトキーで「設定」を選び、 設定フォームでキャッシュを有効にしキャッシュ用のディレクトリを 適当に設定することで利用できます。 キャッシュ用のディレクトリにはたくさんのファイルができることに なりますので御注意ください。 ■ショートカットキー 「3」キーでZoom up, 「1」キーでZoom down します。 (WX310SAでは, さらに 「カメラ」キーでZoom down, 「My」キーでZoom upします。) 「2」キーで地図の中心に十字を表示します。 「4」キーで検索フォームを表示します。 「5」キーで現在のマップ情報(x,y,zoom)を左上に表示します。 「6」キーで座標やズームを指定するフォームを表示します。 「7」キーでブックマークへの登録フォームを表示します。 「8」キーでブックマークのリストを表示します。 「9」キーで設定フォームを表示します。 「*」キーで地図を再描画します。 「0」キーでだいたいの縮尺を表示します。 「#」キーでショートカットキー一覧を表示します。 (WX310SAのみ 「CLR/マナー」キーで検索結果を再参照します。) ショートカットキーの配置は変更するかもしれません。 ■ブックマークのファイルへの書き込み/からの読み込み ブックマークのリストからメニューで 「ファイルへ書き込み/から読み込み」を選ぶと ブックマーク<->ファイルフォームを表示します。 ディレクトリないしファイルを指定してブックマークをファイルへ 書き込んだり、ファイルから読み込んだり追加できます ファイルの形式は「\n」(line feed, 改行)でブックマークを区切り、 「,」で 名前,x,y,zoomを区切ります。 名前に含まれる「\n」は「|」に「,」は「\」に変換します。 また「 」(スペース)が「\ 」となります。 ■検索機能 検索機能のためにCSISシンプルジオコーディング実験[http://geocode.csis.u-tokyo.ac.jp/cgi-bin/simple_geocode.cgi] (街区レベル位置参照情報[http://nlftp.mlit.go.jp/isj/], 国土数値情報[http://nlftp.mlit.go.jp/ksj/], 数値地図25000(地名・公共施設)2001年版[http://www.gsi.go.jp/MAP/CD-ROM/chi25000/chimei.htm])を利用しています 0.0.20まではGeocoding.jp REST API[http://www.geocoding.jp/api/]を利用していました。 ■注意点 激しい操作を行うと動作が変になることがあります。 座標やズームを指定するフォームでズームレベルを下げて (数値を大きくする)から上げる(数値を小さくする)と 元の座標には戻りません。 (携帯に限らず)JavaでImageのクラスのインスタンスを生成するのは、 非常にコストが高い操作のようです。 WX310SAでImage.createImage()をすると 600kB以上ヒープに空きがあってもOutOfMemoryErrorで 失敗することがあります。 これはどうしようもないので、現在Alertでユーザに知らせています。 以後正しく操作できない場合は一旦落として再起動してください。 Zoom up/downで正常な動作ができるようになることが多いようです。 ・TODO もうだいぶjarのサイズもでかいので あまり機能は追加しない方向で。 ■キャッシュ関連 ○キャッシュの削除 ○キャッシュの全削除 (削除は実機では非常に遅い) ■Zoom up/down時に地図の中心からの位置を引き継ぐように(必要か?) ■緯度経度<->座標変換をもっと精度を上げる (もっとたくさんサンプルを取る) ■ハードコーディングしている定数をJava的に定数にする ■ブックマークのレコードストア<->ファイルで実機でおかしい? ところの調査など(?) ■ハードコーティングしているWX310SA用の定数を設定項目化 (いまはない?) ■激しく操作したときにもついていくように (現状で普通に使う分には問題ないか?) ・開発履歴 0.0.35 2007/05/19 画像URLの変更に対応(v=w2.46) v=w2.43のままでも大丈夫の模様 0.0.34 画像URLの変更に対応(v=w2.43) 0.0.33 画像URLの変更に対応 0.0.32 zoomの最大・最小が反映されていなかったクラスを修正 0.0.31 Google Maps の 画像URLが変更されていたのに対処 zoomの最小値(最大にzoomした値)を 0 から -2 に zoomの最大値(最小にzoomした値)を 0 から 17 に (テストはかなり適当) なお, 画像自体がかなり変わっているので, あたらしく取得したファイルとキャッシュを繋げて表示すると かなり違和感があります. 0.0.30 キャッシュの削除をしたあとで 保持しているキャッシュファイル名のクリアをしていなかった のをクリアするようにした。 キャッシュの削除の前処理で消すファイルのVectorを 作るようにして、何件消すかを明示するようにした。 削除の進行状況をGaugeで示すようにした。 (ただし前処理でかなりの時間がかかってしまっています。) 0.0.29 SettingsFormの文言修正(「OK」->「設定反映」) 実機ではTickerが残ることがあるので MapCanvasでsetTicker(null)の後でrepaint()するように してみた。 0.0.28 キャッシュの削除を追加(ただし実機では非常に遅い) (設定フォームからコマンドでキャッシュ操作フォームへ移動) 検索結果を再度参照できるようにした FileList, SettingsForm以外ではCommand.CANCELとしていたコマンドを Command.BACKとし、文言を「戻る」で統一した。 いくつかの文言の修正(「OK」->「選択」,「OK」->「検索」など) ショートカットキーの追加 ■WX310SAのみ「CLR/マナー」キーで検索結果を再参照 0.0.27 動作には影響しないはずのソース上の細かい修正 キャッシュファイル名をx(経度に相当)とzoomでフィルタして 読み込むようにした 0.0.26 キャッシュの判定をすこし効率よくした 通信可否ダイアログで「No」を選択したときに SecurityExceptionをキャッチして 「通信中」Tickerが消えるようにした。 縮尺を表示できるようにした。 縮尺の表示を設定・保存できるようにした。 ショートカットキーの追加 ■「0」キーで縮尺の表示/非表示 0.0.25 FileConnection.list(java.lang.String, boolean)を使って zoomレベルごとにキャッシュファイル名を 別々のVectorに入れるようにした。 0.0.24 MapMIDlet.startApp()は、最初に呼び出されたにだけ 実行するようにした。 少しでもキャッシュファイル名の読み込みが速くなるように FileConnection.list(java.lang.String, boolean)ではなく FileConnection.list() を使うようにした。 0.0.23 検索結果がなかった時に画面の末尾にメッセージがでるだけで わかりにくかったので修正。 vol.2 スレ 447氏からの御指摘の反映 ■「地図データを読み込み中」の文言を「通信中」に その他文言の修正 ■地図のない場所に移動すると"読み込み中"とTickerを出るが 地図データのある場所へ戻ると通信中にもかかわらず Tickerが消えるのを修正。 ■設定で文言が画面からはみでていたのを修正。 0.0.22 ジオコーディングから得る緯度経度の測地系を日本測地系に 「住所」だけを検索対象としていたが、 「地名」「駅名」「住所」を選んで検索できるようにした。 これに伴い文言を追加 日本測地系から世界測地系への変換に http://homepage3.nifty.com/Nowral/02_DATUM/02_DATUM.html#HowTo の三角関数を使わない変換式(簡単)を利用 0.0.21 利用するジオコーディングをGeocoding.jpから CSISシンプルジオコーディング実験に変更 地図の再描画機能を追加。 ショートカットキーの追加 ■「*」キーで地図の再描画 キャッシュの読み込みの判定の際にcontinueするべきところで breakしていたためキャッシュがあるのに読み込まれなかった ことがあったのを修正。 0.0.20 ブックマークのレコードストア<->ファイル間移動の改善 バグ修正 0.0.19 ブックマークのレコードストア<->ファイル間移動を実装 0.0.18 「up」コマンドをWX310SAで 優先的に単独のソフトキーに割り当てられるようにした。 座標・ズームの表示/非表示, 中心に十字を表示/非表示の状態を RecordStoreに保存するようにした。 これらを設定フォームで設定できるようした。 (ショートカットキーで切替えを行った場合もRecordStoreに保存する。) 0.0.17 System.getProperty("microedition.platform").equals("WX310SA")がtrueなら 「カメラ」キーでZoom down, 「My」キーでZoom upするようにした ズームレベルが0のときにこれ以上Zoom upしないようにした。Downも同様。 ショートカットキーの一覧を表示できるようにした。 ショートカットキーの追加 ■「#」キーでショートカットキーの一覧を表示 InfoSetFormでItemStateListenerを使うように修正 キャッシュの読み書きでIOExceptionが出たときに Alertを出すようにした 「この値より現在位置と距離が離れた画像はヒープに保持しない」 を設定できるようにした。 System.gc()以外のFindBugsの警告を消した(uxparserも含めて) OutOfMemoryError時の文言を修正 0.0.16 キャッシュファイルが壊れている時に消すようにしたはず(未テスト) ブックマークリストのソフトキーの並びをWX310SAで他のフォームとあわせた キーリピートに対応(ちょっとwaitをいれたほうがいいかもしれない) メモリに保持する画像、実際に描画する画像を減らした Image.createImage()によってthrowされるOutOfMemoryErrorを Alertでユーザに知らせるようにした。 FindBugs的にはうれしくないが、createImage()の前後に System.gc()を入れた。 0.0.15 画像をキャッシュできるようにした キャッシュの有効/無効, キャッシュ用ディレクトリ, デフォルトのズームレベルを設定できるようにした。 ショートカットキーの追加 ■「9」キーで設定フォームを表示 0.0.14 座標・ズームレベルを直接指定できるフォームを追加した。 ショートカットキーの追加 ■「4」キーで検索フォームを表示 ■「6」キーで座標やズームを指定するフォームを表示 ■「7」キーでブックマークへの登録フォームを表示 ■「8」キーでブックマークのリストを表示 0.0.13 HTTP GETの際にKeep-Alive関係のフィールドを追加した (WX310SAで有効かは未検証) はずれたところを読み込むことが多かったのを直した 描画している画面からある程度離れた画像情報を消すようにした 「2キー」で地図の中心を出すようにした。 ズームアップ時に中心位置に応じて適切な画像を読み込むようにした。 0.0.12 緯度経度->Google Mapsの画像の座標の変換関数を ちょっとましにした。(ほとんどかわらない?) 検索結果として複数の候補がある場合の処理を追加した。 起動時のAlertにGeocoding REST APIを利用していることを明示 「5」キーで地図の情報(x,y,zoom)の表示のトグルをするようにした 0.0.11 Geocoding[http://www.geocoding.jp]を利用した検索機能を付けた (ただしまだピンポイントでというわけではない) 0.0.10 ブックマークの数を記録するレコードストアを用意して (どういうわけか)再起動時にブックマークが増えるのを防ぐようにした 0.0.9 ブックマークを実装 起動時に前回の位置から読み込むように miniSDへの読み書きデモ用コードをコメントアウト 最初にAlertを出すようにした ・他のアプリケーション 2005/11/29 2chで知りましたが、 J2meMap http://j2memap.landspurg.net/ http://www.getjar.com/products/3192/J2meMap というのがありました。 2005/11/30 やはり 2chのスレから Mobile GMaps - Google Maps on your mobile phone! http://wap.mgmaps.com/ というのもありました。 ・miniSDへの読み書きデモ 0.0.8まではminiSDへの読み書きデモ機能がありました。 0.0.9以降にはありません。 ・「5」キーを押すと「file://localhost/SD:/$OTHER/MapPosition」に 現在の地図情報(x,y,zoom)を書き込みます。 #アクセスを許可(読み取りをしていない場合2回)しないと書き込みません。 ・「0」キーを押すとそこから読み取り地図を再描画します。 ・「7」キーを押すと「file://localhost/SD:/pc_inout/MapPosition」に 現在の地図情報を書き込みます ・「9」キーを押すとそこから読み取り地図を再描画します。 これらのファイルは書き込み時に上書きされます。 アプリを終了しても保持されます。 御注意ください。 #アプリ開発者の間で #miniSDのどのディレクトリをどう使うかについて適当な合意があると #よいと思います。