※当ブログではアフィリエイト広告を利用しています。
地理データを 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プロジェクトへようこそ!
上記サイトの「ダウンロードする」からダウンロードぺージに移動します。
自分のプラットフォーム向けのインストーラーをダウンロードします。今回は Windows の 64Bit 版を使用しましたが、MacOSX・Linux 版もあります。
インストールは特に設定を変えることなく、そのまま進めばOKでした。
2.シェープファイルの読み込み
QGIS インストール後、デスクトップにQGIS 2.16
というフォルダができるため、その中のQGIS Desktop 2.16.3
より起動します。(バージョン部分は変わる可能性があります)
シェープファイルを QGIS で読み込みます。今回は下記のサイトで提供されている世界の境界のデータセット(TM_WORLD_BORDERS-0.3.zip)を使用しました。
ダウンロード元: thematicmapping.org
シェープファイルの読み込みは*.shp
を QGIS にドラッグ&ドロップするだけで OK です。読み込むと QGIS の表示が以下の画像のようになります。
3.CSV ファイルへの変換
CSV ファイルに変換するには Layers Panel で右クリックし、 Save As… を選択します。
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
で出力されます。
設定例は以下の画像のようになります。
変換後のファイルです。WKT
フィールドが地理情報の範囲を表すため非常に長いですが、ダウンロード元サイトに記載のとおりのフィールドでデータが出力されています。
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などで地理情報の関数を使用すればさらに色々なことに活用できそうです。