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でShapefileをSQL文に変換する
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.html でPostgreSQLでサポートしている文字エンコード一覧が掲載されている。