Pyraid + GeoAlchemy2 + GeoFormAlchemy2 (4)

(承前)

次に、GeoAlchemy2 を使ってジオメトリデータを PostGIS に投入する方法を確認する。 簡単のため、Pyramid + GeoFormAlchemy2 は使用せずにロジックだけ追う。

モデルは以下とする。

class Plot(Base):
    __tablename__ = 'plots'
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    geom = Column(Geometry('geometry', 4612))

作成するジオメトリは、複数の POINT を含むコレクションで、 以下をサンプルデータとする。

dat = [ [6,8], [8,1], [9,44] ]

ジオメトリのオブジェクトは shapely のものを利用する。

from shapely.geometry.point import Point
from shapely.geometry.collection import GeometryCollection
points = []
for i in dat:
  points.append(Point(i))
gc = GeometryCollection(points)

この時点で、例えば gc.to_wkt() とすると

GEOMETRYCOLLECTION (POINT (6.0000000000000000 8.0000000000000000), POINT (8.0000000000000000 1.0000000000000000), POINT (9.0000000000000000 44.0000000000000000))

が得られ、PostGIS に投入可能のように見えるが、残念ながらそうではなく、 SRID が指定されていない、とエラーが出る。

そこで、 GeoAlchemy2 の from_shape() を使用する。これは shapely オブジェクトを GeoAlchemy2 のオブジェクトに変換する函数だが、 SRID 情報を付加することができる。

from geoalchemy2.shape import from_shape
geo = from_shape(gc, srid=4612)

これでジオメトリオブジェクトが作成できたので、Plot インスタンスを生成して PostGIS に投入する。

plot = Plot()
plot.name = "test1"
plot.geom = geo

session.add(plot)
session.commit()

サンプルコードの完全版は以下の通り。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, Text
from geoalchemy2 import Geometry
from geoalchemy2.shape import from_shape
from shapely.geometry.point import Point
from shapely.geometry.collection import GeometryCollection

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

db_url = "postgresql://gis:gis@localhost/gistest"
dat = [ [6,8], [8,1], [9,44] ]

db_engine = create_engine(db_url)
DBSession = sessionmaker(bind=db_engine)
session = DBSession()

class Plot(Base):
    __tablename__ = 'plots'
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    geom = Column(Geometry('geometry', 4612))

points = []
for i in dat:
  points.append(Point(i))

gc = GeometryCollection(points)
geo = from_shape(gc, srid=4612)

plot = Plot()
plot.name = "test1"
plot.geom = geo

session.add(plot)
session.commit()

これで、GeoAlchemy2 の使い方はだいたい解った。