我正在试验Postgis。我已经设置了一个数据库,其中添加了一个带有几何列的表,其中包含点并将该索引编入该列。
我觉得很奇怪的是,在很多情况下,列中的数据不会被翻译以便在客户端中显示。
例如,如果我将其粘贴到shell
中SELECT ST_MakePolygon(ST_GeomFromText('LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1, 75.15 29.53 1)'));
我得到了这个结果
st_makepolygon
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
010300008001000000040000009A99999999C9524048E17A14AE873D40000000000000F03F00000000004053400000000000003D40000000000000F03F66666666666653400000000000803D40000000000000F03F9A99999999C9524048E17A14AE873D40000000000000F03F
(1 row)
我不应该得到这样的东西吗?
st_asewkt
-----------
POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
当我从几何列中选择点时,我也会看到它们的原始数据。
如果这是正确的,我如何翻译数据,以便我可以轻松地看到几何体中的内容?
我希望能够在列显示中将我的点看作POINT(x,y,z)或类似的东西。
有趣的是,如果我运行类似这样的操作
SELECT ST_Extent(geom) FROM towns WHERE town = 'BOSTON';
客户端向我显示此结果
st_extent
------------------
BOX(10 10,10 10)
(1 row)
答案 0 :(得分:1)
Geometries作为well-known binary对象存储在数据库中,因为它是一种紧凑且无损的格式。查询此数据类型时,会将其解码为十六进制文本表示形式,如您的问题所示。唯一能够改变默认输出行为的黑客就是重新定义强制转换。
此hack要求从postgis.sql
启用程序脚本安装PostGIS,而不是CREATE EXTENSION postgis;
方法。然后,将演员从geometry
重新定义为text
:
DROP CAST (geometry AS text);
CREATE CAST (geometry AS text) WITH FUNCTION ST_AsText(geometry) AS IMPLICIT;
现在显示以下行为:
SELECT '010300008001000000040000009A99999999C9524048E17A14AE87'
'3D40000000000000F03F00000000004053400000000000003D40000000000'
'000F03F66666666666653400000000000803D40000000000000F03F9A9999'
'9999C9524048E17A14AE873D40000000000000F03F'::geometry::text;
text
---------------------------------------------------------------
POLYGON Z ((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
(1 row)
但它仅适用于::text
强制转换。没有它,它会将geometry
转换为bytea
,其默认转换为文本为十六进制格式。