データベースの作り方で一工夫必要だったわけだが、テーブルに位置情報を格納するカラムを作るのはさらに一工夫必要だ。
ID番号、地点名、位置情報の3つを格納するテーブルを作成することにする。テーブルを作成する際は、まず最初に、位置情報を格納するカラム以外のカラムだけでテーブルを作成する。つまりID番号、地点名だけのテーブルを作成する。例えばこんな具合に。
CREATE TABLE positions (
id int4 SERIAL PRIMARY KEY,
name varchar(128)
);
そして、PostGISをインストールした際にたくさん設置された関数群のうちの一つを使用して、位置情報を格納するカラムを追加する。ここではlatlngというカラム名を使用することにする。
SELECT AddGeometryColumn(‘public’,’positions’,’latlng’,4326,’POINT’,2);
publicはスキーマ名
positionsはテーブル名
latlngはカラム名
4326は測地系の番号(この数字はWGS84)
POINTは型(他にLINESTRINGとかPOLYGONとか)
2は2次元
つまりSELECT文を使って、AddGeometryColumn関数を実行しているということ(この関数でカラムを追加)。この作業でようやくPostGISなテーブルが作成される。ここまできて、ようやく今までやってきたことの意味が理解できるようになる。
4326ってどこから出てきたのか。実はこの数字はPostGISなデータベースに自動的に作られるテーブル「spatial_ref_sys」に全て格納されている。このテーブルには約3000行のデータが格納されているのだが、これらは全て座標系だ。4326の値は外部キーのようになっているということ。
そして位置情報格納カラム「latlng」を作成した関数AddGeometryColumnはカラムを追加するだけでなくて、そのカラムの情報を「geometry_coumns」に格納している。ためしにこのテーブルを開くと、先ほどの関数の引数と似たような内容でデータが格納されていることが一目瞭然だ。
もうここまでくればPostGISに関する理解はほぼできたといっても過言ではない(と思いたい)。「なんで最初からわけのわからないテーブルが二つも作られているの」「どうやって使うの」という問題は通り過ぎてしまったわけで、後は希望通りの処理を返してくれるPostGISな関数がどれなのか、ということを探すことになる。
ただしもう一つ知っておかなければいけないことがある。それは測量に関する知識だ。当たり前だが地球は丸い。というか球だ(実際は球ではなくてもっと歪んでいる)。球を無理やり平面に押し込めたのが地図だ。軟式のテニスボールをカッターで切り刻んでみればわかるが、本来球はどうやっても平面にはならない。でも、それでも人間が理解しやすいようにPostGISは答えを返してくれる(らしい)。そんなPostGISをこれから徐々に使っていこうと思う。
当面PostGISを使うので、思ったことや気づいたこと、わかったことをメモしていくことにする。