如何用 GeoAlchemy2 计算 ST_Union?
How to calculate ST_Union with GeoAlchemy2?
我有一个多对多的关系,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 之上构建它。
试试这个:
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()
您可以在 GeoAlchemy 2 docs 中看到一个基本模板。本质上,您需要将 func
传递给查询,而不是模型,传递给 select 联合本身。
在你的情况下,类似于:
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
值的并集,并且 returns 它作为字符串化的 GeoJSON。
接受的答案对我不起作用,我认为导入可能与我使用的 sqlalchemy 版本不同。
我有一个多对多的关系,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 之上构建它。
试试这个:
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()
您可以在 GeoAlchemy 2 docs 中看到一个基本模板。本质上,您需要将 func
传递给查询,而不是模型,传递给 select 联合本身。
在你的情况下,类似于:
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
值的并集,并且 returns 它作为字符串化的 GeoJSON。
接受的答案对我不起作用,我认为导入可能与我使用的 sqlalchemy 版本不同。