Beberapa waktu lalu saya mengadaptasi function
untuk menghasilkan segi enam yang mungkin persis seperti yang Anda cari. Dibutuhkan parameter lebar sel, dan koordinat untuk sudut barat daya dan timur laut, dan menghasilkan kisi heksagonal.
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;
Fungsi ini mengembalikan tabel dengan kolom _gid
dan _geom
, yang masing-masing berisi pengenal dan geometri untuk setiap segi enam.
CREATE TABLE t AS
SELECT * FROM create_hexagons(1.0, -180, -90, 180, 45)
Dengan parameter ini, fungsi menghasilkan kisi dengan 98192 segi enam yang menutupi seluruh dunia:
Di sini sedikit lebih dekat, sehingga Anda dapat melihat kisi-kisi:
Jika Anda hanya tertarik untuk menutupi tanah, Anda dapat membuat subset segi enam ini berdasarkan geometri pilihan Anda menggunakan ST_Intersects
:
CREATE TABLE t_overlap AS
SELECT t._gid,t._geom FROM t,world
WHERE ST_Intersects(world.geom,t._geom)
Kueri ini akan membuat subset dengan kisi yang berisi 35911 segi enam, yang berpotongan dengan geometri dari peta dunia:
Peta dunia yang digunakan dalam jawaban ini dapat diunduh sebagai shapefile here
.
Produk akhir:- Tabel yang berisi titik pusat untuk setiap heksagonal dalam kisi heksagonal yang mencakup seluruh dunia. - Segi enam memiliki area tetap
Menghasilkan centroid untuk setiap segi enam juga bukan masalah besar (lihat ST_Centroid
):
CREATE TABLE t_overlap_centroid AS
SELECT ST_Centroid(_geom) FROM t_overlap;