Vor einiger Zeit habe ich eine function
angepasst um Sechsecke zu erzeugen, die genau das sein könnten, wonach Sie suchen. Es nimmt die Parameter Zellenbreite und die Koordinaten für südwestliche und nordöstliche Ecken und erzeugt ein sechseckiges Gitter.
CREATE OR REPLACE FUNCTION create_hexagons(width FLOAT, xmin FLOAT, ymin FLOAT, xmax FLOAT, ymax FLOAT)
RETURNS TABLE (_gid INTEGER, _geom GEOMETRY) AS $$
DECLARE
b FLOAT := width/2;
a FLOAT := b/2;
c FLOAT := 2*a;
height FLOAT := 2*a+c;
ncol FLOAT := ceil(abs(xmax-xmin)/width);
nrow FLOAT := ceil(abs(ymax-ymin)/height);
polygon_string VARCHAR := 'POLYGON((' ||
0 || ' ' || 0 || ' , ' || b || ' ' || a || ' , ' || b || ' ' || a+c || ' , ' || 0 || ' ' || a+c+a || ' , ' ||
-1*b || ' ' || a+c || ' , ' || -1*b || ' ' || a || ' , ' || 0 || ' ' || 0 || '))';
BEGIN
CREATE TEMPORARY TABLE tmp (gid serial NOT NULL PRIMARY KEY,geom GEOMETRY(POLYGON)) ON COMMIT DROP;
INSERT INTO tmp (geom)
SELECT ST_Translate(geom, x_series*(2*a+c)+xmin, y_series*(2*(c+a))+ymin)
FROM generate_series(0, ncol::INT, 1) AS x_series,
generate_series(0, nrow::INT,1 ) AS y_series,
(SELECT polygon_string::GEOMETRY AS geom
UNION
SELECT ST_Translate(polygon_string::GEOMETRY, b, a + c) AS geom) AS two_hex;
ALTER TABLE tmp ALTER COLUMN geom TYPE GEOMETRY(POLYGON, 4326) USING ST_SetSRID(geom, 4326);
RETURN QUERY (SELECT gid, geom FROM tmp);
END;
$$ LANGUAGE plpgsql;
Diese Funktion gibt eine Tabelle mit den Spalten _gid
zurück und _geom
, die jeweils eine Kennung und die Geometrie für jedes Sechseck enthält.
CREATE TABLE t AS
SELECT * FROM create_hexagons(1.0, -180, -90, 180, 45)
Mit diesen Parametern erzeugt die Funktion ein Raster mit 98192 Sechsecke, die die ganze Welt bedecken:
Hier etwas näher, damit man das Raster sehen kann:
Wenn Sie nur daran interessiert sind, Land zu bedecken, können Sie mit ST_Intersects
eine Teilmenge dieser Sechsecke basierend auf einer Geometrie Ihrer Wahl erstellen :
CREATE TABLE t_overlap AS
SELECT t._gid,t._geom FROM t,world
WHERE ST_Intersects(world.geom,t._geom)
Diese Abfrage erstellt eine Teilmenge mit einem Raster, das 35911 enthält Sechsecke, die sich mit den Geometrien der Weltkarte schneiden:
Die in dieser Antwort verwendete Weltkarte kann here
als Shapefile heruntergeladen werden .
Endprodukt:- Eine Tabelle, die den Mittelpunkt für jedes Sechseck in einem sechseckigen Raster enthält, das die ganze Welt abdeckt. - Die Sechsecke haben eine feste Fläche
Das Generieren der Schwerpunkte für jedes Sechseck ist auch keine große Sache (siehe ST_Centroid
):
CREATE TABLE t_overlap_centroid AS
SELECT ST_Centroid(_geom) FROM t_overlap;