示例
Unit hexagons covering rectangular bounds.
WITH bounds AS (
SELECT ST_MakeEnvelope(2, 1, 4, 3, 3857) AS geom
), grid AS (
SELECT hex.*
FROM bounds
CROSS JOIN LATERAL ST_HexagonGrid(1, geom) AS hex
)
SELECT (SELECT geom FROM bounds) AS input_bounds,
ST_Collect(geom ORDER BY i, j) AS grid
FROM grid;
POLYGON((2 1,2 3,4 3,4 1,2 1)) | MULTIPOLYGON(((0.5 0.866,1 0,2 0,2.5 0.866,2 1.732,1 1.732,0.5 0.866)),((0.5 2.598,1 1.732,2 1.732,2.5 2.598,2 3.464,1 3.464,0.5 2.598)),((2 1.732,2.5 0.866,3.5 0.866,4 1.732,3.5 2.598,2.5 2.598,2 1.732)),((2 3.464,2.5 2.598,3.5 2.598,4 3.464,3.5 4.33,2.5 4.33,2 3.464)),((3.5 0.866,4 0,5 0,5.5 0.866,5 1.732,4 1.732,3.5 0.866)),((3.5 2.598,4 1.732,5 1.732,5.5 2.598,5 3.464,4 3.464,3.5 2.598)))
0103000020110F000001000000050000000000000000000040000000000000F03F00000000000000400000000000000840000000000000104000000000000008400000000000001040000000000000F03F0000000000000040000000000000F03F | 0106000020110F00000600000001030000000100000007000000000000000000E03FAB4C58E87AB6EB3F000000000000F03F0000000000000000000000000000004000000000000000000000000000000440AB4C58E87AB6EB3F0000000000000040AB4C58E87AB6FB3F000000000000F03FAB4C58E87AB6FB3F000000000000E03FAB4C58E87AB6EB3F01030000000100000007000000000000000000E03F8039422EDCC80440000000000000F03FAB4C58E87AB6FB3F0000000000000040AB4C58E87AB6FB3F00000000000004408039422EDCC804400000000000000040AB4C58E87AB60B40000000000000F03FAB4C58E87AB60B40000000000000E03F8039422EDCC80440010300000001000000070000000000000000000040AB4C58E87AB6FB3F0000000000000440AB4C58E87AB6EB3F0000000000000C40AB4C58E87AB6EB3F0000000000001040AB4C58E87AB6FB3F0000000000000C408039422EDCC8044000000000000004408039422EDCC804400000000000000040AB4C58E87AB6FB3F010300000001000000070000000000000000000040AB4C58E87AB60B4000000000000004408039422EDCC804400000000000000C408039422EDCC804400000000000001040AB4C58E87AB60B400000000000000C40EB2F37D10C5211400000000000000440EB2F37D10C5211400000000000000040AB4C58E87AB60B40010300000001000000070000000000000000000C40AB4C58E87AB6EB3F00000000000010400000000000000000000000000000144000000000000000000000000000001640AB4C58E87AB6EB3F0000000000001440AB4C58E87AB6FB3F0000000000001040AB4C58E87AB6FB3F0000000000000C40AB4C58E87AB6EB3F010300000001000000070000000000000000000C408039422EDCC804400000000000001040AB4C58E87AB6FB3F0000000000001440AB4C58E87AB6FB3F00000000000016408039422EDCC804400000000000001440AB4C58E87AB60B400000000000001040AB4C58E87AB60B400000000000000C408039422EDCC80440
Child tiles that intersect a doubled-size parent hexagon share the tiling origin, but do not nest perfectly inside the parent.
WITH parent AS (
SELECT ST_Hexagon(2, 0, 0) AS geom
), children AS (
SELECT child.*
FROM parent
CROSS JOIN LATERAL ST_HexagonGrid(1, geom) AS child
WHERE ST_Area(ST_Intersection(child.geom, parent.geom)) > 0
)
SELECT ST_Collect(geom ORDER BY i, j) AS children,
(SELECT geom FROM parent) AS parent
FROM children;
MULTIPOLYGON(((-2.5 -0.866,-2 -1.732,-1 -1.732,-0.5 -0.866,-1 0,-2 0,-2.5 -0.866)),((-2.5 0.866,-2 0,-1 0,-0.5 0.866,-1 1.732,-2 1.732,-2.5 0.866)),((-1 -1.732,-0.5 -2.598,0.5 -2.598,1 -1.732,0.5 -0.866,-0.5 -0.866,-1 -1.732)),((-1 0,-0.5 -0.866,0.5 -0.866,1 0,0.5 0.866,-0.5 0.866,-1 0)),((-1 1.732,-0.5 0.866,0.5 0.866,1 1.732,0.5 2.598,-0.5 2.598,-1 1.732)),((0.5 -0.866,1 -1.732,2 -1.732,2.5 -0.866,2 0,1 0,0.5 -0.866)),((0.5 0.866,1 0,2 0,2.5 0.866,2 1.732,1 1.732,0.5 0.866))) | POLYGON((-2 0,-1 -1.732,1 -1.732,2 0,1 1.732,-1 1.732,-2 0))
0106000000070000000103000000010000000700000000000000000004C0AB4C58E87AB6EBBF00000000000000C0AB4C58E87AB6FBBF000000000000F0BFAB4C58E87AB6FBBF000000000000E0BFAB4C58E87AB6EBBF000000000000F0BF000000000000000000000000000000C0000000000000000000000000000004C0AB4C58E87AB6EBBF0103000000010000000700000000000000000004C0AB4C58E87AB6EB3F00000000000000C00000000000000000000000000000F0BF0000000000000000000000000000E0BFAB4C58E87AB6EB3F000000000000F0BFAB4C58E87AB6FB3F00000000000000C0AB4C58E87AB6FB3F00000000000004C0AB4C58E87AB6EB3F01030000000100000007000000000000000000F0BFAB4C58E87AB6FBBF000000000000E0BF8039422EDCC804C0000000000000E03F8039422EDCC804C0000000000000F03FAB4C58E87AB6FBBF000000000000E03FAB4C58E87AB6EBBF000000000000E0BFAB4C58E87AB6EBBF000000000000F0BFAB4C58E87AB6FBBF01030000000100000007000000000000000000F0BF0000000000000000000000000000E0BFAB4C58E87AB6EBBF000000000000E03FAB4C58E87AB6EBBF000000000000F03F0000000000000000000000000000E03FAB4C58E87AB6EB3F000000000000E0BFAB4C58E87AB6EB3F000000000000F0BF000000000000000001030000000100000007000000000000000000F0BFAB4C58E87AB6FB3F000000000000E0BFAB4C58E87AB6EB3F000000000000E03FAB4C58E87AB6EB3F000000000000F03FAB4C58E87AB6FB3F000000000000E03F8039422EDCC80440000000000000E0BF8039422EDCC80440000000000000F0BFAB4C58E87AB6FB3F01030000000100000007000000000000000000E03FAB4C58E87AB6EBBF000000000000F03FAB4C58E87AB6FBBF0000000000000040AB4C58E87AB6FBBF0000000000000440AB4C58E87AB6EBBF00000000000000400000000000000000000000000000F03F0000000000000000000000000000E03FAB4C58E87AB6EBBF01030000000100000007000000000000000000E03FAB4C58E87AB6EB3F000000000000F03F0000000000000000000000000000004000000000000000000000000000000440AB4C58E87AB6EB3F0000000000000040AB4C58E87AB6FB3F000000000000F03FAB4C58E87AB6FB3F000000000000E03FAB4C58E87AB6EB3F | 0103000000010000000700000000000000000000C00000000000000000000000000000F0BFAB4C58E87AB6FBBF000000000000F03FAB4C58E87AB6FBBF00000000000000400000000000000000000000000000F03FAB4C58E87AB6FB3F000000000000F0BFAB4C58E87AB6FB3F00000000000000C00000000000000000
Counting points in hexagons.
要针对六边形格网进行点聚合,请使用点的范围作为边界生成六边形网格,然后在空间上连接到该网格。
SELECT COUNT(*), hexes.geom
FROM ST_HexagonGrid(
10000,
ST_SetSRID(ST_EstimatedExtent('pointtable', 'geom'), 3857)
) AS hexes
INNER JOIN pointtable AS pts
ON ST_Intersects(pts.geom, hexes.geom)
GROUP BY hexes.geom;
Generating hex coverage of polygons.
If a grid is generated for each polygon boundary and filtered to intersecting cells, adjacent regions receive overlapping hexagons along their shared border. The build-time figure below uses two simple regions in place of an external administrative-boundary table, so the example is self-contained.
WITH admin1(gid, geom) AS (
VALUES
(1, ST_MakeEnvelope(0, 0, 3, 3, 3857)),
(2, ST_MakeEnvelope(3, 0, 6, 3, 3857))
), coverage AS (
SELECT hex.i, hex.j, hex.geom
FROM admin1
CROSS JOIN LATERAL ST_HexagonGrid(1.5, admin1.geom) AS hex
WHERE ST_Intersects(admin1.geom, hex.geom)
GROUP BY hex.i, hex.j, hex.geom
), layers AS (
SELECT 'region' AS kind, gid AS position, geom
FROM admin1
UNION ALL
SELECT
'hexagon',
1000 + row_number() OVER (ORDER BY i, j),
geom
FROM coverage
)
SELECT
CASE kind WHEN 'region' THEN geom END AS input_region,
CASE kind WHEN 'hexagon' THEN geom END AS hexagon
FROM layers
ORDER BY position;
POLYGON((0 0,0 3,3 3,3 0,0 0)) | null
POLYGON((3 0,3 3,6 3,6 0,3 0)) | null
null | POLYGON((-1.5 0,-0.75 -1.3,0.75 -1.3,1.5 0,0.75 1.3,-0.75 1.3,-1.5 0))
null | POLYGON((-1.5 2.6,-0.75 1.3,0.75 1.3,1.5 2.6,0.75 3.9,-0.75 3.9,-1.5 2.6))
null | POLYGON((0.75 1.3,1.5 0,3 0,3.75 1.3,3 2.6,1.5 2.6,0.75 1.3))
null | POLYGON((0.75 3.9,1.5 2.6,3 2.6,3.75 3.9,3 5.2,1.5 5.2,0.75 3.9))
null | POLYGON((3 0,3.75 -1.3,5.25 -1.3,6 0,5.25 1.3,3.75 1.3,3 0))
null | POLYGON((3 2.6,3.75 1.3,5.25 1.3,6 2.6,5.25 3.9,3.75 3.9,3 2.6))
null | POLYGON((5.25 1.3,6 0,7.5 0,8.25 1.3,7.5 2.6,6 2.6,5.25 1.3))
null | POLYGON((5.25 3.9,6 2.6,7.5 2.6,8.25 3.9,7.5 5.2,6 5.2,5.25 3.9))
0103000020110F000001000000050000000000000000000000000000000000000000000000000000000000000000000840000000000000084000000000000008400000000000000840000000000000000000000000000000000000000000000000 | null
0103000020110F000001000000050000000000000000000840000000000000000000000000000008400000000000000840000000000000184000000000000008400000000000001840000000000000000000000000000008400000000000000000 | null
null | 0103000020110F00000100000007000000000000000000F8BF0000000000000000000000000000E8BF8039422EDCC8F4BF000000000000E83F8039422EDCC8F4BF000000000000F83F0000000000000000000000000000E83F8039422EDCC8F43F000000000000E8BF8039422EDCC8F43F000000000000F8BF0000000000000000
null | 0103000020110F00000100000007000000000000000000F8BF8039422EDCC80440000000000000E8BF8039422EDCC8F43F000000000000E83F8039422EDCC8F43F000000000000F83F8039422EDCC80440000000000000E83F405663454A2D0F40000000000000E8BF405663454A2D0F40000000000000F8BF8039422EDCC80440
null | 0103000020110F00000100000007000000000000000000E83F8039422EDCC8F43F000000000000F83F0000000000000000000000000000084000000000000000000000000000000E408039422EDCC8F43F00000000000008408039422EDCC80440000000000000F83F8039422EDCC80440000000000000E83F8039422EDCC8F43F
null | 0103000020110F00000100000007000000000000000000E83F405663454A2D0F40000000000000F83F8039422EDCC8044000000000000008408039422EDCC804400000000000000E40405663454A2D0F4000000000000008408039422EDCC81440000000000000F83F8039422EDCC81440000000000000E83F405663454A2D0F40
null | 0103000020110F00000100000007000000000000000000084000000000000000000000000000000E408039422EDCC8F4BF00000000000015408039422EDCC8F4BF0000000000001840000000000000000000000000000015408039422EDCC8F43F0000000000000E408039422EDCC8F43F00000000000008400000000000000000
null | 0103000020110F0000010000000700000000000000000008408039422EDCC804400000000000000E408039422EDCC8F43F00000000000015408039422EDCC8F43F00000000000018408039422EDCC804400000000000001540405663454A2D0F400000000000000E40405663454A2D0F4000000000000008408039422EDCC80440
null | 0103000020110F0000010000000700000000000000000015408039422EDCC8F43F000000000000184000000000000000000000000000001E40000000000000000000000000008020408039422EDCC8F43F0000000000001E408039422EDCC8044000000000000018408039422EDCC8044000000000000015408039422EDCC8F43F
null | 0103000020110F000001000000070000000000000000001540405663454A2D0F4000000000000018408039422EDCC804400000000000001E408039422EDCC804400000000000802040405663454A2D0F400000000000001E408039422EDCC8144000000000000018408039422EDCC814400000000000001540405663454A2D0F40
The same pattern applies to a real administrative-boundary table:
当引用 FROM 列表中的先前表时,LATERAL关键字隐含在返回集合的函数中。因此,CROSS JOIN LATERAL、CROSS JOIN 或简单的 CROSS JOIN LATERAL 是本示例的等效构造。
SELECT admin1.gid, hex.geom
FROM
admin1
CROSS JOIN
ST_HexagonGrid(100000, admin1.geom) AS hex
WHERE
adm0_a3 = 'USA'
AND
ST_Intersects(admin1.geom, hex.geom)