我正在尝试使用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))
但是这种语法不起作用,或者我不会发布这个问题;)。有人有想法吗?谢谢!
答案 0 :(得分:1)
解决方案最终变得相当简单:
首先,定义自定义 GeomvalType ,继承geoalchemy2的 CompositeType 并指定特定于 geomval的 typemap 强>:
class GeomvalType(ga2.types.CompositeType):
typemap = {'geom':ga2.Geometry('MULTIPOLYGON'),'val':Float}
接下来,使用 type_coerce 将 ST_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))