我正在使用 FastAPI 后端连接到 PostGIS 服务器。
我使用 SQLAlchemy 和 GeoAlchemy2 作为扩展来将数据库表映射到对象。
其中一个表称为“联盟”,并有一列几何类型。
我想要的是:以WKT格式从该列检索数据。
表中相关部分:
class Consortium(Base):
__tablename__ = "consortiums"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
geometry = mapped_column(Geometry)
目前,我找到了两种有效的方法:
geometry_wkt = session.scalars(select(new_c.geometry.ST_AsText())).first()
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,我只是想知道这是否是我正在尝试做的事情的正确方法,或者是否有更有效的方法或类似“最佳实践”的方法”.
to_shape
的方法,来自其 shapely 集成。其用法如下:
consortium = Session.query(Consortium).first()
shp = to_shape(consortium.geometry)
shp
将是一个形状优美的几何体。to_wkt
方法,您可以获得该几何图形的 WKT 表示,而无需再次查询数据库:
to_wkt(shp)
请记住,我并不是说你的方法是错误的:)
我只是提供一个带有单个数据库查询的替代方案,然后在您的应用程序的代码端进行转换!