sql >> データベース >  >> RDS >> PostgreSQL

世界をカバーする六角形のグリッドの座標を持つテーブル

    少し前に、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のグリッドを生成します 全世界をカバーする六角形:

    グリッドが見えるように、ここでもう少し近づけます:

    土地をカバーすることにのみ関心がある場合は、ST_Intersectsを使用して、選択したジオメトリに基づいてこれらの六角形のサブセットを作成できます。 :

    CREATE TABLE t_overlap AS 
    SELECT t._gid,t._geom FROM t,world 
    WHERE ST_Intersects(world.geom,t._geom)
    

    このクエリは、 35911を含むグリッドを持つサブセットを作成します 世界地図のジオメトリと交差する六角形:

    この回答で使用されている世界地図は、シェープファイルhereとしてダウンロードできます。 。

    最終製品:-全世界をカバーする六角形グリッド内の各六角形の中心点を含むテーブル。 -六角形には固定領域があります

    各六角形の図心を生成することも大したことではありません(ST_Centroidを参照)。 ):

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




    1. カウントにギャップを残してプライマリを自動インクリメント

    2. データベースのメンテナンスを容易にするためのモデル化方法

    3. PostgreSQL:文字列を日付にキャストDD / MM / YYYY

    4. 致命的なエラー:キャッチされないエラー:未定義の関数mysql_connect()の呼び出し