PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Таблица с координати на шестоъгълна мрежа, която покрива света

Преди време адаптирах function за генериране на шестоъгълници, които може да са точно това, което търсите. Той взема параметрите ширина на клетката и координатите за югозападните и североизточните ъгли и генерира шестоъгълна мрежа.

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;

Тази функция връща таблица с колоните _gid и _geom , съдържащ идентификатор и геометрията за всеки шестоъгълник, съответно.

CREATE TABLE t AS
SELECT * FROM create_hexagons(1.0, -180, -90, 180, 45) 

С тези параметри функцията генерира мрежа с 98192 шестоъгълници, покриващи целия свят:

Ето малко по-близо, за да можете да видите решетката:

Ако се интересувате само от покриване на земя, можете да създадете подмножество от тези шестоъгълници въз основа на геометрия по ваш избор, като използвате ST_Intersects :

CREATE TABLE t_overlap AS 
SELECT t._gid,t._geom FROM t,world 
WHERE ST_Intersects(world.geom,t._geom)

Тази заявка ще създаде подмножество с решетка, съдържаща 35911 шестоъгълници, които се пресичат с геометриите от картата на света:

Картата на света, използвана в този отговор, може да бъде изтеглена като шейп файл here .

Краен продукт:- Таблица, съдържаща централната точка за всеки шестоъгълник в шестоъгълна мрежа, която покрива целия свят. - Шестоъгълниците имат фиксирана площ

Генерирането на центроиди за всеки шестоъгълник също не е голяма работа (вижте 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. Вземете името на месеца от дата в PostgreSQL

  2. Функция STRING_AGG() в PostgreSQL

  3. SQLAlchemy func.count на булева колона

  4. каква е escape последователността за тире (-) в PostgreSQL

  5. Защо мога да създам таблица с PRIMARY KEY в колона с нула?