如何将地理列转换为纬度和经度?

Luc*_*uca 6 python postgresql postgis sqlalchemy geoalchemy2

我正在使用PostgreSQL,SQLAlchemyGeoAlchemy2库在数据库中存储一些地理空间坐标。

我使用 Python 在数据库中定义数据库列,如下所示:

import sqlalchemy as sa
import geoalchemy2 as ga
geo = sa.Column(ga.Geography('POINT', srid=4326))  # 4326 = WGS84 Lat Long
Run Code Online (Sandbox Code Playgroud)

我可以通过如下转换来添加地理坐标:

self.geo = 'POINT({} {})'.format(latitude, longitude)
Run Code Online (Sandbox Code Playgroud)

这将其编码为字符串,如下所示:0100002076ED....

我的问题是:如何从 python 中将此字符串转换回纬度和经度?

max*_*zig 2

选择时,将其转换为选择表达式的一部分,例如:

select ST_X(some_loc_col::geometry), ST_Y(some_loc_col::geometry) from mytable
Run Code Online (Sandbox Code Playgroud)

使用 SQLAlchemy,您可以直接执行这样的语句,从文本中准备它(参见sqlalchemy.sql.text()),或者使用 SQLAlchemy 和 GeoAlchemy2 中的函数构建表达式。


表达式示例:

import sqlalchemy
from sqlalchemy.sql.expression import cast
import geoalchemy2
import geoalchemy2.functions as fns

db_url = '...'
echo = True
sqlalchemy.create_engine(db_url, echo=echo)
meta = sqlalchemy.MetaData()
my_table = sqlalchemy.Table('mytable', meta, autoload=True, autoload_with=engine)
stmt = my_table.select().with_only_columns(
        [ fns.ST_X(cast(my_table.c.some_loc_col, geoalchemy2.types.Geometry)),
          fns.ST_Y(cast(my_table.c.some_loc_col, geoalchemy2.types.Geometry)) ])
Run Code Online (Sandbox Code Playgroud)

另请参阅:https://geoalchemy-2.readthedocs.io/en/0.11.1/spatial_functions.html