Index 目次
Introduction
このページでは読み込みについて述べる。
Shapefileは座標情報と付属情報を持っている。
pyshpというライブラリで両方とも読み込めるのだが、せっかくなので付属情報を読み取る
dbfpyの使い方も簡単に紹介しておく。
また
multipolygonの描画についてはこちら。図は座標情報を読み込んで描画したもの。色は付属情報を使っている。
+
Python > Plot > Graph > Fill
Installation of the library
ライブラリのインストール
How to use pyshp
shapefile.Reader(filename, encoding='utf8'):
filenameを開く。
encodingで文字コードを指定できる。
sf.bbox:
Bounding boxを取得する。このデータの座標範囲。地理データだと(west, south, east, north).
sf.fields: 付属情報の一覧を取得する。
sf.shapes(): 座標情報を取得する。
sf.records(): 付属情報を取得する。
「
20万分の1日本シームレス地質図」の全国一括版を例に読み込みを行う。
[pyshp] 座標情報 (shapefile.shapes)
座標情報は座標を格納した'points'とその区切り位置を示す'parts'から成る。
partsによって区切られた
pointsはそれぞれ独立の図形を表す。
例えば
partsが
[0, 20085, 20108, 20127, ...]のとき、
points[0:20085],
points[20085:20108],
points[20108:20127], ...
がそれぞれ独立の図形となる。
この例では地質図を読み込んでいるので
shapeTypeは
5すなわちポリゴン(閉じた図形)であり、
points[0]と
points[20084],
points[20085]と
points[20107],
points[20108]と
points[20127]はそれぞれ同じ値となる。
なお
shapeTypeの値と分類は次のとおり。
0 |
Null Shape |
1 |
Point |
3 |
PolyLine |
5 |
Polygon |
8 |
MultiPoint |
11 |
PointZ |
13 |
PolyLineZ |
15 |
PolygonZ |
18 |
MultiPointZ |
21 |
PointM |
23 |
PolyLineM |
25 |
PolygonM |
28 |
MultiPointM |
31 |
MultiPatch |
shapes[0]を描画してみる。
[pyshp] 付属情報 (shapefile.records)
pydbf
dbfファイルを読み込むモジュール。
先に述べた通り、基本的にpyshpのshapefileモジュールで付属情報も読み込めるのだが、国土数値情報の河川データの付属情報を取得しようとするとどうしてもUnicodeDecodeErrorで読み込めなかった(しかもなぜか北海道と青森だけ)のでこちらを試してみたところうまくいった。なので基本的な使い方を簡単にまとめておく。
当然長さはpyshpで読み込んだshapes, recordsと同じ。
日本のデータはShift-JISで書かれていることが多いので適宜デコードする。
[pyshp] UnicodeDecodeError
encodingを'shift-jis'にしているにもかかわらず"UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 0: ordinal not in range(128)"というメッセージではじかれる。
ソースコードを確認してみると、shapefile.pyのClass Readerの__dbfHeaderという関数で、encodingで指定した文字コードが反映されずasciiでデコードしているところがあったので修正した("ascii"をself.encodingに変えた)。
修正前
修正後
なおファイルを開くことは出来ても付属情報を取得しようとした時点でエンコーディングエラーとなる場合もある。
国土数値情報の河川データの北海道と青森のデータで発生した。原因はShift-JISではなくcp932という文字コードが使われていたため(国交省の提供ページでは「基本的にShift-JIS」と書かれていたのだが…)。