QGIS を使ってシェープファイル(Shapefile)を CSV に変換する方法

QGIS

地理データを Hadoop 等で処理する際、CSV 形式だと別データとの突合せの際に扱いやすい場面があります。

QGIS を使ってシェープファイル(Shapefile)を CSV に変換してみたので、その手順をメモします。

シェープファイル(Shapefile)とは

地理情報システムで有名な Esri 社の提唱したベクトル形式の図形データフォーマットです。多くの GIS()ソフトウェアで使用することができ、無料で使用可能なファイルが様々なサイトでダウンロード可能です。

シェープファイルについては ArcGIS のサイトに詳しい説明があります。

関連サイト: ArcGIS Help 10.1 – シェープファイルとは

QGIS を使ってシェープファイル(Shapefile)を CSV に変換する方法

シェープファイルはそのままだと Hadoop 等で使用するのが困難ですが、オープンソースの地理情報システム QGIS を使うことで CSV に変換することが可能です。

以下に簡単な手順を示します。

1.QGIS のインストール

QGIS の公式サイトから QGIS をダウンロードし、インストールします。本エントリ公開時点ではバージョンは2.16.3でした。

公式サイト: QGISプロジェクトへようこそ!

上記サイトの「ダウンロードする」からダウンロードぺージに移動します。

QGIS オフィシャルサイト

自分のプラットフォーム向けのインストーラーをダウンロードします。今回は Windows の 64Bit 版を使用しましたが、MacOSX・Linux 版もあります。

QGIS ダウンロード

インストールは特に設定を変えることなく、そのまま進めばOKでした。

2.シェープファイルの読み込み

QGIS インストール後、デスクトップにQGIS 2.16というフォルダができるため、その中のQGIS Desktop 2.16.3より起動します。(バージョン部分は変わる可能性があります)

シェープファイルを QGIS で読み込みます。今回は下記のサイトで提供されている世界の境界のデータセット(TM_WORLD_BORDERS-0.3.zip)を使用しました。

ダウンロード元: thematicmapping.org

シェープファイルの読み込みは*.shpを QGIS にドラッグ&ドロップするだけで OK です。読み込むと QGIS の表示が以下の画像のようになります。

QGIS シェープファイル読み込み

3.CSV ファイルへの変換

CSV ファイルに変換するには Layers Panel で右クリックし、 Save As… を選択します。

QGIS レイヤー変換

Save vector layer as… 画面で出力の設定をします。CSV で出力するには以下の設定を行います。

項目 選択値
Format Comma Separated Value[CSV]
Save as 保存するファイルパス
CRS Selected CRS
Encoding UTF-8(出力したいエンコーディングを適宜選択)

また、地理情報を含めて出力したい場合に重要となるのが Layer Options です。SEPARATOR(セパレータ)やLINE FORMAT(改行フォーマット)は出力したい形式に応じて選択しますが、GEOMETRY(地理情報)はAS_WKTを選択します。こうすることでシェープファイルに含まれる地理情報がMULTIPOLYGONで出力されます。

設定例は以下の画像のようになります。
QGIS CSV出力設定

変換後のファイルです。WKTフィールドが地理情報の範囲を表すため非常に長いですが、ダウンロード元サイトに記載のとおりのフィールドでデータが出力されています。

シェープファイルから変換後のCSV

Hive での読み込み・表示

せっかくなので Apache Hive でテーブル作成・読み込みと表示をやってみました。

テーブル作成

CSV なのでこちらを参考にorg.apache.hadoop.hive.serde2.OpenCSVSerdeを使用してCREATE EXTERNAL TABLEします。

CREATE EXTERNAL TABLE IF NOT EXISTS TM_WORLD_BORDERS (
Shape string,
FIPS string,
ISO2 string,
ISO3 string,
UN int,
NAME string,
AREA bigint,
POP2005 double,
REGION int,
SUBREGION int,
LON float,
LAT float
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS TEXTFILE
LOCATION '/path/to/external/table/';

読み込み

CSVをEXTERNAL TABLEのパスに配置するか、load dataで読み込みます。

load data local inpath ‘/tmp/TM_WORLD_BORDERS.csv’ OVERWRITE INTO TABLE TM_WORLD_BORDERS;

表示

適当にSELECTします。

select fips,name,lon,lat from TM_WORLD_BORDERS limit 10;

問題なく表示されました。

hive> select fips,name,lon,lat from TM_WORLD_BORDERS limit 10;
OK
AC      Antigua and Barbuda     -61.783 17.078
AG      Algeria 2.632   28.163
AJ      Azerbaijan      47.395  40.430
AL      Albania 20.068  41.143
AM      Armenia 44.563  40.534
AO      Angola  17.544  -12.296
AQ      American Samoa  -170.730        -14.318
AR      Argentina       -65.167 -35.377
AS      Australia       136.189 -24.973
BA      Bahrain 50.562  26.019
Time taken: 0.035 seconds, Fetched: 10 row(s)

おわりに

変換自体は設定に気を付ければ簡単でした。シェープファイルは様々なサイトで公開されているので、CSV に変換できれば分析などに役立てることができそうです。

spatial-framework-for-hadoopなどで地理情報の関数を使用すればさらに色々なことに活用できそうです。