PostGIS returns 记录为数据类型。这是出乎意料的

PostGIS returns record as datatype. This is unexpected

我有这个问题

WITH buffered AS (
    SELECT 
        ST_Buffer(geom , 10, 'endcap=round join=round') AS geom,
        id
    FROM line),
hexagons AS (
    SELECT 
        ST_HexagonGrid(10, buffered.geom) AS hex,
        buffered.id
    FROM buffered
) SELECT * FROM hexagons;

这会在 hex 列中给出 datatype record。这是出乎意料的。我预计 geometrydatatype。这是为什么?

根据documentation,函数ST_HexagonGridreturns一个setof record。然而,这些记录包含一个名为 geomgeometry 属性,因此为了访问此 recordgeometry,您必须用括号 () 和用点 . 调用属性,例如

SELECT (hex).geom FROM hexagons;

或使用 * 访问获取所有属性(在本例中,ijgeom):

SELECT (hex).* FROM hexagons;

演示(PostGIS 3.1):

WITH j (hex) AS (
 SELECT 
  ST_HexagonGrid(
   10,ST_Buffer('LINESTRING(-105.55 41.11,-115.48 37.16,-109.29 29.38,-98.34 27.13)',1))    
)
SELECT ST_AsText((hex).geom,2) FROM j;

                                       st_astext                                        
----------------------------------------------------------------------------------------
 POLYGON((-130 34.64,-125 25.98,-115 25.98,-110 34.64,-115 43.3,-125 43.3,-130 34.64))
 POLYGON((-115 25.98,-110 17.32,-100 17.32,-95 25.98,-100 34.64,-110 34.64,-115 25.98))
 POLYGON((-115 43.3,-110 34.64,-100 34.64,-95 43.3,-100 51.96,-110 51.96,-115 43.3))
 POLYGON((-100 34.64,-95 25.98,-85 25.98,-80 34.64,-85 43.3,-95 43.3,-100 34.64))

作为 ST_HexagonGrid returns a setof record,您可以使用 LATERAL 访问记录属性,如 here 所述,或者只调用函数FROM 子句:

SELECT i,j,ST_AsText(geom,2) FROM 
  ST_HexagonGrid(
   10,ST_Buffer('LINESTRING(-105.55 41.11,-115.48 37.16,-109.29 29.38,-98.34 27.13)',1));

 i  | j |                                       st_astext                                        
----+---+----------------------------------------------------------------------------------------
 -8 | 2 | POLYGON((-130 34.64,-125 25.98,-115 25.98,-110 34.64,-115 43.3,-125 43.3,-130 34.64))
 -7 | 1 | POLYGON((-115 25.98,-110 17.32,-100 17.32,-95 25.98,-100 34.64,-110 34.64,-115 25.98))
 -7 | 2 | POLYGON((-115 43.3,-110 34.64,-100 34.64,-95 43.3,-100 51.96,-110 51.96,-115 43.3))
 -6 | 2 | POLYGON((-100 34.64,-95 25.98,-85 25.98,-80 34.64,-85 43.3,-95 43.3,-100 34.64))

进一步阅读:How to divide world into cells (grid)