2016-06-09 65 views
0

我有一个多对多的关系,并将OsmAdminUnit(多边形几何图形)的实例分组到OsmAdminAgg实例中。如何用GeoAlchemy2计算ST_Union?

模型的定义主要有:

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个工程管理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上建立它。

回答

0

试试这个:

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()