PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Tabelle mit Koordinaten eines sechseckigen Gitters, das die Welt bedeckt

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;