Postgis Postgres客户端集成无法正常工作?

时间:2013-03-21 15:12:37

标签: database postgresql gis postgis

我正在试验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)

1 个答案:

答案 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,其默认转换为文本为十六进制格式。

但是,我不推荐这种黑客攻击。如果需要人类可读的WKT字符串,请记住在SQL语句中使用ST_AsText。另外,请记住,WKT是几种文本格式之一;其他人请见"Geometry Outputs" in the manual