OsmAdminUnit (ポリゴン ジオメトリ) のインスタンスが OsmAdminAgg インスタンスにグループ化された、多対多の関係があります。
モデル定義は基本的に次のとおりです。
class OsmAdminUnit(db.Model):
__tablename__ = 'osm_admin'
id = db.Column(db.Integer, primary_key=True)
geometry = db.Column(Geometry(
geometry_type='GEOMETRY',
srid=3857), nullable=False)
agg_units = db.relationship('OsmAdminAgg',
secondary=aggregations,
backref=db.backref('osm_admin', lazy='dynamic'))
class OsmAdminAgg(db.Model):
__tablename__ = 'admin_agg'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), unique=True, nullable=False)
今私が苦労しているのは、特定の OsmAdminAgg に属する OsmAdminUnits を選択し、GeoAlchemy から ST_Union を適用して polgyons をマージすることです。
id=1 の admin agg に属するすべての管理ユニットを選択すると機能します。
units = OsmAdminUnit.query.filter(OsmAdminUnit.agg_units.any(id=1)).all()
しかし、その結果に ST_Union を適用する方法がわかりません。これまでの私のアプローチは次のとおりです。
union = db.session.query(
OsmAdminUnit.geometry.ST_Union().ST_AsGeoJSON().label('agg_union')
).filter(OsmAdminUnit.agg_units.any(id=1)).subquery()
では、これらのジオメトリの結合を取得し、それを GeoJSON として取得するにはどうすればよいでしょうか?
ところで、SQLAlchemy、Flask-SQLAlchemy、Geoalchemy2 を使用して、Flask の上にこれを構築しています。