9.1 プロパティ・グラフの空間データの表現

空間データは、頂点のプロパティおよびエッジのプロパティの値として使用できます。

たとえば、エンティティは、locationという名前のプロパティの値として、点(経度および緯度)を持つことができます。別の例として、エッジはプロパティの値としてポリゴンを持つことができ、このプロパティはこのリンク(関係)が確立された場所を表現することができます。

次にプロパティ・グラフの空間データをエンコードするための構文の例を示します。

  • 点: '-122.230 37.560'

  • 点: 'POINT(-122.241 37.567)'

  • SRIDを指定した点: 'srid/8307 POINT(-122.246 37.572)'

  • ポリゴン: 'POLYGON((-83.6  34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))'

  • SRIDを指定したポリゴン: 'srid/8307 POLYGON((-83.6 34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))'

  • 線ストリング: 'LINESTRING (30 10, 10 30, 40 40)'

  • 複数線ストリング: 'MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10))'

テスト・プロパティ・グラフの名前をtestとします。次の文は、頂点とそれぞれに指定された座標(経度および緯度)のセットを追加します。

insert into testVT$(vid, k, t, v) values(100, 'geoloc', 20, '-122.230 37.560'); 
insert into testVT$(vid, k, t, v) values(101, 'geoloc', 20, '-122.231 37.561');
insert into testVT$(vid, k, t, v) values(102, 'geoloc', 20, '-122.236 37.562914');
insert into testVT$(vid, k, t, v) values(103, 'geoloc', 20, '-122.241 37.567');
insert into testVT$(vid, k, t, v) values(104, 'geoloc', 20, '-122.246 37.572');
insert into testVT$(vid, k, t, v) values(105, 'geoloc', 20, '-122.251 37.577');
insert into testVT$(vid, k, t, v) values(200, 'geoloc', 20, '-122.256 37.582');
insert into testVT$(vid, k, t, v) values(201, 'geoloc', 20, '-122.261 37.587');

プロパティ・グラフの空間データを使用して、SDO_GEOMETRYオブジェクトを作成できます。たとえば、OPG_APIS.GET_GEOMETRY_FROM_V_T_COLS関数を使用して、指定した値(20など)のすべてのTに対しV列から空間データを読み取り、SDO_GEOMETRYオブジェクトを返すことができます。この関数は、値が2つの数字のようであれば表として解析しようとし、値が単一点でなければSDO_GEOMETRYコンストラクタを使用します。最後に、SRIDが指定されると、SDO_CS_TRANSFORMプロシージャを使用して、指定された座標システムを使用して変換します。

次の例は、OPG_APIS.GET_GEOMETRY_FROM_V_T_COLS関数を使用してtestプロパティ・グラフからジオメトリを取得します。これには一部の出力が含まれます。

SQL> select vid, k, opg_apis.get_geometry_from_v_t_cols 
      from testVT$     
        order by vid, k;
   . . .
       100 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.23, 37.56, NULL), NULL, NULL)
       101 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.231, 37.561, NULL), NULL, NULL)
       102 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.236, 37.562914, NULL), NULL, NULL)
       103 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.241, 37.567, NULL), NULL, NULL)
   . . .

SDO_GEOMETRYオブジェクトをWKTリテラルから生成できます。次の例は、WKTリテラルを挿入し、次にOPG_APIS.GET_WKTGEOMETRY_FROM_V_T_COLSを使用して、V、T列からSDO_GEOMETRYオブジェクトを作成します。

truncate table testGE$;
truncate table testVT$;
insert into testVT$(vid, k, t, v) values(101, 'geoloc', 20, 'POLYGON((-83.6  34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))');
insert into testVT$(vid, k, t, v) values(103, 'geoloc', 20, 'POINT(-122.241 37.567)');
insert into testVT$(vid, k, t, v) values(105, 'geoloc', 20, 'POINT(-122.251 37.577)');
insert into testVT$(vid, k, t, v) values(200, 'geoloc', 20, 'MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10))');
insert into testVT$(vid, k, t, v) values(201, 'geoloc', 20, 'LINESTRING (30 10, 10 30, 40 40)');

prompt show the geometry info
SQL> select vid, k, opg_apis.get_wktgeometry_from_v_t_cols(v,t) 
       from testVT$
      order by vid, k;
   . . .
       101 geoloc SDO_GEOMETRY(2003, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(-83.6, 34.1, -83.6, 34.3, -83.4, 34.3, -83.4, 34.1, -83.6, 34.1))
       103 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.241, 37.567, NULL), NULL, NULL)
       105 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.251, 37.577, NULL), NULL, NULL)
       200 geoloc SDO_GEOMETRY(2006, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(10, 10, 20, 20, 10, 40, 40, 40, 30, 30, 40, 20, 30, 10))
       201 geoloc SDO_GEOMETRY(2002, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(30, 10, 10, 30, 40, 40))