0

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 の上にこれを構築しています。

4

2 に答える 2