mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

GDAL/OGR - 国土数値情報の複数 Shapefile を結合!

[ pc_tips ] [ GIS, Linux, LinuxMint, QGIS ]

こんばんは。

国土交通省が提供する国土に関する電子地図データダウンロードサービス「国土数値情報」の都道府県別データを1つに結合する方法についての記録です。
都道府県別に読み込むよりまとめて読み込んだ方が作業をしやすい、という場合に使えるのではないでしょうか。

フリーでオープンソースの地理情報システム QGIS(QuantumGIS) の「ベクタ」ー「データマネジメントツール」ー「複数のシェープファイルを1つに結合する」でも可能ですが、エンコードに難があるようです。(エンコード指定をどのように試しても文字情報の文字化けが解消しない)

そこで、データ変換ライブラリ GDAL/OGR の ogr2ogr コマンドを使用して結合してみます。

以下、その記録です。(当方 GIS については素人です。乱文ご容赦ください)

0. 前提条件

  • GDAL/OGR 1.10.0 での作業を想定。
    (国土地理院・基盤地図情報対応の GDAL/OGR(1.11.0) でも同じ)
  • 使用するデータは、国土数値情報「行政区域」データ(JPGIS2.1形式)の全都道府県分。(平成26年4月分)
  • 作業用ディレクトリは “N03-140401_00_GML” とする。
  • bash スクリプトを使用する。

1. 準備

QGIS でもそうであるが、結合使用する Shapefile を1つのディレクトリにまとめておく必要がある。

国土数値情報「行政区域」データの圧縮ファイル1つ(1県分)展開すると “N03-140401_XX_GML” というディレクトリができる。("XX" は都道府県番号)
47都道府県分のディレクトリ内のファイル全てを作業用ディレクトリ内へコピーする。(今回の場合は “N03-140401_00_GML” というディレクトリ)

2. シェルスクリプト作成

以下のような bash スクリプトを作成する。

merge_shp.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

enc="UTF-8"  # CP932

ds_dst="N03-14_00_140401"
echo "DST: ${ds_dst}"
rm -f ${ds_dst}.*

# 1つ目の Shapefile (「北海道」分)で生成先ファイル作成
ds_src=$(printf N03-14_%02d_140401 1)
echo "SRC: ${ds_src}"
ogr2ogr -lco "ENCODING=${enc}" ${ds_dst}.shp ${ds_src}.shp

# 2つ目以降の Shapefile を1つ目に結合
for i in {2..47}; do
  ds_src=$(printf N03-14_%02d_140401 $i)
  echo "SRC: ${ds_src}"
  ogr2ogr -update -append ${ds_dst}.shp ${ds_src}.shp -nln $ds_dst
done

処理概要は以下のとおり。

  1. エンコード指定は “UTF-8” とする。
    (国土数値情報 Shapefile のデータ仕様に記載してある)
  2. 最初に結合先ファイルを削除する。
    (結合先ファイルが存在するとエラーになるため)
  3. 1つ目の Shapefile ("01"「北海道」分)で結合先ファイルを作成する。
    (空のファイルに Shapefile を結合することはできないため)
  4. 残りの46都府県の Shapefile をループ処理で結合する。

3. シェルスクリプト実行

以下のように、作成した bash スクリプトを実行する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ./merge_shp.sh
DST: N03-14_00_140401
SRC: N03-14_01_140401
SRC: N03-14_02_140401
SRC: N03-14_03_140401
SRC: N03-14_04_140401
SRC: N03-14_05_140401

        :

SRC: N03-14_42_140401
SRC: N03-14_43_140401
SRC: N03-14_44_140401
SRC: N03-14_45_140401
SRC: N03-14_46_140401
SRC: N03-14_47_140401

同じディレクトリ内に以下のようなファイルが作成されるはずである。

1
2
3
4
5
N03-14_00_140401.cpg
N03-14_00_140401.dbf
N03-14_00_140401.prj
N03-14_00_140401.shp
N03-14_00_140401.shx

4. 地図表示

QGIS で作成された Shapefile を読み込んで地図を表示してみる。(「ベクタレイヤの追加」でエンコーディング “UTF-8” にして)

QGIS_KSJ_ALL_1

5. 問題点

冒頭で QGIS で Shapefile を結合した際にエンコードに難がある旨を記載したが、 ogr2ogr コマンドで結合した場合も部分的に文字化けしてしまう。

QGIS_KSJ_ALL_2

(表示データの出典:国土数値情報(行政区域データ)・国土交通省)

上のように、正常に表示される都道府県データと文字化けする都道府県データがあるようだ。(47都道府県中12都道県)
色々と試してみると、エンコーディング変換不可能な文字が部分的にでも存在するファイルは、そのファイル内の日本語は全て文字化けするような感じ。ただ、QGIS で 都道府県別に “Shift_JIS” で読み込んだ場合はすべて正常に表示される。

結果的に、ラベル表示等が正常にできないという問題はあるが、地図を表示するだけなら問題はないだろう。(文字化けするデータはあっても都道府県の区別等は可能)

気(問題)になるようなら、まず市区町村ごとに複数存在するポリゴン(地物)を市区町村単位で融合して1つのポリゴン(地物)にし、その後でそれらの Shapefile を結合する方法を取るとよい。(なぜか、こうすることで文字化けは起こらなくなった。参照=>「QGIS(QuantumGIS) - 国土数値情報・ポリゴンの融合!」)


大量の Shapefile を1つに結合する際に役立つだろう。

以上。

Comments