Таблица с координатами гексагональной сетки, которая охватывает мир - PullRequest
0 голосов
/ 13 июня 2018

Ищем в PostGIS реализацию для создания гексагональной сетки, охватывающей всю планету, для агрегирования данных по каждому шестиугольнику.

Любой указатель в правильном направлении будет очень полезен!

Конечный продукт: - Таблица, содержащая центральную точку для каждого шестиугольника в шестиугольной сетке, которая охватывает весь мир.- шестиугольники имеют фиксированную площадь

1 Ответ

0 голосов
/ 13 июня 2018

Некоторое время назад я адаптировал 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 шестиугольниками, охватывающими весь мир:

Hexagons covering the whole world

Здесь немного ближе, чтобы вы могли видетьсетка:

Hexagons covering the whole world - Europe Overview

Если вы заинтересованы только в покрытии земли, вы можете создать подмножество этих шестиугольников на основе геометрии по вашему выбору, используяST_Intersects:

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

Этот запрос создаст подмножество с сеткой, содержащей 35911 шестиугольников, которые пересекаются с геометриями с карты мира:

enter image description here

Карта мира, использованная в этом ответе, может быть загружена как шейп-файл here.

Конечный продукт: - таблица, содержащая центральную точку для каждого шестиугольника в шестиугольной сетке, которая охватывает весь мир.- Шестиугольники имеют фиксированную площадь

Создание центроидов для каждого шестиугольника также не представляет большой проблемы (см. ST_Centroid):

CREATE TABLE t_overlap_centroid AS
SELECT ST_Centroid(_geom) FROM t_overlap;

enter image description here

...