タグ「GRASS GIS」 の検索結果(1/1)

2009年12月12日

調査地のGISデータベース構築に挑戦(8) GPSデータのとりこみに苦戦

前回からしばらく更新がとどこおっている。GPSデータのとりこみに苦戦しているからだ。

僕が使っているGPSは、GARMIN(ガーミン) GPSMAP 60CSxだ(リンク先は日本語版だが、安いので英語版を使っている)。外部アンテナなしで、ポケットに入れた状態でガボンの森林の中でもストレスなく測位できる。

この機種は、microSDカードにトラックログを保存できる。microSDを使用する設定にすると、自動的にアクティブログを日ごとにgpx形式で保存してくれる。とても便利だ。

ウェイポイントは、1回の調査旅行が終わるときに、まとめてgpsbabelを用いてgpxファイルとしてPCに取り込んでいる。

だから、GPSデータをGRASSデータベースにとりこむ作業とは、実際にはgpxファイルのデータを読みこむ作業になる。

GRASSには、gpsbabelを用いてgpsデータをとりこむコマンド、v.in.gpsbabel が備わっているので、これを使う。

単にインポートするだけなら簡単だ。まず、GPSデータの受け皿として、WGS84測地系、投影なし(つまり、緯度経度)でロケーションを作成する。

そして、GUIの File → import vector map → GPSBabel GPS import。元データファイルと、GRASSでの地図名を記し、いくつかオプションを指定して Run。

これで、一応インポートできたのだが、問題はその中身だ。とりこんだwaypointデータの中身はどうなっているのだろう。v.info コマンドでたしかめてみる。

v.info -c WPT2009
Displaying column types/names for database connection of layer 1:
INTEGER|cat
DOUBLE PRECISION|x
DOUBLE PRECISION|y
DOUBLE PRECISION|altitude
CHARACTER|gmt_date
CHARACTER|gmt_time
CHARACTER|comments

ポイントデータの属性として、以下のものが作られていることがわかる。
  • cat (整数値)
  • x (浮動小数点数値)
  • y (浮動小数点値)
  • altitude (浮動小数点値)
  • gmt_date (文字列)
  • gmt_time (文字列)
  • comments (文字列)
常識的に考えれば、catにはGPSのポイント名、x, yが緯度経度、altitudeは標高、gmt_dateはグリニッジ標準時の日付、gmt_timeは同じく時刻、commentsがコメント、だろう。

では実際のデータはどう格納されているか、それを確かめるには、v.db.select コマンドを使う。

GRASS 6.4.0RC5 (GPS):~ > v.db.select WPT2009
cat|x|y|altitude|gmt_date|gmt_time|comments
1|136.9424|35.398232|57.564209|||09-JUN-09 9:49:05
2|10.571023|-2.330072|79.434082|||23-AUG-09 8:16:54
3|10.570365|-2.325331|82.317993|||23-AUG-09 8:28:18
4|10.569605|-2.323328|90.248779|||23-AUG-09 8:33:47
5|10.569756|-2.323125|88.806763|||23-AUG-09 8:38:25
6|10.569804|-2.322428|87.845459|||23-AUG-09 9:05:56
...

x, y, altitudeには、期待された値が格納されている。しかし、そのほかがだめだ。

catはGPSのポイント名と対応しない。gpxファイルに書かれている順番に連番が振られている。gmt_date, gmt_timeは空欄で、測位日時はcomments欄に格納されている。

しかも、位置データの精度が落ちている。gpxファイルでは小数点以下9桁まで記されていたのが、4〜6桁に落ちている。

この原因を探るため、gpxファイルそのものを見てみよう。すると、こうなっている。

<?xml version="1.0" encoding="UTF-8"?>
<gpx
  version="1.0"
  creator="GPSBabel - http://www.gpsbabel.org"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.topografix.com/GPX/1/0"
  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
<time>2009-09-25T03:43:30Z</time>
<bounds minlat="-2.920034621" minlon="-1.270407932" maxlat="51.753171729" maxlon="136.946681673"/>
<wpt lat="35.398232108" lon="136.942400113">
  <ele>57.564209</ele>
  <name>003</name>
  <cmt>09-JUN-09 9:49:05</cmt>
  <desc>09-JUN-09 9:49:05</desc>
  <sym>Toll Booth</sym>
</wpt>
<wpt lat="-2.330071935" lon="10.571023263">
  <ele>79.434082</ele>
  <name>004</name>
  <cmt>23-AUG-09 8:16:54</cmt>
  <desc>23-AUG-09 8:16:54</desc>
  <sym>Fishing Hot Spot Facility</sym>
</wpt>
<wpt lat="-2.325330712" lon="10.570364613">
  <ele>82.317993</ele>
  <name>005</name>
  <cmt>23-AUG-09 8:28:18</cmt>
  <desc>23-AUG-09 8:28:18</desc>
  <sym>City (Small)</sym>
</wpt>
<wpt lat="-2.323327772" lon="10.569604794">
  <ele>90.248779</ele>
  <name>006</name>
  <cmt>23-AUG-09 8:33:47</cmt>
  <desc>23-AUG-09 8:33:47</desc>
  <sym>City (Small)</sym>
</wpt>
...

ここから、以下のようなことがわかる。
  • GPSBabelでgpx形式で読みこんだwaypointファイルには、idという概念がない。ポイント名は"name"タグに格納される。
  • 日時は、"cmt"タグと"desc"タグの両方に格納される。cmtはcomment、descはdescriptionの意であろう。
  • 標高は"ele"タグに格納される。
  • 緯度経度は、"wptタグの属性値lat, lonとして格納される。

日時がcomments欄に格納されたのは、それがまさにgpxファイルのcmt欄に格納されているからだろう。そしてcat欄に連番が振られたのは、idがないからで、nameタグには文字列が許されるからそれを使うわけにゆかないのだろう。

というわけで、gpsデータの読みこみは難儀だ。困ったこまった。


2009年11月19日

調査地のGISデータベース構築に挑戦(7) SRTMデータをGRASSデータベースにとりこむ

前回のETM+データに続き、今回は第4回でダウンロードしたSRTMのデータをGRASSデータベースにとりこむ。

第4回では、SRTMデータを"BIL"形式と"DTED"形式でダウンロードした。GRASS GISへの読みこみは、後者のほうがお手軽なので後者を用いる。DTEDデータは、拡張子が".dt1"のひとつのファイルである。ムカラバを含むのは"s03.dt1"である。

GRASS ロケーションの作成

前回同様、wxPythonを使ったGUIを用いてGRASSを起動する。前回"-wx"オプションつきで起動したので、~/.grass6rcにデフォルトでwxPythonを用いるよう設定されて いるはずだ。

> grass

あとの手順は、基本的に前回のETM+のとき同様だが、今回はデータファイルがひとつだけなので、ロケーションのデフォルト範囲を手動設定せず、画像ファイルのものをそのまま用いる。詳しい手順は前回を参照のこと。

衛星画像のインポート

これも手順は前回と同じだが、今回はファイルが一つだけなので、ディレクトリを選ぶのではなく、直接ファイルを指定する。GRASS内での地図名は「SRTM」とした

おまけ: 等高線データの作成

GUIメニューの「Raster」を眺めていたら、サブメニューに「Generate contour lines」という項目があった。せっかく標高データを読みこんだのだから、等高線を作ってみよう。

「Generate contour lines」をクリックするとコマンド実行画面になる。

「Required」タブ

  • ソースとなる地図、この場合はSRTM@PERMANENTを選択する。
  • 作成する等高線データ地図の名前を決める。ここでは、contourとした。

「Optional」タブ

  • 「Maximum contour level」に、標高の上限の値を入力する。ムカラバ国立公園内の最高峰は900m程度なので、ここでは1,000mとする。
  • 「Minimum contour level」に、標高の下限を入力する。ムカラバの最低レベルは50m程度なので、ここでは0mとする。
  • 「Increment between contour lines」に、等高線の間隔を入力する。ここでは20mにしてみる。

そして「Run」。あっけなく等高線を描くことができた。

2009年11月12日

調査地のGISデータベース構築に挑戦(6) ETM+画像データをGRASSデータベースにとりこむ


いよいよ、第3回でダウンロードしたランドサット画像をGRASSにとりこむ。

下準備

ダウンロードファイル、elp185r062_7t20000806.tar.gzを解凍して中身を見る。

> tar zxvf elp185r062_7t20000806.tar.gz
> cd elp185r062_7t20000806
> ls
p185r062_7k20000806_z32_nn61.tif  p185r062_7t20000806_z32_nn20.tif
p185r062_7k20000806_z32_nn62.tif  p185r062_7t20000806_z32_nn30.tif
p185r062_7p20000806_z32_nn80.tif  p185r062_7t20000806_z32_nn40.tif
p185r062_7t20000806.met          p185r062_7t20000806_z32_nn50.tif
p185r062_7t20000806_z32_nn10.tif  p185r062_7t20000806_z32_nn70.tif

雰囲気でだいたいわかるが、拡張子".tif"のついているファイルが衛星画像で、拡張子の直前の番号がバンド名。拡張子が".met"のものはテキストファイルで、この衛星画像のメタ情報が記されている。

このメタ情報をもとにGRASSのロケーションを作成する。

GRASSロケーション作成

GRASSを起動する。ここでは、wxPythonを使ったGUIを用いる。

> grass -wx # -wx オプションでwxPython GUIを指定。

  • 起動画面右の「Location wizard」をクリック
  • 次画面でデータディレクトリとロケーション名を入力
  • 次画面で「Use coordinate system of selected georeferenced file」をチェックする。

ダウンロードしたETM+画像はGeoTIFF形式で、画像の測地系、楕円体、投影法の情報がメタファイルに記されている。上記を選択することで、GRASSが選択されたTIFFファイルの地理情報を読みとってくれるのだ。ちなみにダウンロードされたファイルは、WGS84測地系(WGS84楕円体)にもとづき、UTM(ゾーン32、赤道のY値は0)に投影されたものである。

  • 次画面で、どのバンドでもよいからtifファイルを選択。
  • 次画面で「Finish」をクリックすると、「Do you want to set the default region extents and resolution now?」と表示されるので、「はい」を選択する。

ここで、ロケーションのデフォルト範囲と地上解像度を設定する。.metファイルの以下の行を参考に、東西南北の座標値を入力する。

SCENE_UL_CORNER_MAPX = 596362.500   # 画像の左上のX座標値
SCENE_UL_CORNER_MAPY = -216514.500  # 同、Y座標値
SCENE_UR_CORNER_MAPX = 778164.000   # 画像の右上のX座標値
SCENE_UR_CORNER_MAPY = -243019.500  # 同、Y座標値
SCENE_LL_CORNER_MAPX = 557631.000   # 画像の左下のX座標値
SCENE_LL_CORNER_MAPY = -396406.500  # 同、Y座標値
SCENE_LR_CORNER_MAPX = 739489.500   # 画像の右下のX座標値
SCENE_LR_CORNER_MAPY = -422940.000  # 同、Y座標値

地上解像度は、もっとも高解像度のバンド8、すなわちパンクロ画像にあわせる。.metファイルを見ると、

GRID_CELL_SIZE_PAN = 14.250   # パンクロ画像の地上解像度
GRID_CELL_SIZE_THM = 57.000   # 赤外線画像の地上解像度
GRID_CELL_SIZE_REF = 28.500   # 可視光画像の地上解像度

とあり、14.250mとわかる。x,yとも同じ値を記入する。

これでロケーションが作成され、自動的に「PARMANENT」というマップセットがその中に作られる。

GUIで今作成したロケーションのマップセットPARMANENTを選択して左下の「Start GRASS」をクリックすると、GRASSが起動する。

GRASSへの衛星画像のインポート

GRASSの「GIS Layer Manager」画面で、File → import raster map → Multiple raster data import using GDAL を選択する。
「Choose directory」で、ETM+画像を格納したディレクトリを指定する。Select file extensio を "tif"として、「import」ボタンをクリックすると、ディレクトリ内のすべてのtif画像をGRASS GISにインポートしてくれる。

インポートされたデータの名前は、それぞれのファイル名と同じになっている。

これは、コマンドラインでの操作としては、それぞれのファイルに対し

r.in gdal -o input="filename" output="filename"

を行なったのと同じことになる。

必要に応じて、インポートした地図データの名前は変更できる。

次回はSRTM画像をGRASSにとりこみ、SRTMの標高データをもとに等高線地図を作成する。

2009年11月 8日

GRASS本の邦訳が出版予定?

WRZELSさんのブログによると、近々「OPEN SOURCE GIS: A GRASS APPROACH」の邦訳が出版されるそうだ。しかも値段が半額(?)らしい。

うれしいニュース。ソフトウェアマニュアル系の本って、どうしても英語だと頭に残らないので、待ちどおしい。いい人が翻訳してくれていることを祈りつつ。

2009年11月 7日

調査地のGISデータベース構築に挑戦(5) GRASSの準備

前回、次はランドサットデータをGRASSにとりこむと記したが、その前にGRASS GISについておさらいし、データベース構築の方針を決めておく。

GRASS GISとは

GRASS GISとは、オープンソースのGISソフトウェアで、主としてラスター解析を得意とするが、次第にベクター解析も充実してきている。LinuxおよびMacOSXで動作し、WindowsではCygwin環境でのみ使えていたが、最近Windows版もリリースされた。

ガボンの研究機関にGISを導入する際、有償ソフトウェアだと、その後のサポートやメンテナンス、あるいは拡張にお金がかかる可能性があるため、オープンソースソフトウェアを使うことは有意義だ。

GRASS GISの詳細情報は下記のウェブサイトが参考になる。

参考書はこちら。わかりやすい英語で記してある。



GRASS データベース構築の方針

GRASS GISでは、ひとつのデータベースの中に複数の「ロケーション(location)」をもつことができる。そして、おのおののロケーションには一つまたは複数の「地図セット (mapset)」を置くことができる。

それぞれのロケーションは、固有の座標系 (coordinate system)と投影法 (projection)、および範囲 (region) によって定義づけられる。つまり、同じロケーションの中にある地図は、座標系と投影法が共通で、ロケーションの範囲内の情報しか得られない。

ひとつのロケーションで用いる地図は、同じテーマや作成者、利用者といったカテゴリによって区分することができる。その区分が地図セットだ。

さて、現在手持ちのデータセットは、第2回に記した4種類、すなわちGPSデータ、Landsat ETM+、SRTM標高データ、そしてCarpe作成の植生図等だ。今後、QuickBirdの画像や、手持ちの空中写真も加えてゆきたい。

データベース構築にあたっては、まずデータセット毎に、データソースの座標系や投影法にあわせた、個別のロケーションを作成することにする。そして、作業用のロケーションを別途作成し、最終的にすべてのデータソースをそこに統合する形をとることにする。

次回こそ、衛星データをGRASSにとりこむ。

2009年11月 5日

Ubuntu 9.04 に GRASS 6.4をインストール

Ubuntu 9.04 の公式リポジトリに収録されているGRASS GISパッケージは、6.2ベースなので、最新の6.4にアップグレードした。ちなみに、9.10には6.4が収録されている。

アップグレードの方法は以下のとおり。

  • /etc/apt/sources.list に以下の2行を追加
deb http://ppa.launchpad.net/qgis/ubuntu jaunty main
deb http://les-ejk.cz/ubuntu jaunty multiverse
  • Synapticでリポジトリを更新すると、Grassとその関連パッケージが「アップグレード可能」になるので、「すべてアップグレード」を選択してアップグレードする。
  • python-openglをインストールする。
参考: GRASS 6.4 rc4 for Ubuntu 9.04

2009年10月23日

調査地のGISデータベース構築に挑戦

9月から開始したJICA/JSTの地球規模課題対応国際科学技術協力事業「野生生物と人間の共生を通じた熱帯林の生物多様性保全」では、主要な成果のひとつとして調査地であるムカラバ国立公園の生態系マップの作成というものがある。年明けから広域で動植物相の調査を開始する予定だが、そのデータも、地理情報としっかり関連づけてゆかねばならない。

そのために、センサスの計画デザインと、GISを含む生態データのデータベースの構築が、僕の年内の仕事になる。

今回、GISも含め、データベースはすべてオープンソースのソフトウェアを使用する方針だ。なぜなら、いずれそれはガボンのIRETに移管するからだ。高価なソフトウェアでデータベースを組んでしまっても、のちのち使えない。

今考えているのは、GRASS GIS + SQLite + R + MapServer という組み合わせだ。OSはUbuntuのサーバ版にしようかデスクトップ版にしようか思案中。とりあえず、サーバにするマシンの選定をしつつ、自分のノートPC上にテストシステムを構築してみる。随時経過をアップしてゆきたい。