16.2. Lesson: 単純地物モデル

データベースの中にどのように地物を保存し、表現できるでしょうか? このレッスンではOGCによって定義されている単純地物モデルを見ていきます。

このレッスンの目標: SFSモデルとは何か、それをどうやって使うかを学習します。

16.2.1. OGCとは

Open Geospatial Consortium (OGC)は、1994年に発足した国際的な自発的コンセンサス標準団体です。OGCでは、世界中の370以上の民間団体、政府、非営利、研究期間が協力し、地理空間コンテンツとサービス、GISデータの解析と交換のための標準の開発と実装を行っています。 - Wikipedia

16.2.2. SFSモデルとは

SQL用単純地物 (SFS) モデルとはデータベースに地理空間データを格納する 非トポロジ的 な方法で、データへのアクセス、操作、構築のための関数を定義しています。

../../../_images/ogc_sfs.png

モデルはポイントやラインストリング、ポリゴンのタイプ(そしてそれらの集合)で地理空間データを定義します。

For further information, have a look at the OGC Simple Feature for SQL standard.

16.2.3. ジオメトリフィールドをテーブルに追加する

people(人)テーブルにポイントフィールドを追加しましょう:

alter table people add column the_geom geometry;

16.2.4. ジオメトリタイプに基づく制約を追加する

ジオメトリフィールドタイプは、フィールドのジオメトリの タイプ を暗黙的に指定していないことに気づくでしょう。

alter table people
add constraint people_geom_point_chk
    check(st_geometrytype(the_geom) = 'ST_Point'::text
          OR the_geom IS NULL);

これはポイントジオメトリまたはnull値だけを受け入れる制約をテーブルに追加します。

16.2.5. Try Yourself hard

cities(都市)という新しいテーブルを作成して、それに適切な列を追加します。それにはポリゴン(市の境界)を格納するジオメトリフィールドを含めて、ジオメトリをポリゴンに制限する制約を追加して下さい。

結果をチェックする

16.2.6. geometry_columns テーブルの設定

この時点で、 geometry_columns テーブルにエントリを追加する必要があります:

insert into geometry_columns values
  ('','public','people','the_geom',2,4326,'POINT');

なぜでしょう? geometry_columns はデータベースの中のどのテーブルがジオメトリデータを持っているかをアプリケーションが認識するために使われます。

注釈

上記の INSERT 文でエラーが発生した場合は、まずこのクエリを実行してください:

select * from geometry_columns;

f_table_name に値 people が含まれている場合、このテーブルは既に登録されており、それ以上何もする必要はありません。

The value 2 refers to the number of dimensions; in this case, two: X and Y.

4326 の値は私たちが使っている投影法を指しています。WGS 84は4326の数字で参照されます(EPSGに関する以前の解説を参照して下さい)。

Try Yourself basic

新しい cities レイヤーのための適切なエントリを geometry_columns に追加して下さい

結果をチェックする

16.2.7. SQLを使用してテーブルにジオメトリレコードを追加する

テーブルが地理的に有効になったので、そこにジオメトリを格納することができます:

insert into people (name,house_no, street_id, phone_no, the_geom)
        values ('Fault Towers',
                 34,
                 3,
                 '072 812 31 28',
                 'SRID=4326;POINT(33 -33)');

注釈

上記の新しいエントリには使用する投影法(SRID)を指定する必要があります。これはプレーンテキストを用いて新しいポイントのジオメトリを入力すると正しい投影情報が自動的に付加されないためです。新しいポイントはデータセットと同じSRIDを使用する必要がありますのでそれを指定しなければいけません。

もしグラフィカルなインターフェイスを使用していれば、たとえば、各ポイントの投影法は自動で指定されます。つまり以前行ったようにデータセットに投影法を指定しておけば、すべてのポイントに対して正しい投影法を指定しなくてもよいのです。

ではQGISを開いて people テーブルを表示します。そしてデータベースでレコードの編集/追加/削除を試し、選択クエリを実行してデータがどのように変更されたかを見ます。

QGISでPostGISレイヤーを読み込むには レイヤー ► PostGISレイヤーの追加 メニューオプションまたは次のツールバーボタンを使用します:

addPostgisLayer

ダイアログが表示されます:

../../../_images/add_postgis_layer_dialog.png

新規 ボタンをクリックしてこのダイアログを開きます:

../../../_images/new_postgis_connection.png

新しい接続を定義します。例えば:

Name: myPG
Service:
Host: localhost
Port: 5432
Database: address
User:
Password:

QGISが address データベースを見つけたかどうか、そしてユーザー名とパスワードが正しいことを確認するには、 接続テスト をクリックします。正しく動作したら ユーザー名の保存パスワード保存 の横にあるチェックボックスをチェックします。そして OK ボタンをクリックしてこの接続を作成します。

PostGISレイヤーの追加 ダイアログに戻り 接続 をクリックし、いつものようにプロジェクトにレイヤーを追加します。

Try Yourself moderate

人の名前と街路の名前、位置(the_geom列)をプレーンテキストとして表示するクエリを作成して下さい。

結果をチェックする

16.2.8. In Conclusion

空間オブジェクトをデータベースに追加してGISソフトウェアで表示する方法を見てきました。

16.2.9. What's Next?

次はデータベースへデータをインポートする方法、およびデータベースからデータをエクスポートする方法を見ていきます。