5. 空間データのロード¶
様々な種類のライブラリのやアプリケーションがサポートするので、PostGIS にはデータのロードに関捨てう多数の選択肢があります。
まず、データベースのバックアップファイルから作業データをロードし、その後、一般的なツールを使って他の GIS データフォーマットをロードする標準的な方法を確認します。
5.1. バックアップファイルのロード¶
pgAdmin ブラウザ内で、nyc データベースのアイコンを 右クリック して、Restore... を選択します。
Browse to the location of your workshop data data directory (available in the workshop data bundle), and select the
nyc_data.backup
file.Data/Objects タブをクリックして Do not save セクションまで下りて、Owner を**有効**にします。
**Restore**ボタンをクリックします。データベースの復元はエラーなく完了するまで実行されます。
ロードが完了すると、nyc データベースを右クリックして、Refresh オプションを選択して、データベースに存在するテーブルに関するクライアント側の情報を更新します。
注釈
PostgreSQL のバックアップファイルの代わりに、ネイティブ空間データフォーマットからのデータロードを実際に試してみたいのでしたら、次から数セクションは、様々なコマンドラインツールや QGIS DbManager を使ったロードする方法のガイドになっています。pgAdminによるデータのロードが済んでいる場合には飛ばせます。
5.2. ogr2ogrでのロード¶
ogr2ogr
は、GISで使用される一般的なファイルフォーマットと一般的な空間データベースを含むデータフォーマットの相互変換のためのコマンドラインユーティリティです。
- Windows:
ogr2ogrのビルドは GIS Internals からダウンロードできます。
ogr2ogr は QGIS Install の一部として含まれていて、OSGeo4W シェルから実行できます。
ogr2ogr のビルドは MS4W からダウンロードできます。
- MacOS:
Postgres.app をインストールした場合には、
/Applications/Postgres.app/Contents/Versions/*/bin
ディレクトリ内にogr2ogr
があります。最後に、HomeBrew をインストールしている場合には gdal パッケージをインストールして
ogr2ogr
にアクセスできます。
- Linux:
パッケージから QGIS をインストールした場合には、
ogr2ogr
がインストールされていて、gdal または libgdal パッケージの一部として PATH 上に存在するはずです。
PostGIS ワークショップのデータディレクトリには 2000/
サブディレクトリがあります。ここには、 2000年米国国勢調査からのシェープファイルがあります。2010年の米国国勢調査が2000年のデータに取って代わっています。これらのファイルを使って、バックアップファイルを使ってロードを終えているデータとで発生する名前衝突を回避するようなデータロードの練習ができます。この手順を実行する時は、シェルのカレントディレクトリを 2000/
サブディレクトリにして下さい。
export PGPASSWORD=mydatabasepassword
パスワードを接続文字列に組み入れて渡すのではなく、環境変数に置いて、コマンド実行のプロセスリストで表示されないようにします。
Windows 上では、export
でなく set
を使わないといけないことにご注意ください。
ogr2ogr \
-nln nyc_census_blocks_2000 \
-nlt PROMOTE_TO_MULTI \
-lco GEOMETRY_NAME=geom \
-lco FID=gid \
-lco PRECISION=NO \
Pg:"dbname=nyc host=localhost user=pramsey port=5432" \
nyc_census_blocks_2000.shp
視覚的に分かりやすくするためにこれらの行に \
を付けて表示していますが、シェルでは 1行 で書くべきです。
ogr2ogr
は**膨大な**オプションが用意されていますが、ここでは、一握りしか使いません。行ごとにコマンドの説明をします。
ogr2ogr \
実行ファイル名です! 実行ファイルが PATH 内にあるようにするか、実行ファイルのフルパスを使うかしなければなりません。どちらを使うかは設定に依存します。
-nln nyc_census_blocks_2000 \
nln オプションは "new layer name" の略です。対象データベース内に生成するテーブル名を設定します。
-nlt PROMOTE_TO_MULTI \
nlt オプションは "new layer type" の略です。特にシェープファイル入力では、新しいレイヤのタイプがマルチ系ジオメトリになることが多く、ジオメトリタイプを "POLYGON" でなく "MULTIPOLYGON" として使うよう指示する必要があります。
-lco GEOMETRY_NAME=geom \
-lco FID=gid \
-lco PRECISION=NO \
lco オプションは「レイヤ作成オプション」の略です。ドライバによって異なる生成オプションを持ちます。ここでは PostgreSQL driver の 3個 のオプションを使っています。
GEOMETRY_NAME では、ジオメトリカラムのカラム名を設定します。デフォルトよりも "geom" を使って、テーブルはこのワークショップの標準のカラム名と一致します。
FID では主キー名を設定します。こちらもワークショップ標準である "gid" をデフォルトより優先します。
PRECISION は、データベース内で数値フィールドをどう表現するかを制御します。シェープファイルのロードのデフォルトでは、"numeric"型 を使います。"integer" や "double precision" のような単純な数値型と比べて精度は高いですが、扱いにくいです。"numeric"型 を切るには "NO" を使います。
Pg:"dbname=nyc host=localhost user=pramsey port=5432" \
ogr2ogr
内の引数の順序は、大まかに言うと、実行ファイル、オプション、**出力先**位置、**入力元**位置、となっています。ですので、この PostgreSQL データベースへの接続文字列は、出力です。"Pg:" の部分はドライバ名で、接続文字列 は引用符で囲みます (接続文字列に空白が含まれる可能性があるため)。
nyc_census_blocks_2000.shp
この場合のソースデータセットは、読み込もうとしているシェープファイルです。ここに接続文字列を置き、その後にレイヤ名リストを並べると、1回 の呼び出しで複数レイヤを読むことができますが、この場合、ロードするシェープファイルは一つだけです。
5.3. シェープファイル? なんですかそれ?¶
「このシェープファイルは何なのだろう?」と自問するかもしれません。「シェープファイル」は一般にファイル名の前半が同じ (たとえば nyc_censys_blocks) で、.shp
, .shx
, .dbf
などの拡張子で終わるファイル群です。実際のシェープファイルは特に .shp
拡張子を持つファイルに関連しています。ただし、必須のサポートファイルなしで .shp
ファイル単独での配布では不完全です。
必須ファイルは次の通りです:
.shp
—シェープファイル フォーマット、地物ジオメトリ自体.shx
—シェープ インデックスフォーマット、地物ジオメトリの位置インデックス.dbf
—属性フォーマット、地物ごとのdBaseIIIの列属性
任意ファイルは次の通りです:
.prj
—投影ファイル、座標系と投影情報、Well-Known Text 書式で記述された投影のプレーンテキストファイル
shp2pgsql
ユーティリティは、シェープファイルのデータを、バイナリから、データベースにデータをロードする一連の SQL コマンドに変換して PostGIS で使用できるようにします。
5.4. shp2pgsql によるロード¶
shp2pgsql
は、シェープファイルを SQL に変換します。PostGIS コードベースの一部をなし、PostGIS パッケージに付属する変換ユーティリティです。PostgreSDQL を、お手持ちのコンピュータにインストールした場合には、shp2pgsql
が一緒にインストールされ、インストール先の実行可能ディレクトリ内にあります。
ogr2ogr
と違い shp2pgsql
は、直接データベースに接続せず、入力シェープファイルと等価な SQL を吐き出すだけです。SQL をデータベースに渡すのに「パイプ」を使うか、SQL をファイルとしてからロードするかができますが、どちらを選ぶかはユーザ次第です。
前と同じデータのロードを行う呼び出し例を示します:
export PGPASSWORD=mydatabasepassword
shp2pgsql \
-D \
-I \
-s 26918 \
nyc_census_blocks_2000.shp \
nyc_census_blocks_2000 \
| psql dbname=nyc user=postgres host=localhost
コマンドを1行ずつ説明します。
shp2pgsql \
実行可能プログラムです! 元のデータファイルを読み、ファイルに送ったり、 psql
へのパイプでデータベースに直接ロードしたりできる SQL を吐きます。
-D \
D フラグは、「ダンプフォーマット」で生成するように指示するものです。デフォルトの「INSERT フォーマット」よりもずっとロードが早くなります。
-I \
I フラグは、ロード完了後にテーブル上に空間インデックスを生成するよう指示するものです。
-s 26918 \
s フラグは、データの「SRID」 (Spatial Reference IDentifier, 空間参照系ID) が何かを指示するものです。このワークショップのソースデータは全て "UTM 18" で、SRID は 26918 です (下記参照)。
nyc_census_blocks_2000.shp \
読み取るソースのシェープファイルです。
nyc_census_blocks_2000 \
ロードするテーブル生成時に使用されるテーブル名です。
| psql dbname=nyc user=postgres host=localhost
このユーティリティで生成されるのは SQL のストリームです。"|" は、ストリームを受け取り、データベースの端末用プログラムである psql
への入力として使うようにするためのものです。psql
への引数は、出力先データベースへの接続文字列です。
5.5. SRID 26918? なんですかこれは?¶
インポート処理のほとんどが一目瞭然ですが、経験豊富な GIS プロフェッショナルでさえ SRID につまずくことがあります。
"SRID" は "Spatial Reference IDentifier" (空間参照系識別子) の略です。出力データの地理座標系と投影法の全てのパラメータを定義します。SRID は、地図投影法の情報 (非常に複雑になることがあります) の全てを一つの数字にまとめているので便利です。
本ワークショップの地図投影法の定義を見るには、次のようにオンラインデータベースで調べるか、
または、PostGIS 内で直接 spatial_ref_sys
テーブルへのクエリを実行します。
SELECT srtext FROM spatial_ref_sys WHERE srid = 26918;
注釈
PostGIS の spatial_ref_sys
テーブルは OGC 標準のテーブルで、データベースが把握している空間参照系の全てを定義しています。PostGIS に付属するデータには、3000 件以上の空間参照系と、変換/投影変換に必要な詳細情報があります。
いずれの場合でも、26918 という空間参照系の文字表現が得られます (分かりやすくするため、ここではきれいに印字しています):
PROJCS["NAD83 / UTM zone 18N",
GEOGCS["NAD83",
DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],
AUTHORITY["EPSG","6269"]],
PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4269"]],
UNIT["metre",1,AUTHORITY["EPSG","9001"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",-75],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
AUTHORITY["EPSG","26918"],
AXIS["Easting",EAST],
AXIS["Northing",NORTH]]
データディレクトリから nyc_neighborhoods.prj
を開くと、同じ投影法定義が見えます。
ニューヨーク市等の地方機関から得たデータは、通常はその地域の投影法で、「州平面」 (訳注; 米国で使われるものです)や「UTM」などと示されます。ここでの投影法は "Universal Transverse Mercator (UTM) Zone 18 North" (UTM ゾーン18 北半球) で、EPSG:26918 となります。
5.6. やること: QGISを使ったデータ表示¶
QGIS は、データを素早く見るためのデスクトップ GIS ビューア/エディタです。シェープファイルや PostGIS データベースを含む、様々な種類のフォーマットのデータを表示することができます。グラフィカルインタフェースによって、簡単に手持ちデータを探索できますし、簡単な試験や、手早いスタイル設定も可能です。
このソフトウェアを使って PostGIS データベースに接続してみましょう。このアプリケーションは https://qgis.org からダウンロードできます。
まず、メニューの レイヤ->レイヤを追加->PostGISレイヤを追加->新規 を使って、PostGIS データベースへの接続を生成します。接続が生成されると、「接続」をクリックして表示したいテーブルを選択することで、レイヤを追加することができます。
5.7. QGIS DBマネージャを使用してデータをロードする¶
QGISに DBマネージャ と呼ばれるツールが付属しています。PostGISを含む様々な種類のデータベースに接続することができます。PostGIS Database 接続の設定を作った後は、データベース->DBマネージャ に行き、次の通りデータベースを展開します:
そこから レイヤ/ファイルのインポート メニューオプションを使って多数の空間フォーマットのロードができます。多数の空間フォーマットからのデータのロードと多数の空間フォーマットへのデータのエクスポートに加えて、アドホックのクエリをキャンバスに追加したり、データベースのビューとして定義することができます。