他の環境関係法令による政令市

指定都市等のリストは 総務省 を参照するのが確実かな。

さて、いろいろややこしい。

水質汚濁防止法

水質汚濁防止法施行令 第10条に、指定都市と中核市に加えて

  • 福島市
  • 市川市
  • 松戸市
  • 市原市
  • 町田市
  • 藤沢市
  • 徳島市

が挙げられている。

特例市については、かつては令第10条に記載されていたが、 地方自治法改正に合わせて条文から削除し、 H27.1.30付の附則で経過措置として施行時特例市に従来通りの事務委任を 続けるという規定が定められている。

だから実質的には、指定都市、中核市、施行時特例市、上記7市に 水質汚濁防止法の事務が委任されている。

騒音規制法

H23年度までは、(旧)騒音規制法施行令第4条第1項において、

  • 一関市
  • 日立市
  • 土浦市
  • ひたちなか市
  • 桐生市
  • 松戸市
  • 君津市
  • 上田市
  • 多治見市

に、自動車騒音常時監視の事務が委任されていた (H21年度版環境六法で確認)。

指定都市、中核市、特例市、特別区には自動車騒音常時監視に加えて 他の事務も委任されていた(旧令4-2)。

H24年度からは、地方自治の推進のため、すべての一般市にも 指定都市に対するものと同様の事務が委任されるようになった。 それに合わせて令第4条は削除された。

だから現在では、騒音規制法に定める政令市、というものはない。

振動規制法

H23年度までは、(旧)振動規制法施行令第5条において、 指定都市、中核市、特例市、特別区 に事務が委任されていた。

H24年度からは、地方自治の推進のため、すべての一般市にも 指定都市に対するものと同様の事務が委任されるようになった。 それに合わせて令第5条は削除された。

だから現在では、振動規制法に定める政令市、というものはない。

悪臭防止法

H23年度までは、(旧)悪臭防止法施行令第3条において、 指定都市、中核市、特例市、特別区 に事務が委任されていた。

H24年度からは、地方自治の推進のため、すべての一般市にも 指定都市に対するものと同様の事務が委任されるようになった。 それに合わせて令第3条は削除された。

だから現在では、悪臭防止法に定める政令市、というものはない。

ダイオキシン類対策特別措置法

ダイオキシン類対策特別措置法施行令 第8条に、指定都市と中核市に対する事務委任が規定されている。

特例市に関しては、もとから規定がなかったようだ (H21年度版環境六法で確認)。

大気汚染防止法に定める政令市

法律に疎いと何処に書いてあるのかわからんのよね。

大気汚染防止法施行令 第13条に規定。

  • 小樽市
  • 室蘭市
  • 苫小牧市
  • 川口市
  • 所沢市
  • 市川市
  • 松戸市
  • 市原市
  • 平塚市
  • 藤沢市
  • 四日市市
  • 吹田市
  • 八尾市
  • 明石市
  • 加古川市
  • 大牟田市

他に、指定都市、中核市、施行時特例市に事務の委譲がある。

川口市、所沢市、平塚市、四日市市、吹田市、八尾市、明石市、加古川市は 大気汚染防止法政令市かつ施行時特例市。

環境省・大気汚染防止法施行状況調査報告書 の末尾に政令市等の一覧がある。

いわゆる市区町村コード(2)

(承前)

データとしての使いやすさと情報量という点では、 統計LOD から公開されている「標準地域コード」で充分である。 ただ、実際に中身を見たところ、やや不十分なところがあった。

  • 自治体の分割に対応していない。山梨県上九一色村が2分割されて 甲府市と富士河口湖町に編入されたケースなどが正確に記述されていない。
  • 標準地域コード策定時点(1970年4月1日)時点で既に廃止されていた自治体の エンティティが混入していて紛らわしい。

これについては統計LODの問い合わせアドレスにメールで問い合わせたところ、 データを修正する方向で対応する、とのことであった。 そのうちデータがアップデートされるものと思われる。

さて LOD と言えば Sparql とかいう言語で検索したりするものらしいが、 私は当面は自発的にこれを学ぶつもりはない(だってめんどくさそうだし)。 この程度のデータ量だったらどんな方法でも大差はないのだから、 いつも通りに Python + rdflib で スクリプト を書いてみた。 各コードの有効期間と編入・合併先を抽出するスクリプトである。

実行結果は こんな感じ (ただし別途 sort してある)。 元データのライセンスが CC-BY 4.0 なので、このファイルを利用する場合は 元データの権利者を表示すること。 ただし標準地域コードの著作権者が誰になるのか、統計LODのサイトに 記載が無い...(追記・「政府統計の総合窓口(e-Stat)」で良いそうだ)。

いわゆる市区町村コードなるもの

これまで行政由来のデータを扱うことがほとんど無かったので 「市区町村コード」とかいうものをほとんど知らなかったのであるが、 業務上避けて通れなくなったので、これを機会に真面目に調べることにしたのである。

いわゆる市区町村コードには、実は3系統あって、初心者は混乱する。 というか混乱した。系統ごとに用語が微妙に違うので google で検索に 巧く引っかからなかったりするようだ。

系統間の関係について、調べた中では ここ が解りやすいか。

自治省系コード

正式には「全国地方公共団体コード」の「都道府県コード及び市区町村コード」。 旧自治省が地方自治体の事務処理のために作成したもので、作成時期は 3系統の中で一番古く、1968年。以下「市区町村コード」と呼ぶ。

「全国地方公共団体コード」は「市区町村コード」の他に 「一部事務組合等コード」が含まれている。この「一部事務組合等コード」が どういうものかと言うと、 たとえば「常総地方広域市町村圏事務組合」のような団体に 事務処理用コードを割り当てるためのものだ。 今回はこのような組合のことは関係ないので立ち入らないことにする。

「市区町村コード」のコードとしての特徴は、

  • 検査数字を含めた 6桁の数値
  • 都道府県、市町村、特別区(東京23区)、政令指定都市の行政区、を収録 (郡、支庁・振興局は除外)

現在は総務省地域力創造グループが管理しており、 総務省の電子自治体のページ から PDF と Excel がダウンロードできる。

過去の情報は、2005年4月1日以降の改正分が同じく PDF と Excel で入手できる。 それ以前の情報について、直接問い合わせところ、総務省地域力創造グループでは データを持っておらず、別途資料を当たられたい、とのことで、 例として 第一法規(という出版社)「全国都道府県・市区町村コード」 を紹介された。

行政管理庁系コード

正式には「統計に用いる標準地域コード」。 旧行政管理庁が 1970年に策定したもので、現在は総務省統計局が管理している。

コードの割り当て規則は、先行の自治省系コードのものを流用しているので、 実態としてはほとんど同じと言って良いが、細かいところで差異がある。

  • 検査数値なしの 5桁
  • 郡、支庁・振興局にもコードを割り当てている。
  • 策定の時点で「削除」扱いになっているコードがある。つまり、 1970年4月1日以前に存在し、先行の自治省系コードが割り当てられていた自治体が、 1970年4月1日までに廃止された場合、自治省系コードとの整合性のため、 そのコードを削除扱いにした、ということ。

電子情報としては、 総務省ウェブサイトの統計部門のページ から PDF, CSV で入手できるが、 2016年3月31日に LOD形式で公開された ので、現在はこれを使うのが良い。 1970年4月1日から現在までの変遷が追跡できる(ただし、一部に誤りがある。後述)。

このページ の一番下に turtle 形式のファイルが置いてある。

JIS コード

正式には JIS X401, JIS X402。 自治省系「市区町村コード」を流用して JIS 規格化したもの、のようだ。 これについて調べる前に、「標準地域コード」の LOD が見付かったので、 調べるのを止めてしまった。

(続く)

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 ライセンスを、 著作物ではない研究データに適用することは適切なのか? という疑問が生じる。

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

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