すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ジオメトリモデル

最終更新日:Jan 11, 2024

Ganos Geometryは、PostgreSQLの空間ジオメトリ拡張です。 Ganos GeometryはOpenGIS仕様に準拠しており、PostgreSQLが2D (X、Y) 、3D (X、Y、Z) 、および4D (X、Y、Z、M) 空間ジオメトリデータを保存および管理できます。 Ganos Geometryは、空間ジオメトリオブジェクト、インデックス、関数、演算子などのさまざまな機能も提供します。

概要

ジオメトリモデルはPostGIS操作と完全に互換性があり、既存のアプリケーションをスムーズに移行できます。

入門ガイド

  • 拡張機能を作成します。
    -- ジオメトリ拡張を作成します。
    拡張ganos_geometryカスケードを作成します。-- ジオメトリトポロジ拡張を作成します。
    拡張ganos_geometry_topologyを作成します。-- SFCGALプラグイン拡張機能を作成します。
    拡張子ganos_geometry_sfcgalを作成します。
    重要

    同じスキーマにGanos拡張またはPostGIS拡張を作成しないでください。 それ以外の場合、エラーメッセージerror: table "spatial_ref_sys" is not a member of the extension being createdが表示されます。

    GanosまたはPostGIS拡張機能を作成すると、spatial_ref_sysという名前のテーブルが自動的に作成されます。 同じスキーマでGanos拡張とPostGIS拡張を作成すると、テーブルの競合が発生します。 GanosとPostGISの拡張機能を異なるスキーマで作成することを推奨します。 Ganosエクステンションを作成する前に、PostGISエクステンションを削除できます。

  • ジオメトリテーブルを作成します。
    − 方法1: ジオメトリフィールドを含むテーブルを作成する。
    テーブルロードの作成 (ID int4, ROAD_NAME varchar (25), geom geometry(LINESTRING,3857) );
    
    -方法2: 通常のテーブルを作成し、ジオメトリフィールドをテーブルに追加します。
    テーブルロードの作成 (ID int4、ROAD_NAME varchar(25));
    SELECT AddGeometryColumn( 'roads' 、'geom' 、3857、'LINESTRING、2); 
  • ジオメトリ制約を追加します。
    ALTER TABLE ROADS ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(geom));
  • ジオメトリデータをインポートします。
    INSERT INTO roads (id、geom、road_name)
      値 (1、ST_GeomFromText('LINESTRING(191232 243118,191108 243242)'、3857) 、'North Fifth-Ring Road');
    INSERT INTO roads (id、geom、road_name)
      値 (2、ST_GeomFromText('LINESTRING(189141 244158,189265 244817)'、3857) 、'East Fifth-Ring Road');
    INSERT INTO roads (id、geom、road_name)
      値 (3、ST_GeomFromText('LINESTRING(192783 228138,192612 229814)'、3857) 、'South Fifth-Ring Road');
    INSERT INTO roads (id、geom、road_name)
      値 (4、ST_GeomFromText('LINESTRING(189412 252431,189631 259122)'、3857) 、'West Fifth-Ring Road');
    INSERT INTO roads (id、geom、road_name)
      値 (5、ST_GeomFromText('LINESTRING(190131 224148,190871 228134)'、3857) 、'East Chang'an Avenue'));
    INSERT INTO roads (id、geom、road_name)
      値 (6、ST_GeomFromText('LINESTRING(198231 263418,198213 268322)'、3857) 、'West Chang'an Avenue'); 
  • ジオメトリオブジェクト情報を照会します。
    SELECT id, ST_AsText(geom) AS geom, road_name FROM roads;
    
    --------------------------------
         id | geom | road_name
    ------- ----------------------------------------- -------------
          1 | LINESTRING(191232 243118,191108 243242) | North Fifth-Ring Road
          2 | LINESTRING(189141 244158,189265 244817) | East Fifth-Ring Road
          3 | LINESTRING(192783 228138,192612 229814) | 南フィフス-環状道路
          4 | LINESTRING(189412 252431,189631 259122) | 西5番目-環状道路
          5 | LINESTRING(190131 224148,190871 228134) | 東長安アベニュー
          6 | LINESTRING(198231 263418,198213 268322) | 西長安アベニュー
    (6行) 
  • インデックスを作成します。
    − GiSTインデックスを作成する。
    CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
    CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);
    VACUUM ANALYZE [table_name] [(column_name)];
    
    -例:
    GIST(geom) を使用して道路にINDEX sp_geom_indexを作成します。真空分析道路 (geom);
    
    -- ブロック範囲インデックス (BRIN) を作成します。
    CREATE INDEX [indexname] ON [tablename] 使用してBRIN ( [geometryfield] );
    CREATE INDEX [indexname] ON [tablename] USING BRIN ([geometryfield] brin_geometry_inclusion_ops_3d);
    CREATE INDEX [indexname] ON [tablename] USING BRIN ([geometryfield] brin_geometry_inclusion_ops_4d);
    -- 指定された範囲を持つBRINインデックスを作成します。
    CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geometryfield] ) WITH (pages_per_range = [number]); 
  • ジオメトリオブジェクトにアクセスします。
    − 空間ジオメトリオブジェクトが単純な要素のみからなるかどうかを判定する。
     SELECT ST_IsSimple(ST_GeomFromText('POLYGON((1 2、3 4、5 6、1 2))'));
     st_issimple
    -------------
     t
    (1行)
    
     SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5、1 3,1 2,2 1)'));
     st_issimple
    -------------
     f
    (1行)
    
    
    -地形に交通サークルがある最大の都市を照会します。
    SELECT gid, name, ST_Area(the_geom) AS area
    bc_micipalityから
    どこST_NRings(the_geom) > 1
    エリアDECCリミットによる注文1;
    
    gid | 名前 | エリア
    ----------------- ------------------
    12 | Anning | 257374619.430216
    (1行) 
  • 空間データを測定および分析し、空間関係を特定する。
    -- bc_roadsテーブルを作成します。 
    テーブルbc_roads (gid serial、name varchar、the_geom geometry) を作成します。-- bc_unmicityテーブルを作成します。
    テーブルbc_unmicality (gid serial、code integer、name varchar、the_geom geometry) を作成します。-長さを計算します。
    SELECT sum(ST_Length(the_geom))/1000 AS km_roads FROM bc_roads;
    
    km_roads
    ------------------
    70842.1243039643
    (1行)
    
    -面積を計算します。
    SELECT ST_Area(the_geom)/10000 ASヘクタールからbc_municity WHERE name='PRINCEGE';
    
    ヘクタール
    ------------------
    32657.9103824927
    (1行)
    -- ST_Contains関数を使用します。
    SELEC T m.name、sum(ST_Length(r.the_geom))/1000 as roads_km
    から
      bc_roads AS r, bc_micipality AS m
    どこ
      ST_Contains(m.the_geom,r.the_geom)
    グループB Y m.name
    roads_kmによる注文;
    
    name | roads_km
    ---------------------------- + ------------------
    SURREY | 1539.47553551242
    バンクーバー | 1450.33093486576
    ラングリー地区 | 833.793392535662
    BURNABY | 773.769091404338
    ジョージ王子様 | 694.37554369147
    
    
    -- ST_Covers関数を使用します。
    SELECT ST_Covers(smallc,smallc) smallinsmallとして、
        ST_Covers(smallc, bigc) smallcoversbigとして、
        ST_Covers(bigc, ST_ExteriorRing(bigc))
        ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior
    FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)')) 、10)
        ST_Buffer(ST_GeomFromText('POINT(1 2)') 、20) As bigc) As foo;
        -結果
     smallinsmall | smallcoversbig | bigcoversexterior | bigcontainsexterior
    -------------- ---------------- -------------------
     t | f | t | f
    (1行)
    
    -- ST_Disjoint関数を使用します。
    SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry);
     st_disjoint
    ---------------
     t
    (1行)
    SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);
     st_disjoint
    ---------------
     f
    (1行)
    
    -- ST_Overlaps関数を使用します。
    SELECT ST_Overlaps(a,b) a_overlap_bとして、
        ST_Crosses(a,b) a_crosses_bとして、
            ST_Intersects(a, b) As a_intersects_b, ST_Contains(b,a) As b_contains_a
    FROM (SELECT ST_GeomFromText('POINT(1 0.5)') As a, ST_GeomFromText('LINESTRING(1 0, 1 1, 3 5)') As b)
        fooとして
    
    a_overlap_b | a_crosses_b | a_intersects_b | b_contains_a
    ------------ --------------- ---------------- ---------------------
    f | f | t | t
    
    -- ST_Relate関数を使用します。
    SELECT ST_Relate(ST_GeometryFromText('POINT(1 2)') 、ST_Buffer(ST_GeometryFromText('POINT(1 2)'),2) 、'0FFFFF212');
    st_relate
    -----------
    t
    
    -- ST_Touches関数を使用します。
    SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(1 1)'::geometry);
     st_touches
    ------------
     f
    (1行)
    
    SELECT ST_Touches('LINESTRING(0 0, 1, 0 2)'::geometry, 'POINT(0 2)'::geometry);
     st_touches
    ------------
     t
    (1行)
    
    -- ST_Within関数を使用します。
    SELECT ST_Within(smallc,smallc) As smallinsmall,
        ST_Within(smallc, bigc) As smallinbig,
        ST_Within(bigc,smallc) biginsmallとして、
        ST_Within(ST_Union(smallc, bigc), bigc) as unioninbig,
        ST_Within(bigc, ST_Union(smallc, bigc)) as biginunion,
        ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion
    から
    (
    SELECT ST_Buffer(ST_GeomFromText('POINT(50 50)'), 20) As smallc,
        ST_Buffer(ST_GeomFromText('POINT(50 50)') 、40) As bigc) As foo;
    -結果
     smallinsmall | smallinbig | biginsmall | unioninbig | biginunion | bigisunion
    ------------- --------------------------------------------------------------------------------
     t | t | f | t | t | t
    (1行) 
  • 拡張機能を削除します。
    ドロップ拡張ganos_geometryカスケード;

SQL リファレンス

詳細については、「公式PostGISリファレンス」をご参照ください。