PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tabel dengan koordinat kisi heksagonal yang menutupi dunia

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;




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara melihat kode CREATE VIEW untuk tampilan di PostgreSQL?

  2. Fitur Kompatibilitas Oracle baru di PostgresPlus Advanced Server 9.3Beta

  3. Instal Postgres.app di Mac

  4. Nomor seri per grup baris untuk kunci majemuk

  5. Tentukan nama tabel dan kolom sebagai argumen dalam fungsi plpgsql?