GIG

赴くままに技術を。

Natural EarthのデータをPostGISに登録する

データを取得する

Natural Earthは世界中の地形に関わるパブリックデータを利用できるサービスである。

今回は、http://www.naturalearthdata.com/downloads/10m-cultural-vectors/ にある国データを持ってくる。

データベースworldを作る

今回はworldというデータベースにデータを登録してみる。

 $ createdb world -E UTF-8
 $ psql world
 world=# CREATE EXTENSION postgis;
 CREATE EXTENSION 

shp2pgsqlでShapefileSQL文に変換する

shp2pgsqlは-pオプションでテーブルのCREATE文が作成できる。

$ shp2pgsql -p -s 4236 -W "LATIN1" ne_10m_admin_0_countries.shp country >  
country0.sql

確認してみよう。

$ less country0.sql
SET CLIENT_ENCODING TO UTF8;
SET STANDARD_CONFORMING_STRINGS TO ON;
BEGIN;

CREATE TABLE "country" (gid serial, "scalerank" int2, "featurecla" varchar(30), "labelrank" float8, "sovereignt" varchar(254), "sov_a3" varchar(254), "adm0_dif" float8, "level" float8, "type" varchar(254), "admin" varchar(254), "adm0_a3" varchar(254), "geou_dif" float8, "geounit" varchar(254), "gu_a3" varchar(254), ・・・(以下、省略)・・・

最後には、COMMITで変更の反映が行われていることが分かる。 次にデータを入れてみよう。先ほど-pオプションを利用していたところを今度は-aオプションを利用する。

$ shp2pgsql -a -s 4236 -W "LATIN1" ne_10m_admin_0_countries.shp country >  
country1.sql

こちらもlessなどで確認してみると、INSERT分が複数行記述されていることが分かる。 最後にデータベースworldにデータを挿入しよう。

$ psql world < country0.sql
$ psql world < country1.sql

トラブルシューティング

shp2pgsqlを使って、Shapefileを変換しようとしたら、以下ようなエラーが発生した。 エラーの内容としては、文字コードとしてUTF-8を指定しているけど、ファイルの文字コードが違うとのことで、エラーが発生している。

$ shp2pgsql -s 4236 ne_10m_admin_0_countries.shp country > country.sql
Shapefile type: Polygon
Postgis type: MULTIPOLYGON[2]
Unable to convert data value to UTF-8 (iconv reports "Illegal byte sequence"). Current   
encoding is "UTF-8". Try "LATIN1" (Western European), or one of the values described at   
http://www.postgresql.org/docs/current/static/multibyte.html.

メッセージ通り、LATIN1(Western European)を利用すれば良さそうなんだけど、とりあえずフィアルの文字エンコーディングを調べてみる。

$ vi ne_10m_admin_0_countries.shp

:set fileencoding

fileencoding=latin1

ちなみにfile --mineコマンドだとbinaryというだけしか分からなかった。従って、-Wオプションを用いてLATIN1を指定すれば良い。ちなみにエラーメッセージに出ている参考のリンク先はhttp://www.postgresql.org/docs/current/static/multibyte.htmlPostgreSQLでサポートしている文字エンコード一覧が掲載されている。