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

PolarDB:ガノス幾何学

最終更新日:Oct 17, 2024

このトピックでは、ジオメトリモデルの詳細と使用方法について説明します。

概要

概要

Open Geospatial Consortium (OGC) は、地理空間データのモデルを提供するためにSimple Features Access standard (SFA) を開発しました。 ジオメトリの基本的な空間タイプと、ジオメトリ値を操作および変換して空間分析タスクを実行する操作を定義します。

GanosBase Geometryは、PostgreSQL ( PolarDB for PostgreSQL (Compatible with Oracle)) の時空間エンジン拡張です。 GanosBase Geometryは、OGCによって開発されたSFAを使用します。 平面やサーフェス上の点、線、平面などの幾何オブジェクトを記述するためのジオメトリおよび地理データ型をサポートしています。

機能

GanosBase Geometryは、空間オブジェクトの構築、アクセス、編集、処理、集約、およびエクスポートのための複数のメソッドをサポートしています。 また、空間オブジェクトのリレーショナルクエリと線形参照設定もサポートしています。

GanosBase Geometryは、WKT、WKB、EKWT、EWKB、KML、GML、GeoHash、Geojsonなど、直接入力用の複数のデータ形式と互換性があります。 他のツールを使用して、Esri Shapefilesなどの他の形式のデータをインポートすることもできます。

シナリオ

ジオメトリデータ型は、ジオメトリオブジェクトの格納と分析に使用できます。

  • マップの作成と視覚化

    地図ビジュアライゼーションは、地理空間内のデータの分布、傾向、および関係を表示します。 地図ビジュアライゼーションは、点、線、平面などのデータをマークし、地図の投影、色、記号などの要素を使用して、地理空間でのデータの分布を表示します。 これは、マップの作成と視覚化に役立ちます。 ジオメトリデータ型は、道路、川、建物など、マップ上のさまざまなフィーチャを表すために使用できます。

  • 位置情報サービス

    位置データの空間クエリ、集計、分析を実行して、最適な位置を見つけたり、リスクを評価したり、2点間の距離を計算したりできます。 ジオメトリデータタイプは、定時のジオオブジェクトを記述し、定時のジオオブジェクトに対して空間処理を実行することができる。 これは、ロケーションサービスのサポートを提供することができる。

  • 空間関係クエリ

    空間関係クエリは、空間データマイニングや都市計画など、さまざまなシナリオで使用できます。 空間関係クエリを実行することで、特定の条件を満たす空間エンティティをすばやく見つけることができます。 これにより、意思決定プロセスをサポートできます。 ジオメトリデータ型を使用すると、複数のジオメトリオブジェクト間の空間的関係を識別できます。 たとえば、2つのオブジェクトが交差するか、互いに接しているかを識別できます。

  • 空間解析とコンピューティング

    空間分析および計算は、建物の面積および2つの都市間の距離を計算するなど、さまざまな測定シナリオで使用できます。 ジオメトリデータ型は、面積、長さ、距離、重心の計算など、さまざまなタイプの空間分析と計算をサポートします。

コンポーネント

ジオメトリモデルの概要

ジオメトリは、2次元または3次元の座標系で形状をモデル化します。 形状のサイズと位置は、それらの座標によって指定されます。 各座標は、x座標値およびy座標値を有し、z座標値およびm座標値を含み得る。 z座標値は、高度を表すためによく使用されます。 m座標は、時間または距離を表し得る測定値を含む。 ジオメトリ値にz座標またはm座標の値が存在する場合は、ジオメトリの各点に対してそれらを定義する必要があります。 ジオメトリにz座標またはm座標の値がある場合、座標次元は3Dです。 ジオメトリにz座標とm座標の両方の値がある場合、座標次元は4Dです。

空間参照システム

空間参照システム (SRS) は、ジオメトリオブジェクトを地球の表面上の特定の場所に関連付ける方法を定義します。

GanosBaseは、SRS定義を参照するためにSRIDとして整数を使用します。 Sceneオブジェクトは、それ自体のSRID値を使用することによってSRSに関連付けられる。

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

外部使用のフォーマット

SFA仕様では、外部で使用するジオメトリ値を表す2つの形式を定義します。

  • 周知テキスト (WKT) は、空間データの標準的なテキスト表現を提供する。

  • WKB (Well-Known Binary) は、バイナリデータとしての空間データのポータブルでフル精度の表現を提供します。

WKTおよびWKBの両方は、オブジェクトのタイプおよびそれを定義する座標に関する情報を含むが、関連するSRIDは含まない。 非バイナリデータはサポートされていません。

GanosBaseは、3DZ、3DM、および4Dデータをサポートし、SRID情報を埋め込むために、WKTおよびWKBフォーマットに加えてEKWTおよびEKWBフォーマットを提供します。

EKWTまたはEKWBフォーマットは、WKTまたはWKBフォーマットのスーパーセットである。 WKTまたはWKBフォーマットの任意の有効なファイルは、EKWTまたはEKWBフォーマットの有効なファイルである。

ジオメトリデータ型

  • 原子タイプ

    モデル

    説明

    Point

    座標空間内の単一の位置を表す0次元ジオメトリ。

    • ポイント (1 2) * ポイントZ (1 2 3)

    • ポイントZM (1 2 3 4)

    ラインストリング

    線分の連続したシーケンスによって形成される1次元線。 各線分は2つの点によって定義され、1つの線分の終点が次の線分の始点を形成する。 LineStringsは、自己交差であり得る。

    LINESTRING (1 2, 3 4, 5 6)

    Polygon

    外部境界 (シェル) とゼロ以上の内部境界 (穴) によって区切られた2次元平面領域。 各境界はLinearRingです。

    POLYGON ((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0) 、(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))

  • パラメータ化された型

    モデル

    説明

    EllipticalString

    楕円弧。

    ELLIPTICALSTRING(-2 0,2 0,0 0,0、0,0、2,0 5)

    Bezier3Curve

    4つのポイントによって決定される3次ベジェ曲線。

    BEZIER3CURVE(1 1, 2, 3 2, 3 1)

  • コレクションの種類

    モデル

    説明

    マルチポイント

    ポイントのコレクション。

    マルチポイント ( (0 0), (1 2) )

    MultiLineString

    LineStringsのコレクション。

    MULTILINESTRING ( (0 0,1 1,1 2) 、(2 3,3 2,5 4) )

    MultiPolygon

    非重複および非隣接ポリゴンのコレクション。 集合内の多角形は、有限数の点でのみ接触することができる。

    マルチポリゴン (((1 5、5、5 1、1 1、1 5)) 、((6 5、9 1、6 1、6 5)))

    GeometryCollection

    ジオメトリの異種コレクションのコレクション。

    GEOMETRYCOLLECTION ( POINT(2 3) 、LINESTRING(2 3, 3 4))

    CompoundCurve

    線、楕円弧、およびベジエ曲線を含むことができる複合線オブジェクト。 すべてのコンポーネント (最後のコンポーネントを除く) の終点は、次のコンポーネントの始点と一致している必要があります。

    • COMPOUNDCURVE((1 0,2 0),ELLIPTICALSTRING(2 0 ,4 0, 3 0, 1,0,0,1,0.5))

    • COMPOUNDCURVE((1 2,2 0) 、BEZIER3CURVE(2 0,20 20、30 10,10 10))

    CurvePolygon

    カーブを含む複合サーフェスオブジェクト。 CurvePolygon内のオブジェクトは閉じる必要があります。

    • CURVEPOLYGON(ELLIPTICALSTRING(2 0,2 0,0 0,0、0,0、2,0) 、CIRCULARSTRING(-0.5 0,0、0、-0.5 0))

    • CURVEPOLYGON(BEZIER3CURVE(1 1、2、3 1、1) 、CIRCULARSTRING(1.7 1.2、1.9 1.2、1.7 1.2))

空間データ列ビュー

GanosBaseでは、geometry_columnsビューは、データベースのシステムカタログテーブルからすべてのジオメトリ列を読み取ります。 このビューは、OGCによって定義されたSQL標準の単純機能仕様に従います。

空間データ列ビューには、次の列が含まれます。

データ型

説明

f_table_catalog

varchar(256)

データベースの名前。 この値はpostgresとして固定されます。

f_table_schema

varchar(256)

テーブルのスキーマ。

f_table_name

varchar(256)

テーブルの名前。

f_geometry_列

varchar(256)

テーブル内のジオメトリ列の名前。

coord_dimension

integer

ジオメトリ列のディメンション。 有効な値: 2,3、および4。

スリッド

integer

spatial_ref_sysテーブルを参照する外部キーであるジオメトリ列のSRID。

タイプ

varchar (30)

ジオメトリオブジェクトの型。 値は、標準のOGCデータ型のいずれかである必要があります。 GEOMETRYの値は、混合データ型を示します。

次のステートメントを実行して、現在のデータベースのすべてのジオメトリデータ列を照会できます。

SELECT * FROM geometry_columns;

インデックス

空間インデックスにより、GanosBaseは、大きな空間データセットを処理するときにデータベースのグローバルなシーケンシャルスキャンを回避できます。 空間インデックスは、特定のレコードを見つけるために素早くトラバースできるツリー構造にデータを編成します。

GanosBaseは、空間データに次のタイプの空間インデックスを提供します。

インデックス

概要

機能

GiST (一般化検索ツリー)

GiSTは、空間インデックス付けに一般的に使用されるバランスの取れた検索ツリーです。 高いクエリパフォーマンスを提供できます。  

GiSTインデックスを使用すると、バランスの取れたツリーに任意のタイプのデータを分散するルールを定義できます。 データにアクセスするメソッドを定義することもできます。

BRIN (ブロック范囲インデックス)

BRINインデックスは、ブロック範囲と呼ばれる空間テーブルのレコードのセットを格納します。 クエリを実行すると、ブロック範囲の結果がスキャンされます。  

  • BRINは、オーバーラップが少ない、またはまったくない大きなテーブル (ポイントなど) に適しています。 これらのテーブルは静的であるか、まれにしか変化しない。

  • GiSTと比較して、BRINはインデックスの作成時間が短く、インデックスサイズが小さくなりますが、クエリ時間が遅くなります。

  • BRINは手動インデックスメンテナンスが必要です。

  • BRINは、多数のデータレコードを返すクエリに対してより効果的です。

SP-GiST (スペース分割された一般化検索ツリー)

SP-GiSTは、4分木、k-d木、基数木などの分割された検索木をサポートする多次元データ型のインデックス作成の一般的な形式です。

  • SP-GiSTはGiSTよりも少ない演算子をサポートし、KNN検索はサポートしません。

  • SP-GiSTは、重複しないオブジェクトにはGiSTよりも適しています。

クイックスタート

概要

このセクションでは、拡張子の作成、テーブルの作成、データのインポート、インデックスの作成、空間分析と測定、空間関係の識別など、GanosBase Geometryエンジンの使用方法について説明します。

構文

  • 拡張を作成します。

    -- Create a geometry extension.
    CREATE extension ganos_geometry cascade;
    説明

    アクセス許可の問題を回避するために、パブリックスキーマに拡張機能を作成します。

    CREATE extension ganos_geometry WITH schema public cascade;
  • ジオメトリテーブルを作成します。

    -- Method 1: Create a table that contains a geometry field.
    CREATE TABLE ROADS ( ID int4, ROAD_NAME varchar(25), geom geometry(LINESTRING,3857) );
    
    -- Method 2: Create a regular table and then add a geometry field to the table.
    CREATE TABLE ROADS (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)
      VALUES (1,ST_GeomFromText('LINESTRING(191232 243118,191108 243242)',3857),'North Fifth-Ring Road');
    INSERT INTO roads (id, geom, road_name)
      VALUES (2,ST_GeomFromText('LINESTRING(189141 244158,189265 244817)',3857),'East Fifth-Ring Road');
    INSERT INTO roads (id, geom, road_name)
      VALUES (3,ST_GeomFromText('LINESTRING(192783 228138,192612 229814)',3857),'South Fifth-Ring Road');
    INSERT INTO roads (id, geom, road_name)
      VALUES (4,ST_GeomFromText('LINESTRING(189412 252431,189631 259122)',3857),'West Fifth-Ring Road');
    INSERT INTO roads (id, geom, road_name)
      VALUES (5,ST_GeomFromText('LINESTRING(190131 224148,190871 228134)',3857),'East Chang'an Avenue');
    INSERT INTO roads (id, geom, road_name)
      VALUES (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) | South Fifth-Ring Road
      4 | LINESTRING(189412 252431,189631 259122) | West Fifth-Ring Road
      5 | LINESTRING(190131 224148,190871 228134) | East Chang'an Avenue
      6 | LINESTRING(198231 263418,198213 268322) | West Chang'an Avenue
    (6 rows)
  • インデックスを作成します。

    -- Create a GiST index.
    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)];
    
    -- Example:
    Create INDEX sp_geom_index ON ROADS USING GIST(geom);
    VACUUM ANALYZE ROADS (geom);
    
    -- Create a BRIN index.
    CREATE INDEX [indexname] ON [tablename] USING 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);
      -- Create a BRIN index with specified block size.
    CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geometryfield] ) WITH (pages_per_range = [number]);
  • 空間データを測定および分析する。

    --Create Table bc_roads:
    Column  | Type  | Description
    ------------+-------------------+-------------------
    gid | integer   | Unique ID
    name| character varying | Road Name
    the_geom| geometry  | Location Geometry (Linestring)
    
    --Create table bc_municipality:
    Column | Type  | Description
    -----------+-------------------+-------------------
    gid| integer   | Unique ID
    code   | integer   | Unique ID
    name   | character varying | City / Town Name
    the_geom   | geometry  | Location Geometry (Polygon)
    
    -- Calculate the length.
    SELECT sum(ST_Length(the_geom))/1000 AS km_roads FROM bc_roads;
    
    km_roads
    ------------------
    70842.1243039643
    (1 row)
    
    -- Calculate the area.
    SELECT ST_Area(the_geom)/10000 AS hectares FROM bc_municipality WHERE name = 'PRINCE GEORGE';
    
    hectares
    ------------------
    32657.9103824927
    (1 row)
  • 空間関係の識別。

    --ST_Contains
    SELECT  m.name, sum(ST_Length(r.the_geom))/1000 as roads_km
    FROM
      bc_roads AS r, bc_municipality AS m
    WHERE
      ST_Contains(m.the_geom,r.the_geom)
    GROUP BY m.name
    ORDER BY roads_km;
    
    name| roads_km
    ----------------------------+------------------
    SURREY  | 1539.47553551242
    VANCOUVER   | 1450.33093486576
    LANGLEY DISTRICT| 833.793392535662
    BURNABY | 773.769091404338
    PRINCE GEORGE   | 694.37554369147
    ...
    
    --ST_Covers,a circle covering a circle
    SELECT ST_Covers(smallc,smallc) As smallinsmall,
        ST_Covers(smallc, bigc) As smallcoversbig,
        ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior,
        ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior
    FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc,
        ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo;
        --Result
     smallinsmall | smallcoversbig | bigcoversexterior | bigcontainsexterior
    --------------+----------------+-------------------+---------------------
     t| f  | t | f
    (1 row)
    
    --ST_Disjoint
    SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry);
     st_disjoint
    ---------------
     t
    (1 row)
    SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);
     st_disjoint
    ---------------
     f
    (1 row)
    
    --ST_Overlaps
    SELECT ST_Overlaps(a,b) As a_overlap_b,
            ST_Crosses(a,b) As 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)
        As 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 row)
    
    SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(0 2)'::geometry);
     st_touches
    ------------
     t
    (1 row)
    
    --ST_Within
    SELECT ST_Within(smallc,smallc) As smallinsmall,
        ST_Within(smallc, bigc) As smallinbig,
        ST_Within(bigc,smallc) As 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
    FROM
    (
    SELECT ST_Buffer(ST_GeomFromText('POINT(50 50)'), 20) As smallc,
        ST_Buffer(ST_GeomFromText('POINT(50 50)'), 40) As bigc) As foo;
    --Result
     smallinsmall | smallinbig | biginsmall | unioninbig | biginunion | bigisunion
    --------------+------------+------------+------------+------------+------------
     t| t  | f  | t  | t  | t
    (1 row)
  • ジオメトリオブジェクトにアクセスします。

     SELECT ST_IsSimple(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))'));
     st_issimple
    -------------
     t
    (1 row)
    
     SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)'));
     st_issimple
    -------------
     f
    (1 row)
    
    
    -- Query the largest city that has traffic circles in the terrain.
    SELECT gid, name, ST_Area(the_geom) AS area
    FROM bc_municipality
    WHERE ST_NRings(the_geom) > 1
    ORDER BY area DESC LIMIT 1;
    
    gid  | name | area
    -----+--------------+------------------
    12   | Anning        | 257374619.430216
    (1 row)
  • 拡張子を削除します (オプション) 。

    -- Delete the geometry extension.
    Drop extension ganos_geometry cascade;

SQL参照

詳細については、「ジオメトリSQLリファレンス」をご参照ください。