ラベル OpenStreetMap の投稿を表示しています。 すべての投稿を表示
ラベル OpenStreetMap の投稿を表示しています。 すべての投稿を表示

2008/09/17

iPod nano

注文していたピンマイクが届いたので、早速近所でオーディオマッピングを数回試してみました。が、何回やっても上手く行かなかったのでMP3プレーヤーを暫く観察していると、どうやら録音機能に問題があって3分を過ぎた頃に勝手にリセットされたり電源がオフになったりしていたようです。更新用のファームウェアを探してみましたが見つからず、MP3プレーヤーでのオーディオマッピングは中止しました。

仕方が無いのでICレコーダーを探すことにしようかとも一瞬思ったのですが、前に買った物のことを考えるとちょっと気が進みませんでした。そうこうしているうちに、自分が持っている第2世代iPod nanoでも録音ができることが分かりました。

アマゾンで探してみると、iPodで録音するためのアクセサリーはいくつかのサードパーティーから発売されていました。
今回は右から2番目のiTalk Proを選びました。理由は注文時点で一番安かったから。(今は在庫切れで、在庫切れの状態ではその時の値段が表示されないみたいです。)

まぁ、上手く行くのかちょっと心配ですが、届くのが楽しみです。

2008/09/09

Marble

先日、国土数値情報の空港データをインポートするためのPerlスクリプトがLinux上で動かないという問い合わせがありました。私自身はWindows上でしか使ったことが無かったので、OpenStreetMapの日本語メーリングリスト (talk-ja) で尋ねてみると、鉄道データ用のスクリプトFedora8/9とCentOS5.2で特に問題無く動いているとのこと。私も、Mapnikを動かして以来使っていなかったUbuntu8.04で試してみました。久々にUbuntuを使う為、無線LANの調子が悪い中を170MBのファイルをダウンロードしてVMware Playerをアップデートしたり、Ubuntuに224個のアップデートを適用したりしたのですが、CPANから"XML::Simple"をインストールしなければならなかったことを除けば、空港データ用のスクリプトも特に問題無く動きました。

意外にあっさり終わってしまったなと思っていた時に、talk-jaで話題になっていたMarbleのことを思い出しました。Marbleというアプリケーションは、(衛星画像や地図が表面に貼り付けられた)地球をGoogle Earthのようにグリグリと回せるもので、OpenStreetMapの地図の表示もできます。

talk-jaでは「KDE Marble」と紹介されていたのでLinuxをあまり使ったことの無い私はUbuntuには関係の無い話だと思っていましたが、Windows版Qtを使っており、もしかしたらと思って公式サイトを眺めているとQt-onlyでもコンパイルできることが分かったので、私もMarbleを触ってみることにしました。

せっかくなので、MarbleをQt-onlyアプリケーションとしてコンパイルして動かすまでに試行錯誤したことを書いておこうと思います。



1. Qtの導入

QtはMapnikViewerを動かす為に入れてあったので、今回は無し。その時のメモはこちら

2. ソースコードの入手

ソースコード (.tar.gzファイル) はダウンロードページから入手できますが、コンパイルの手引きのページではSVNからの入手を奨めているので、今回はSVNから安定版を入手することにしました。
vmuser@vmuser-desktop:~$ sudo su
[sudo] password for vmuser:
root@vmuser-desktop:/home/vmuser# cd /usr/local/src
root@vmuser-desktop:/usr/local/src# svn co svn://anonsvn.kde.org/home/kde/branches/KDE/4.1/kdeedu/marble


3. cmakeのインストール

cmakeは使ったことが無く、Ubuntu8.04にも入っていなかったのでインストールしました。
vmuser@vmuser-desktop:~$ sudo su
[sudo] password for vmuser:
root@vmuser-desktop:/home/vmuser# apt-get install cmake
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libestraier8 libqdbm14
これらを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
cmake
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
4808kB のアーカイブを取得する必要があります。
この操作後に追加で 12.4MB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com hardy/main cmake 2.4.7-1build1 [4808kB]
4808kB を 5min24s で取得しました (14.8kB/s)
未選択パッケージ cmake を選択しています。
(データベースを読み込んでいます ... 現在 141371 個のファイルとディレクトリがインストールされています。)
(.../cmake_2.4.7-1build1_i386.deb から) cmake を展開しています...
cmake (2.4.7-1build1) を設定しています ...


4. buildディレクトリの作成

buildディレクトリを作成して移動します。
root@vmuser-desktop:/usr/local/src# cd ../bin
root@vmuser-desktop:/usr/local/bin# mkdir marble-build
root@vmuser-desktop:/usr/local/bin# cd marble-build
※ディレクトリの作成場所はコンパイルの手引きのページに書いてあるものと異なっています。

5. cmakeの実行

cmakeを実行します。
root@vmuser-desktop:/usr/local/bin/marble-build# cmake -DQTONLY=ON ../../src/marble
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
WARNING: This project requires version 2.4.8 of CMake. You are running version 2.4.7.

CMake Error: Qt qmake not found!
-- Configuring done
qmakeが見付からないと怒られたので、cmakeをやり直しました。
root@vmuser-desktop:/usr/local/bin/marble-build# cmake -DQTONLY=ON -DQT_QMAKE_EXECUTABLE=/usr/local/Trolltech/Qt-4.3.4/bin/qmake ../../src/marble
WARNING: This project requires version 2.4.8 of CMake. You are running version 2.4.7.

-- Looking for Q_WS_X11
-- Looking for Q_WS_X11 - found
-- Looking for Q_WS_MAC
-- Looking for Q_WS_MAC - not found.
-- Looking for Q_WS_WIN
-- Looking for Q_WS_WIN - not found.
-- Found Qt-Version 4.3.4

-- Not building with Gpsd Support
-- not building with gpsd support
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/bin/marble-build

root@vmuser-desktop:/usr/local/bin/marble-build# ls
CMakeCache.txt Makefile src
CMakeFiles cmake_install.cmake svnscript.cmake
CPackConfig.cmake cmake_uninstall.cmake tests
CPackSourceConfig.cmake data

root@vmuser-desktop:/usr/local/bin/marble-build#
なんかCMakeのバージョンが古いという警告メッセージが出ていますけど、CMakeはさっきインストールしたばかりでどうしたらいいのか分からないので、そのまま進むことにしました。

6. makeの実行

makeを実行します。
root@vmuser-desktop:/usr/local/bin/marble-build# make
出力メッセージは長いので省略。

7. make installの実行

make installを実行します。
root@vmuser-desktop:/usr/local/bin/marble-build# make install
出力メッセージは長いので省略。

8. marbleの実行

marbleを実行します。
vmuser@vmuser-desktop:~$ marble
marble: error while loading shared libraries: libQtCore.so.4: cannot open shared object file: No such file or directory
vmuser@vmuser-desktop:~$
動きません。ホームディレクトリにlibQtCore.so.4のシンボリックリンクを作ってみましたが、状況は変わらず駄目でした。

cmakeの段階でQT_QTCORE_LIBRARYを指定してやり直し。
root@vmuser-desktop:/usr/local/bin/marble-build# cmake -DQTONLY=ON -DQT_QMAKE_EXECUTABLE=/usr/local/Trolltech/Qt-4.3.4/bin/qmake -DQT_QTCORE_LIBRARY=/usr/local/Trolltech/Qt-4.3.4/lib/libQtCore.so.4.3.4 ../../src/marble > cmakelog.txt
WARNING: This project requires version 2.4.8 of CMake. You are running version 2.4.7.


root@vmuser-desktop:/usr/local/bin/marble-build#
状況は変わらず、これも駄目。

検索して少し調べてみると、環境変数でLD_LIBRARY_PATHを指定すると良いようです。 .bashrc の末尾に追加して試してみると、
LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.3.4/lib
export LD_LIBRARY_PATH
今度は libmarblewidget.so.6 が見付からないと怒られてしまいましたので、.bashrc を修正すると、
LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.3.4/lib:/usr/local/bin/marble-build/src/lib
export LD_LIBRARY_PATH
解決!

2008/09/03

ピンマイク

オーディオマッピングで使おうと思っているMP3プレーヤーには内臓マイクが付いていて、大きさ・形(・色まで)が今使っているGPSロガーとほぼ同じUSBメモリータイプなので、そのまま手に持って使うこともできます。でも、いくら小さいとは言っても両手に1つずつ同じような物を持って歩くのが嫌だったので、外部マイクを買うことにしました。

本当は下の画像(アマゾンの広告)の一番左の物のようなハンドマイクみたいな形で、手元でマイクのOn/Offができる物を探していたのですが、トランシーバー用のハンドマイクしか見付からなかったので諦めました。OpenStreetMapの日本語メーリングリスト (Talk-ja) でピンマイクを使っていると言う人がいたので、私もそのタイプにすることにして探してみると真ん中の画像の物が一番安かったみたいですが、実際には一番右の画像の物を注文しました。理由は単に、私のMP3プレーヤーが2.5Фマイク端子で、一番右の画像の物が3.5Ф→2.5Ф変換プラグ付きだったからです。



注文してから気が付いたのですが、一番右の画像の物はコードの長さが1.8mなんですよね。車に乗っている時は構いませんけど、徒歩の時にはちょっと長いような気がします。MP3プレーヤーを鞄に入れるとしても、1.2m位がちょうど良かったのに。鞄の中でコードがぐちゃぐちゃになるなぁ。まぁ、コード整理用の小物を見付けて来れば済む話ですけど、なるべくなら余計なものを持って歩きたくないですし...

2008/08/30

Audio Mapping

最近のOpenStreetMapの日本語メーリングリスト (Talk-ja) でのやりとりで、Audio Mapping を始めてみると言う人が増えつつあるようです。

実は私も2~3か月前に、オーディオマッピングをやってみようかなと思ったことがありました。その時、数年前に購入してほとんど使わずにほったらかしにしていたSONYのICレコーダーを引っ張り出してみたのですが、電池の液漏れの形跡も無いのに既にお亡くなりになっていました。ICレコーダーに限らず私はそのような小物類を思いつきで買い、直ぐに飽きて放置、久しぶりに使おうと思うと壊れているということが多いのです。また、その時点でオーディオマッピングに関する日本語ドキュメントが未整備ということもあって、新しいICレコーダーを買うのは止めて暫く様子見をすることにしました。

そして、最近のTalk-jaを読んでいるうちに、ふと、以前使っていたMP3プレーヤーに録音機能が付いていたことを思い出しました。オーディオマッピングに関するドキュメントは今も英語のものしかないようですが、それらと過去のTalk-jaを読むと、WAVE形式の音声ファイル (.wav) を使用するとのこと。MP3プレーヤーの取説にはWAVEかMP3で録音できると書いてありました。「なーんだ、これでOKじゃん。なんであの時に思いださなかったんだよ!」ということで、私もオーディオマッピングをやってみようという気がムクムクと起きてきました。これから段々涼しくなっていくので、時期的にはちょうど良かったかも知れませんね。で、これからオーディオマッピングを始めるにあたっての、ごく簡単なまとめというか、備忘録。

オーディオマッピングに必要なもの
GPS
GarminのハンディGPSのような高級機からGPS付き携帯電話や私が使っているような廉価版のGPSロガーなど、最終的にOSMで使用できる(タイムスタンプの入った)gpxファイルを取得できるものなら何でもOK。当たり前か...
録音機器
ICレコーダー、MP3プレーヤー、携帯電話など、最終的にJOSMで使用できるWAVEファイルを取得できるものなら何でもOK。過去のTalk-jaによると、録音機器のデータ容量に制約がある場合は、MP3で録音しPC上でWAVEに変換すると良いらしいです。
JOSM
今年の春頃のバージョンではオーディオマッピングが使えるようになっていたような気がしますが、ちょこちょこといろいろな機能が改良されているので最新版をダウンロードし直した方が良いですね。

2008/08/25

GPSロガーの設定をいぢってみる - 6

前回の続きです。

Wintec社のGPSロガー「Easy Showily (WPL-1000)」にプリセットされたGPSの受信設定の5つ目を試してみました。今回は5番の「捕捉時間最短」で、設定値の内容は次の通りです。

5. Fast Acquisition time / 捕捉時間最短
GPS Parameters / GPS設定項目Values / 設定値
Fix mode / 測位モード2. Auto 2D/3D
2D Fix Altitude[m] / 2D Fix高度500.00
Initial Min. SVs[3~6] / 初回衛星数3
Initial Signal Min. Strength[dBHz] / 初回信号強度15
Navigation Signal Min. Strength[dBHz] / 測位後信号強度14
P Accuracy Masks[m] / 測位精度マスク200
T Accuracy Masks[m] / 時間精度マスク300
PDOP Mask / PDOPマスク28.0
TDOP Mask / TDOPマスク28.0
SBASON


今回もログモードは前回と同じプリセットの1.Walk(歩行)を使用しました。その内容は複合条件(10秒毎, 20m毎, 最高時速=2000km/h, 最低時速=1km/h)です。

結果は、低層(2階建)や中層(5~6階建)の建物沿いの道や近くに建物が無い公園沿いの道では前4回とあまり違いがありませんでした。そして前々回のように、高層(15階建前後)の建物の間の通過した直後だけぶれが大きくなっていました(ひび野2丁目交差点手前)。
こうしてみると、高い建物で囲まれた場所ではその影響を受けますが、通過した直後の大きなぶれはGPS設定とはあまり関係が無さそうに思えます。

GPS受信設定の5種類のプリセットを試してみましたが、試した場所や方法(徒歩)のせいか、あまり大きな違いは無かったようです。とほほ...
でも、精度の高い設定にすると「電源ON後になかなかFIXしないのではないか」とか、或いは「頻繁にLOSTするのではないか」とか心配だったので、試してみて良かったとは思っています。因みに、採れたログの内容はともかく、丸の内のビル街で「1.高精度」にしてもFIX自体はしていましたので、初回FIXを行う場所の選び方や歩き方、或いは乗り物での乗車位置など、ログの採り方に気を付けて工夫していった方が良さそうです。

2008/08/12

GPSロガーの設定をいぢってみる - 5

前回の続きです。

Wintec社のGPSロガー「Easy Showily (WPL-1000)」にプリセットされたGPSの受信設定の4つ目を試してみました。今回は4番の「捕捉時間標準」で、設定値の内容は次の通りです。

4. Middle Acquisition time / 捕捉時間標準
GPS Parameters / GPS設定項目Values / 設定値
Fix mode / 測位モード2. Auto 2D/3D
2D Fix Altitude[m] / 2D Fix高度500.00
Initial Min. SVs[3~6] / 初回衛星数3
Initial Signal Min. Strength[dBHz] / 初回信号強度18
Navigation Signal Min. Strength[dBHz] / 測位後信号強度14
P Accuracy Masks[m] / 測位精度マスク150
T Accuracy Masks[m] / 時間精度マスク300
PDOP Mask / PDOPマスク25.0
TDOP Mask / TDOPマスク25.0
SBASON


今回もログモードは前回と同じプリセットの1.Walk(歩行)を使用しました。その内容は複合条件(10秒毎, 20m毎, 最高時速=2000km/h, 最低時速=1km/h)です。

結果は、低層(2階建)や中層(5~6階建)の建物沿いの道や近くに建物が無い公園沿いの道では前3回とあまり違いがありませんでした。そして前回とは少し異なって、高層(15階建前後)の建物の間の通過中にぶれが大きくなっていました(ひび野2丁目交差点手前)。

2008/08/05

GPSロガーの設定をいぢってみる - 4

前回の続きです。

Wintec社のGPSロガー「Easy Showily (WPL-1000)」にプリセットされたGPSの受信設定の3つ目を試してみました。今回は3番の「出荷時設定」で、設定値の内容は次の通りです。

3.Factory setting / 出荷時設定
GPS Parameters / GPS設定項目Values / 設定値
Fix mode / 測位モード2. Auto 2D/3D
2D Fix Altitude[m] / 2D Fix高度500.00
Initial Min. SVs[3~6] / 初回衛星数4
Initial Signal Min. Strength[dBHz] / 初回信号強度20
Navigation Signal Min. Strength[dBHz] / 測位後信号強度15
P Accuracy Masks[m] / 測位精度マスク100
T Accuracy Masks[m] / 時間精度マスク300
PDOP Mask / PDOPマスク23.0
TDOP Mask / TDOPマスク23.0
SBASON


今回もログモードは前回と同じプリセットの1.Walk(歩行)を使用しました。その内容は複合条件(10秒毎, 20m毎, 最高時速=2000km/h, 最低時速=1km/h)です。

結果は、低層(2階建)や中層(5~6階建)の建物沿いの道や近くに建物が無い公園沿いの道では前2回とあまり違いがありませんでしたが、高層(15階建前後)の建物の間を通過した直後だけ前2回と比較して大きくぶれていました(ひび野2丁目交差点付近)。

2008/08/02

Slippy MapウィジェットがIE6でも動くようになりました

Firefox3とSafari3では動いたのにIE6では動かなかった Blogger Slippy Mapウィジェット がIE6でも動くようになりました。(稼動確認したPCはWindowsXP SP3とSP2です。)

何箇所か alert を入れてみて何となく悪そうな場所は分かったのですが、そこから先は Visual Web Developer 2008 Express Edition をインストールしても分かりませんでした。(これはデバッグツールの使い方自体良く分かっていないせいだと思います。)

また検索を繰り返し、次のページに辿り着いて漸く分かりました。 そこに書かれていた原因とは「IEの場合、動的にスクリプトエレメント(<script></script>)にテキストの追加は、できないようです。」ということで、解決策は「動的に関数を作成したいとかそういうことなら、文字列として、関数を構成してeval すればいいです。(script タグを追加する必要はない)」でした。

で、 eval とやらをしてみました。
IEのためのコードを追加しなければならないのかと思っていたので助かりました。普段からJavaScriptを書いている人には当たり前のことなんだろうなぁ(汗

今回のコード(IE6対応版)はこちら。( "+ expand source" のリンクをクリックして下さい。)
<style>
.slippymap img { padding: 0px !important; border: none !important;}
</style>
<!-- bring in the OpenLayers javascript library -->
<script src="http://openlayers.org/api/OpenLayers.js"></script>
<!-- bring in the OpenStreetMap OpenLayers layers. Using this hosted file will make sure we are kept up to date with any necessary changes. -->
<script src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script>

<script type="text/javascript"><!--
// Blogger Slippy Map 0.1.1
var i = 0;
var lat = 54;
var lon = 0;
var z = 4;
var style = "width:300px; height:200px;";
var element1, element2, element3, text;
var tags = document.getElementsByTagName("div");

  for ( var j=0; j < tags.length; j++ ) {

    if ( tags[j].className == "slippymap" ) {

      i++;

      if ( tags[j].getAttribute("lat") ) {
         lat = tags[j].getAttribute("lat");}
      if ( tags[j].getAttribute("lon") ) {
         lon = tags[j].getAttribute("lon");}
      if ( tags[j].getAttribute("z") ) {
         z = tags[j].getAttribute("z");}
      if ( tags[j].getAttribute("style") ) {
         style = tags[j].getAttribute("style");}

      element1 = document.createElement("div");
      element1.setAttribute("class","tempmap");
      element1.setAttribute("style","margin-bottom:-35px;");
      <!-- define a DIV into which the map will appear -->
      element2 = document.createElement("div");
      element2.setAttribute("id", "map" + i);
      element2.setAttribute("style", style 
        + " border-style:solid; border-width:1px; border-color:#000;");
      element1.appendChild(element2);
      element2 = document.createElement("br");
      element1.appendChild(element2);
      element2 = document.createElement("span");
      element2.setAttribute("class","tempmap")
      element2.setAttribute("style",
        "font-size:70%; background-color:white; position:relative;top:-65px;left:5px;z-index:1003;");
      text = document.createTextNode("Data by ");
      element2.appendChild(text);
      element3 = document.createElement("a");
      element3.setAttribute("href","http://www.openstreetmap.org/?lat=" + lat 
        + "&lon=" + lon + "&zoom=" + z );
      element3.setAttribute("title","See this map on OpenStreetMap.org");
      text = document.createTextNode("OpenStreetMap");
      element3.appendChild(text);
      element2.appendChild(element3);
      element3 = document.createElement("br");
      element2.appendChild(element3);
      element3 = document.createElement("a");
      element3.setAttribute("href","http://creativecommons.org/licenses/by-sa/2.0/");
      element3.setAttribute("title","Creative Commons Attribution-Share Alike 2.0");
      text = document.createTextNode("CC-BY-SA-2.0");
      element3.appendChild(text);
      element2.appendChild(element3);
      element1.appendChild(element2);
      tags[j].appendChild(element1);

      eval("var lat"+ i + "=" + lat + "; var lon"
        + i + "=" + lon + "; var zoom"+ i + "=" + z + "; var map" + i
        + "; function lonLatToMercator(ll) { var lon = ll.lon * 20037508.34 / 180; "
        + "var lat = Math.log (Math.tan ((90 + ll.lat) * Math.PI / 360)) / "
        + "(Math.PI / 180); lat = lat * 20037508.34 / 180; return new "
        + "OpenLayers.LonLat(lon, lat); } ;"
        + "if (typeof window.addEventListener == 'function') { "
        + "window.addEventListener('load', init, false);} else if (typeof "
        + "window.attachEvent == 'object') { window.attachEvent('onload', "
        + "init);} else { var oldonload = window.onload ; if (typeof "
        + "window.onload != 'function') { window.onload = init;} else { "
        + "window.onload = function() { oldonload(); init(); } } };"
        + "function init() { map" + i + " = new OpenLayers.Map('map" + i 
        + "', { controls:[ new OpenLayers.Control.Navigation()"
        + ", new OpenLayers.Control.PanZoom(), new OpenLayers.Control"
        + ".LayerSwitcher()], maxExtent: new OpenLayers.Bounds(-20037508.34, "
        + "-20037508.34, 20037508.34, 20037508.34), maxResolution:156543.0399, "
        + "units:'meters', projection: 'EPSG:900913' } ); var mapnik = new "
        + "OpenLayers.Layer.OSM.Mapnik('Mapnik'); map" + i + ".addLayer(mapnik);"
        + " var osmarender = new OpenLayers.Layer.OSM.Osmarender('Osmarender'); "
        + "map" + i + ".addLayer(osmarender); var cyclemap = new OpenLayers"
        + ".Layer.OSM.CycleMap('Cycle Map'); map" + i + ".addLayer(cyclemap); "
        + "var maplint = new OpenLayers.Layer.OSM.Maplint('Maplint'); map" + i 
        + ".addLayer(maplint); var lonLat" + i + " = lonLatToMercator(new "
        + "OpenLayers.LonLat(lon" + i + ", lat" + i + ")); map" + i 
        + ".setCenter (lonLat" + i + ", zoom" + i + "); } ");
    }
  }
--></script>
しかし...
Firefox3とSafari3ではクレジットとライセンスが地図の枠内に収まるのに、IE6では枠外に出てしまうな。
良く見るとIE6では枠の線も表示されてないよ。
まっ、いっかぁ~。とりあえず動くようになったし。

あと、あんまり地図を貼り付けるとページの動きが遅くなりますね。当たり前か。

2008/07/31

Blogger Slippy Map

[ja] Slippy Map MediaWiki Extensionからの出力を基にBlogger用のSlippy Mapウィジェットを作成しました。
divタグに幾つかの属性値を設定して使用します(使用例をご覧下さい)。
ウィジェットを追加するには下のボタンを押して下さい。
Firefox3とSafari3では動きますが、IE6では動きませんでした。
Firefox3、Safari3、IE6で動きました。

[en] I made a Slippy Map widget based on output from Slippy Map MediaWiki Extension.
Usage is just adding some attributes to div tag; see examples below.
To get this widget, click the button.
It works on Firefox3 and Safari3, doesn't work on IE6.
It works on Firefox3, Safari3 and IE6.






使用例 (Examples)




<div class="slippymap" lat="36" lon="139" z="3" style="width:250px;height:200px;"></div>






<div class="slippymap" lat="52.516" lon="13.378" z="9" style="width:300px;height:300px;"></div>






<div class="slippymap" lat="51.5012" lon="-0.123" z="14" style="width:500px;height:400px;"></div>





履歴 (History)

0.1
2008-07-31 新規作成。Firefox3とSafari3で動作。
0.1.1
2008-08-02 IE6で動作。

Slippy Mapのウィジェットを作ってみる

Blogger上でSlippy Mapを一応表示できるようになったので、ウィジェットとして作ってみることにしました。

前回は「地図作成時のオブジェクト名」と「地図描画スペースとなるdiv要素のid」が共に"map"だったので、1ページに複数のSlippy Mapを表示させるには、この組み合わせ毎にユニークにしてあげればいっかなーと考えていましたが、普段からJavaScriptなどをやり慣れていない私にはそれほど単純ではありませんでした。


とりあえずコードを書いて1ページに複数のSlippy Mapを表示させようとすると、前回のSlippy Mapを含めて、どれか1つしかタイルが読み込まれませんでした。コードと睨めっこしても他にユニークにするべきところも無さそうだしJavaScript自体は動いているので、もしかしたらOpenLayersの制約かななどと思いながらコードを眺めていると、window.onload=init; と書かれた行が目に留まりました。色々検索しているうちに次のページが見付かったので参考にさせてもらいました。



単純に window.onload を使わないようにコードを修正すると、1ページに複数のSlippy Mapを表示させることができるようになりましたが、よーっく地図を見ると全て同じ座標とズームレベルになっています。地図そのもののオブジェクトだけでなく、座標とズームレベルのオブジェクトも別の名前で作ってあげないと駄目みたいですね...

このウィジェットの追加ボタンのページを作成して、そちらに簡単な使用例を載せておきます。

現時点のコード(一応完成版)はこちら。( "+ expand source" のリンクをクリックして下さい。)
<style>
.slippymap img { padding: 0px !important; border: none !important;}
</style>
<!-- bring in the OpenLayers javascript library -->
<script src="http://openlayers.org/api/OpenLayers.js"></script>
<!-- bring in the OpenStreetMap OpenLayers layers. Using this hosted file will make sure we are kept up to date with any necessary changes. -->
<script src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script>

<script type="text/javascript"><!--
// Blogger Slippy Map 0.1
var i = 0;
var lat = 54;
var lon = 0;
var z = 4;
var style = "width:300px; height:200px;";
var element1, element2, element3, text;
var tags = document.getElementsByTagName("div");

  for ( var j=0; j < tags.length; j++ ) {

    if ( tags[j].className == "slippymap" ) {

      i++;

      if ( tags[j].getAttribute("lat") ) {
         lat = tags[j].getAttribute("lat");}
      if ( tags[j].getAttribute("lon") ) {
         lon = tags[j].getAttribute("lon");}
      if ( tags[j].getAttribute("z") ) {
         z = tags[j].getAttribute("z");}
      if ( tags[j].getAttribute("style") ) {
         style = tags[j].getAttribute("style");}

      element1 = document.createElement("script");
      element1.setAttribute("type","text/javascript");
      text = document.createTextNode("var lat"+ i + "=" + lat + "; var lon"
        + i + "=" + lon + "; var zoom"+ i + "=" + z + "; var map" + i
        + "; function lonLatToMercator(ll) { var lon = ll.lon * 20037508.34 / 180; "
        + "var lat = Math.log (Math.tan ((90 + ll.lat) * Math.PI / 360)) / "
        + "(Math.PI / 180); lat = lat * 20037508.34 / 180; return new "
        + "OpenLayers.LonLat(lon, lat); } ;"
        + "if (typeof window.addEventListener == 'function') { "
        + "window.addEventListener('load', init, false);} else if (typeof "
        + "window.attachEvent == 'object') { window.attachEvent('onload', "
        + "init);} else { var oldonload = window.onload ; if (typeof "
        + "window.onload != 'function') { window.onload = init;} else { "
        + "window.onload = function() { oldonload(); init(); } } };"
        + "function init() { map" + i + " = new OpenLayers.Map('map" + i 
        + "', { controls:[ new OpenLayers.Control.Navigation()"
        + ", new OpenLayers.Control.PanZoom(), new OpenLayers.Control"
        + ".LayerSwitcher()], maxExtent: new OpenLayers.Bounds(-20037508.34, "
        + "-20037508.34, 20037508.34, 20037508.34), maxResolution:156543.0399, "
        + "units:'meters', projection: 'EPSG:900913' } ); var mapnik = new "
        + "OpenLayers.Layer.OSM.Mapnik('Mapnik'); map" + i + ".addLayer(mapnik);"
        + " var osmarender = new OpenLayers.Layer.OSM.Osmarender('Osmarender'); "
        + "map" + i + ".addLayer(osmarender); var cyclemap = new OpenLayers"
        + ".Layer.OSM.CycleMap('Cycle Map'); map" + i + ".addLayer(cyclemap); "
        + "var maplint = new OpenLayers.Layer.OSM.Maplint('Maplint'); map" + i 
        + ".addLayer(maplint); var lonLat" + i + " = lonLatToMercator(new "
        + "OpenLayers.LonLat(lon" + i + ", lat" + i + ")); map" + i 
        + ".setCenter (lonLat" + i + ", zoom" + i + "); } ");
      element1.appendChild(text);
      tags[j].appendChild(element1);
      element1 = document.createElement("div");
      element1.setAttribute("class","tempmap");
      element1.setAttribute("style","margin-bottom:-35px;");
      <!-- define a DIV into which the map will appear -->
      element2 = document.createElement("div");
      element2.setAttribute("id", "map" + i);
      element2.setAttribute("style", style 
        + " border-style:solid; border-width:1px; border-color:#000;");
      element1.appendChild(element2);
      element2 = document.createElement("br");
      element1.appendChild(element2);
      element2 = document.createElement("span");
      element2.setAttribute("class","tempmap")
      element2.setAttribute("style",
        "font-size:70%; background-color:white; position:relative;top:-65px;left:5px;z-index:1003;");
      text = document.createTextNode("Data by ");
      element2.appendChild(text);
      element3 = document.createElement("a");
      element3.setAttribute("href","http://www.openstreetmap.org/?lat=" + lat 
        + "&lon=" + lon + "&zoom=" + z );
      element3.setAttribute("title","See this map on OpenStreetMap.org");
      text = document.createTextNode("OpenStreetMap");
      element3.appendChild(text);
      element2.appendChild(element3);
      element3 = document.createElement("br");
      element2.appendChild(element3);
      element3 = document.createElement("a");
      element3.setAttribute("href","http://creativecommons.org/licenses/by-sa/2.0/");
      element3.setAttribute("title","Creative Commons Attribution-Share Alike 2.0");
      text = document.createTextNode("CC-BY-SA-2.0");
      element3.appendChild(text);
      element2.appendChild(element3);
      element1.appendChild(element2);
      tags[j].appendChild(element1);
    }
  }
--></script>

Slippy Mapを表示してみる

OpenStreetMapではサイトに表示しているメインの地図をSlippy Mapと呼んでいます。

最近、日本語サイトのOpenStreetMap Japan地図ページの改良をなさっている方が居て、私もちょっと触ってみたくなってBloggerに表示させてみることにしました。


ベースにしたのは、MediaWiki用のSlippy Map MediaWiki Extensionからの出力です。

サーバーからタイル(細分化された地図画像)を引っ張ってくることは直ぐにできましたが、タイル同士の間に数ピクセルの隙間が空いてしまいます。OSM.orgやOSM.jpで使用しているコードを覗いて見たり、OpenLayersの文書やソースを読んでみても解決できず二日程悩んでいました。ふと思い立ってFirefoxのアドオンのページを確認してみるとFirebugのFirefox3対応版が出ていたので早速インストール。HTMLを調査すると適用されているスタイル (padding:4px;) や要素のクラス名 (olTileImage) が簡単に分かり、直ぐに解決。この程度のことだから、OpenLayersのFAQやメーリングにも質問が出ていなかったんだと思いました。それにしてもFirebugは便利だなぁ。あまり使ったことがないので、使い方も良く分かんないけど...

やろうと思ったけどやり方が分からず、とりあえず現時点では諦めたこと。
  • 地図のスクロール時やズーム時に、OSM.orgの地図へのURLに入っている座標やズームレベルを更新すること。
    • URLのベースをOSM.orgサーバーへ向ける。
    • 座標の形式を lat=35.67255 lon=139.76183 のように普段GPSなどで見ているものと同じにする。
    • リンクテキストを Permalink 以外のものにする
  • ズームレベルに合わせたスケールを表示する。
これからやろうと思っていること。



上の地図を表示させているコードはこちら。( "+ expand source" のリンクをクリックして下さい。)
<style>
.map img { padding: 0px !important; border: none !important;}
</style>

<div class="map" style="margin-bottom:-35px;">

<!-- define a DIV into which the map will appear -->
<div style="width:400px; height:350px; border-style:solid; border-width:1px; border-color:#000;" id="map"></div>

<br/>
<span style="font-size:70%; background-color:white; position:relative;top:-65px;left:5px;z-index:1003;">Data by <a href="http://www.openstreetmap.org/?lat=36&lon=139&zoom=4" title="See this map on OpenStreetMap.org">OpenStreetMap</a><br/>
<a href="http://creativecommons.org/licenses/by-sa/2.0/" title="Creative Commons Attribution-Share Alike 2.0">CC-BY-SA-2.0</a></span>

</div>

<!-- bring in the OpenLayers javascript library -->
<script src="http://openlayers.org/api/OpenLayers.js"></script>
<!-- bring in the OpenStreetMap OpenLayers layers. Using this hosted file will make sure we are kept up to date with any necessary changes. --> 
<script src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script> 

<script type="text/javascript"> 
var lon=139; 
var lat=36; 
var zoom=4; 
var map; 

function lonLatToMercator(ll) {
  var lon = ll.lon * 20037508.34 / 180;
  var lat = Math.log (Math.tan ((90 + ll.lat) * Math.PI / 360)) / (Math.PI / 180);
  lat = lat * 20037508.34 / 180;
  return new OpenLayers.LonLat(lon, lat);
}

window.onload=init; 

function init() {
  map = new OpenLayers.Map("map", {
    controls:[
      new OpenLayers.Control.Navigation(),
      new OpenLayers.Control.PanZoom(),
      new OpenLayers.Control.LayerSwitcher()],
    maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
    maxResolution:156543.0399,
    units:'meters',
    projection: "EPSG:900913"
  } );
  var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
  map.addLayer(mapnik);
  var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
  map.addLayer(osmarender);
  var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map");
  map.addLayer(cyclemap);
  var maplint = new OpenLayers.Layer.OSM.Maplint("Maplint");
  map.addLayer(maplint);
  var lonLat = lonLatToMercator(new OpenLayers.LonLat(lon, lat));
  map.setCenter (lonLat, zoom);
} 
</script>


追記

Widget追加ボタンを作成しました。
尚、上のコードで表示できるSlippy Mapは1ページに1つだけで、Widgetでは複数のSlippy Mapを同じページに表示できます。また、上のコードによるSlippy Mapと同じページ内にWidgetによるSlippy Mapがあると、その影響により指定した座標・ズームで表示できないことがあるようです。

2008/07/26

Perlのコードをハイライトしてみる

Blogger Syntax Highlighterウィジェットをちょっと弄ってみました。

まぁ、やったことはウィジェット (JavaScript) の最後の方にあるRubyを処理する部分をコピーして、次のページを参考に内容を書き換えてRubyを処理する部分の下に追加しただけなんですけど。




正規表現がよくわかんないので、たぶんPerlの変数を上手く引っ掛けられないと思いますが、今後直そうと思います。

テストで表示させるのに "Hello, world!" ではつまらないしPerlの変数も出てこないので、オープンストリートマップで国土数値情報インポート作業用の資料を作る際に、ファイルをソートするために使った短いスクリプトが残っていたので、それにしました。

preタグに class="perl" を指定して、果たして上手くいくのか...

#!/usr/bin/perl

#####
#
# データ調査用スクリプト UTF8ファイルのSORT
#
# KSJ2 Railway Data 2007 - EB02 (Railway Line)
# 国土数値情報(鉄道データ)平成19年 国土交通省 - EB02 (鉄道路線)
#
# Files
#   Input : N02-07_EB02-r1.osm
#   Output : N02-07_EB02-r1-sort.osm
#    
#####


use strict;
use warnings;
use encoding "utf8";
use Encode;
use open IO => "utf8";


sub main() {

 open(IN, "<N02-07_EB02-r1.osm");
 open(OUT, ">N02-07_EB02-r1-sort.osm");

 my $i = 0;
 my @file = <IN>;
 my @array = sort @file;

 foreach my $line(@array) {
   print OUT $line;
   $i++;
 }

 close IN;
 close OUT;

 printf "Output %d records\n", $i;   

}




# run this script.

main();





うーん、やっと出た。

予想通り最初は正規表現の所がおかしくて、JavaScriptの実行自体がエラーになり、全くのプレーンテキストしか表示されませんでした。その後、キーワードや関数の名前を登録している部分、それに対応するCSSなども修正。これからも少しづつ直す所が出てきそうな気がします。

でも、とりあえず今の時点で動いているものを貼っておきます。

dp.sh.Brushes.Perl=function()
{var keywords='break continue do elsif else for foreach goto if last next return sub undef unless '+'until while';var builtins='abs accept alarm atan2 bind binmode bless caller chdir chmod chomp chop chown '+'chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined '+'delete die do dump each eof eval exec exists exit exp fcntl fileno flock fork '+'format formline getc getlogin getpeername getpgrp getppid getpriority getpwnam '+'getgrnam gethostbyname getnetbyname getprotobyname getpwuid getgrgid '+'getservbyname gethostbyaddr getnetbyaddr getprotobynumber getservbyport '+'getpwent getgrent gethostent getnetent getprotoent getservent setpwent '+'setgrent sethostent setnetent setprotoent setservent endpwent endgrent '+'endhostent endnetent endprotoent endservent getsockname getsockopt glob gmtime '+'goto grep hex import index int ioctl join keys kill last lc lcfirst length '+'link listen local localtime log lstat m map mkdir msgctl msgget msgsnd msgrcv '+'my next no oct open opendir ord our pack package pipe pop pos print printf '+'prototype push q qq qr qx qw quotemeta rand read readdir readline readlink '+'readpipe recv redo ref rename require reset return reverse rewinddir rindex '+'rmdir s scalar seek seekdir select semctl semget semop send setpgrp '+'setpriority setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep '+'socket socketpair sort splice split sprintf sqrt srand stat study substr '+'symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied '+'time times tr truncate uc ucfirst umask undef unlink unpack untie unshift use '+'utime values vec wait waitpid wantarray warn write y'
this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:'comment'},{regex:dp.sh.RegexLib.DoubleQuotedString,css:'string'},{regex:dp.sh.RegexLib.SingleQuotedString,css:'string'},{regex:new RegExp(':[a-z][A-Za-z0-9_]*','g'),css:'symbol'},{regex:new RegExp('(\\$|@|%|\\*)\\w+','g'),css:'variable'},{regex:new RegExp(this.GetKeywords(keywords),'gm'),css:'keyword'},{regex:new RegExp(this.GetKeywords(builtins),'gm'),css:'builtin'}];this.CssClass='dp-pl';this.Style='.dp-pl .symbol { color: #a70; }'+'.dp-pl .variable { color: #a70; font-weight: bold; }'+'.dp-pl .builtin { color: #069; font-weight: bold; }';}
dp.sh.Brushes.Perl.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Perl.Aliases=['perl'];


桁番号表示のオプションは TeraPad みたいなものを勝手に想像していたので、ちょっとガッカリ。コードを見るにはメニューにある + expand source のリンクをクリックして下さい。

私はこれをウィジェット (JavaScript) の最後の方にある ['ruby','rails','ror']; で終わっている行の次に追加しています。

元のsyntaxhighlighterのページには"Code License: GNU Lesser General Public License"と書いてあるので、この部分もGLGPLということかな?  よくわからんけど...

2008年7月28日 追記

Perl対応部分を組み込んだウィジェットの追加ボタンを作成してみました。

おかげで、[設定] → [フォーマット] → 改行の変換を「いいえ」にして、自分でbrタグを入力して改行させなければいけなくなりました。「はい」だとウィジェットの中に在る改行までbrタグに変換されてしまうので...

2008/07/24

GPSロガーの設定をいぢってみる - 3

前回の続きです。

Wintec社のGPSロガー「Easy Showily (WPL-1000)」にプリセットされたGPSの受信設定の2つ目を試してみました。今回は2番の「標準精度」で、設定値の内容は次の通りです。


2.Middle Accuracy / 標準精度
GPS Parameters / GPS設定項目Values / 設定値
Fix mode / 測位モード3. 3D only
2D Fix Altitude[m] / 2D Fix高度500.00
Initial Min. SVs[3~6] / 初回衛星数4
Initial Signal Min. Strength[dBHz] / 初回信号強度25
Navigation Signal Min. Strength[dBHz] / 測位後信号強度18
P Accuracy Masks[m] / 測位精度マスク75
T Accuracy Masks[m] / 時間精度マスク150
PDOP Mask / PDOPマスク15.0
TDOP Mask / TDOPマスク15.0
SBASON


今回もログモードは前回と同じプリセットの1.Walk(歩行)を使用しました。その内容は複合条件(10秒毎, 20m毎, 最高時速=2000km/h, 最低時速=1km/h)です。

結果は前回とあまり違いがありませんでした。

GPSロガーの設定をいぢってみる - 2

以下は、OSM.orgのUser Diaryに投稿した「[ja] GPSロガーの設定をいぢってみる - 2」を移動し、表やリンクなど一部を手直ししたものです。



前回の続きです。

「いぢってみる」と言っても、GPSロガーに何種類かプリセットされている設定値を試してみるだけなのですが...

私が使用しているGPSロガーはWintec社Easy Showilyというモデルで、型式はWPL-1000、"Auto-show Track Logger"と紹介されています。

ログモードの設定に関しては、3種類のプリセットと1種類のユーザー定義を単体で切り替えることができますが、ユーザー定義の内容はPCに繋がないと変更できません。

今回試そうとしているのはログモードではなくGPSの受信設定なのですが、こちらの方は5種類のプリセットと1種類のユーザー定義の切り替えとユーザー定義の内容の変更の両方ともPCに繋がないと行えません。面倒くさい... なので、5種類のプリセットを一通り試すのにも、ちょっと時間が掛かりそうです。

プリセットの番号順に試していこうと思うので、とりあえず最初は1番の「高精度」。設定値の内容は次の通りです。

1.High Accuracy / 高精度
GPS Parameters / GPS設定項目Values / 設定値
Fix mode / 測位モード3. 3D only
2D Fix Altitude[m] / 2D Fix高度500.00
Initial Min. SVs[3~6] / 初回衛星数4
Initial Signal Min. Strength[dBHz] / 初回信号強度25
Navigation Signal Min. Strength[dBHz] / 測位後信号強度20
P Accuracy Masks[m] / 測位精度マスク50
T Accuracy Masks[m] / 時間精度マスク50
PDOP Mask / PDOPマスク10.0
TDOP Mask / TDOPマスク10.0
SBASON


ログモードはプリセットの1.Walk(歩行)を毎回使用する予定で、その内容は複合条件(10秒毎, 20m毎, 最高時速=2000km/h, 最低時速=1km/h)になっています。

結果はこんな感じです。

「高精度?」という気がしないでもないですが、まぁまぁですかね。素人には良く分かりませんが...

そう言えば、OSM.jpでrssフィードを受けられるようになったかな? 忙しそうだし、たぶんまだだろうなぁ。

Posted by Tatata at Wed Jul 23 12:35:00 +0100 2008

GPSロガーの設定をいぢってみる - 1

以下は、OSM.orgのUser Diaryに投稿した「[ja] GPSロガーの設定をいぢってみる - 1」を移動したものです。



This is my first diary post. Since it's hard for me to write a diary post in English, I'll do it in Japanese; sorry. :-)

OSM.jpでのrssフィードによるブログエントリ作成機能を使ってみることも兼ねて、ちょっとこちらに書いてみます。

えーっと、先日、東京の呉服橋交差点付近から丸の内1丁目・大手町・和田倉噴水公園・皇居東御苑を通って竹橋までマッピングしてきました。家に帰ってGPSのログを見てみると、これがもうグッチャグチャで、せっかく4時間近く歩いたのに使い物にならず、かなりショックを受けました。

ヘコミつつ取説を読み返すと「大気が不安定な時、GPSロガーから出力されるGPSデータは実際の位置データと異なるデータを示すときがあります」みたいなことが書いてあり、確かにこの日の朝はどんよりとして雨が降りそうな感じで、マッピングを行った午後も陽が差して暑かったですけど雲は結構あったように思います。

1ヶ月程前に皇居外苑をマッピングした時は、快晴ではないけど雲は多くなく暑い日で、結果はマッピングを開始した国際フォーラム横辺りから国道1号まではぶれていましたけどway pointを記録したタイミングはメモと合っていて、国道1号から先はtrack pointも使えました。

でも、このGPSロガーを今まで使ってきて、今回だけが結果に影響が出る程の天候だったとも思えないし、「なんでかなー?なんでかなー?」と思っている時、ふと思い出しました。そう言えば皇居外苑のマッピングの後に GPS reception を読んで、よく分かっていないくせにGPSロガーの設定を弄って、テストもせずにそのままにしていました。

天候が原因なのか設定が原因なのか、たぶん私では正確に分からないと思いますが、プリセットの設定をいくつか試してみて、その結果を次回以降のdiaryに書いておこうと思います。

Coordinates: 35.6851115538029; 139.763114997619 (map / edit)
Posted by Tatata at Sat Jul 05 07:46:02 +0100 2008

OpenStreetMapのUser diary

OpenStreetMapの本家のサイト http://www.openstreetmap.org/ にあるUser diaryを使ってみたのですが、「Previewが無い」「SaveするとEditできない」「HTMLのTableタグが上手く使えない」など長めのものを書くには使い難いと感じたので、こちら (Blogger) に引っ越すことにしました。

2008-08-25 追記
「SaveするとEditできない」と思っていたのですが、各エントリの一番下の行の右端に "Edit this entry" というリンクがありました。

2008/07/20

eneloop

大きなパッケージでまとめ買いしていたアルカリ電池を使い果たし、暫くの間はマッピングに行って電池が無くなる度にコンビニやキオスクで買っていましたが、次第に馬鹿らしくなって来たので三洋電機のeneloop(エネループ)を買ってみました。



実際にGPSロガーでエネループを使ったみたところ、計った訳ではありませんが、今までの電池よりも長持ちするような気がします。そう思いながら暫く使っていると、先日、徒歩で20分の道程のちょうど真ん中あたりで電池切れになってしまいました。もちろんスタート時に電池残量の警告は表示されておらず、いつもは(アルカリ電池を使っていた時は)警告が表示されてからも30分程度は使用できていたので、ちょっとビックリです。どうやらこれはエネループの放電カーブの特性によるもののようで、リンク先のKansai-Event.comのページには「残量メーターが付いている機器で使用される方は注意が必要かもしれません。」と書かれていました。

今までのマッピングではほとんどの場合に区切りの良い場所で電池交換ができていたけど、これからは電池残量の警告が表示されたら出来るだけ早く電池交換をしないといけないなぁ。でも、エネループは「つぎ足し充電OK」なんだから、マッピングに出掛ける前に毎回交換して、帰って来たら即充電という習慣を付ければいいのか...

2008/07/15

GPSのログモード

先日、OpenStreetMapの日本語メーリングリスト (Talk-ja) でログモードについて話題になっていたので、メモを書いておこうと思います。


自転車や徒歩でマッピングする時にGPSのトラックログの頻度をどうしているかという話でしたが、これについてはOSMのwikiにあるFAQのページに "Why are the points on my tracks spaced out?" という節があり、この中で「自動車や自転車の場合は1秒間隔、徒歩の場合は2~3秒間隔にすると良い」と書かれています。この解説はガーミン社ハンディGPS(トラックログの容量が10,000ポイント)を前提に書かれているようですが、その他のGPSロガーでも参考にできそうです。

MLではマップコンシェルジュ古橋さんから、普段の設定やOSM用GPSロガー購入時のチェックポイントについてアドバイスがありました。その中に「最大速度の上限も有効になれば、ノイズもかなりとれる」と書かれており、その点が気になっています。自分のGPSロガーが対応しているか、なるべく早い内に試したいと思います。上手く行けば、街中のログがあまりグチュグチュにならずにすみそうなので...
Atom