35.30 SDO_UTIL.GET_VECTORTILE

書式

SDO_UTIL.GET_VECTORTILE(
    TABLE_NAME       IN VARCHAR2,
    GEOM_COL_NAME    IN VARCHAR2,
    TILE_X           IN NUMBER,
    TILE_Y           IN NUMBER,
    TILE_ZOOM        IN NUMBER,
    ATT_COL_NAMES    IN MDSYS.SDO_STRING_ARRAY DEFAULT NULL,
    SIMPLE_PREDICATE IN MDSYS.SDO_STRING_ARRAY DEFAULT NULL,
    LAYER_NAME       IN VARCHAR2 DEFAULT 'LAYER',
    TILE_EXTENT      IN NUMBER DEFAULT 4096,
    GOOGLE_TS        IN BOOLEAN DEFAULT TRUE,
    MAX_FEATURES     IN NUMBER DEFAULT 20000,
    ROWID_FLG        IN BOOLEAN DEFAULT FALSE
    ) RETURN BLOB;

または

SDO_UTIL.GET_VECTORTILE(
    TABLE_NAME       IN VARCHAR2,
    GEOM_COL_NAME    IN VARCHAR2,
    TILE_X           IN NUMBER,
    TILE_Y_PBF       IN VARCHAR2,
    TILE_ZOOM        IN NUMBER,
    ATT_COL_NAMES    IN MDSYS.SDO_STRING_ARRAY DEFAULT NULL,
    SIMPLE_PREDICATE IN MDSYS.SDO_STRING_ARRAY DEFAULT NULL,
    LAYER_NAME       IN VARCHAR2 DEFAULT 'LAYER',
    TILE_EXTENT      IN NUMBER DEFAULT 4096,
    GOOGLE_TS        IN BOOLEAN DEFAULT TRUE,
    MAX_FEATURES     IN NUMBER DEFAULT 20000,
    ROWID_FLG        IN BOOLEAN DEFAULT FALSE
    ) RETURN BLOB;

または

FUNCTION GET_VECTORTILE(
  CUR              IN SYS_REFCURSOR,
  TILE_X           IN NUMBER,              
  TILE_Y           IN NUMBER,
  TILE_ZOOM        IN NUMBER,
  LAYER_NAME       IN VARCHAR2 DEFAULT 'LAYER',
  TILE_EXTENT      IN NUMBER DEFAULT 4096,
  GOOGLE_TS        IN BOOLEAN DEFAULT TRUE,
  MAX_FEATURES     IN NUMBER DEFAULT 20000
) RETURN BLOB;

説明

Mapbox Vector Tile (MVT)を表すBLOBを生成します。

パラメータ

table_name

名前付きジオメトリ列および属性列リストで名前が付いたすべての列を含む有効な表またはビューの名前。

表(またはビュー)に対してREADアクセス権があることを確認してください。必要な権限がない場合、または表が存在しない場合は、例外が発生します。

geom_col_name

table_nameのSDO_GEOMETRY型列またはファンクションベースの空間索引の名前。

列がtable_nameに存在しない場合、またはSDO_GEOMETRY型でない場合は、例外が発生します。

cur

APEXアプリケーションで使用されるSQL問合せのCURSOR

書式はCURSOR(<user_SQL_query>)です。

また、SQL問合せについて、次のことに注意してください。

  • SELECT句の最初の列は、ジオメトリ列である必要があります。
  • WHERE句にmask=anyinteractmin_resolution=' || res || 'およびbypass_point=trueパラメータを指定して、SDO_RELATEをコールする必要があります。WHERE句には、必要に応じて、SQL問合せの他の述語も含めることができます。

    min_resolutionパラメータの値は、((40075016.0/(2<tile_zoom>)) * .001)という式を使用して計算できます。ここで40075016はズーム・レベル0のタイルのX軸およびY軸に沿ったメートル数を示すデフォルト値、tile_zoomはリクエストされるタイルのズーム、.001は変更されない定数です。

    WHERE句にSDO_RELATEメソッドのコールが指定されていない場合でも、結果のタイルは同じままになります。ただし、関心のあるジオメトリのみでなく、すべてのジオメトリが処理されるため、タイルの計算コストは大幅に高くなります。

  • オプションで、ベクター・タイルに必要な分布情報の量に応じて、SQL問合せにORDER BY句およびFETCH FIRST ROWS ONLY句を指定できます。

CURSORNULLの場合、または指定された問合せが無効である場合は、例外が発生します。

tile_x

フェッチするタイルの原点のX座標。

このパラメータの有効最小値はゼロです。有効最大値は、指定されたズームに依存し、max(X) = (2^tile_zoom) - 1で計算できます。有効範囲外のX座標を指定すると、例外が発生します。

tile_y

フェッチするタイルの原点のY座標(NUMBER形式)。

このパラメータの有効最小値はゼロです。有効最大値は、指定されたズームに依存し、max(Y) = (2^tile_zoom) - 1で計算できます。有効範囲外のY座標を指定すると、例外が発生します。

tile_y_pbf

フェッチするタイルの原点のY座標(VARCHAR2形式)。

tile_y_pbf値は、数値とその後の任意のファイル拡張子を指定するVARCHAR2文字列です。Y縦座標値は、文字列内のファイル拡張子を削除した後に抽出されます。たとえば、文字列値‘23.pbf’または‘23.XYZ’を考えてみます。次に、23がY座標値として抽出され、'.'の後のすべてが削除され、無視されます。

このパラメータの有効最小値はゼロです。有効最大値は、指定されたズームに依存し、max(Y) = (2^tile_zoom) - 1で計算できます。有効範囲外のY座標を指定すると、例外が発生します。

tile_zoom

地図の分割に必要なタイルの数を決定します。これらのセグメントは、地図全体を読み取ることなく、より高い解像度で結合できます。

たとえば、ゼロのtile_zoomは、詳細がそれほど表示されずに、地図全体が単一のタイルとなります。ntile_zoomは、地図を2^n x 2^n個のタイル(つまり、X軸に沿ったタイルの数にY軸に沿ったタイルの数を乗算した数)に分割します。たとえば、8tile_zoomでは、65,536個のタイルになります。nの値が大きいほど、タイル内の詳細度が高くなることを意味します。有効範囲外のパラメータ値では例外が発生することに注意してください。

att_col_names

フィーチャの非空間データを含む属性列名。

これはオプションのパラメータです。たとえば、郡ポリゴンを問い合せる場合、郡名、郡が存在する都道府県、およびその郡の総人口にも関心がある場合があります。これらの列は、ATT_COL_NAMES => sdo_string_array('COUNTY','STATE','TOTPOP')のようにSDO_STRING_ARRAYとして指定されます。

配列の各項目は、表内(table_name)で一意の有効な列名である必要があります。ただし、これらの制限に違反しても、次の理由により致命的ではありません。

  • 項目名が表内の列で見つからない場合、その項目名は単に無視されます。
  • 同じ項目名の複数の列が指定されている場合は、最後の項目値のみが使用されます。

また、配列にリストされている項目値は、Oracleの標準の大/小文字ルールに従っており、'COUNTY''County'および'county'は重複とみなされ、これらはすべて'COUNTY'に解決されることに注意してください。ただし、'"COUNTY"''"County"'および'"county"'は重複とはみなされないため、これら3つはすべて競合することなく表の列名として指定できます。

att_col_namesリストに指定される列でサポートされるデータ型(ANSIとOracleの組込みの両方)を次の表に示します。

表35-1 att_col_namesリストの列でサポートされるデータ型

カテゴリ データ型
文字データ型
  • CHAR
  • CHARACTER
  • CHAR VARYING
  • CHARACTER VARYING
  • NATIONAL CHAR
  • NATIONAL CHARACTER
  • NATIONAL CHAR VARYING
  • NATIONAL CHARACTER VARYING
  • NCHAR
  • NCHAR VARYING
  • NVARCHAR2
  • VARCHAR
  • VARCHAR2
数値データ型
  • DEC
  • DECIMAL
  • DOUBLE PRECISION
  • FLOAT
  • INT
  • INTEGER
  • NUMBER
  • NUMERIC
  • REAL
  • SMALLINT
日付と時間
  • DATE
  • TIMESTAMP

関連項目:

Oracle SQLデータ型の詳細は、『Oracle Database SQL言語リファレンス』データ型を参照してください。

att_col_namesリストに指定される列でサポートされないデータ型を次に示します。

  • BINARY FLOAT
  • BINARY DOUBLE
  • LONG
  • LONG RAW
  • RAW
  • INTERVAL YEAR TO MONTH
  • INTERVAL DAY TO SECOND
  • BLOB
  • CLOB
  • NCLOB
  • BFILE
  • ROWID
  • UROWID
  • SDO_GEOMETRYSDO_TOPO_GEOMETRYおよびSDO_GEORASTERを含むユーザー定義のデータ型

ノート:

  • SDO_GEOMETRYは引き続き有効であり、実際、ベクター・タイル・リクエストで指定するgeom_col_nameに必要なデータ型です。
  • att_col_namesリストにサポートされていないデータ型の列が1つ以上指定されている場合、それらの列は無視され、タイルは列が要求されなかったかのように返されます。
simple_predicate

述語を形成する3つの要素(オペランド演算子)で構成される書式設定されたSDO_STRING配列。

3つの組を形成する要素については、次の点に注意してください。

  • 3つの最初の要素であるオペランドは、表内(table_name)の有効な列名である必要があります。列名が有効でない場合は、例外が発生します。
  • 3つの要素の2番目は演算子で、次の演算子のみがサポートされています。
    • =, !=, <, >, <=, >=
    • IS [NOT] NULL
    • AND
    • [NOT] LIKE
  • 3つの要素の3番目はで、文字列または数値である必要があります。たとえば、'answer'は文字列として扱われます。一方で、'42'42は両方とも数値として扱われます。
  • 3つの要素が複数ある場合は、AND演算子で結合された複数の述語が形成されます。たとえば、次のSIMPLE_PREDICATE配列があるとします。

    SIMPLE_PREDICATE => sdo_string_array('STATE', '=', 'WI', 'COUNTY', 'LIKE', 'B*', 'TOTPOP', '>', '50000')

    これは、"STATE"='WI' AND "COUNTY" LIKE 'B*' AND "TOTPOP" > 50000という述語が形成されます。

layer_name

ベクター・タイルのレイヤーの名前。

これはオプションのパラメータです。ベクター・タイルでは、デフォルトの'LAYER'値を持つ単一のレイヤーのみがサポートされます。

tile_extent

タイルの幅と高さを表す整数座標。

これはオプションのパラメータです。デフォルト値の4096は、ベクター・タイルの高さが4096単位で、幅が4096単位であることを示します。これらの単位の実際のサイズは、タイルのズーム・レベルによって異なります。タイル内の2つの座標間の距離は、ズーム・レベル0のほうがズーム・レベル12よりもはるかに大きくなります。標準以外のタイル処理方法を使用する場合のみ、デフォルトのパラメータ値を変更することをお薦めします。

google_ts

Googleタイル処理方法が使用されているかどうかを示すブール値。

これはオプションのパラメータです。デフォルト値はTRUEで、これはGOOGLEタイル処理方法を示します。

タイル住所の読取り時には、次の2つのタイル処理方法がサポートされています。

  • GOOGLE (デフォルト): このタイル処理方法では、タイルの原点(X,Y)が北西の角になります。X座標はタイルが西から東に読み取られるにつれて増加します。Y座標はタイルが北から南に読み取られるにつれて増加します。
  • TMS: このタイル処理方法では、タイルの原点(X,Y)が南西の角になります。X座標はタイルが西から東に読み取られるにつれて増加しますが、Y座標はタイルが南から北に読み取られるにつれて増加します
max_features

レイヤーに含まれるフィーチャの最大数。

これはオプションのパラメータであり、デフォルト値は20000です。

ベクター・タイルはレイヤーで構成されます。レイヤーはフィーチャで構成されます。フィーチャは、タイル・エンベロープと相互作用するジオメトリおよびその属性列です。州全体または国全体を覆う大規模なタイル・エンベロープの場合、建物の数とその属性は非常に多くなる可能性があります。過剰な数のフィーチャの処理は、CPUとメモリーの両方でリソースを大量に消費する可能性があります。

したがって、このパラメータを使用すると、レイヤーに含めるフィーチャの最大数を制御できます。

rowid_flg

ROWIDを属性列として取得するかどうかを示すブール値。

これはオプションのパラメータであり、デフォルト値はFALSEです。

FALSEの場合、ROWIDはタイル・フィーチャに列属性として含まれません。

TRUEの場合は、ROWIDがタイル・フィーチャに列属性として含まれます。

詳細は、「使用上のノート」を参照してください。

使用上のノート

SDO_UTIL.GET_VECTORTILEファンクションは、次の3つの書式をサポートしています(の先頭を参照してください)。

  • 最初の書式では、特定のズーム・レベルでX座標とY座標(両方ともNUMBER形式)を入力として受け取り、指定されたタイル住所によって定義されたタイル・エンベロープと相互作用するすべてのフィーチャを含むBLOBを返します。
  • 2番目の書式では、特定のズーム・レベルでX座標(NUMBER形式)と、.PBF接尾辞が付いたY座標(VARCHAR2形式)を入力として受け取り、BLOBベクター・タイル・データを返します。
  • 3番目の書式は、SQL問合せを使用したベクター・タイルの生成に適用されます。ベクター・タイルの作成に必要な行をフェッチするには、カーソル入力が必要です。出力ベクター・タイル・データはBLOBとして返されます。

BLOBの各フィーチャは、タイル・エンベロープと相互作用するジオメトリと、そのジオメトリに関連付けられているリクエストされた属性列で構成されることに注意してください。

タイルは、地図の一部を記述するポリゴン(正方形)です。タイル・エンベロープは、X軸とY軸の両方の両端を2.5%ずつ追加してタイルを覆う正方形でもあります。ユーザーから見ると、タイルとタイル・エンベロープは両方とも同じです。タイル・エンベロープは、MASK=ANYINTERACTが設定されたSDO_RELATEのコールでフィルタとして使用されます。

SDO_UTIL.GET_VECTORTILEファンクションでは、タイル・エンベロープのかわりにX、Y原点、ズーム・レベルおよびタイル方法が渡されることに注意してください。このファンクションは、タイル・エンベロープを形成するSDO_UTIL.GET_TILE_ENVELOPEを内部的にコールします。

SQL問合せ内でSDO_UTIL.GET_VECTORTILEファンクションをコールする場合は、次の点を考慮する必要があります。

  • タイル・エンベロープの作成に使用されるタイル住所(tile_xtile_yおよびtile_zoom)およびタイル処理方法(google_ts)が、ベクター・タイル・ファンクションに渡されるものと同じであることを確認します。そうしないと、異なる住所または方法によって異なるタイル・エンベロープが提供される場合があるため、ファンクションでデータが返されない可能性があります。
  • 同様に、フェッチする行数を決定するためにSQL問合せにmax_featuresを指定する場合は、問合せの最大フィーチャ値がベクター・タイル・ファンクションに渡される値と同じであることを確認します。また、次の点にも注意してください。
    • 問合せで指定されたmax_features値がベクター・タイルAPIで指定された値より大きい場合、問合せは引き続き多数の行の読取りが試行しますが、フィーチャの処理はAPIに渡されたmax_features値に制限されます。
    • 問合せで指定されたmax_features値がベクター・タイルAPIで指定された値より小さい場合、問合せは指定された行数をフェッチして終了します。
  • rowid_flgパラメータは、カーソル入力をサポートするSDO_UTIL.GET_VECTORTILEファンクション書式には含まれません。この場合、SELECT句にROWIDTOCHAR(<table_alias>.rowid) "ROWID"を追加することで、ROWID列属性を取得できます。この属性列は、取得する列のリストの任意の場所に配置できます。また、取得するリスト内の唯一の列にすることもできます。
    • "ROWID"疑似列名は単なる提示です。任意の名前を選択できます。
    • ROWIDTOCHARファンクション・コールでは、ROWIDの生成元の表の別名をROWIDの接頭辞として付ける必要があります。問合せにはデータ表とタイル・エンベロープ表の2つの表があるため、どちらの表からROWIDが生成されるかを明確にするためにこの別名が必要です。
    • 問合せから返される行数を制限する場合は、WHERE NUMROW <= :xを使用する必要があります(:xmax_featuresパラメータの値)。

次の例では、特定のズーム・レベルでNUMBER形式のX座標とY座標の両方を使用してベクター・タイル・データを取得します。この例では、各ベクター・タイルに対して10000レコードのサイズ制限も保持しています。
SQL> SELECT SDO_UTIL.GET_VECTORTILE(
       TABLE_NAME=>'states',
       GEOM_COL_NAME=>'geom',
       ATT_COL_NAMES=>sdo_string_array('totpop', 'name', 'state_abbrv'),
       SIMPLE_PREDICATE=>sdo_string_array('totpop','>', '50000'),
       TILE_X=>1192,
       TILE_Y=>1579,
       TILE_ZOOM=>12,
       MAX_FEATURES=>10000);

SDO_UTIL.GET_VECTORTILE(TABLE_NAME=>'US_STATE',GEOM_COL_NAME=>'GEOM',ATT_COL_NAMES=>SDO_STRING_ARRAY('TOTPOP','NAME','STATE_ABBRV'),SIMPLE_PREDICATE=>SDO_STRING
----------------------------------------------------------------------------------------------------------------------------------------------------------------
1A150A0E084E59414E205350415449414C0828802078021ABE010A054C41594552122C080012060000010102021803221E09CB01AE233AA80919AE2845B2010CFC06FD0B94098912009F069743000F12

次の例では、SQL問合せを使用してベクター・タイル・データを取得するステップを説明します。

SELECT SDO_UTIL.GET_VECTORTILE(
       CURSOR(
         WITH tet(tec) AS
             (SELECT SDO_UTIL.GET_TILE_ENVELOPE(tile_zoom=>12, tile_x=>1192, tile_y=>1579))
         SELECT geom, totpop, state, state_abrv
             FROM states, tet
             WHERE totpop > 200 and ROWNUM <= 10000 and
              SDO_RELATE(geom, tet.tec,
                 'mask=anyinteract min_resolution=9.7839 bypass_point=true')),
         tile_zoom=>12, tile_x=>1192, tile_y=>1579) FROM DUAL;

SDO_UTIL.GET_VECTORTILE(CURSOR(WITHTET(TEC)AS(SELECTSDO_UTIL.GET_TILE_ENVELOPE(T
--------------------------------------------------------------------------------
1A150A0E084E59414E205350415449414C0828802078021A620A054C41594552121C080012060000
010102021803220E09CB01B81B128E10851D8D10000F1A06544F54504F501A0553544154451A0A53
544154455F4142525622091900000000673D5241220A0A084D6172796C616E6422040A024D442880
207802

前述の例では、次のようにmin_resolution値が計算されます:

SQL> SELECT ((40075016.0/POWER(2, 12)) * .001) FROM DUAL;

((40075016.0/POWER(2,12))*.001)
-------------------------------
                     9.78393945

次の例では、タイル・フィーチャの列属性としてROWIDを返します。ベクター・タイルは、次に示すように、SQL問合せ(cursor入力あり)を使用して生成されます。

SELECT SDO_UTIL.GET_VECTORTILE(
       cursor(
         WITH tet(tec) AS
             (SELECT SDO_UTIL.GET_TILE_ENVELOPE(tile_zoom=>12, tile_x=>1192, tile_y=>1579))
         SELECT geom, totpop, state, state_abrv, ROWIDTOCHAR(vtt.rowid) "ROWID"
             FROM states, tet
             WHERE totpop > 200 and ROWNUM <= 10000 and
                   SDO_RELATE(geom, tet.tec,
                     'mask=anyinteract min_resolution=9.7839 bypass_point=true')),
       tile_zoom=>12, tile_x=>1192, tile_y=>1579) FROM DUAL;

次の例では、ROWID_FLGパラメータがTRUEに設定されているため、このプロシージャはタイル・フィーチャの列属性としてROWIDを返します。

SELECT SDO_UTIL.GET_VECTORTILE(
       TABLE_NAME=>'states',
       GEOM_COL_NAME=>'geom',
       ATT_COL_NAMES=>sdo_string_array('totpop', 'state', 'state_abbrv'),
       SIMPLE_PREDICATE=>sdo_string_array('totpop','>', '200'),
       TILE_X=>1192,
       TILE_Y=>1579,
       TILE_ZOOM=>12,
       ROWID_FLG=>TRUE,
       MAX_FEATURES=>10000);