【问题标题】:How to calculate ST_Union with GeoAlchemy2?如何使用 GeoAlchemy2 计算 ST_Union?
【发布时间】:2021-02-28 07:47:03
【问题描述】:

我有一个多对多的关系,将 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。

选择所有属于 admin agg 且 id=1 的管理单元有效:

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 上构建它。

【问题讨论】:

    标签: python sqlalchemy postgis geoalchemy2


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 抱歉回答晚了,但使用 func 有所不同。谢谢。
    【解决方案2】:

    您可以在GeoAlchemy 2 docs 中看到一个基本模板。本质上,您需要将 func 传递给查询而不是模型,以选择联合本身。

    在你的情况下,类似于:

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

    这会获取与过滤器匹配的 OsmAdminUnit 记录的 geometry 值的联合,并将其作为字符串化的 GeoJSON 返回。

    接受的答案对我不起作用,我认为导入可能在我使用的 sqlalchemy 版本中有所不同。

    【讨论】:

    • 如果你能至少以极简的方式解释你的代码会很有帮助
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2021-01-19
    相关资源
    最近更新 更多