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 の使い方はだいたい解った。
前の投稿:
Pyraid + GeoAlchemy2 + GeoFormAlchemy2 (3)
次の投稿:
FormAlchemy のカスタマイズ