postgresql - 带有覆盖世界的六边形网格坐标的表格
问题描述
在 PostGIS 中寻找一种实现,用于生成覆盖整个星球的六边形网格,以便在每个六边形上聚合数据。
任何指向正确方向的指针都会有很大帮助!
最终产品: - 一个表格,其中包含覆盖整个世界的六边形网格中每个六边形的中心点。- 六边形有一个固定的区域
解决方案
前段时间我改编了 afunction
来生成可能正是您正在寻找的六边形。它采用参数单元格宽度以及西南角和东北角的坐标,并生成一个六边形网格。
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个六边形的网格的子集,这些六边形与世界地图中的几何图形相交:
此答案中使用的世界地图可以下载为 shapefile here
。
最终产品: - 一个表格,其中包含覆盖整个世界的六边形网格中每个六边形的中心点。- 六边形有一个固定的区域
为每个六边形生成质心也不是什么大问题(请参阅 参考资料ST_Centroid
):
CREATE TABLE t_overlap_centroid AS
SELECT ST_Centroid(_geom) FROM t_overlap;
推荐阅读
- c# - 如何在 WPF 应用程序中的 SOAP 客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头
- javascript - 使用 vue.js 从 api 调用中渲染转义的 HTML
- android - 使用 Retrofit2 从 json 资源中检索数据
- c# - 如何通过 C# 将可空整数列的空值插入 SQL 表
- r - 加载cowplot后带有主题的自定义轴宽
- vb.net - Arraylist.Contains 不返回 True VB.NET
- javascript - 根据浏览器语言重定向
- bash - Windows 上的 Docker:服务“db”构建失败:命令“/bin/sh -c ./myscript 1”返回非零代码:127
- kubernetes - 无法使用 kubeadm-dind-cluster 访问 pod 中的外部数据库
- html - 通过 URL 生成托管图像(特别是 QR 码)