2009年3月アーカイブ

はじめに

Twitterでは,自動発言するbotの存在も無視できない。例えば,列車の運行情報botは役に立っており,私も実際にいくつかのbotをフォローしている。便利なbotはこちらのサイトでまとめられている。

Twitterのようなシンプルなインターフェイスで,botを含めたユーザの情報を時系列表示させる方法(Time Line)や,botによる自動的な情報の配信サービスとフォローによる受け取る情報を選択できることは,個々人が必要な情報を受けとることが可能なサービスを考える上で,参考になる。そこで,とにかく実際にbotを作ってみることにした。

作ったbot

tagchan_bot
http://twitter.com/tagchan_bot

このbotは,位置情報SNSであるBrightkiteにおける私の位置情報を定期的に配信する。そのために,私の位置情報を配信しているフィード(XML)を取得している。それをTwitterにポストしている。なお,サーバーはさくらインターネットを使っており1時間ごとに定期的に実行するcronを利用している。以下がphpのソースコードである。

<?php

// 文字コード関連。http://www.spencernetwork.org/jcode/を参照のこと。
require_once 'code_table.ucs2jis';
require_once 'jcode.php';

$now_date = time();
$now_time = date("Y/m/d(D)H:i",$now_date);


// Brightkiteのフィードを取得
$burl = "http://brightkite.com/people/tagchan.xml";
$rss = file_get_contents($burl);
$xml_p=xml_parser_create('UTF-8');
xml_parse_into_struct($xml_p,$rss,$r_vals,$index);
xml_parser_free($xml_p);

for ($i=0;$i<90;$i++){
if($r_vals[$i]['tag'] == "LONGITUDE"){
$lon = $r_vals[$i]['value'];}
if($r_vals[$i]['tag'] == "LATITUDE"){
$lat = $r_vals[$i]['value'];}
if($r_vals[$i]['tag'] == "NAME"){
$location = $r_vals[$i]['value'];}
}

$url = "http://twitter.com/statuses/update.xml?";

// Twitter ID & Password
$username = "id";
$password = "password";

$mes = "$now_time 現在,Tagchanは $location (緯度$lat, 経度$lon)にいます。";
$params = "status=". rawurlencode($mes);

$result = file_get_contents($url.$params , false, stream_context_create(array(
"http" => array(
"method" => "POST",
"header" => "Authorization: Basic ". base64_encode($username. ":". $password)
)
)));
?>

いくつかのサイトを参考にしつつ作成したが,かなり簡単に作成できてしまった。

今後の展開

今回はbotの作成を行って発信のみに注目したが,情報を集めるという側面でもTwitterは使える可能性があると考えている。Twitterでは,「@ユーザ名」を含めてポスト(投稿)することで,そのユーザに向けてポストした文章を送ることができる(リプライ機能)。このアプローチを使うことで,情報を収集する手段として使えそうな場面がありそうだと考えている。

例えば,gyuque氏の開発したサービスである「ねる。」は,「@twneru ねる」とか「@twneru おきた」とポストすることで,睡眠時間を記録してくれるサービスである。Twitterのリプライ機能を使って情報を収集する枠組みとなっている。

Twitterのようなインターフェイスおよび枠組みを使うことで,「情報収集→加工→bot等で配信」を行うことが可能なシンプルなサービスが作り出せるのではないかと考えている。

自分の行ってきた研究を,多くの人に平易な言葉で説明できるようにしたいと考えている。それは,研究成果の社会還元のために重要だと考えたからである。つい最近出版された自分の論文を紹介したいと思う。

  1. やったことを一文で説明すると・・・
  2. 「これまで撮りためてきた航空写真(空中写真)を使って,過去40年間の森林の変化や成長が再現できることが明らかになった。」

  3. 航空写真(空中写真)について
  4. 航空写真は,地図作りの目的のために,日本全国を戦後から定期的(森林域ではほぼ5年おき)に撮影してきた。そのため,航空写真は膨大な枚数の蓄積がある。この蓄積を生かすことできれば,新しい情報を生み出せる可能性がある。このような視点で航空写真を使うことはほとんどなかった。

  5. 航空写真を使って立体視
  6. 航空写真は,先ほど書いたように地図作成を目的として撮影されている。そのため,等高線が必要であり,地形のデコボコを把握するために立体視ができるように撮影される。立体視とは,写真のような2次元の画像を複数枚使うことで,物を3次元(立体的)に見る方法である。そのため,同じ地点でも複数の航空写真で写るように撮影されている。

  7. 樹木の凸凹の変化だけ抽出
  8. 森林や山の中を撮影した航空写真を使って立体視をすると,どんな凹凸が見えるだろうか。それは,「地形+樹木」の凹凸である。樹木は,成長すると上に高くなっていく。つまり,同じ森林で,40年前に撮影された航空写真の凹凸と,最近撮影された航空写真の凹凸を比較すれば,地形の凹凸が変化していないとするならば,樹木の成長による凹凸の違い,要するに樹木が高くなっていくことが把握できるはずだ。

    fig1.jpg

  9. 樹木の凹凸を抽出
  10. 航空写真から,地図作成のために立体視をしてきたが,人の手によって行われてきた。しかし,これでは時間がかかる。最近では,コンピュータの発達や,この分野の発展により,半自動的に凹凸が抽出できる技術が確立しつつある。そのため,この技術を使って,8時期約40年間の航空写真を50枚以上使い,8時期の凹凸を抽出した。そして,地形の凹凸である地盤高のデータを使って,樹木の凹凸のみを抽出した。この樹高の凹凸の時系列変化を観察することで,森林の変化が把握できるのかを調べてみた。

  11. どんな結果が得られたか?
  12. 最新の航空写真については,最新の測量技術であるレーザ測量の凹凸と比較して,樹木の凹凸は樹木の高さが十分に抽出できていることが確認された。

    そして,8時期の樹木の凹凸を観察したところ,樹木の成長が把握できた。また,樹種や地形による成長の違いが把握できた。他にも,伐採されたところや,植林された所が把握できたり,倒れた被害の発生したところが,凹凸で表現されていた。

    以下に樹木の凹凸を地図化したマップを示す。黒いほど樹木の高さが低く,白いほど高いことを示している。1960年代や1970年代は,南側は黒っぽいことがわかる。ちょうどこの頃に,植林が活発に行われ,その後は順調に成長していることがわかる。

    fig2.jpg

  13. どんないいことがあるの?
  14. 樹木の凹凸として樹木の高さが分かれば,林業を行っている森林では,木材の体積を知ることが重要であるが,これを時間変化として知ることができる。これまでも,森林のこのような情報を自治体が把握してきたが,精度に問題があるという指摘があった。そのため,航空写真を使えば,人間の調査が行けなかった場所でも,今回抽出できた情報を使うことで,精度を高められる可能性がある。また,伐採とか植林の確認もでき,倒木箇所の把握もできるので,森林管理の効率化に貢献できることが期待できる。

    また,バイオマスや貯蔵されている炭素の量が分かるようになる。そして,時間変化がわかるので,その情報を使って,森林の将来の森林の予測を行うこともできる。そうなれば,温室効果気体である二酸化炭素の吸収量の予測や,炭素の貯蔵量の予測も高精度に行える可能性がある。

  15. 掲載論文
  16. 田口仁,遠藤貴宏,古川邦明,沢田治雄,安岡善文,(2009)「多時期の空中写真から作成したDigital Canopy Modelによる森林キャノピーのモニタリング」写真測量とリモートセンシング, Vol. 48, No. 1, pp. 4-11.


というわけで,自分の研究成果を分かりやすく説明することを試みた。正直なところ,どんな書き方が良いのか模索している段階である。今後,いろいろと研究成果を発表していくと思うので,試行錯誤しながら,行ってきた研究を誰もが理解できる形で紹介できるようにしていきたいと思っている。

2008年8月から2009年2月にかけて,200ページ以上の学位論文の執筆を行ったが,ファイル管理にDropboxが役に立った。今回,自分がどのようなソフトウェアおよびファイル管理方法を用いて論文を書いたのかを文章として残すために,このエントリを書くことにした。

  • 文章作成に使用したソフトウェア
  • LaTexを使ったことがあり,研究室にも代々使われてきたLatexのテンプレートがあったのだが,MS Wordで書くことにした。一部の図表でLinuxを使う場合があったが,基本的にWindowsを使っていたので,MS Wordを使うことが最も楽であると判断したからである。

    図表の作成には,MS PowerPoint 2003を使った。1枚のスライド1つの図表とした。パワポ上でオブジェクトを選択し,「図として保存」とすることで,emf形式に保存した。図表ファイル名は,「figタイトル.emf」や「tableタイトル.emf」のようにして,図表の内容がファイル名から把握できるようにした。

    論文はページ数が多くなることが予想されたので,グループ文章を活用し,1章で1ファイルとした。サンプルのグループ文章のファイル群をこちらにアップロードした。doc_thesis.docがグループ文章ファイルで,その他の頭に数字が入るファイルがサブ文章である。グループ文章とサブ文章のファイルは,パスを変えると呼び出せなくなるので,全て同じディレクトリで管理したほうが良い。このグループ文章はくせ者で,慣れるまで試行錯誤が必要である。

  • ファイル管理方法
  • 図表ファイルや文章ファイルはDropboxで管理した。研究室にある自分のPCと,自分が所有しているPC(ノートパソコン)にDropboxをインストールし,ファイルを同期させた。つまり,論文作成に関する全てのファイルをDropboxで同期させることにしたのだ。なお,Dropbox上でバージョン管理ができるが,今回は手作業で日付フォルダを作成して,数日に一度コピーする方法とした。

    帰宅後も論文を執筆するため,自宅のノートPCにも論文のファイルを移動する必要がある。USBメモリでのファイル移動は面倒だった。また,研究室にノートPCを持っていくことも多く,ファイル管理が煩雑だった。しかし,Dropboxを使うことでファイル管理の煩雑さがゼロになった。また,ノートPCを毎日研究室に持っていっていたが,最終的には持っていかなくなった。

    また,DropboxはiPhoneでの閲覧に対応しているため,移動中に執筆した文章を眺め,誤字脱字をチェックしたり,今後の論文の書き方などを考えることができた。(ただし,emfファイルで挿入した図表の日本語部分は文字化けしていた。)

    執筆中にPCがクラッシュする事態には遭遇しなかったが,Dropboxで同期しておけば,ファイルが完全に復元できなくなる可能性は極めて低くなるだろう。なので,論文執筆にはDropboxは大変役に立つと思う。

パソコン2台を使って論文執筆を行う場合は,Dropboxは必須といえる。また,1台のみの場合でも,データバックアップという意味でもDropboxは役に立つと思う。

前回のエントリでは,Quantum GISを使って地図画像に地理座標を与えた。地理座標が定義できているので,地図投影法は自由に変えることが可能となる。今回は,希望の投影法に変換する手順を説明したい。

GDALは,ラスター(画像のようなメッシュ)形式のGISデータを処理するライブラリである。Linuxだけでなく,Windowsでも動作する。Windowsへのインストールは,まずOSGeo4Wで,OSGeo4W Installerをダウンロードし,実行させる。そして,GDALのみをチェックするとインストールできる。スタート > すべてのプログラム > OSGeo4W > OSGeo4W Shellを選択すると,コマンドプロンプトが出てきて,このプロンプトを通してGDALのライブラリが実行できる。コマンドプロンプトの使いかたについては,こちらのサイトが参考になりそうだ。

前回のエントリで行った,地理座標を与えた画像データがあるフォルダへ移動する。そして,前回の画像ファイルだが,Quantum GISによって座標はインプットされているのだが,投影法が画像ファイル自身には埋め込まれていないことが判明した。これは,gdalinfoコマンドで確認することができた。

gdalinfo <入力ファイル名>

投影法が定義されている場合には,投影法に関する記述が出てくるのだが,無いのである。なので,まずこれを定義することからはじめよう。定義するには,gdal_translateコマンドを使う。このコマンドは,画像の形式を変換することも可能な便利なコマンドである。

投影法の定義するためには,いろいろなパラメータが必要だが,コードで記述する方法が採用されている。それが,EPSGコードである。座標系と投影法の組み合わせで一つのEPSGコードが決まっている。なお,国内のEPSGコードについては,こちらのサイトで一覧が示されている。また,Google Earthと同じ,等緯度経度(Plate Caree)の場合のEPSGは4326,Google MapsはSpherical MercatorでEPSGが900913(または3785)である。

前回のエントリで扱った地図投影のEPSGコードはどうやって調べればよいかというと,前回のエントリの一つ目の画像が参考になる。WMSレイヤーを表示させるときに,基盤地図情報25000では,複数の投影法で表示させることが可能なことを記述したが,そこにEPSGのコードが出ている。それによると,25000分の1地形図の投影法はUTM図法のゾーン54の北側だったため,EPSGコードは3100である。それをgdal_translateでは以下のようにコマンドする。

gdal_translate -a_srs "EPSG:3100" <入力ファイル名> <出力ファイル名>

出力ファイルはtifとすると,Geotiffとなるため,今回は全て拡張子はtifで統一する。出力ファイルをgdalinfoコマンドで表示させると,ちゃんと投影法が定義されていることが分かるはずである。これで,投影変換を行う準備が整った。投影変換のコマンドは以下のようになる。

gdalwarp -t_srs "EPSG:xxxx" <入力ファイル名> <出力ファイル名>

-t_srs "EPSG:xxxx"のxxxxは変換先のEPSGコードである。なお,等緯度経度の場合はxxxxは4326となる。

実は,先ほどgdal_translateで元の画像のEPSGを定義したが,一気に変換することも可能である。その場合,EPSG:3100からEPSG:4326への変換となり,コマンドは以下のようになる。

gdalwarp -s_srs "EPSG:3100" -t_srs "EPSG:4326" <入力ファイル名> <出力ファイル名>

"-s_srs"の後のEPSGが,入力ファイル名のEPSGコードである。s_srsとt_srsのsとtの違いは,sourceとtargetの違いである。それでは,出力されたファイルを比較してみよう。まずは,EPSG:3100(UTM/54N/JGD2000)である。

fig1.jpg

次がEPSG:4326である。

fig2.jpg

等緯度経度(Plate Caree)であるため,ゆがみが大きくなる。そのため,等緯度経度である下の画像の方が,横に伸びたような画像となっているのが分かる。

以上で,Quantum GISで地図画像に地理座標を与え,GDALで任意の投影変換を行う流れまでできたことになる。せっかくなので,次のエントリでは,等緯度経度に投影変換した地図画像をGoogle Earthでぴったりと重ねることができることを示したいと思う。

前回は,地図画像に地理情報を与えるコンセプトを説明した。今回は実際にQuautumGISを用いて地理情報を与える方法を説明する。今回,例としてスキャンした25000分の1地形図(図葉名:流山)を使うことにする。

25000分の1地形図は,前のエントリで示したように,地図投影法はUTM図法(横メルカトル図法)である。なお,地形図の右側の凡例などが記載されている所の説明には,「ユニバーサル横メルカトル図法,座標体は第54帯,中央子午線は東経141°」と記されている。そのため,リファレンスに使用する地図もその投影法に合わせる必要がある。

以前のエントリで,WMSサーバを紹介したが,基盤地図情報25000は非常に便利である。なぜなら,多種多様な投影法に対応しているからである。では,次からは実際の手順の説明に移る。

QuantumGISを起動して,基盤地図情報25000のWMSレイヤを表示させる。方法については,基盤地図情報25000のサイトで詳しく紹介されている。ただ,ここで必要なプロセスがあり,「Add Layer(s) from a Server」ウィンドウの下にある,「Coordinate Reference System」のChangeをクリックする必要がある。表示されたウィンドウでは,以下のようなウィンドウが表示され,投影法を選択することができる。

fig1.jpg

上の図の通り,「UTM zone 54N」を選択する。そして,OKをクリックし,前のウィンドウに戻ってAddをクリックすると,地理情報を与えたい地形図と同じ投影法で基盤地図情報25000が表示される。

次に,メニューで プラグイン>Georeferencerを選択する。すると,「地理参照」というウィンドウが表示されるので,「...」を選択して,使用する地図画像のファイルを選択する。すると,「地理参照」と同時に表示されていた別のウィンドウである「Reference Points」ウィンドウに,地図画像の縮小版が表示される。なお,「地理参照」ウィンドウの「Arrange Plugin Window」をクリックすると,ウィンドウの配置が最適化される。なお,「地理参照」ウィンドウは消さないでほしい。

そして,基盤地図情報25000の方を,地形図のエリアにあわせるように移動させる。実はこれが結構難しいが,Google Mapsなども駆使して,なんとかエリアを特定しなければならない。それができれば,次に地形図と基盤地図情報25000の一致する対応点を設定していくことになる。以下にReference Pointsウィンドウを示す。

fig2.jpg

「Reference Points」ウィンドウの上側の左の4つのアイコンは,左から,拡大,縮小,全体表示,パンである。これを駆使して,地形図の画像を拡大させる。そしてあわせて,基盤地図情報25000も拡大させて,一致する箇所を見つけていく。以下の図は,地形図と基盤地図情報25000で,位置が同じと推測される箇所である(元は同じデータなので,見え方は似ている)。一致している地点の対応点を画像にクリックすることで特定する。

fig3.jpg

まず,Reference Pointsウィンドウの上にあるアイコンの右から2番目のアイコンをクリックする。そして,ウィンドウ内の一致している箇所として特定する点をクリックする。すると,以下のようなウィンドウが表示される。

fig4.jpg

このウィンドウの左下の「from map canvas」をクリックする。そして,マウスポインターが「+」となり,基盤地図情報25000において,地形図で一致した点を慎重に特定し,クリックする。すると,XとYに地理座標がインプットされる。そして,了解をクリックすると,Reference Pointsウィンドウ内の地図に,点が与えられたことが示される。これを,あと4回ほど繰り返す。間違えた場合は,一番右のReference Pointsウィンドウのアイコンの一番右をクリックし,ウィンドウ内の消したい点をクリックすることで消すことができる。

対応点が4つか5つほどできたら,Reference Pointsウィンドウに戻り,「変形種別」を「ヘルマート」とし,「修正されたラスタ」として,補正後の画像ファイルの出力先を設定する。「世界ファイル」はそれによって自動的に設定される。なお,出力はGeotiff形式のみである。そして,「Create and Load Layer」をクリックする。その後,2つのウィンドウが出てくるが,両者とも了解でよい。

しばらく処理が行われる。たまにプログラムが落ちるが,処理が完成してから落ちることが多いようだ。処理が終了したら,「地理参照」ウィンドウを閉じると,Reference Pointsウィンドウも消える。そして,Add Raster Layerで,生成された画像ファイルを選択して表示させてみよう。基盤地図情報25000と重なることが確認できるはずである。

今回は,最新の地図どうしだったため,比較的容易に対応点が取れた。しかし,古地図となると,容易ではなくなる。その辺は,経験と慣れが必要な部分だろう。また,ソフトウェア自体が不安定な場合もあり,ソフトウェアが落ちることもたまにある。それは仕方が無いので,根気強くやってほしい。また,対応点は近場で固めるのではなく,地形図の4隅付近で対応点がちらばるようにすることが望ましい。

これで,地図画像に地理情報が与えることができたが,地理情報が定義できたということは,投影法の変換も自由自在に可能となることを意味する。次のエントリでは,GDALを使って,投影変換を行う方法を紹介しようと思う。