【问题标题】:how to use composite data types (e.g. geomval) in SQLAlchemy?如何在 SQLAlchemy 中使用复合数据类型(例如 geomval)?
【发布时间】:2013-07-16 06:54:39
【问题描述】:

我正在尝试使用 SQLAlchemy(0.8)/GeoAlchemy2(0.2.1) 复制嵌套的原始 PostGreSQL/PostGIS 栅格查询,但不知道如何访问 geomval 数据类型的组件。它是一种复合数据类型,返回一个“geom”和一个“val”。

这是有效的原始查询:

SELECT (dap).val, (dap).geom
FROM (SELECT ST_DumpAsPolygons(rast) as dap FROM my_raster_table) thing

我目前正在使用的 SQLAlchemy 查询:

import geoalchemy2 as ga2
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker

metadata = MetaData()
my_raster_table = Table('my_raster_table', metadata,
                  Column('rid', Integer),
                  Column('rast', ga2.Raster))

engine = create_engine(my_conn_str)
session = sessionmaker(engine)()

q = session.query(ga2.func.ST_DumpAsPolygons(my_raster_table.c.rast).label('dap'))

然后我想在子查询中访问它,如下所示:

q2 = session.query(ga2.func.ST_Area(q.subquery().c.dap.geom))

但是这种语法不起作用,否则我不会发布这个问题;)。有人有想法吗?谢谢!

【问题讨论】:

    标签: postgresql sqlalchemy postgis raster geoalchemy


    【解决方案1】:

    解决方案最终相当简单:

    首先,定义一个自定义的 GeomvalType,继承 geoalchemy2 的 CompositeType 并指定一个特定于 geomvaltypemap

    class GeomvalType(ga2.types.CompositeType):
        typemap = {'geom':ga2.Geometry('MULTIPOLYGON'),'val':Float}
    

    接下来,使用 type_coerceST_DumpAsPolygons 结果转换为初始查询中的 GeomvalType

    q = session.query(type_coerce(ga2.func.ST_DumpAsPolygons(my_raster_table.c.rast), GeomvalType()).label('dap'))
    

    最后,像我之前尝试的那样从子查询中访问它(成功!):

    q2 = session.query(ga2.func.ST_Area(q.subquery().c.dap.geom))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2018-07-25
      • 2021-04-26
      • 2011-07-14
      相关资源
      最近更新 更多