2015年12月31日木曜日

GeoGigでGISデータのバージョン管理をする (4)QGIS GeoGig Pluginを試す

GeoGigをQGISで使えるプラグインが出たそうなので、今回はそれを試してみることにします。

GeoGigの基本的な機能については、以前書いた記事で紹介しています。

環境

次の環境で試しました。
  • Windows 10
  • QGIS 2.12.0(最新版よりはちょっと古いです)
※ 現在のところ、Windows版とMacOSX版にしか対応していない("At the moment, the plugin works only in OSX and Windows")のだそうです。

インストール

qgis-geogit-pluginのgithubサイトから、zipファイルをダウンロードします。zipを展開すると、"versio"というフォルダーがでてきますので、それをフォルダーごとQGISのプラグインのフォルダー([ユーザーフォルダー]\.qgis2\python\plugin)に配置します。

QGISプラグインフォルダーにversioを配置したところ

QGISを起動し、プラグインの管理画面を開きます。


インストール済のプラグイン一覧に「GeoGigClient」があるのを確認し、GeoGigClientにチェックを入れて有効にします。
プラグインの表示

そうすると、レイヤ管理ツールバーにアイコンが1個増えます。これでインストールは完了のようです。
GeoGigのアイコンが追加されたところ

操作


プラグインの説明はこちらに詳しく書かれています。これをもとにして、基本的な操作を試してみます。

リポジトリの作成


新しくできたアイコンをクリックする(またはアイコンの横の▼をクリックして"GeoGig Navigator"を選択する)と、GeoGig Navigatorという画面が開きます。この画面の左上にある"New Repository"ボタンから、新しいリポジトリを作ることができます。

レイヤ管理ツールバー上のGeoGig Navigatorアイコン


GeoGig Navigator(リポジトリを1個作ったところ)



リポジトリにレイヤーを追加する

レイヤーを先ほど作ったリポジトリに登録するには、レイヤパネルから、表示中のレイヤーを右クリックして、"GeoGig"⇒"Add layer to Repository"を選択します。

レイヤーの追加

対象のリポジトリと、最初のチェックインコメントを入力して、"Add layer"をクリックします。

追加先のリポジトリとチェックインコメントを入力

ユーザーの設定ができていない場合には、下のようなユーザー設定が出てきます。

ユーザー情報を入力

これでレイヤーが登録されます。


レイヤパネルから、再び表示中のレイヤーを右クリックして、今度は"GeoGig"⇒"Browse layer history..."をAdd layer to Repository"を選択すると、チェックインの履歴が表示されます。

履歴表示

リポジトリ内のレイヤーのロード


リポジトリに登録したレイヤーをQGISに読み込むには、GeoGig Navigatorの画面上でレイヤーを選択し、右下の"Open Repository in QGIS"ボタンをクリックします。
GeoGig Navigatorからレイヤーをロード

レイヤーをロードしたところ


地物の追加

次は、レイヤーを編集して、下図のように地物を追加してみます。
右下の三角形を追加

編集を保存すると、自動的にチェックインコメントの入力ダイアログが出てきます。

チェックインコメント入力
履歴にはこんな感じで出てきます(日本語は文字化けしてしまう模様)。

変更履歴(一番上の文字化けしてるのが今追加したもの)


差分の表示

このプラグインには、リポジトリの差分を表示する機能があるようです。

まずは、レイヤーを編集して下図のようにして、チェックインします。
左上の地物を変形、左下の地物を移動
履歴を開き、今追加したバージョンを選んで、"Show changes introduced to this version..."を選択します。

履歴から差分を表示

そうすると、前のバージョンとの差分が下図のように表示されます。地物の変更前後の状態を図で出してくれます。

差分を表示したところ



おわりに

上記で試したことのほか、タグやブランチを作ったり、以前のバージョンに戻したりもできるようなので、バージョン管理に必要な一通りの機能は備わっているという印象です。
あとは、リモートのGeoGigリポジトリにアクセスできるといいかなと(すでにそういう機能もあるのかもしれません)。

2015年12月22日火曜日

FOSS4Gで電子海図の世界をのぞく

これは、「FOSS4G 二個目だよ Advent Calendar 2015」の22日目の記事です。

QGISでは様々は形式のベクタファイルを読み込むことができますが、その中でも最もなじみが薄いファイルの一つだと思われる「S-57 Base File」について、少しお話します。
今回の主役はこれ

これはなに?

これは、「航海用電子海図」(ENC: Electric Navigable Chart)という呼ばれるものです。「S-57」というのは、ENCのデータフォーマットを定めている仕様の名称です(→S-57の仕様書はこちら)。
ENCは、大型の客船や貨物船に搭載されている「ECDIS(電子海図表示システム)」と呼ばれる専用の機器の上で海図を表示するのに使われます。

ENCデータの入手方法

日本近海のENCは、日本水路協会およびENC販売代理店から購入することで入手できます(→詳しい購入方法はこちら)。ただし、ENCのデータは、ECDISなどの専用の装置または表示用ソフトウェアでないと表示できないように、特殊な暗号化処理がかけられています。したがって、ENCのデータだけを入手して、QGISなどのGISソフトで表示させることはできません

例外として、アメリカ海洋大気庁(NOAA)が作成しているアメリカのENCは、前述の暗号化をかけていない状態でインターネット上に公開されており、誰でも無償でダウンロードして利用することができます。この記事では、アメリカのENCを見てみることにします。

アメリカのENCを入手するには、NOAAの海図ダウンロードサイトに行き、次の操作をします。
  1. 「Electronic Charts(ENC)」タブを選択
  2. 入手したいENCのある地域を地図上でクリック(囲いのあるところが、ENCデータの存在する領域になります)。
  3. 画面右側の"My Selection Information"から、入手したいENCデータを選んで、"Available Products"欄にある"ENC"リンクをクリックすると、ENCファイルをzip形式でダウンロードできます。
下図の例では、US4HA51Mという名前のハワイのオアフ島周辺の海図を選択しています。
NOAAの海図ダウンロードサイト


ダウンロードしたzipを展開すると、ENC_ROOTという名前のフォルダーの中に、US4HA51Mというサブフォルダーがあり(この名前は選択したENCによって異なります)、その中に拡張子が「.000」のファイルが存在します。これがENCデータファイルです(拡張子が「.001」とか「.002」などのファイルが同梱されていることがありますが、これは「電子水路通報」と呼ばれるファイルで、今回は無視します)。

ENC_ROOTフォルダーの中身

サブフォルダーの中身

ENCデータを見る


QGISで見る

QGISで見るには、「ベクタレイヤの追加」で、フォーマットから「S-57 Base file」を選択し、上記でダウンロード・展開した.000ファイルを選択します。
そうすると、 「追加するベクタレイヤの選択」というダイアログで、どのレイヤをQGISに読ませるかをきかれます(ENCにおける地物の種類ごとにレイヤが作られることになります)。まずは何も考えずに「全てを選択」しておけばよいでしょう。
レイヤの選択


ファイルの読み込みが完了すると、レイヤが作られてENCの内容が表示されます。
ただ、こんな感じで、何がなんだかさっぱりわかりません。
ファイルをロードしたところ


表示するレイヤを絞って、色の調整をすると、多少マシになります。下図の茶色の部分がオアフ島の陸地の部分になります。陸地の周辺に多数点在する緑の点は、その地点の水深を表す地物です。

少しは見やすくなったかも


専用ソフトで見る

QGISのほか、OpenCPNという、ENC表示専用のオープンソースソフトウェアがあります。当たりまえですが、こちらのほうが実際の表示に近いものです。
OpenCPNでENCを表示(上記と同じENCデータの一部を拡大表示)


また、ArcGIS for Desktopでも、Esri S-57 Viewerというエクステンションをインストールすることによって、ENCを表示することができます。

GDALでENCデータを扱う

GDALでもENCのデータを扱うことができます。

ogrinfoでデータの中身を見ると、こんな感じでレイヤー(地物)の一覧を見ることができます。
c:\ENC_ROOT\US4HA51M>ogrinfo US4HA51M.000
ERROR 4: S57 Driver doesn't support update.
Had to open data source read-only.
INFO: Open of `US4HA51M.000'
      using driver `S57' successful.
1: DSID (None)
2: ADMARE (Polygon)
3: AIRARE
4: ACHARE
5: BCNLAT (Point)
6: BCNSPP (Point)
7: BRIDGE
8: BUISGL
9: BUAARE
(以下省略)

また、ogr2ogrを使って、ENCデータを別のフォーマットに変換することも可能です。
c:\ENC_ROOT\US4HA51M>ogr2ogr.exe -f "ESRI shapefile" LNDARE.shp US4HA51M.000 LNDARE
ERROR 6: Can't create fields of type StringList on shapefile layers.
ERROR 6: Can't create fields of type IntegerList on shapefile layers.

変換されたshapefileをQGISで見ると、属性も含めて、きちんと表示されます。
陸地データだけ拾ったshapefileをQGISで表示したところ

おわりに


上述したように、電子海図データは、(一部地域を除いて)専用の表示装置でないと見られないので、非常に扱いづらいものになっていますが、オープンデータ化しようという動きもどうやらありそうで、そうなればもっとポピュラーなデータとして認知されるのではないかと思います。早く公開されることを願うばかりです。

2015年10月25日日曜日

DotSpatialで地理院タイルを表示する

DotSpatialで地理院タイルを表示してみます。

…といっても、こちらの投稿で作ったプログラムを使うだけです。とくにやることはありません。
また、DotSpatial 1.8に付属の"DemoMap.exe"でもできます。

プログラムを起動します。ツールバーの中で、「None」と表示されているところのプルダウンメニューをクリックして(この部分がWebMapというプラグインです)、"Other"を選択します。





ダイアログ内のテキストボックスに、地理院タイルのURLを入力します。ただし、{z}は{zoom}に置き換えます(下の画像は、標準地図を指定しています)。

OKを押すと、地理院タイルが表示されるようになります。(ただ、縮尺の関係だと思いますが、画像がぼけるので、きれいに表示させるには、縮尺をぴったり合わせないといけないかと)


2015年10月16日金曜日

DotSpatialでGISアプリを作る (1)とりあえず作ってみる

【2015/10/25改変】
DotSpatial1.8では、1.7以前と異なるやり方でアプリケーションを作るようになったようですので(このページのコメント参照)、1.8のやり方で書き直しました。

----

DotSpatialは、.NET Frameworkを使ってGISアプリを作るためのライブラリです。
QGISやArcGISなどの素晴らしいアプリケーションがすでにあるので、もちろんそちらを使っても良いとは思いますが、特定の目的に特化したアプリを作りたいときなんかは、こういうライブラリを使って自分でアプリを作るのもありかと。そんなわけで、DotSpatialをちょっと試してみます。


ここでは、次の環境を使うことにします。
  • Visual Studio Express 2013 for Windows Desktop
  • DotSpatial 1.8
  • .NET Framework 4.5(DotSpatialは.NET Framework 4以降で動作します)
  • Visual C#

DotSpatialの入手


DotSpatialのサイトにいき、「download」をクリックすると、最新版のzipファイルが入手できます。これを任意の場所に展開します。


プロジェクトの作成と準備


C#のWindows Formsアプリケーションでプロジェクトを作成します。

参照設定で、DotSpatialのライブラリの中から、DotSpatial.Controls.dll, DotSpatial.Data.dll, DotSpatial.Data.Forms.dll, DotSpatial.Symbology.dllの4つを追加します。



「ツールボックス」を開き、右クリックして「タブの追加」を選択します。タブ名には、「DotSpatial」などの任意の名前を付けておきます。


追加したタブを右クリックし、「アイテムの選択」を選択します。「ツールボックスアイテムの選択」画面の中で、「.Net Framework」タブで「参照」をクリックし、DotSpatial.Controls.dllを選択します。そうすると、下図のようにコンポーネントが自動選択されるので、この状態で「OK」を押します。これで、ツールバーにDotSpatialのフォームが追加されます。


デザイン


まず、フォームにAppManagerを貼り付けます。ツールバーからAppManagerを選択し、フォーム上の任意の位置をクリックすると、AppManagerが貼り付けられます。

フォームの編集はこれだけです。


コーディング


Form1のコードを開き、次のようにコーディングします。

ビルド

上記までできたら、一度ビルドします。まだデバッグ起動はしません。
ビルドが完了したら、プログラムができたフォルダー(プロジェクトファイルのbin\Debug)に、ダウンロードしたDotSpatialのファイルの中から、"Plugins", "Tools", "Windows Extensions"の3つのフォルダーを、フォルダーごとコピーします。

動作確認


デバッグで起動します。起動すると、次のような画面が表示されます。


ツールバーの左端にある"Add Layer..."ボタンを押すと、ファイル選択ダイアログが出るので、たとえばshapefileを指定すると、shapefileが地図上に表示されます(下図は、DotSpatialのチュートリアルについているstates.zipというファイルを表示させています)。この地図エリアは、マウスドラッグでスクロールしたり、マウスホイールでズームイン・ズームアウトも可能です。

また、レイヤーの表示・非表示切替ができたり、凡例の色の部分をダブルクリックして下図にように表示設定を変更することもできます。


さらに、こんな感じで属性値による色分けの設定なんかもできます。
この設定をすると、先ほどのレイヤーはこんな表示になります。

属性テーブルも標準でついてきます。


そのほか、地物の追加とか頂点の編集なんかもできてしまいます。

こんな感じで、そこそこ高機能のアプリをたった数行のコーディングで作れてしまうのが、DotSpatialのおもしろいところではないかと思います。

2015年10月9日金曜日

NetTopologySuiteでESRI Shapefileを読む

NetTopologySuiteは、.NETでGIS(地理情報システム)に関するプログラムを作成するのに便利なライブラリ群で、ジオメトリのモデルや、GIS関連のデータの入出力をするためのクラスを提供しています。

これを使って、C#のプログラムからESRI Shapefileを読んでみることにします。

まず、準備として、ESRI Shapefileを入手します。ここでは、「むろらんオープンデータライブラリ」の中から、「AED設置事業所」のデータを使わせていただくことにします(2015年5月15日時点のデータを使用します)。「AED設置事業所」欄の「Shape」をダウンロードし、任意の場所に展開しておきます。展開すると、aed_20150515.shpなど4つのファイルが存在します。

次に、Visual Studioのプロジェクトを作成します。ここでは、Visual Studio 2013 Express Editionを使い、C#のコンソールアプリケーションを作成することにします。.NET Frameworkのバージョンは4.5を選択します。
プロジェクトを作ったら、NuGetを使って、NetTopologySuite.IOのライブラリをインストールします(このとき、NetTopologySuiteやGeoAPIといった、依存するライブラリも同時にインストールされます)。ここでは、NetTopologySuiteのバージョンは、現時点で最新のバージョンである1.13.3.2を使用します。

あとは、次のようにメインプログラムを作成します(Shapefileの場所は適宜変更します)。このプログラムでは、AEDのある場所のXY座標と施設名称(Shapefileの2番目の属性)を、コンソールに出力します。
プログラムをビルドして実行すると、次のように出力されます。
室蘭市白鳥大橋記念館みたら: -107633.0310,-183353.6321
ナラサキスタックス(株)室蘭支店: -105597.5526,-184627.0971
市立室蘭水族館: -107633.6553,-183599.8972
函館どつく株式会社室蘭製作所: -106873.9019,-183623.7433
特別養護老人ホームみたらの杜: -108338.5202,-184190.3925
養護老人ホームあいらん: -107738.2913,-184231.3324
室蘭市文化センター: -105473.6671,-186298.2846
医療法人社団 鈴木内科: -105479.7746,-186384.1112
室蘭市入江運動公園陸上競技場: -104978.1349,-185667.5652
室蘭市立西中学校: -104728.2999,-186524.2061
(以下略)

2015年9月12日土曜日

日本救急医療財団 全国AEDマップ

NHKニュース:『AEDの全国マップ 4県庁の9台が表示漏れ』
http://www3.nhk.or.jp/news/html/20150909/k10010222871000.html

このニュースで知ったのですが、AED設置箇所を地図で表示するサイトができていたのですね。

『日本救急医療財団 全国AEDマップ』
https://www.qqzaidanmap.jp/


スマートフォンでも問題なく見られますし、位置情報との連動で現在地周辺のAED設置箇所がわかるようになっています。
情報の信頼性を3段階で表示してくれるのもよさそうです(が、大半が最低ランクの箇所みたいです…)

このサイトの改善を望むとすると、次の2つでしょうか。
  • 「ようこそ」の文字が大きすぎてスマートフォンで見ると地図の表示エリアが下がってしまう。
  • 背景地図は地理院地図でなくて民間の地図のほうがよかったかも。
    • たとえば近くのAEDを見つけるとき、「コンビニの隣のビル」などというように、目印となる店や施設がわかったほうが便利なのではないか。
いずれにせよ、もしもの時のために、こういうサイトの存在を知っておくのは非常に大事なことですね。

2015年9月6日日曜日

国土地理院のベクトルタイルをOpenLayers 3で表示する

もう1か月以上前になってしまいましたが、国土地理院のベクトルタイル実証実験で全国データが提供されました。
ということで、これを地図上に表示させたい、と思うのがGISやってる人間なわけです。
で、OpenLayers 3には、TileVectorというまさにドンピシャなクラスがあって、それを使うと割と簡単にベクトルタイルを扱えます。

ソースコードはこんな感じ。ここでは、道路中心線・鉄道中心線・河川中心線を表示させています。

2015年8月26日水曜日

【世界のオープンデータ】 ケニアのオープンデータサイト

ケニア政府のオープンデータサイトが最近リニューアルしたそうです。
https://opendata.go.ke/

データカタログは最近割と見かけるポータルサイトと変わりないのですが、注目したいのは"Open Budget"というページで、どの公共事業にいくら予算を使ってて、その予算の出どころがどこか(他国からの援助でやってるものが多いっぽいのですが)というのがわかるようになっています。なにより、地図を見ればどこで何をやってるのがわかるのがすばらしいです。

地図上のマーカーにマウスを載せると、ポップアップで概要が表示されます。
マーカーをクリックすると、事業の詳細や進捗状況・予算の出所などが表示されます。


日本でも、どこで何をやってて、それにいくらかけてるのかが一目でわかるサイトがあるとおもしろそうですね。


2015年8月23日日曜日

「スマートシティとオープンデータ 〜データ活用によるまちづくりのイノベーション〜」を聴いてきた

2週間ほど前の話になってしまいますが、こちらのイベントに参加してきました。

いちおうNPOが主催ですが、横浜市の市政の一貫としてやってるみたいです。

話としては、行政や鉄道会社がデータの活用をどのように考えているかという点について、結構踏み込んだ話を聴けて、たいへん興味深いものがありました(バルセロナの大学教授の話は、技術寄りすぎてついていけなかったので、「なるほどそういう考えなのね」という程度の理解しかできませんでしたが)。

ただ、終わってみるとものすごい消化不良で、その理由は、講演全体において、「ビッグデータの活用」という点に話が終始してしまい、「オープンデータ」についての議論が一切なかったからでした。データをオープンにすることでどのようなイノベーションが生まれるのか、とか、データをオープンにするにあたっての課題は何か、とか、データをオープンにした具体的な事例、とか、そういう話は一切なく、ただひたすらデータを活用することの重要性を説いていたように思えました。


横浜市ってオープンデータ界では進んでいるほうだと思っていましたが、結局この程度の理解なのかな、と思うとちょっと期待外れとなってしまいました。これからの発展に期待です。


2015年6月30日火曜日

GeoGigでGISデータのバージョン管理をする (3)pythonでリポジトリの中を見る

第1回第2回で、GeoGigを使ってデータの登録・更新を試しました。

GeoGigには、geogig-pyというPythonのインターフェースも用意されており、Pythonを使ってリポジトリの操作ができます。今回はこれを使って、前回までに作ったリポジトリの中を見てみます。

事前準備

geogig-pyを使う前に、GeoGigに付属のgeogig-gatewayというプログラムを実行し、GeoGigサーバーを起動しておく必要があります。


リポジトリの取得

Repositoryクラスのインスタンスを作成します。リポジトリ操作は、すべてこのインスタンスを通じて実行します。
from geogigpy.repo import Repository
repo = Repository('C:\\work\\geogig')

ノードの取得

repo.treesで、リポジトリの最上位のノードのリストが拾えます。最初のノードを取得するには、repo.trees[0]を指定します。
node = repo.trees[0]

フィーチャーの取得

node.featuresで、ノード内のフィーチャーのリストが取得できます。
feature = node.features[0]
geom = feature.geom
attrs = feature.attributes

ログの取得

repo.log()で、データセットあるいはフィーチャーのログが取れます。
logs = repo.log(path = 'parks')
logs = repo.log(path = 'parks/1')

ログから更新日時やコミットメッセージなどを取り出すには、次のようにします。
logs[0].committerdate  #更新日時
logs[0].committername  # 更新者
logs[0].message  #コミットメッセージ

今回はここまで。

2015年6月28日日曜日

QGIS付属のpythonにpipをインストールする

QGISには、Pythonコンソールという機能がついており、pythonのスクリプトを実行できます。
このPythonは、WindowsのStandalone Installerでインストールした場合、次の場所にインストールされます。
  • python.exe … <QGISインストールフォルダ>\bin\python.exe
  • ライブラリ類 … <QGISインストールフォルダ>\apps\Python27
QGISコンソールで標準以外のライブラリを使いたいとき、このPython環境上にeasy_installまたはpipをインストールし、ライブラリをインストールすることになります。以下はその手順です。QGISのバージョンは2.8.1(QGIS Wien)を使います。

事前準備

setuptoolsパッケージのサイトから、ez_setup.pyをダウンロードして、任意の場所に置いておきます。


環境変数の設定


まず、コマンドプロンプトを管理者権限で開き、QGIS付属のPythonをコマンドプロンプトで動かすための環境変数の設定をします。
必要なのは、PATHを通すことと、PYTHONPATHを設定することです。

set QGISPATH=C:\Program Files\QGIS Wien
set PYTHONPATH=%QGISPATH%\apps\Python27\Lib;%QGISPATH%\apps\Python27\DLLs;%QGISPATH%\apps\Python27\site-packages;%QGISPATH%\apps\qgis\python
set PATH=C:\Windows\System32;%QGISPATH%\bin;%QGISPATH%\apps\Python27\Scripts

※ここでapps\Python27\Scriptsにパスを通すのは、easy_install.exeがここにインストールされるためです。また、ez_setup.py実行中にcurl使うので、<QGISインストールフォルダ>\binにパスを通しておく必要があります。

setuptoolsのインストール

ダウンロードしたez_setup.pyを実行すれば、easy_installをインストールできます。
python C:\Users\xxxxx\Downloads\ez_setup.py

pipのインストール

easy_installでpipをインストールします。
easy_install pip
これで、pipはまたはeasy_installを使って、他のライブラリをインストールできるようになります。

2015年6月19日金曜日

WMTS配信を使って地理院タイルをQGISで表示してみる

地理院タイルのWMTSメタデータ提供実験が始まったのを受けて、これをQGISで表示させてみます。

まず、「WMS/WMTSレイヤの追加」アイコンをクリックします。

 「WM(T)Sサーバからレイヤを追加」ダイアログで、画面上部の「追加」ボタンを押下します。


「新しいWMSコネクションの作成」ダイアログで、次を入力してOKを押下します。
  • 名称は適当につけます。
  • URLは"http://gsi-cyberjapan.github.io/experimental_wmts/gsitiles_wmts.xml"を指定します。
  • 「軸方位を無視する」にチェックを入れます。


「WM(T)Sサーバからレイヤを追加」ダイアログに戻り、「接続」ボタンを押下します。


レイヤの一覧が表示されるので、表示したいレイヤを選択して(ここでは「標準地図」を選択)、「追加」ボタンを押下すると、選択されたレイヤが追加されます。

レイヤが追加されたところ。