2016-06-09 2 views
0

J'ai une relation plusieurs-à-plusieurs, avec des instances de OsmAdminUnit (géométries polygonales) regroupées en instances OsmAdminAgg.Comment calculer ST_Union avec GeoAlchemy2?

Les définitions du modèle sont essentiellement:

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) 

Maintenant que je suis mal à faire est de sélectionner OsmAdminUnits qui appartiennent à une certaine OsmAdminAgg et obtenir les polgyons fusionnées en appliquant ST_Union de GeoAlchemy.

Sélection de toutes les unités d'administration qui appartiennent à l'admin agg avec id = 1 œuvres:

units = OsmAdminUnit.query.filter(OsmAdminUnit.agg_units.any(id=1)).all() 

Mais je ne comprends pas comment je peux appliquer ST_Union sur ce résultat. Mon approche à ce jour était:

union = db.session.query(
     OsmAdminUnit.geometry.ST_Union().ST_AsGeoJSON().label('agg_union') 
     ).filter(OsmAdminUnit.agg_units.any(id=1)).subquery() 

Alors, comment puis-je obtenir l'union de ces géométries, et obtenir comme GeoJSON? Btw, Je construis cela sur Flask, en utilisant SQLAlchemy, Flask-SQLAlchemy, Geoalchemy2.

Répondre

0

Essayez ceci:

from sqlalchemy.sql.functions import func 

union = db.session.query(func.ST_AsGeoJSON(func.ST_Union(
    OsmAdminUnit.geometry)).label('agg_union') 
    ).filter(OsmAdminUnit.agg_units.any(id=1)).subquery()