Shapeファイルのインポート/エクスポート

shp2pgsqlとpgsql2shpコマンドを使用する場合

ShapeファイルをPostGISに投入

まずはデータベースを作成します。
データベースを作成するときにはテンプレート「template_postgis」を指定しておく必要があります。

PostGIS 2.0では「template_postgis_20」とします。

> createdb -U "ユーザ名" -T template_postgis "データベース名"

shp2pgsqlコマンドを使って、データベースにデータを追加するSQLファイルを作成します。

> shp2pgsql -s "SRID番号" -W "文字コード" "shpファイル名" 
   "テーブル名" "データベース名" > "SQLファイル名"

テーブル名は既存のテーブルを指定することができません。

あと、可能なら-Sオプションを指定しておくといいかもしれません。これはシンプルジオメトリを生成させるオプションで、これを指定しないとマルチジオメトリになってしまいます。投入するデータにマルチジオメトリが無いことがわかっているなら必ず指定しておきましょう。

最後に、できたSQLファイルを実行します。

> psql -U "ユーザ名" -d "データベース名" -f "SQLファイル名"

PostGIS 2.0では、GeometryColumnのカラム名が「the_geom」から「geom」になるように変更されています。

PostgreSQL 9.1以降の場合

投入方法が大幅に変わりました。template_postgisがなくなりました。
新規作成したデータベースをPostGISに対応させるためにはCREATE EXTENSION postgis;を実行します。
コマンドラインから実行する場合は以下の手順になるでしょうか。

> createdb -U "ユーザ名" "データベース名"

> psql -U "ユーザ名" -d "データベース名" -c "create extension postgis;"

後はいっしょ

pgAdmin III を使う場合は以下のようにします。

pgadmin popupmenu

 

データベースのツリーを展開して、”Extensions”を右クリック、ポップアップメニューから”New Extension”を選択

pgadmin new extension dialog

“名前”のドロップダウンリストから”postgis”を選択

 

shp2pgsqlを使って複数のファイルを一括して投入したい場合

後述のogr2ogrを使ったほうが楽なのですが、それが使えない場合は以下のようにするといいかと思います。

まず、以下のコマンドでからのテーブルを作ります。

> shp2pgsql -p -s "SRID番号" -W "文字コード" "shpファイル名" 
"テーブル名" "データベース名" > "SQLファイル名"

-pオプションはテーブル定義のみを作成するオプションで、実際のデータの追加をしません。

この時に指定したファイルはテーブルのテンプレートとなるわけですが、ここで注意なのがvarchar型の文字数がギリギリに設定されてしまいます。なので、ほかのファイルで文字数がこれよりも多いデータが出現した場合エラーになってしまいます。そこで、生成されたsqlファイルを開き、CREATE TABLE句の中にあるvarchar()の数字をあらかじめ多めに書き換えます。

sqlファイルを編集後psqlを実行して空のテーブルを作成後、すべてのファイルに対して以下のコマンドで一括して投入用sqlファイルを作成します(Windowsコマンドプロンプトの場合)。

> for %i in (*.shp) do shp2pgsql -a -s "SRID番号" -W "文字コード" %i 
    "テーブル名" "データベース名" >  %~ni.sql
 
-aオプションは追加モードを表します。一括作成後はpsqlで一括追加を実行します。
 
> for %i in (*.sql) do psql -U "ユーザ名" -d "データベース名" -f %i
 

PostGISからShapeに吐き出し

pgsql2shpコマンドを使って、データベースの内容をShapeファイルに書き出すには以下のようにします。

> pgsql2shp -u "ユーザ名" -P "パスワード" -f "Shapeファイル名"
    "データベース名" "テーブル名"

ユーザ名のオプションが普通は大文字の”-U“なのに、このコマンドだけ小文字なので注意!
また、パスワードを後で聞かれなくて、コマンドラインで指定しないと動かないようです。

ogr2ogrコマンドを使用する場合

OGR2OGR Cheatsheet
に詳しく書かれています。大体以下の要領です。
データベースの作成は上記と同じように行います。

ShapeファイルをPostGISに投入

> ogr2ogr -f "PostgreSQL" -a_srs "EPSG:EPSG番号" PG:"host=ホスト名 user=ユーザ名
     dbname=データベース名 password=パスワード" Shapeフィアル名 -nln テーブル名

-nlnオプションを省略すると拡張子を除いたファイル名がテーブル名になります。
また、プライマリキーの”gid”フィールドは”ogc_fid”、
GeometryColumnの”the_geom”は”wkb_geometry”という名前にそれぞれなります。

さらに、shp2pgsqlとは文字列の取り扱いが異なります。
shp2pgsqlでは文字列はvarchar(255)として登録されますが、
ogr2ogrでは文字列はcharacter(255)で、固定長です。
なので、末尾に余計な空白があります。

このコマンドを使用した場合、shp2pgsqlのようにSQLファイルを出力するのではなく、直接データベースに投入します。

PostGISからShapeに吐き出し

以下のコマンドラインでShapeに吐き出します。

> ogr2ogr -f "ESRI Shapefile" Shapeファイル名 PG:"host=ホスト名 user=ユーザ名
     dbname=データベース名 password=パスワード" "テーブル名"

テーブル名の指定の仕方に注意してください(ここだけ別にダブルクォーテーションで囲みます)。

このコマンドを使用した場合、.prjファイルも作成されて、便利なのですが、
フィールドがアルファベット順に並び替えられてしまいます。


PostGISからShapeに吐き出し

pgsql2shpコマンドを使って、データベースの内容をShapeファイルに書き出すには以下のようにします。

> pgsql2shp -u "ユーザ名" -P "パスワード" -f "Shapeファイル名"
    "データベース名" "テーブル名"

ユーザ名のオプションが普通は大文字の”-U“なのに、このコマンドだけ小文字なので注意!
また、パスワードを後で聞かれなくて、コマンドラインで指定しないと動かないようです。

ogr2ogrコマンドを使用する場合

OGR2OGR Cheatsheet
に詳しく書かれています。大体以下の要領です。
データベースの作成は上記と同じように行います。

ShapeファイルをPostGISに投入

> ogr2ogr -f "PostgreSQL" -a_srs "EPSG:EPSG番号" PG:"host=ホスト名 user=ユーザ名
     dbname=データベース名 password=パスワード" Shapeフィアル名 -nln テーブル名

-nlnオプションを省略すると拡張子を除いたファイル名がテーブル名になります。
また、プライマリキーの”gid”フィールドは”ogc_fid”、
GeometryColumnの”the_geom”は”wkb_geometry”という名前にそれぞれなります。

さらに、shp2pgsqlとは文字列の取り扱いが異なります。
shp2pgsqlでは文字列はvarchar(255)として登録されますが、
ogr2ogrでは文字列はcharacter(255)で、固定長です。
なので、末尾に余計な空白があります。

このコマンドを使用した場合、shp2pgsqlのようにSQLファイルを出力するのではなく、直接データベースに投入します。

PostGISからShapeに吐き出し

以下のコマンドラインでShapeに吐き出します。

> ogr2ogr -f "ESRI Shapefile" Shapeファイル名 PG:"host=ホスト名 user=ユーザ名
     dbname=データベース名 password=パスワード" "テーブル名"

テーブル名の指定の仕方に注意してください(ここだけ別にダブルクォーテーションで囲みます)。

このコマンドを使用した場合、.prjファイルも作成されて、便利なのですが、
フィールドがアルファベット順に並び替えられてしまいます。

用語

意味
SRIDspatial referencing system identifier。
こちらと、
こちらを参照。

アーカイブ