寻找在PostGIS中实现生成覆盖整个行星的六边形网格以便对每个六边形进行数据聚合的方法。
任何指向正确方向的指导都将是极大的帮助!
最终产品: - 包含六边形网格中每个六边形的中心点的表格,该六边形网格覆盖了整个世界。 - 六边形具有固定面积。
寻找在PostGIS中实现生成覆盖整个行星的六边形网格以便对每个六边形进行数据聚合的方法。
任何指向正确方向的指导都将是极大的帮助!
最终产品: - 包含六边形网格中每个六边形的中心点的表格,该六边形网格覆盖了整个世界。 - 六边形具有固定面积。
一段时间以前,我改编了一个函数
来生成六边形,这可能正是你要寻找的。它需要参数单元格宽度、西南角和东北角的坐标,并生成一个六边形网格。
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)
ST_Intersects
基于所选几何形状创建这些六边形的子集:CREATE TABLE t_overlap AS
SELECT t._gid,t._geom FROM t,world
WHERE ST_Intersects(world.geom,t._geom)
这里
下载。
对于每个六边形生成质心也不是什么大问题(参见最终产品: - 包含覆盖整个世界的六边形网格中每个六边形的中心点的表。 - 六边形具有固定的面积
ST_Centroid
)。CREATE TABLE t_overlap_centroid AS
SELECT ST_Centroid(_geom) FROM t_overlap;
39.45 - 40.05
和经度 115.4166 - 117.5
周围绘制一个矩形区域。因为我的研究意图覆盖这些坐标定义的市辖区。 - arilwan