PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Bảng có tọa độ của lưới lục giác bao phủ thế giới

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_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;




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi đối chiếu cơ sở dữ liệu, Ctype trong Postgresql

  2. Phát triển PostgreSQL cho Windows, Phần 1

  3. LỖI:quyền bị từ chối đối với giản đồ user1_gmail_com ở ký tự 46

  4. SELECT DISTINCT chậm hơn mong đợi trên bảng của tôi trong PostgreSQL

  5. tệp postgres db - tệp nào đại diện cho bảng / chỉ mục cụ thể?