Python で MS Access データファイルを読む

mdbtools, pymdb を使えば Python 上から MS Access のデータファイルが 読めるらしい、と知った。こういうものがネットに転がっているとは 便利な時代になったものである。

Mac だと、MacPorts で glib2 と glib2-dev の切替が巧く行かず、 面倒だったので止めた。

従っていつも通り FreeBSD 上で実行した。10.3 Release。

mdbtools

mdbtools は MDB ファイルを CSV に変換したりするコマンド群とそのライブラリ。 PKG に収録されているので素直にそれをインストールする。

pkg install mdbtools

mdbtools のコマンドで MDB から CSV に変換できるので、 これだけで充分と言えば充分なのだが、やはり直接 Python 上で 扱えた方が便利なので(値にカンマが混じっていたりして クォーテーションされると面倒)、pymdb も入れる。

pymdb

pymdb は mdbtools の Python 用バインディング。PyPi にある。 pip でのインストールは、少なくとも FreeBSD 10.3R 上では不具合が発生した。

  • glibconfig.h が見つからず、ビルド失敗。

    FreeBSD 10 では glibconfig.h は

    /usr/local/lib/glib-2.0/include/glibconfig.h
    

    にあるが、これが pymdb のサーチパスに入っていない。 glibconfig.h 以外の glib 関係のヘッダファイルは

    /usr/local/include/glib-2.0
    

    にあるのに、何故か glibconfig.h だけ別のディレクトリに設置されている。 何故だろう。よく解らない。

    これを解決するだけだったら /usr/local/include とかに glibconfig.h を 無理矢理コピーすれば pip install が通るが、 次の不具合もあるので二度手間になる。

  • libiconv が無視される。

    pymdb の Cコード上で HAVE_ICONV というマクロが検査されるのだが、 pip install では OS 上に libiconv があるのにも関わらず HAVE_ICONV が セットされない。結果として MDB 内の日本語データが文字化けする。

    解決法は、pymdb の setup.py でマクロを定義して、直接ビルドする。

結論として、setup.py に以下の2行を追加する。

define_macros=[("HAVE_ICONV", "1"),],        # 追加
include_dirs=[
    "/usr/local/lib/glib-2.0/include",       # 追加

pymdb の使用感

pymdb の機能は極めて単純で、MDBファイルの中身を

{ table_name: { "headers": [header_list], "data": [[data_row], ...] }, ...}

という構造に変換するだけである。pythonic に利用するにはラッパクラスを作って __getitem__ 等を書くのが良い。例えば、

class MDBRow:
  def __init__(self, header, row, table_name=None, row_idx=None):
    self.headers = header
    self.data = row
    self.table_name = table_name
    self.index = row_idx
    self.extra_data = {}

  def __getitem__(self, col_name):
    try:
      return self.data[self.headers.index(col_name)]
    except ValueError:
      return self.extra_data[col_name]

  def __setitem__(self, col_name, col_data):
    try:
      self.data[self.headers.index(col_name)] = col_data
    except ValueError:
      self.extra_data[col_name] = col_data

RからWFSを利用する(2)

(承前)

ogr2ogr で保存した GMLファイルを R 上に読み込んでみよう。 それには readOGR を用いる。

R の GIS データ用クラスはジオメトリ型ごとに異なっているらしい。 型ごとに別のオブジェクトに格納する。

> library(gdalUtils)
> library(rgdal)
> pnt <- readOGR("test.gml", "mylayer", require_geomType="wkbPoint")
> lines <- readOGR("test.gml", "mylayer", require_geomType="wkbLineString")
> poly <- readOGR("test.gml", "mylayer", require_geomType="wkbPolygon")
> plot(pnt)

R オブジェクトのクラス名はそれぞれ SpatialPointsDataFrame, SpatialLinesDataFrame, SpatialPolygonsDataFrame のようだ。 plot() に渡すと点や線が表示される。

ローカルファイルに保存せずに R に取り込む

readOGR のデータソースに WFS の URL を指定すれば、WFS サーバから データを直接 R 上に取り込むこともできる。

> mypoints <- readOGR("WFS:http://hogehoge/wfs?version=1.0.0&request=getfeature&typename=mylayer&srsname=EPSG:4326", "mylayer", require_geomType="wkbPoint")
> plot(mypoint)

SpatialPointsDataFrame 等のクラスがどの程度汎用的なのかは 今の私には判らない。ただローカルに GML形式で保存できさえすれば 後はなんとでもなるだろう。

RからWFSを利用する

R で地理データを扱う時に、WFS から直接取り込むことができたら便利に違いない。 幾つか方法があるのかも知れないが、google でまず GDAL を使う方法が ヒットしたので試してみる。

gdalUtils と rgdal というパッケージを使うのだが、実態は、GDAL のコマンドを 呼び出すラッパーのようなので、先に直接コマンドを実行してみる。

さて、まず判り難かったのが、GDAL で WFS ドライバをビルドするには configure で curl オプションを有効にしなければならないということ。 OSX の macports、および FreeBSD の pkg で素直にインストールすると curl は有効になっていないので WFS が使えない。 macports では次のようにする。

$ sudo port install gdal +curl

FreeBSD では ports でリビルドしなければならないので少々面倒臭い。

curl オプション付きで GDAL をインストールすると、ogrinfo で WFS のメタデータを取得できるようになる。以下で利用可能なレイヤの一覧が出力される。

$ ogrinfo "WFS:http://hogehoge/wfs?service=wfs&version=1.0.0&request=GetCapabilities&srsname=EPSG:4326"

ogr2ogr で WFS から取得した GIS データをローカルファイルに保存できる。 TypeName に欲しいレイヤ名を、 request は GetFeature にする。 なお、元データにマルチバイト文字があるとエンコードエラーが出るのと、 線とポリゴンが含まれているとジオメトリ変換エラーが出る。 どちらも、デフォルトの出力フォーマットが shp であることが原因のようだ。 前者は -lco オプションでエンコードを指定して回避する。 後者は、shp がそもそも複数のジオメトリ型をひとつのファイルに 共存させられないから回避できない(処理するジオメトリ型を明示的に指定して 複数回実行するしかない)。出力フォーマットはオプションで 変更可能だが、まずはエラーを無視するように -skipfailures を指定してみる。

$ ogr2ogr test.shp "WFS:http://hogehoge/wfs?service=wfs&version=1.0.0&request=GetFeature&typename=mylayer&srsname=EPSG:4326" -lco "encoding=utf-8" -skipfailures

出力フォーマットは -f オプション で指定する。GML だとエンコーディング問題も 複数型共存問題も生じない。

$ ogr2ogr test.gml "WFS:http://hogehoge/wfs?service=wfs&version=1.0.0&request=GetFeature&typename=PlotNet:plots&srsname=EPSG:4326" -f gml

QGIS on OSX 10.9

OSX 10.9.5 に QGIS を入れてみようとして、 まずは MacPorts を試してみたが、ビルドに失敗する。 ログを見ると、system というコマンドを実行しようとして失敗しているようだが、 そのような名前のコマンドは、ユーザランドにも bash built-in にも (libclang にも?)見当たらない。どういうことだ? なお FreeBSD には system(3) がある。

さくらインターネットの個人サーバ(FreeBSD)に pkg で入れて、 X11 Forwarding で使おうかと思って試してみたが、やはり反応が遅くて気が滅入る。 仕方ないので http://www.kyngchaos.com/software/qgis からビルド済み dmg を 落として入れることにした。こういう時にはいつも何故か何かに負けたような 気分になる。

さて入れてはみたが、QGIS の使い方を全然知らないんだよな。 取り敢えず本買うか。

GISデータとGML

環境省・水環境総合情報サイト、というものがある。 Google で検索した時、 http://www.env.go.jp/water/mizu_site/ が 先頭に出てくるのだが、このサイトに行ってメニューをクリックすると、 Network Error という画面が出てくる。 始めのうちは、何だよメンテでもしてんのか、と思ったが、それらしい 素振りもないし、どうも変だなー、と頭を悩ませていた。

実はこのサイトは古いサイトで、現在ではリニューアルされて https://www2.env.go.jp/water-pub/mizu-site/ で公開されている、 ということに気付くのに半日くらい掛かった。 うーん。自動転送するように設定しておいてくれないものか。

まぁそれはそれとして、このサイトでは、水質調査のデータを ダウンロードすることができる。のだが、Safari だとダウンロードが途中終了する。 サイトのヘルプを見ると、IE のバージョン 8 以上が推奨だそうで、 うへぇ、と思いつつ試しに Firefox 31.0 でやってみると、 無事にダウンロードすることができた。

さて、この ダウンロードページ では、(底質データ以外は)ファイル形式として CSV, SHP, GML を選ぶことができる。 GML についてあまり知識が無かったので、GML って KML の親戚だっけ? などと考えつつググり、OGC 発で ISO 19100 シリーズに取り込まれたことや、 国土地理院が JPGIS という国内規格に取り込んだことなどを勉強した。 ISO 19115/19139 や JMP のことは以前に勉強したことがあって知ってたんだけど、 ISO 19136, JPGIS は聞いた記憶が無いな。なんでだろう。

話を戻して、水質データの中身だが、まず面食らうのが項目名の表記法で、 安直なローマ字表記が妙に笑える。例えば ( 公共用水域水質データファイル利用説明書 より引用)

カラム名 内容
TORIKUROROECHIREN トリクロロエチレン
SIENKATANSO 四塩化炭素
ZETTAICODE 絶対番号

と、中々のセンスである。

まぁカラム名はただのラベルなので本質的にはどうでもいい。

ダウンロードした GML ファイルの中身を見て判ったのは、どうもこのファイルは ツールを使って自動的に生成したものらしい、 ということ。GML ファイル内に http://www.safe.com/gml/fme という URI が 指定されていたので調べたところ、 Safe Software という会社が FME というデータフォーマット変換ツールを売っているようだ。 おそらく環境省から業務を受託した業者が FME を導入したのだろう。 ファイルダウンロード時に十数秒待たされる挙動から、どうも、ダウンロード用ファイルは 事前に用意されているのではなく、その都度マスターDBから生成している 雰囲気がある。

GML は主題情報用のタグなどを別途定義しなければならないため、 この GML形式水質データにも XML スキーマファイルが同梱されている。 しかしこれが如何にも自動生成されましたという顔をしており、 annotation や description が一切無く、maxLength や minOccurs などの 形式面の定義だけが羅列されているという物。 また GML ファイルの方には gml:featureMember というタグが使われているが、 これは GML 3.2.1 では deprecated とされていて、使うべきではない。

という訳で、このサイトの GML形式データは総じてやっつけ感が隠せない仕上がりであった。

参考までに、国交省・国土数値情報のサイトから GML 形式データをひとつ ダウンロードして中身を見てみたが、さすがにこちらは出来が良い。 思いがけず、環境省と国交省の差を見せつけられた一日となった。

非著作物とCC

昨日は NIMS で開催された「オープンサイエンスと著作権」というセミナーに 行ってきた。もちろん会場から質問する機会はあったのだが、その時には 思いつかず、自宅に帰ってきてから何時間も経ってから訊くべきことに 気付く、というよくある事態に。

データは、法的には著作物ではない。 一方で、研究データを CC ライセンスの下で公開する事例が出始めている。 そこで、著作物を前提にして設計されている CC ライセンスを、 著作物ではない研究データに適用することは適切なのか? という疑問が生じる。

  • 法的枠組みとして妥当なのか?
  • 実際問題としてこれは上手いやり方になっているのか?

という点について、弁護士としての見解をお尋ねしたい。

ライセンス色々(3)

CCAFS GCM Data Portal

国際的な食料安全保障に関するパートナーシップとして CGIAR (Consortium of International Agricultural Research Centers) というものがあるらしく、その中の研究プログラムに CCAFS (Climate Change, Agriculture and Food Security) というものがあり、 その下に Downscaled GCM Data Portal というサイトがある。 世界各地の GCM 研究グループのモデル出力を集めてアーカイブしてある サイトのようだ。ただ、メタデータは用意してないようで、見当たらない。 データファイルのファイル名から内容を推測するしかないようだが、 GCM の専門家でないと内容が理解できないだろう。

それはともかく、ライセンスとしては

  • 再配布禁止
  • 謝辞

という条件だが、それよりもファイルのダウンロード時の対応が面白い。 利用状況把握のために氏名等の情報を教えて欲しいが、嫌なら スキップしてくれてもいいよ、というような文面になっている。 試しに skip をクリックしてみると、確かに何も入力しなくても ファイルのダウンロードができた。

http://ccafs-climate.org/ のダウンロードフォームより引用:

Terms and conditions

To continue downloading your files, please first fill in your email and then some basic information. This information will be used by CCAFS solely for impact assessment and CGIAR and Center level reporting purposes. Filling it in will greatly help us to track the use of the portal and keep improving it. This portal provides data to a very large community of users and improving its usability and efficiency is a key aspect we work on continuously. However, you may click on skip to download links directly.

この設計には好感が持てる。個人的に。

ちなみにこのシステムは Amazon でホストしているらしい。 Amazon の利用料が如何程なのか興味がある。

ライセンス色々(2)

NCAR EOL

米国 National Center for Atmospheric Research の Earth Observing Lab. の データポリシー 。 後半部の ACKNOWLEDGEMENTS AND PUBLICATIONS にユーザ向けのことが書いてある。

  • EOL への謝辞
  • 個々のデータセットの引用(2個の DOI を含む文字列)

両方の条文に expect という動詞を使用している。

要点として、実際に利用したデータセットだけでなく、それをホストしている EOL という組織に対する謝辞も入れるように要求しているところがひとつ。 ふたつには、DOI が2個あるところで、ひとつはデータセットの最終バージョンに 付けられた DOI で、もうひとつは、データ収集のためのプラットフォームに 与えられた DOI だという。後者はおそらく、研究プロジェクトの開始時に 専用ストレージやポータルサイトのようなものが作成されて、そこに データファイルを集めるような体制になっていて、それに DOI が付けられている ということなのではないかと思う。

ライセンス色々

SOCAT

SOCAT は海洋表面CO2 観測データの集積データセット。

利用条件は license や agreement ではなくて statement と位置づけている。 ( Fair Data Use Statement for SOCAT )

そのため、ユーザに対して義務を課すのではなくて “expect” する、という 文面になっている。期待・要求することは具体的には

  1. co-authorship (SOCAT 自体ではなく、SOCAT にデータを提供した個々の研究者に対して)
  2. 引用
  3. 謝辞
  4. バグレポート
  5. 利用して得られた成果の情報提供

SOCAT にデータ提供している研究者は多数であるので、 その全員に連絡を取って共著者として論文を作成するのは大変だ。 そこでガイドラインとして提示されている方法は、 特に大量のデータを提供している研究者には共著の打診を送り、 そうでない研究者には引用と謝辞で済ます、というもの。

全体的に、co-authorship について強く主張する内容になっている。 そんなに拘りがあるなら statement ではなくて agreement にすればいいのに、 と思うが、そうしなかったのは何故だろう。よく解らない。 ちょっと一貫性が取れてないように思える。

気象庁 JRA

気象庁55年長期再解析 のデータ。

利用規約が 利用申し込みのページ にあり、見つけ難かった。内容は、

  1. 氏名、利用目的等の事前申告
  2. 商用利用禁止
  3. 引用
  4. 成果物の提供

1 の事前申告は煩雑に思えるが、まぁ気象庁はお役所だし仕方ないか、とも思う。 しかし、それに加えて許諾の審査があるというのはどうだろう。

申し込み内容を気象庁で検討の上、ID及びパスワードを発行いたします。 ID及びパスワードの発行をもって、共同研究に準じる契約を締結したものと見なします。

一体何を懸念しているのか、にわかには想像できない。

NCEP-DOE Reanalysis 2 では、利用制限は無く、謝辞と成果物提供を(義務ではなくて) お願いするだけになっている。

随分違いがあるなぁ。

GCM データのライセンス

IPCC Data Distribution Centre

というサイトに GCM データの利用規約が記載されている。

AR4 GCM data

出典は ここ

License Statement

These data are licensed for use in Research Projects only. A ‘Research Project’ is any project organised by a university, a scientific institute, or similar organisation (private or public), for non-commercial research purposes only. A necessary condition of the recognition of non-commercial purposes is that all the results obtained are openly available at delivery costs only, without any delay linked to commercial objectives, and that the research itself is submitted for open publication.

研究機関による非商用目的の研究活動に限る、としている。 非商用目的について「得られたすべての成果が公開されること」等々と 明確な定義を与えている。

AR5 GCM data

出典は ここ

CMIP5 Data License Statement

These data were first published under the license of CMIP5. Terms of use for CMIP5 are applied for DDC-AR5 data. They are provided at http://cmip-pcmdi.llnl.gov/cmip5/terms.html. Data from some modelling centres are licensed for use in non-commercial research and for educational purposes, other for unrestricted use. Please refer to the terms of use for the CMIP5 modeling groups for details. DDC-AR5 data should be cited by its DataCite DOI and according to the citation recommendation of CMIP5.

AR5 に使われたデータは CMIP5 なので、CMIP5 のライセンスに従え、とある。 データ提供元に応じて非商用目的限定のデータセットと 制限無しのデータセットがある、とのこと。

Terms of use agreement for CMIP5 model output

出典は ここ

CMIP5 のアーカイブ自体は “non-commercial research and educational purposes” に限定されているが、個々のデータセットで “unrestricted” なものは 制限無しに利用して良い、とのこと。

個々のデータセットの利用条件のリストは これ だが、ほとんどのものは unrestricted で、non-commercial にしているのは 3グループしかない。そして、その3グループはすべて日本のグループである。

  • MIROC: 東大大気海洋研、JAMSTEC、国立環境研究所
  • MRI: 気象庁気象研究所
  • NICAM: 理研計算科学研、東大大気海洋研、JAMSTEC

これはどういう理由だろうか。法令の問題ではないだろうし、研究費の 制限なのだろうか。CMIP のようなプロジェクトで他国と足並みを揃えられないのは かなりまずいような気がするが。いずれにせよ、日本のオープンデータの状況が 遅れているということが現れている。

ライセンスの個々の条文はそれぞれ、

  • a non-commercial の制限について
  • b 免責
  • c 謝辞への記載
  • d DOI の引用
  • e As is 条項(モデルの欠陥など構造的なもの)
  • f As is 条項(QC作業での見逃し)
  • g データ提供者へのフィードバック
  • h 再配布の制限

について記述されている。