いずれ Windows TabletのときのGPSログや写真は Map/WT に置きたい。
プログラムの修正は3か所。
プログラムの修正は2か所のみ。国土地理院サイトからのダウンロードファイルを置く。
修正は1か所のみ。
修正は1か所のみ。
ミラーリングダウンロードのバグも解決した。まず、Map/Common に guides、img、infos を置いた。
パソコンの c:/_www/_Common に原本を置き、レンタルサーバーにミラーリングアップロードする。 これをスマホとタブレットにミラーリングダウンロードする。
再帰処理で接続数が制限値を超えるようだ。
時刻がサーバー側の時刻に変更されていない。
タブレットでは明らかに目盛幅が間違っている。
MapXでも同じであった。元のPC版でも間違いがあったのかも知れない。 参考情報のため、ずっと気づかなかったのかも知れない。 あるいは、最初は正しかったが、バージョンアップを重ねたため、どこかで誤りが混入したのかも知れない。
原点に立ち戻って見直す。赤道上の横幅は分かりやすいが、任意の地点のメルカトル図法上の幅の算出は複雑である。
タイル(256x256画素)の横幅は何メートルかを求める。縦幅と横幅は異なる。
緯度により異なる。表示範囲の中心線の緯度を求める。zoom 0 での1画素のサイズは156543.034メートルである。
現在のzoom、表示範囲の中心での画素の横幅は次式 resolution メートルとなる。
double latHere = Y2Lat((CY+H/2.0)/PX, zoom); double resolution = 156543.034*Math.cos(deg2rad(latHere))/Math.pow(2,zoom);
表示する目盛りの横幅を dist メートルとすれば、画素数 w は (int)(dist/resolution) となる。
現在のプログラムでは横幅を 2*w としている。まず、これが間違いである。 プログラム上は w = (int)(dist/resolution/2); とした方が楽である。
タイルサイズが 256x256画素の場合はこれでよい。スマホのようにタイルの画素数が Scale倍のときの表示にも誤りがある。 resolutionは タイルサイズが 256x256画素に対するものであるから、 タイルサイズが Scale倍のときは、1画素当たりのサイズは 1/Scale になる。
したがって、w の算出は以下のようにする必要がある。これで、修正された。
int w = (int)(dist/resolution/2*Scale);
100要素(5分)のサイクリックバッファにGPSログのspeedを蓄積、直近の1(または2)分間を除き、 4(または3)分間の平均時速を表示する。
まずはもっと簡単に過去10分間の平均時速を表示する。実際に歩いてみた。 時速確認時には、歩速を緩めたり、立ち止まったりするが、それが平均時速に与える影響は僅かなため、 これでいいだろう。
MapXと同じようにした。
この他にも漏れはあると思うが、新Mapアプリを使いながら、気づいたときに追加修正する。
タイル画像サイズを scale倍にする場合、halo にも scale をかけるのを忘れていた。 これを補い、スマホでも、文字が見やすくなった。
タブレットでは表示される。排他制御の矩形計算で倍率のかけ方が間違っているのかも知れない。
スマホでは renderSymbol は 768x768画素に対して実行している。デバッグのため、タブレットではタイルサイズを 512x512画素にしてみる。
その結果、アイコンだけで文字は表示されなくなった。重なり回避を無視してみると、アイコンと文字に少し重なりがあることが分かった。
垂直方向シフト dy に、scale をかけるのを忘れていたことが原因であった。この修正で正しく表示されるようになった。
仕様は MapX と同じであるが、プログラムは少し簡単化できた。
スマホではOSMタイルが表示される。タブレットでは別のタイルが表示される。
logcatのエラーメッセージで分かった。 android.permission.INTERNET を省いたのは間違いだった。元に戻して直った。