シェープファイル
    Top > Python > I/O
    Index 目次
    + Introduction + Installation of the library + How to use pyshp + [pyshp] 座標情報 (Shapes) + [pyshp] 付属情報 (Records) + pydbf + [pyshp] UnicodeDecodeError
    Introduction
    このページでは読み込みについて述べる. Shapefileは座標情報と付属情報を持っている. pyshpというライブラリで両方とも読み込めるのだが,せっかくなので付属情報を読み取るdbfpyの使い方も簡単に紹介しておく. またmultipolygonの描画についてはこちら.図は座標情報を読み込んで描画したもの.色は付属情報を使っている. + Python > Plot > Graph > Fill
    Installation of the library
    ライブラリのインストール
    pyshp:  + https://github.com/GeospatialPython/pyshp dbfpy: + https://pypi.org/project/dbfpy/ たしかダウンロードしてパスを通すだけ. pip installなどでも良い.
    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」と書かれていたのだが…).
    References
    pyshp · PyPI + https://pypi.org/project/pyshp/ dbfpy · PyPI + https://pypi.org/project/dbfpy/ ESRI Shapefile Technical Description - shapefile.pdf + https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf