5. 空間データのロード

様々な種類のライブラリのやアプリケーションがサポートするので、PostGIS にはデータのロードに関捨てう多数の選択肢があります。

まず、データベースのバックアップファイルから作業データをロードし、その後、一般的なツールを使って他の GIS データフォーマットをロードする標準的な方法を確認します。

5.1. バックアップファイルのロード

  1. pgAdmin ブラウザ内で、nyc データベースのアイコンを 右クリック して、Restore... を選択します。

    _images/data_loading_1.png
  2. Browse to the location of your workshop data data directory (available in the workshop data bundle), and select the nyc_data.backup file.

    _images/data_loading_2.png
  3. Data/Objects タブをクリックして Do not save セクションまで下りて、Owner を**有効**にします。

    _images/data_loading_2a.png
  4. **Restore**ボタンをクリックします。データベースの復元はエラーなく完了するまで実行されます。

    _images/data_loading_3.png
  5. ロードが完了すると、nyc データベースを右クリックして、Refresh オプションを選択して、データベースに存在するテーブルに関するクライアント側の情報を更新します。

    _images/data_loading_4.png

注釈

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マネージャ に行き、次の通りデータベースを展開します:

_images/qgis_dbmanager.png

そこから レイヤ/ファイルのインポート メニューオプションを使って多数の空間フォーマットのロードができます。多数の空間フォーマットからのデータのロードと多数の空間フォーマットへのデータのエクスポートに加えて、アドホックのクエリをキャンバスに追加したり、データベースのビューとして定義することができます。