オープンストリートマップの編集メッセージをツィートする #osmjp

OpenStreetMap

みんなでつくり上げる WiKi 地図である オープンストリートマップ/OpenStreetMap の編集時コメントを都道府県毎に twitter に流すようにした。

経緯

オープンストリートマップ は、地図データを編集する際に、 "何のために何をどうした"をコメントとして残すことが推奨されている。

大阪 京都 神戸近辺が変更された際、 そのコメントを @osmjp_santo という twitter アカウントに tweet する仕組みを 以前、ある方が構築されていた。

誰が何のためにどこをどう編集したかがわかることによって、
・共同作業時の排他制御の参考にしたりとか
・あの人頑張ってるなぁ、、、とか
・へへへ、最北端、先に行ったもんね とか
といった情報共有、モチベーションの向上につながっていた。
その他、
・他の地図からコピーしたらアカンやん
という不正の検出にも役立つことがあった。

ところが、12/11/10 を最後に @osmjp_santo が何らかの事情で止まってしまった。
管理者の方に連絡を取ったりしたのだが、 残念ながら復旧の見込みが無く、寂しく残念な思いをしていた。

そこで技術的興味から、自分で作ってみることにした。

結果

先に結果を。
京都府の編集をツィートする @osmjp_kyoto を始め、 全都道府県ごとの twitter アカウント を作成した。

更には、全ての編集を把握できることから、 都道府県ごとの編集数/編集者数の集計を各 twitter アカウントに、
全国集計を @osmjp_stats に流している。

更に更にその集計結果は @kudarisenmon さんにより、
・過去1か月間の推移
・2週間の都道府県ランキング
としてビジュアル化もされている。

・近所の編集の参考にしたり、
・共同作業時の排他制御の参考にしたり
とか、必要に応じて活用いただきたい。


osmjp_都道府県 の仕組み

これ?を総称して「osmjp_都道府県」と呼んでいる。
の仕組を解説しておく。

プラットホーム

osmjp_都道府県は、手近に使える Debian 化した LinkStation と、 私が手軽に使えるプログラミング言語である B(a)sh の シェルスクリプトで実装している。

昔から、この手のテキスト処理は Unix の得意分野である。
まぁ XML など複数行に渡る処理は結構苦手なのだが、、、

以下、シェルスクリプトの解説

編集履歴の収集

最初にやることは日本の編集履歴の取得。

OpenStreetMap の左上の方にある「履歴」ボタンを押した時に使用されるAPIを使用して、 日本を含む領域を編集した Changeset を取得する。

ただ、この API は矩形しか指定できず、 一つの矩形で日本全土をカバーしようとすると、 朝鮮半島や中国本土のデータまで取得してしまい、 無駄なデータの取得/不要なトラフィック、負荷を発生してしまう。
そこで、
・北海道/東北/関東甲信越
・東海/北陸/近畿/中国/四国
・九州
という3つのブロックに分けて Changeset を取得している。

各都道府県境、国境が矩形だったら、どれだけ楽だったことか(笑

編集された都道府県の特定

次に、各 Changeset がどの都道府県を編集しているかを特定する。

ここで最大の手抜き(良く言えば効率化)をしている。
各 Changeset には、複数のノード、ウェイ、リレーションが含まれる。
Changeset に含まれる全ノードの都道府県を判定すれば確実なのだが、 大量のノードが含まれる場合はその判定コストは膨大となる。

そこで、考えたのが、四隅だけを判定する方法。

Chengeset に複数のノードが含まれる場合、 このように その領域が矩形で表される。
その右上/右下/左上/左下の4ヶ所を判定することによって 一つの Changeset につき最大4ヶ所の判定だけで済むようにして 判定コストを抑えている。

この手抜きには色々弊害もあって

編集されていない都道府県が判定されることがある

京都のように北西~南東に長い都道府県だと、 北部と南部とがひとつの Changeset で編集されると、 福井県や兵庫県が編集されたと判定されることになる。

まぁ、これほど大規模でなくても、県境付近で編集すると、 いずれかの隅が隣の都道府県になることがある。

編集された都道府県が判定されないことがある

北海道、京都、鹿児島がひとつの Changeset で編集されると、 矩形の中で四隅にヒットしない京都府が編集されたとは判定できない。

また、都道府県判定には、 農研機構の簡易逆ジオコーディングサービス を使わせて頂いているが、
このサービスは、海上はどの都道府県に属していないと判定するようで、 例えば 島の編集 はどの都道府県にも属さないという残念な結果になる

なお、このサービスが停止されると osmjp_都道府県 は欠落してしまう。

メッセージの作成

四隅を判定した結果の都道府県の osmjp_都道府県 にツィートする メッセージを作成する。 基本的には、
"コメント" by "編集者ID" ChangesetへのURL
というフォーマットである。

当初、Changeset への URL をそのまま短縮してツィートしていたのだが、
それだと Twitter で "OpenStreetMap" を検索した時 に大量にヒットするという苦情が来て、致し方なく 私のサイトにスタブを作ってその URL を使うことにした。

URL の短縮には Google URL Shortener を使わせて頂いている。

Google URL Shortener が止まっているときは、スタブの URL をそのまま使う。

メッセージのツィート

作成したメッセージをツィートする。

といっても、私の知識では twitter に直接ツィートすることはできず、
メールを使ってツィートするサービス yabmin を使わせて頂いている。

時々、twitter へアクセスできなかったというエラーが帰ってきている。
その場合は、Changeset の tweet はできていないが、集計はできている。

都道府県別集計

osmjp_都道府県には、毎日それぞれの都道府県の集計、
・編集数
・編集者数
と、月累計、(14/2/23 からの)年累計がポストしてある。

上記、4隅判定のため、
・編集されているのにカウントされていない場合
・編集されていないのにカウントされている場合
がある。

なお、1つの Changeset が複数の都道府県と判定した場合は、 それぞれの都道府県でカウントする。

集計は、0時過ぎに実行しているが、 月累計、年累計は(前日までではなく) その集計時点までの累計をとっているため、 0時から集計時点までの編集までをカウントしてしまい 前日までの累計+前日の集計とは合わなくなることがある

「概略集計」としている所以である。

全国集計

前述のとおり、 @osmjp_stats には、全国の集計、
・編集数
・編集者数
と、月累計、(14/2/23 からの)年累計がポストしてある。

一つの Chageest が複数の都道府県と判定した場合は、 編集数はその都道府県の数となるので、 一つの Chageest (編集)が最大4編集とカウントすることがある。

累計については、上記都道府県別集計と同じ。

「概略集計」としている所以である。

編集者は、uniq をとっているので、 一つの Chageest (編集)を4編集とカウントしたとしても 編集者数は1とカウントする。

というわけで、色々「仕様」があって、厳密ではない。
あくまで「概略集計」ということで、参考にしていただければと思う。

有効活用

OSM の何らかの全国集計の場としての @osmjp_stats が何か有益な用途があれば、使っていただければよいし、
osmjp_都道府県の生データは必要であれば提供するので、 活用いただければと思う。

上記の通り、 @kudarisenmon さんには生データを活用して
・過去1か月間の推移
・2週間の都道府県ランキング
としてビジュアル化していただいている。




西陣杉坂線バイパスロギング、他、気になる所マッピング
山下康成の
きばらないブログ

京都腐道530号、707号、府道53号久住バイパス

ツイート Tweet to @yasunari_y @yasunari_yをフォロー

Copyright (C) 2003-2017 Yasunari Yamashita. All Rights Reserved.
yasunari @ yamasita.jp 山下康成@京都府向日市