Pyramid + GeoAlchemy2 + GeoFormAlchemy2

SQLAlchemy を空間データに拡張した GeoAlchemy2 という パッケージがあるのを見つけた。 同様に FormAlchemy にも GeoFormAlchemy2 があるらしい。 早速試してみる。

PostGIS

PostgreSQL に PostGIS を導入。

FreeBSD pkg でインストールすると /usr/local/share/postgresql/extension に何もインストールされず、 create extention postgis が実行できない。 /usr/local/share/postgresql/contrib/postgis-2.1/ にある SQL ファイルを psql で投入するという従来の方法でデータベースをセットアップする。

$ cd /usr/local/share/postgresql/contrib/postgis-2.1/
$ su pgsql
# psql postgres
postgres=# create database gistest;
postgres=# create role gis with unencrypted password 'gis' login;
postgres=# \c gistest
gistest=# \i postgis.sql
gistest=# \i spatial_ref_sys.sql
gistest=# \i topology.sql
gistest=# \q

GeoAlchemy2

インストールは pip で。

$ pip install GeoAlchemy2

Pyramid 上で使用するには、たとえば models.py に以下のように 記述する。

from geoalchemy2 import Geometry
class Plot(Base):
    __tablename__ = 'plots'
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    geom_point = Column(Geometry('point', 4612))

細かい使用方法は後回しにして、先に GeoFormAlchemy2 をセットアップする。

GeoFormAlchemy2

pip でインストールする。

$ pip install GeoFormAlchemy2

現時点でインストールされるのはバージョン 2.0.dev3 であるが、 OpenLayers のURL が若干間違っているため、そのままだと上手く動作しない。 site-packages/geoformalchemy/pylons/project/+package+/templates/forms/map.mako を以下のように修正する。

) options['openlayers_lib'] = 'http://openlayers.org/dev/OpenLayers.js'
) options['openlayers_lib'] = 'http://openlayers.org/api/OpenLayers.js'

http://openlayers.org/api/OpenLayers.js はバージョン 2系で、 最新版の 3系ではない。 3系の URL を指定してみたが、上手く動作しないようだ。

さらに、pyramid_formalchemy 上で動かすためには、 forms.py に以下を追加する必要がある。

from formalchemy import FieldSet, Grid
from geoformalchemy import GeometryFieldRenderer
from geoalchemy2 import Geometry
FieldSet.default_renderers[Geometry] = GeometryFieldRenderer

動作テスト

この状態で Pyramid を起動し、 pyramid_formalchemy の admin UI で表示させてみる。

__init__.main() に pyramid_formalchemy の admin UI 設定が残っていることを確認。

config.include('pyramid_formalchemy')
config.formalchemy_admin('admin', package="alc")

テーブルを作成してアプリケーションを起動し、ブラウザで http://hogehoge/admin/Plot にアクセスすると以下のようになる。

../../../_images/point1.png

'new plot' ボタンを押すと、 OpenLayers のインターフェイスが現れ、 地図上で空間データが入力できる。今回は models.py で point を 指定したため、点がひとつしか指定できない(新しい点を指定すると 既存の指定点が消されてしまう)。point ではなく multipoint を 指定するとどうなるか、後で確認してみよう。

../../../_images/point2.png

'save' ボタンを押すとデータがテーブルに insert される。

../../../_images/point3.png

Geom 欄の背景に何も表示されていないように見えるのはズームのせいで、 ズームを調整すると背景にちゃんと地図があることが解る。

../../../_images/point4.png

(続く)