Cách đây một thời gian, tôi đã điều chỉnh một hàm function
để tạo ra các hình lục giác có thể là chính xác những gì bạn đang tìm kiếm. Nó lấy chiều rộng ô tham số và tọa độ cho các góc tây nam và đông bắc, đồng thời tạo ra một lưới hình lục giác.
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;
Hàm này trả về một bảng có các cột _gid
và _geom
, chứa một số nhận dạng và hình dạng của mỗi hình lục giác, tương ứng.
CREATE TABLE t AS
SELECT * FROM create_hexagons(1.0, -180, -90, 180, 45)
Với các tham số này, hàm tạo lưới có 98192 hình lục giác bao phủ toàn thế giới:
Ở đây gần hơn một chút, để bạn có thể nhìn thấy lưới:
Nếu bạn chỉ quan tâm đến việc che phủ đất, bạn có thể tạo một tập hợp con các hình lục giác này dựa trên hình dạng bạn chọn bằng cách sử dụng ST_Intersects
:
CREATE TABLE t_overlap AS
SELECT t._gid,t._geom FROM t,world
WHERE ST_Intersects(world.geom,t._geom)
Truy vấn này sẽ tạo một tập hợp con có lưới chứa 35911 hình lục giác, giao với các hình từ bản đồ thế giới:
Bản đồ thế giới được sử dụng trong câu trả lời này có thể được tải xuống dưới dạng shapefile here
.
Sản phẩm cuối cùng:- Một bảng chứa điểm chính giữa của mỗi ô lưới lục giác hình lục giác bao phủ toàn thế giới. - Các hình lục giác có diện tích cố định
Việc tạo các trọng tâm cho mỗi hình lục giác cũng không phải là vấn đề lớn (xem ST_Centroid
):
CREATE TABLE t_overlap_centroid AS
SELECT ST_Centroid(_geom) FROM t_overlap;