hotchimariのブログ

hotchimariのブログ

ほっちまりのブログ

Amebaでブログを始めよう!
・頑張ったわりに出来あがったのは夏休みの宿題レベルのモノだったというおはなし



 前回計算方法まではクリアしたので、あとは面倒臭いGUIの作成とxml作成部分だけAHKで記述すれば出来上がりである。

 MapSourceは「Google Maps」「Google Terrain」「Microsoft Maps」「Microsoft Virtual Earth」「Microsoft Hybrid」の5つだけ選択可能にした。それぞれのマップで選択可能なズームレベルが違うので、選択変更したらZoom Levelsのチェックボックスも選択可能項目を変更させるようにする。
OutputFormatは「OruxMapsSqlite」しか使わないんだけど、なんとなく「OruxMaps」「RMaps」も選択可能にした。
Layer Settingsは全ての項目選択できるようにする。
地図を切り出す範囲を決定する計算部分は、全地点一律同じ範囲を切り出す「固定範囲」と何らかの数値と切り取る一辺を比例させる「比例1」と何らかの数値と切り取る面積を比例させる「比例2」の3つのモードを使えるようにする。(第2回で作ったのは「比例2」に相当する。)


 出来上がった2号機の試運転をしてみる。117都市のデータでLv0-19まで全てチェックを入れた状態で1号機と2号機でプロファイルを作成し比較してみる。


 正常に処理できてるようなので大量データのプロファイルの作成に移る。第4回で挑戦した593路線10661駅の登録と国土地理院の日本の主な山岳標高一覧(1059件)の登録をやってみる。切り取りモードの確認も兼ねて、駅は「固定範囲」、山岳は「比例1」で標高に比例させて切り取ることにする。1059件は一瞬で、10661件は1秒ちょいほど間を置いて作成完了のメッセージが出る。できたプロファイルをMOBACで表示させてみる。ちょっと気持ち悪いぐらい大量に表示される。表示された瞬間はちょっと感動したけど、すぐに「それがどうした?」という覚めた気持ちになった。山岳の方も「比例1」モードの確認はできたが、完成図はインパクトに欠ける微妙な出来栄えになった。「なつやすみのじゆうけんきゅう」みたいな地図だ(笑)

   

 第6回に渡って書いてきた何の役にも立たなそうなこの記事も今回で終わりです。特に後半はどうでもいいことばっかりやってしまったが、主要都市の周辺地図の作成と画質・サイズ比較は参考になることもあったので、自分的にはやってよかったかなあと思ってる。
・なんだかよくわからない計算式をこねくり回すおはなし

 MOBACのプロファイル作成用スクリプトをMOBAC任せから自前で作成できるタイプに作り直すにあたって、xmlに保存されている数値が何なのか理解する必要がある。どうやら緯度経度情報そのままではなく、マップタイルの位置を示すものであるようなので、「google map タイル」で検索してみる。トップに表示されたGoogleのデベロッパー向けぽいページにそれらしき記述がある。

 とりあえず1枚のタイルが256x256で、それが縦横(2のズームレベル乗)枚敷き詰められているということはわかった。Lv19だと、縦横それぞれ(2^19*256 = 134217728)ピクセルの大きな画像ということになる。MOBACで一番右下のタイルを選択したときの値134217472~134217727というのにも一致する。他のLvでもそのようだ。「じゃあ、まあなんとかなるか」と適当に考えサイトを後にする。

 まずは札幌周辺の N=43.16125 , W=141.21423 , E=141.47937 , S=42.96755 Lv16 で計算してみて一致するか確認しよう。MOBACで作成済みのデータによると14982143/6167039~14969600/6154240あたりの数値になるはずである。

 タイルは左上から数えるが、MOBACで使う座標は原点が真ん中にあるので、原点を左上にそろえてやる。W,Eは180を足してやり、N,Sはそれぞれ85.051129までしかないので、85.051129から引いた値にする。こんな計算式でいいかなと計算してみる。

tileN = floor((85.051129-43.16125)/170.102258*(2^16))*256 = 4131584
tileW = floor((141.21423+180)/360*(2^16))*256 = 14969600
tileE = ceil((141.47937+180)/360*(2^16))*256-1 = 14982143
tileS = ceil((85.051129-42.96755)/170.102258*(2^16))*256-1 = 4150783
※ floorは切り捨て、ceilは切り上げ

 tileWとtileEは一致するけど、tileNとtileSがかすりもしない……つまり上下方向には線形的に考えてはいけないということか。そういえばメルカトル図法ってそういうものだって地理で習ったような(笑)

 メルカトル図法でぐぐってみる。こういうときはWikipediaだろう。「特長」の項目には、いつか聞いたことのあるようなことが長々と説明されている。まあ、これを読めば↑みたいな計算式で座標が求まる訳がないのはわかる。さすがに浅はかすぎた…

 「投影法の表式」という項目にそれっぽい計算式が書かれている。y=ln tan(π/4+φ/2)という式が使えそうだ。というか、こんな式自力で導き出せるわけがなかった(笑)

 試行錯誤しながらそれっぽい式を作って確認してみる。↓はAHK用の記述

pi := 3.14159265358979
Lv := 16
tileN := Floor(((1-Ln(Tan((N/2+45)*pi/180))/pi)/2)*2**Lv)*256
tileW := Floor((W+180)/360*2**Lv)*256
tileE := Ceil((E+180)/360*2**Lv)*256-1
tileS := Ceil(((1-Ln(Tan((S/2+45)*pi/180))/pi)/2)*2**Lv)*256-1

tileN = 6154240 , tileW = 14969600 , tileE = 14982143 , tileS = 6167039 となりMOBACで作ったデータと一致する。数カ所、数種類のLvで確認してみたが正しく計算できてるようだ。

 どうやらプロファイルの自前作成の糸口がつかめたので次回で2号機完成と使用結果について書いてみることにする。
・安物タブレットがどうもまずい状態だなというおはなし

 半年ほど前にNTT-X Storeで叩き売りされてたVITROのV9702というタブレットを買った。9.7インチQXGAのいわゆるiPad Retinaクローン機である。クアッドコアと言ってもA31なので動作はとってももっさり。購入前からそれは承知していたが、枕元に置いてNAS上の動画の再生と書籍閲覧(DL購入モノと自炊モノと青空文庫)専用に使用するつもりだったので別に不満は感じてなかった。

 動画と書籍専用だが、たまにちょっとした調べ物ぐらいには利用する。んで今日ちょっと調べようとしたらGoogle日本語入力で日本語の入力ができない…
 ソフトウェアキーボードは表示されるのだがいくら打っても文字が入力できない。IMEの再起動をしてみたが変化なし。とりあえず端末の再起動をしてみる。

 四核なんちゃらというロゴが表示されたあとなんかグリーンバックの画面が出て救急箱とかで見かける十字のマークと検査がなんたらとかっていう中国語が表示される。しばらく待つといつものブートアニメーションが始まった。

 一応再起動されたがなんかおかしい。いつも以上に起動がもっさり。さらになんか壁紙がデフォルトに戻ってる。ついでにドックに並んでるアイコンがいくつか消えてる。「あれ、ここ何のアイコンだっけ?」とか思いながら、まずはGoogle日本語入力の確認。文字入力しようとしたらAndroid キーボードが起動。入力の切り替えをしようとしたらGoogle日本語入力が見当たらない。どうやらインストールされていないことになってるらしい。

 Titanium Backupで復元しようとしてさらなる異変に気づく。Titanium Backupはバックアップはあるがインストールされていないアプリは打ち消し線で表示されるがGoogle 日本語入力以外にも打ち消されるはずのない名前が並んでる。「ああ、だからドックからアイコンがいくつか消えてたのか…」

 8つぐらい消えてるぽい。
その中には↓こんなのも
Google Playストア

 この端末、内蔵ストレージのショボさに定評があるのでストレージにトラブルが出ていくつかのアプリが消えてしまったのかなあ。それなら無事に見えてるやつもダメージ受けてる可能性が…
 
 とりあえずバックアップから復元していくがGoogle Playだけ復元できない。他の復元したアプリは一応は動くようだ。「別にこの端末にアプリ追加することないし、アップデートとかこまめにする方じゃないし、必要なら別端末経由ですればいいか…」急にどうでもよくなって見なかったことにした。

 本来の用途である動画と書籍閲覧は特に変わりなく動作してるので本格的にだめになるまではこのまま行こうという結論に達した。多分時間の問題だと思うけど(笑)