重要
翻訳は あなたが参加できる コミュニティの取り組みです。このページは現在 100.00% 翻訳されています。
16.2. レッスン: 単純地物モデル
地理的な地物をデータベースの中にどのように保存し、表現できるでしょうか? このレッスンではOGCが定義した単純地物モデルというひとつの取り組み方を見ていきます。
このレッスンの目標: SFSモデルとは何か、それをどうやって使うかを学習します。
16.2.1. OGCとは
Open Geospatial Consortium (OGC)は、1994年に発足した国際的な民間コンセンサス標準団体です。OGCでは、世界中の370以上の企業、政府、非営利組織そして研究機関が協力し、地理空間コンテンツとサービス、GISデータの解析と交換のための標準の開発と実装を行っています。 - Wikipedia
16.2.2. SFSモデルとは
SQL用単純地物 (SFS) モデルとはデータベースに地理空間データを格納する 非トポロジ的 な方法で、データへのアクセス、操作、構築のための関数を定義しています。
このモデルでは、ポイント、ラインストリング及びポリゴン型(およびそれらを集約したマルチオブジェクト)の地理空間データを定義しています。
詳細は、OGC Simple Feature for SQL 標準を見てください。
16.2.3. ジオメトリフィールドをテーブルに追加する
people(人)テーブルにポイントフィールドを追加しましょう:
alter table people add column geom geometry;
16.2.4. ジオメトリタイプに基づく制約を追加する
お気づきのとおり、ジオメトリフィールドタイプは、フィールドのジオメトリの タイプ を暗黙に指定しません。そのために制約が必要です:
alter table people
add constraint people_geom_point_chk
check(st_geometrytype(geom) = 'ST_Point'::text
OR geom IS NULL);
これは制約をテーブルに追加して、ポイントジオメトリまたはnull値だけを受け入れるようにします。
16.2.5. ★★★ (上級レベル) 自分でやってみよう:
cities(都市)という新しいテーブルを作成して、それに適切な列を追加します。それにはポリゴン(市の境界)を格納するジオメトリフィールドを含めて、ジオメトリをポリゴンに制限する制約を追加して下さい。
答え
16.2.6. geometry_columns テーブルの設定
この時点で、 geometry_columns テーブルにエントリを追加する必要があります:
insert into geometry_columns values
('','public','people','geom',2,4326,'POINT');
なぜでしょう? geometry_columns はデータベースの中のどのテーブルがジオメトリデータを持っているかをアプリケーションが認識するために使われます。
注釈
上記の INSERT 文でエラーが発生した場合は、まずこのクエリを実行してください:
select * from geometry_columns;
列 f_table_name に値 people が含まれている場合、このテーブルは既に登録されており、それ以上何もする必要はありません。
値 2 は次元の数を示します。この場合、 X と Y の2つです。
値 4326 は私たちが使っている投影法を指しています。この場合はWGS 84であり、数字4326で参照されます(EPSGに関する以前の解説を参照して下さい)。
★☆☆ (初級レベル) 自分でやってみよう:
新しい cities レイヤに適切な geometry_columns エントリを追加して下さい
答え
insert into geometry_columns values
('','public','cities','geom',2,4326,'POLYGON');
16.2.7. SQLを使用してテーブルにジオメトリレコードを追加する
これでテーブルが地理的に有効になったので、そこにジオメトリを格納することができます:
insert into people (name,house_no, street_id, phone_no, geom)
values ('Fault Towers',
34,
3,
'072 812 31 28',
'SRID=4326;POINT(33 -33)');
注釈
上記の新しいエントリには使用する投影法(SRID)を指定する必要があります。これはプレーンテキストを用いて新しいポイントのジオメトリを入力すると正しい投影法の情報が自動的に付加されないためです。新しいポイントはデータセットと同じSRIDを使用する必要がありますのでそれを指定しなければいけません。
グラフィカルなインターフェイスを使用していると、たとえば各ポイントの投影法の指定は自動的でしょう。つまり以前行ったように、データセットに投影法を指定しておけば、追加したい各ポイントについて正しい投影法を使用することを通常は気にする必要はありません。
ここでQGISを開いて people テーブルを表示するのが良いでしょう。また、データベースでレコードの編集/追加/削除を試し、それから選択クエリを実行してデータがどのように変わったかを見ます。
QGISでPostgreSQLレイヤを読み込むには メニューオプションまたは次のツールバーボタンを使用します:
ダイアログが表示されます:
新規 ボタンをクリックしてこのダイアログを開きます:
新しい接続を定義します。例えば:
Name: myPG
Service:
Host: localhost
Port: 5432
Database: address
User:
Password:
QGISが address データベースを見つけたかどうか、そしてユーザー名とパスワードが正しいことを確認するには、 接続テスト をクリックします。正しく動作したら ユーザー名の保存 と パスワード保存 の横にあるチェックボックスをチェックします。そして OK ボタンをクリックしてこの接続を作成します。
PostgreSQLレイヤを追加 ダイアログに戻り 接続 をクリックし、いつものようにプロジェクトにレイヤを追加します。
★★☆ (中級レベル) 自分でやってみよう:
人の名前と街路の名前、位置(geom列)をプレーンテキストとして表示するクエリを作成して下さい。
答え
select people.name,
streets.name as street_name,
st_astext(people.geom) as geometry
from streets, people
where people.street_id=streets.id;
結果:
name | street_name | geometry
--------------+-------------+---------------
Roger Jones | High street |
Sally Norman | High street |
Jane Smith | Main Road |
Joe Bloggs | Low Street |
Fault Towers | Main Road | POINT(33 -33)
(5 rows)
ご覧のとおり、この制約により、データベースにnullを追加できます。
16.2.8. 結論
空間オブジェクトをデータベースに追加してGISソフトウェアで表示する方法を見てきました。
16.2.9. 次は?
次はデータベースへデータをインポートする方法、およびデータベースからデータをエクスポートする方法を見ていきます。
