使用 GeoAlchemy 将 PostGIS 几何数据检索为 WKT,无需进行额外查询

问题描述 投票:0回答:1

我正在使用 FastAPI 后端连接到 PostGIS 服务器。
我使用 SQLAlchemy 和 GeoAlchemy2 作为扩展来将数据库表映射到对象。
其中一个表称为“联盟”,并有一列几何类型。
我想要的是:以WKT格式从该列检索数据。

表中相关部分:

class Consortium(Base):
    __tablename__ = "consortiums"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    geometry = mapped_column(Geometry)

目前,我找到了两种有效的方法:

  1. 进行显式查询(在本例中仅针对 1 个元素):
geometry_wkt = session.scalars(select(new_c.geometry.ST_AsText())).first()
  1. 使用
    Computed
    列:
# declared within the model, right below the geometry column
geometry_wkt: Mapped[str] = mapped_column(Computed("ST_AsText(geometry)"))

我尝试的另一个解决方案是:

from geoalchemy2.functions import ST_AsText

   # added on model
   @hybrid_property
    def geometry_wkt(self):
        return self.geometry.ST_AsText()

但是当我尝试

print
联盟模型时,这似乎只是返回函数本身而不是值

print(new_c) # outputs: ST_AsText(ST_GeomFromEWKB(:ST_GeomFromEWKB_1))

现在我选择了我可以接受的解决方案2,我只是想知道这是否是我正在尝试做的事情的正确方法,或者是否有更有效的方法或类似“最佳实践”的方法”.

python sqlalchemy fastapi postgis geoalchemy2
1个回答
0
投票

GeoAlchemy2 有一个名为

to_shape
的方法,来自其 shapely 集成。其用法如下:

consortium = Session.query(Consortium).first()
shp = to_shape(consortium.geometry)

shp
将是一个形状优美的几何体。
使用 shapely 的
to_wkt
方法
,您可以获得该几何图形的 WKT 表示,而无需再次查询数据库:

to_wkt(shp)

请记住,我并不是说你的方法是错误的:)
我只是提供一个带有单个数据库查询的替代方案,然后在您的应用程序的代码端进行转换!

© www.soinside.com 2019 - 2024. All rights reserved.