在 GeoAlchemy2 中表示坐标
Representing Coordinates in GeoAlchemy2
为了使用 GPS 位置扩展我的休息时间 api,我决定尝试地质炼金术。我已经有一个数据库在运行,我认为它已经将这些点保存到我的数据库中。但是,每次我尝试打印我保存的点(例如 return 给用户)时,我都会得到一个内存地址或类似这样的东西:
<WKBElement at 0x7ffad5310110; '0101000000fe47a643a7f3494049f4328ae5d61140'>
这对于未入门的程序员和用户来说都是毫无用处的。
我有一个简单的问题。我如何以人类可读的形式表示几何对象,例如:
POINT(40.5563 30.5567)
那将是 Well-Known Binary 格式;您可以使用 geoalchemy2.functions.ST_AsText
将它们转换为 WKT 文本格式。
这将在数据库本身中起作用,因此您可以将其应用于您的查询以请求 WKT 而不是 WKB 中的结果;那是在你的 SQLAlchemy 你 select
Model.column.ST_AsText()
或
ST_AsText(Model.column)
对于 WKT 和 WKB 之间的数据库外转换,您可以使用 shapely
模块。请注意,wkb
函数需要二进制,而不是十六进制:
from shapely import wkb, wkt
from binascii import unhexlify
>>> binary = unhexlify(b'0101000000fe47a643a7f3494049f4328ae5d61140')
>>> binary
b'\x01\x01\x00\x00\x00\xfeG\xa6C\xa7\xf3I@I\xf42\x8a\xe5\xd6\x11@'
>>> point = wkb.loads(binary)
>>> point.x, point.y
(51.903542, 4.45986)
>>> wkt.dumps(point)
'POINT (51.9035420000000016 4.4598599999999999)'
为了使用 GPS 位置扩展我的休息时间 api,我决定尝试地质炼金术。我已经有一个数据库在运行,我认为它已经将这些点保存到我的数据库中。但是,每次我尝试打印我保存的点(例如 return 给用户)时,我都会得到一个内存地址或类似这样的东西:
<WKBElement at 0x7ffad5310110; '0101000000fe47a643a7f3494049f4328ae5d61140'>
这对于未入门的程序员和用户来说都是毫无用处的。
我有一个简单的问题。我如何以人类可读的形式表示几何对象,例如:
POINT(40.5563 30.5567)
那将是 Well-Known Binary 格式;您可以使用 geoalchemy2.functions.ST_AsText
将它们转换为 WKT 文本格式。
这将在数据库本身中起作用,因此您可以将其应用于您的查询以请求 WKT 而不是 WKB 中的结果;那是在你的 SQLAlchemy 你 select
Model.column.ST_AsText()
或
ST_AsText(Model.column)
对于 WKT 和 WKB 之间的数据库外转换,您可以使用 shapely
模块。请注意,wkb
函数需要二进制,而不是十六进制:
from shapely import wkb, wkt
from binascii import unhexlify
>>> binary = unhexlify(b'0101000000fe47a643a7f3494049f4328ae5d61140')
>>> binary
b'\x01\x01\x00\x00\x00\xfeG\xa6C\xa7\xf3I@I\xf42\x8a\xe5\xd6\x11@'
>>> point = wkb.loads(binary)
>>> point.x, point.y
(51.903542, 4.45986)
>>> wkt.dumps(point)
'POINT (51.9035420000000016 4.4598599999999999)'