postgresql - 包含覆盖世界的六边形网格坐标的表格

标签 postgresql geolocation geometry postgis

在 PostGIS 中寻找一个实现来生成覆盖整个地球的六边形网格,以便聚合每个六边形上的数据。

任何指向正确方向的指针都会有很大帮助!

最终产品: - 包含覆盖整个世界的六边形网格中每个六边形中心点的表格。 - 六边形有一个固定的面积

最佳答案

前段时间我改编了一个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

此答案中使用的世界地图可以下载为 shapefile here .

End product: - A table containing the center point for each hexagon in a hexagonal grid that covers the whole world. - The hexagons have a fixed area

为每个六边形生成质心也不是什么大问题(参见 ST_Centroid ):

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

enter image description here

关于postgresql - 包含覆盖世界的六边形网格坐标的表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50839919/

相关文章:

postgresql - 使用 Gorm 插入和选择 PostGIS 几何

iOS - 如何在 APNS 之前放置自定义弹出窗口并启用位置弹出窗口

html5 地理定位精度

java - 线上的点到第一个点的距离

python - 3D 空间中最佳拟合平面的方向

postgresql - PostgreSQL 如何在内部存储日期时间类型

java - JOOQ 生成器 : Missing name

c# - 试图在 C# 中理解 Postgres 的二进制复制格式

json - mongo 2.6.4 中的多个 $near 不起作用

html - 如何使用 css 在圆形 div 中垂直居中我的文本