3 マップ視覚化サーバー

マップ視覚化コンポーネントは、Java Enterprise Editionパッケージのセットとして、マッピング・サービスを提供するためのサーバーの集合を含みます。

これらのサービスには、マップ・サーバー、マップ・データ・サーバー、マップ・タイル・サーバー、ベクター・タイル・サーバー、WMSサーバー(マップ視覚化コンポーネントでのOGC WMSサポートを参照)、WMTSサーバー(マップ視覚化コンポーネントでのOGC WMTSサポートを参照)などがあります。Oracle Mapsアプリケーションの開発時には、Oracle Maps APIとマップ視覚化コンポーネント・サーバーによって、必要とされるサービスが識別され、適切なサーバーに向けてマップ・サービス・リクエストが発行されます。通常、マップ・アプリケーションで明示的にサービス・リクエストを送信する必要はありません。ただし、この章で説明するマップ視覚化コンポーネント・サーバーの詳しい知識があると、アプリケーションのデバッグや最適化が必要になったときに役立ちます。

3.1 マップ視覚化コンポーネント・マップ・データ・サーバー

マップ視覚化コンポーネント・マップ・データ・サーバーは、データベースからクライアントへのライブ・データのストリーミング・サービスを提供します。

このデータは、Oracle Maps JavaScript APIクライアントで利用できます。また、API編集ユーティリティで編集することもできます。さらに、データ同期タスクを処理するための、中間層コンポーネントとして使用されることもあります。

最も簡単に説明すると、クライアントはテーマの名前とオプションの枠ボックスを指定したリクエストをマップ・データ・サーバーに送信します。サーバーは、圧縮されたGeoJSON形式でライブ・データを返します(このデータには、ジオメトリと属性の両方が含まれています)。

3.1.1 ドメインとマップ・データ・サーバーURLのパターン

マップ・データ・サーバーは、複数のドメインを使用します。それぞれのドメインが1つのマップ視覚化コンポーネント・データソースに対応します。たとえば、mvdemoデータソースからのデータをリクエストするには、URLが次のパターンに従っている必要があります。

http://example.com:8080/mapviewer/dataserver/mvdemo?

このURLリクエストでは、/dataserverがマップ・データ・サーバーを表しています。/mvdemoは、このリクエストが、どのドメインまたはデータソースに向けられているかを示しています。URLリクエストの残りの部分で、明示的にデータソースを指定する必要はありません。このURLパターンには、保護の観点からの柔軟性があります。ユーザーやWeb管理者は、そのようなURLパターンを使用して、簡単に様々なドメインに様々な保護のレベルを設定できます。

サポートされているHTTPリクエスト・パラメータの完全なリストについてのクイック・ヘルプを取得するには、helpパラメータを含んでいるリクエストを発行します。次に例を示します。

http://example:8080/mapviewer/dataserver/mvdemo?help=true

この例により、サポートされているパラメータのリストが返されます。(/mvdemoパスは、このヘルプ・リクエストの場合にも必要とされます)。

3.1.2 マップ・データ・サーバー・リクエストのパラメータ

データを取得するマップ・データ・サーバー・リクエストでは、URLに適切な問合せパラメータが含まれている必要があります。データは、マップ視覚化コンポーネントの事前定義済ジオメトリ・テーマかJDBCテーマからのものになります。

3.1.2.1 事前定義済ジオメトリ・テーマからのデータの取得

事前定義済ジオメトリ・テーマからデータを取得する前に、事前定義済ジオメトリ・テーマが適切に定義されていることを確認してください。適切に定義されていない場合、その定義を変更するか、適切な定義で新しい事前定義済ジオメトリ・テーマを作成してください。

空間表のジオメトリ列の他に、アプリケーションの属性列も必要な場合、ジオメトリ・テーマのSTYLING_RULESには、必要な属性を定義するために<hidden_info>要素が必要です。たとえば、空間表を表すためにアプリケーションにジオメトリ・テーマ(CUSTOMERSなど)が必要で、各顧客の名前、都市および売上高も必要な場合、STYLING_RULESは、次のようになります。

SQL> select STYLING_RULES from user_sdo_themes where name='CUSTOMERS';
 
STYLING_RULES
--------------------------------------------------------------------------------
<?xml version="1.0" standalone="yes"?>
<styling_rules>
  <hidden_info>
    <field column="name" name="Name"/>
    <field column="city" name="City"/>
    <field column="sales" name="Sales"/>
  </hidden_info>
  <rule>
    <features style="M.STOPLIGHT_RED"> </features>
  </rule>
</styling_rules>

マップ・ビジュアライザ・ユーティリティは、ジオメトリ・テーマを変更または作成するための推奨ツールです。

事前定義済ジオメトリ・テーマでのスタイリング・ルールの使用の詳細は、「事前定義済空間ジオメトリ・テーマのスタイリング・ルール」を参照してください。

次のパラメータは、マップ視覚化コンポーネントの事前定義済ジオメトリ・テーマからデータを取得するマップ・データ・サーバー・リクエストに使用できます。t (テーマ名)パラメータは必須ですが、その他のパラメータはオプションです。

  • t: テーマの名前。

  • bbox: バウンディング・ボックス。minx,miny,maxx,maxyのカンマ区切りリストにする必要があります。

  • to_srid: データを返すためのSRID (空間参照システム)。

  • bbox_srid: データのネイティブSRIDとは異なる場合の枠ボックスのSRID (空間参照システム)。

  • seq: シーケンスID。マルチパート形式でデータを取得するときに使用します。

  • dadp: 小数点以下の桁数。返されるデータの座標系に対する小数点以下の最大桁数です。

  • include_style_info: それぞれの地物にスタイリング情報(レンダリング/ラベリング・スタイル名、および関連する列)を含めるかどうかを決定します。(デフォルト値はtrueです。)

  • include_label_box: 各ポリゴン地物にラベル・ボックスを含めるかどうかを決定します。(デフォルト値はtrueです。)ラベル・ボックスは、ポリゴンに収まる最大付近の矩形です。この矩形の内側に配置されるラベルは、ポリゴン地物に完全に収まるように生成されます。このパラメータは、ポリゴン以外の地物に対しては無視されます。

  • simplify:ジオメトリを簡略化するかどうかを決定します。(デフォルトはfalseです)

  • threshold: simplifytrueの場合、thresholdは、単純化の際に削除される入力ジオメトリからの頂点の近似割合を制御します。(1から99までの数にする必要があります)たとえば、値が10の場合、比較的少数(約10%)の頂点が削除されて大部分(約90%)が保持されます。一方、値が90の場合は、頂点の約90%が消去されます(約10%のみ保持されます)。

次に例を示します

すべてのデータをCITIES表から3857 SRIDで取得するには:

http://example:8080/mapviewer/dataserver/mvdemo?t=theme_demo_cities&to_srid=3857

指定したbboxに接触するすべてのデータをCITIES表から3857 SRIDで取得するには:

http://example:8080/mapviewer/dataserver/mvdemo?t=theme_demo_cities&bbox=-122.0,25,-100,45&to_srid=3857

指定したbboxに接触するすべてのデータをCITIES表から小数点以下3桁、スタイリング情報なしの3857 SRIDで取得するには:

http://example:8080/mapviewer/dataserver/mvdemo?t=theme_demo_cities&bbox=-122.0,25,-100,45&to_srid=3857&dadp=3&include_style_info=no

すべてのデータをCOUNTIES表から取得して、ラベル・ボックスを含めるには:

http://example:8080/mapviewer/dataserver/mvdemo?t=theme_demo_counties&include_label_box=yes

3.1.2.2 JDBCテーマからのデータの取得

次のパラメータは、動的JDBCテーマに基づいたマップ視覚化コンポーネント・テーマからデータを取得するマップ・データ・サーバー・リクエストに使用できます。t (テーマ名)パラメータとsql (SQL問合せ)パラメータは必須ですが、その他のパラメータはオプションです。

  • t: テーマの名前。

  • sql: 完全なSQL問合せ(適切にURLエンコードされたもの)。

  • asis: 問合せを「そのまま」実行する必要があるかどうかを決定します。デフォルトは、falseです。この値により、マップ視覚化コンポーネントは、その空間フィルタ問合せの副問合せとしてSQL問合せを埋め込みます。この値がtrueの場合、マップ視覚化コンポーネントは指定された問合せ文字列の変更を試行しなくなります。

  • bbox: バウンディング・ボックス。minx,miny,maxx,maxyのカンマ区切りリストにする必要があります。

  • to_srid: データを返すためのSRID (空間参照システム)。

  • bbox_srid: データのネイティブSRIDとは異なる場合の枠ボックスのSRID (空間参照システム)。

  • seq: シーケンスID。マルチパート形式でデータを取得するときに使用します。

  • dadp: 小数点以下の桁数。返されるデータの座標系に対する小数点以下の最大桁数です。

  • include_style_info: それぞれの地物にスタイリング情報(レンダリング/ラベリング・スタイル名、および関連する列)を含めるかどうかを決定します。(デフォルト値はtrueです。)

  • include_label_box: 各ポリゴン地物にラベル・ボックスを含めるかどうかを決定します。(デフォルト値はtrueです。)ラベル・ボックスは、ポリゴンに収まる最大付近の矩形です。この矩形の内側に配置されるラベルは、ポリゴン地物に完全に収まるように生成されます。このパラメータは、ポリゴン以外の地物に対しては無視されます。

次に例を示します

CITIES表のすべてのデータをSRID 3857で取得するには:

http://example:8080/mapviewer/dataserver/mvdemo?t=theme1&sql=select+*+from+cities&to_srid=3857

特定のbboxに収まるCITIES表のすべてのデータをSRID 3857で取得するには:

http://example:8080/mapviewer/dataserver/mvdemo?t=theme1&sql=select+*+from+cities&to_srid=3857&bbox=-122.0,25,-100,45

問合せをbboxなしでそのまま実行し、SRID 3857でデータを返すには:

http://example:8080/mapviewer/dataserver/mvdemo?t=theme1&sql=select+*+from+cities&to_srid=3857&bbox=-122.0,25,-100,45&asis=t

3.1.2.3 JDBCテーマからの注釈テキストの取得

JDBCテーマから注釈テキストの要素を取得するリクエストは、「JDBCテーマからのデータの取得」のリクエストと同様のものになります

次のパラメータは、動的JDBCテーマに基づいたマップ視覚化コンポーネント・テーマからデータを取得するマップ・データ・サーバー・リクエストに使用できます。t (テーマ名)、sql (SQL問合せ)、geom_type、およびbase_tableの各パラメータは必須ですが、その他のパラメータはオプションです。

  • t: テーマの名前。

  • sql: 完全なSQL問合せ(適切にURLエンコードされたもの)。

  • geom_type: 空間列が注釈タイプであることを示す、annotationとして指定する必要があります。

  • base_table: データベース表(その表の注釈テキスト・メタデータを読み取るサーバー用のもの)。

  • asis: 問合せを「そのまま」実行する必要があるかどうかを決定します。デフォルトは、falseです。この値により、マップ視覚化コンポーネントは、その空間フィルタ問合せの副問合せとしてSQL問合せを埋め込みます。この値がtrueの場合、マップ視覚化コンポーネントは指定された問合せ文字列の変更を試行しなくなります。

  • bbox: バウンディング・ボックス。minx,miny,maxx,maxyのカンマ区切りリストにする必要があります。

  • to_srid: データを返すためのSRID (空間参照システム)。

  • bbox_srid: データのネイティブSRIDとは異なる場合の枠ボックスのSRID (空間参照システム)。

  • seq: シーケンスID。マルチパート形式でデータを取得するときに使用します。

  • dadp: 小数点以下の桁数。返されるデータの座標系に対する小数点以下の最大桁数です。

  • include_style_info: それぞれの地物にスタイリング情報(レンダリング/ラベリング・スタイル名、および関連する列)を含めるかどうかを決定します。(デフォルト値はtrueです。)

  • include_label_box: 各ポリゴン地物にラベル・ボックスを含めるかどうかを決定します。(デフォルト値はtrueです。)ラベル・ボックスは、ポリゴンに収まる最大付近の矩形です。この矩形の内側に配置されるラベルは、ポリゴン地物に完全に収まるように生成されます。このパラメータは、ポリゴン以外の地物に対しては無視されます。

次の例では、注釈テキスト情報を取得します。

http://example:8080/mapviewer/dataserver/tilsmenv?t=theme1&sql=select+*+from+annotext_table&geom_col=textobj&geom_type=annotation&base_table=annotext_table&bbox=0,0,10,10

通常のレスポンスには、注釈テキスト・メタデータ情報に加えて、注釈テキスト地物が含まれています。それぞれの注釈テキスト地物には、1つ以上のテキスト要素が含まれていることがあります。それぞれのテキスト要素は、テキスト値、場所、引出し線、およびグラフィックの属性で定義されています。詳細は、注釈テキストについてのOGC仕様書を参照してください。

レスポンスは、次のようになります。

{"type":"AnnotationText",
"collectionName":"theme1",
"srs":0,
"geodetic":false,
"bbox":[0, 0, 10, 10],
"attr_names":["ID"],
"attr_types":["double"],
"default_text_attributes":{"fontWeight":"Normal","fontStyle":"Normal","textDecoration":"None","letterSpacing":"Normal","wordSpacing":"Normal","fill":"black","fill-opacity":1.0,"stroke":"black","strokeWidth":1.0,"stroke-opacity":1.0,"horizontalAlignment":"start","verticalAlignment":"top","multilineJustification":"left","multilineSpacing":0.0},
"metadata":{"textExpression":"name","textAttributes":{"fontFamily":"Serif","fontSize":14.0,"fill":"#ff0000"}},
"features":[
{"type":"AnnoText", "elements":[{"location":{"type":"Point", "coordinates":[1, 1]},"textValue":"Sample Label 1","leaderLine":{"type":"LineString", "coordinates":[0,0,1,1]}}],"envelope":{"type":"Rectangle", "coordinates":[0,0,1,1]},"properties":{"ID":"1.0"}},
{"type":"AnnoText", "elements":[{"location":{"type":"LineString", "coordinates":[2,5,4,5,6,5]},"leaderLine":{"type":"LineString", "coordinates":[4,3,4,5]},"textAttributes":{"fontFamily":"Dialog","fontSize":14.0,"fill":"blue"}}],"envelope":{"type":"Rectangle", "coordinates":[2,3,6,5]},"properties":{"ID":"3.0"}},
{"type":"AnnoText", "elements":[{"location":{"type":"Point", "coordinates":[10, 10]},"textValue":"Sample Label 2","leaderLine":{"type":"LineString", "coordinates":[5,10,10,10]}}],"envelope":{"type":"LineString", "coordinates":[5,10,10,10]},"properties":{"ID":"2.0"}}
]}
3.1.2.4 トポロジ・データの取得

トポロジ・セットは、トポロジ・プリミティブのセット(フェイス、エッジ、およびノード)で定義されます。それぞれのトポロジ地物は、1つ以上のトポロジ・プリミティブに関連付けできます。

トポロジ・プリミティブを取得するリクエストには、次の例に示すように、topologyパラメータを含める必要があります。

http://example:8080/mapviewer/dataserver/tilsmenv?topology=city_data&bbox=10,10,35,35

レスポンスには、入力MBRに接触するすべてのプリミティブが含まれています。

{"type":"TopologyPrimitives",
"topology":"city_data",
"srs":0,
"bbox":[0, 0, 62, 42],
"face_attr_names":["FACE_ID","BOUNDARY_EDGE_ID","ISLAND_EDGE_ID_LIST","ISLAND_NODE_ID_LIST"],
"face_attr_types":["integer","integer","array:integer","array:integer"],
"edge_attr_names":["EDGE_ID","START_NODE_ID","END_NODE_ID","NEXT_LEFT_EDGE_ID","PREV_LEFT_EDGE_ID","NEXT_RIGHT_EDGE_ID","PREV_RIGHT_EDGE_ID","LEFT_FACE_ID","RIGHT_FACE_ID"],
"edge_attr_types":["integer","integer","integer","integer","integer","integer","integer","integer","integer"],
"node_attr_names":["NODE_ID","EDGE_ID","FACE_ID"],
"node_attr_types":["integer","integer","integer"],
"primitives":[
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[3,30,15,38]}, "properties":{"FACE_ID":"1", "BOUNDARY_EDGE_ID":"1", "ISLAND_EDGE_ID_LIST":[25]}},
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[9,14,21,22]}, "properties":{"FACE_ID":"3", "BOUNDARY_EDGE_ID":"19"}},
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[9,6,21,14]}, "properties":{"FACE_ID":"6", "BOUNDARY_EDGE_ID":"20"}},
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[17,30,31,40]}, "properties":{"FACE_ID":"2", "BOUNDARY_EDGE_ID":"2", "ISLAND_NODE_ID_LIST":[4]}},
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[21,6,35,14]}, "properties":{"FACE_ID":"7", "BOUNDARY_EDGE_ID":"10"}},
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[21,14,35,22]}, "properties":{"FACE_ID":"4", "BOUNDARY_EDGE_ID":"17"}},
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[35,14,47,22]}, "properties":{"FACE_ID":"5", "BOUNDARY_EDGE_ID":"15"}},
{"type":"Face", "mbr_geometry":{"type":"Rectangle", "coordinates":[35,6,47,14]}, "properties":{"FACE_ID":"8", "BOUNDARY_EDGE_ID":"16"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[8,30,16,30,16,38,3,38,3,30,8,30]}, "properties":{"EDGE_ID":"1", "START_NODE_ID":"1", "END_NODE_ID":"1", "NEXT_LEFT_EDGE_ID":"1", "PREV_LEFT_EDGE_ID":"1", "NEXT_RIGHT_EDGE_ID":"-1", "PREV_RIGHT_EDGE_ID":"-1", "LEFT_FACE_ID":"1", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[4,31,7,31,7,34,4,34,4,31]}, "properties":{"EDGE_ID":"26", "START_NODE_ID":"20", "END_NODE_ID":"20", "NEXT_LEFT_EDGE_ID":"26", "PREV_LEFT_EDGE_ID":"26", "NEXT_RIGHT_EDGE_ID":"-26", "PREV_RIGHT_EDGE_ID":"-26", "LEFT_FACE_ID":"9", "RIGHT_FACE_ID":"1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[9,22,21,22]}, "properties":{"EDGE_ID":"6", "START_NODE_ID":"16", "END_NODE_ID":"17", "NEXT_LEFT_EDGE_ID":"7", "PREV_LEFT_EDGE_ID":"21", "NEXT_RIGHT_EDGE_ID":"-21", "PREV_RIGHT_EDGE_ID":"19", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"3"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[9,14,9,22]}, "properties":{"EDGE_ID":"21", "START_NODE_ID":"15", "END_NODE_ID":"16", "NEXT_LEFT_EDGE_ID":"6", "PREV_LEFT_EDGE_ID":"22", "NEXT_RIGHT_EDGE_ID":"9", "PREV_RIGHT_EDGE_ID":"-6", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"3"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[9,14,21,14]}, "properties":{"EDGE_ID":"9", "START_NODE_ID":"15", "END_NODE_ID":"14", "NEXT_LEFT_EDGE_ID":"19", "PREV_LEFT_EDGE_ID":"-21", "NEXT_RIGHT_EDGE_ID":"-22", "PREV_RIGHT_EDGE_ID":"20", "LEFT_FACE_ID":"3", "RIGHT_FACE_ID":"6"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[9,6,21,6]}, "properties":{"EDGE_ID":"12", "START_NODE_ID":"8", "END_NODE_ID":"9", "NEXT_LEFT_EDGE_ID":"20", "PREV_LEFT_EDGE_ID":"-22", "NEXT_RIGHT_EDGE_ID":"22", "PREV_RIGHT_EDGE_ID":"-13", "LEFT_FACE_ID":"6", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[9,35,13,35]}, "properties":{"EDGE_ID":"25", "START_NODE_ID":"21", "END_NODE_ID":"22", "NEXT_LEFT_EDGE_ID":"-25", "PREV_LEFT_EDGE_ID":"-25", "NEXT_RIGHT_EDGE_ID":"25", "PREV_RIGHT_EDGE_ID":"25", "LEFT_FACE_ID":"1", "RIGHT_FACE_ID":"1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[9,6,9,14]}, "properties":{"EDGE_ID":"22", "START_NODE_ID":"8", "END_NODE_ID":"15", "NEXT_LEFT_EDGE_ID":"21", "PREV_LEFT_EDGE_ID":"-12", "NEXT_RIGHT_EDGE_ID":"12", "PREV_RIGHT_EDGE_ID":"-9", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"6"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[25,30,31,30,31,40,17,40,17,30,25,30]}, "properties":{"EDGE_ID":"2", "START_NODE_ID":"2", "END_NODE_ID":"2", "NEXT_LEFT_EDGE_ID":"3", "PREV_LEFT_EDGE_ID":"-3", "NEXT_RIGHT_EDGE_ID":"-2", "PREV_RIGHT_EDGE_ID":"-2", "LEFT_FACE_ID":"2", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[21,6,35,6]}, "properties":{"EDGE_ID":"13", "START_NODE_ID":"9", "END_NODE_ID":"10", "NEXT_LEFT_EDGE_ID":"18", "PREV_LEFT_EDGE_ID":"-20", "NEXT_RIGHT_EDGE_ID":"-12", "PREV_RIGHT_EDGE_ID":"-14", "LEFT_FACE_ID":"7", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[21,22,35,22]}, "properties":{"EDGE_ID":"7", "START_NODE_ID":"17", "END_NODE_ID":"18", "NEXT_LEFT_EDGE_ID":"8", "PREV_LEFT_EDGE_ID":"6", "NEXT_RIGHT_EDGE_ID":"-19", "PREV_RIGHT_EDGE_ID":"17", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"4"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[21,6,21,14]}, "properties":{"EDGE_ID":"20", "START_NODE_ID":"9", "END_NODE_ID":"14", "NEXT_LEFT_EDGE_ID":"-9", "PREV_LEFT_EDGE_ID":"12", "NEXT_RIGHT_EDGE_ID":"13", "PREV_RIGHT_EDGE_ID":"10", "LEFT_FACE_ID":"6", "RIGHT_FACE_ID":"7"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[35,14,21,14]}, "properties":{"EDGE_ID":"10", "START_NODE_ID":"13", "END_NODE_ID":"14", "NEXT_LEFT_EDGE_ID":"-20", "PREV_LEFT_EDGE_ID":"18", "NEXT_RIGHT_EDGE_ID":"17", "PREV_RIGHT_EDGE_ID":"-19", "LEFT_FACE_ID":"7", "RIGHT_FACE_ID":"4"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[21,14,21,22]}, "properties":{"EDGE_ID":"19", "START_NODE_ID":"14", "END_NODE_ID":"17", "NEXT_LEFT_EDGE_ID":"-6", "PREV_LEFT_EDGE_ID":"9", "NEXT_RIGHT_EDGE_ID":"-10", "PREV_RIGHT_EDGE_ID":"-7", "LEFT_FACE_ID":"3", "RIGHT_FACE_ID":"4"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[25,30,25,35]}, "properties":{"EDGE_ID":"3", "START_NODE_ID":"2", "END_NODE_ID":"3", "NEXT_LEFT_EDGE_ID":"-3", "PREV_LEFT_EDGE_ID":"2", "NEXT_RIGHT_EDGE_ID":"2", "PREV_RIGHT_EDGE_ID":"3", "LEFT_FACE_ID":"2", "RIGHT_FACE_ID":"2"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[35,6,47,6]}, "properties":{"EDGE_ID":"14", "START_NODE_ID":"10", "END_NODE_ID":"11", "NEXT_LEFT_EDGE_ID":"16", "PREV_LEFT_EDGE_ID":"-18", "NEXT_RIGHT_EDGE_ID":"-13", "PREV_RIGHT_EDGE_ID":"-16", "LEFT_FACE_ID":"8", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[35,14,47,14]}, "properties":{"EDGE_ID":"11", "START_NODE_ID":"13", "END_NODE_ID":"12", "NEXT_LEFT_EDGE_ID":"15", "PREV_LEFT_EDGE_ID":"-17", "NEXT_RIGHT_EDGE_ID":"-18", "PREV_RIGHT_EDGE_ID":"16", "LEFT_FACE_ID":"5", "RIGHT_FACE_ID":"8"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[35,6,35,14]}, "properties":{"EDGE_ID":"18", "START_NODE_ID":"10", "END_NODE_ID":"13", "NEXT_LEFT_EDGE_ID":"10", "PREV_LEFT_EDGE_ID":"13", "NEXT_RIGHT_EDGE_ID":"14", "PREV_RIGHT_EDGE_ID":"-11", "LEFT_FACE_ID":"7", "RIGHT_FACE_ID":"8"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[35,22,47,22]}, "properties":{"EDGE_ID":"8", "START_NODE_ID":"18", "END_NODE_ID":"19", "NEXT_LEFT_EDGE_ID":"-15", "PREV_LEFT_EDGE_ID":"7", "NEXT_RIGHT_EDGE_ID":"-17", "PREV_RIGHT_EDGE_ID":"15", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"5"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[35,14,35,22]}, "properties":{"EDGE_ID":"17", "START_NODE_ID":"13", "END_NODE_ID":"18", "NEXT_LEFT_EDGE_ID":"-7", "PREV_LEFT_EDGE_ID":"-10", "NEXT_RIGHT_EDGE_ID":"11", "PREV_RIGHT_EDGE_ID":"-8", "LEFT_FACE_ID":"4", "RIGHT_FACE_ID":"5"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[36,38,38,35,41,34,42,33,45,32,47,28,50,28,52,32,57,33]}, "properties":{"EDGE_ID":"4", "START_NODE_ID":"5", "END_NODE_ID":"6", "NEXT_LEFT_EDGE_ID":"-5", "PREV_LEFT_EDGE_ID":"-4", "NEXT_RIGHT_EDGE_ID":"4", "PREV_RIGHT_EDGE_ID":"5", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[41,40,45,40,47,42,62,41,61,38,59,39,57,36,57,33]}, "properties":{"EDGE_ID":"5", "START_NODE_ID":"7", "END_NODE_ID":"6", "NEXT_LEFT_EDGE_ID":"-4", "PREV_LEFT_EDGE_ID":"-5", "NEXT_RIGHT_EDGE_ID":"5", "PREV_RIGHT_EDGE_ID":"4", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[47,14,47,22]}, "properties":{"EDGE_ID":"15", "START_NODE_ID":"12", "END_NODE_ID":"19", "NEXT_LEFT_EDGE_ID":"-8", "PREV_LEFT_EDGE_ID":"11", "NEXT_RIGHT_EDGE_ID":"-16", "PREV_RIGHT_EDGE_ID":"8", "LEFT_FACE_ID":"5", "RIGHT_FACE_ID":"-1"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[47,6,47,14]}, "properties":{"EDGE_ID":"16", "START_NODE_ID":"11", "END_NODE_ID":"12", "NEXT_LEFT_EDGE_ID":"-11", "PREV_LEFT_EDGE_ID":"14", "NEXT_RIGHT_EDGE_ID":"-14", "PREV_RIGHT_EDGE_ID":"-15", "LEFT_FACE_ID":"8", "RIGHT_FACE_ID":"-1"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[4, 31]}, "properties":{"NODE_ID":"20", "EDGE_ID":"26", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[8, 30]}, "properties":{"NODE_ID":"1", "EDGE_ID":"1", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[9, 6]}, "properties":{"NODE_ID":"8", "EDGE_ID":"12", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[9, 35]}, "properties":{"NODE_ID":"21", "EDGE_ID":"25", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[9, 14]}, "properties":{"NODE_ID":"15", "EDGE_ID":"21", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[9, 22]}, "properties":{"NODE_ID":"16", "EDGE_ID":"6", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[13, 35]}, "properties":{"NODE_ID":"22", "EDGE_ID":"-25", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[20, 37]}, "properties":{"NODE_ID":"4", "EDGE_ID":"0", "FACE_ID":"2"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[21, 14]}, "properties":{"NODE_ID":"14", "EDGE_ID":"19", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[21, 22]}, "properties":{"NODE_ID":"17", "EDGE_ID":"7", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[21, 6]}, "properties":{"NODE_ID":"9", "EDGE_ID":"20", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[25, 30]}, "properties":{"NODE_ID":"2", "EDGE_ID":"2", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[25, 35]}, "properties":{"NODE_ID":"3", "EDGE_ID":"-3", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[35, 14]}, "properties":{"NODE_ID":"13", "EDGE_ID":"17", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[35, 6]}, "properties":{"NODE_ID":"10", "EDGE_ID":"18", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[35, 22]}, "properties":{"NODE_ID":"18", "EDGE_ID":"8", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[36, 38]}, "properties":{"NODE_ID":"5", "EDGE_ID":"4", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[41, 40]}, "properties":{"NODE_ID":"7", "EDGE_ID":"5", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[47, 14]}, "properties":{"NODE_ID":"12", "EDGE_ID":"15", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[47, 6]}, "properties":{"NODE_ID":"11", "EDGE_ID":"-14", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[47, 22]}, "properties":{"NODE_ID":"19", "EDGE_ID":"-15", "FACE_ID":"0"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[57, 33]}, "properties":{"NODE_ID":"6", "EDGE_ID":"-4", "FACE_ID":"0"}}
]}

トポロジ地物を取得するために、次の例では、topologyパラメータ、base_tableパラメータ、およびgeom_colパラメータを指定しています(grom_colは、トポロジ列を表しています)。

http://example:8080/mapviewer/dataserver/tilsmenv?topology=city_data&base_table=land_parcels&geom_col=feature

このリクエストのレスポンスは、次のようなものになります。

{"type":"TopologyFeatures",
"topology":"CITY_DATA",
"topology_id":5,
"topology_owner":"TILSZUSER",
"tolerance":5.0E-5,
"srs":0,
"table_schema":"TILSZUSER",
"table_name":"LAND_PARCELS",
"topo_column":"FEATURE",
"layer_id":1,
"layer_type":"POLYGON",
"layer_level":0,
"child_layer":0,
"node_sequence":"CITY_DATA_NODE_S",
"edge_sequence":"CITY_DATA_EDGE_S",
"face_sequence":"CITY_DATA_FACE_S",
"feature_sequence":"CITY_DATA_TG_S",
"digits_right_decimal":16,
"attr_names":["FEATURE_NAME"],
"attr_types":["string"],
"features":[
{"type":"topology", "tg_id":4, "primitives":[{"topo_id":3,"topo_type":3},{"topo_id":6,"topo_type":3}], "properties":{"FEATURE_NAME":"P1"}},
{"type":"topology", "tg_id":5, "primitives":[{"topo_id":4,"topo_type":3},{"topo_id":7,"topo_type":3}], "properties":{"FEATURE_NAME":"P2"}},
{"type":"topology", "tg_id":6, "primitives":[{"topo_id":5,"topo_type":3},{"topo_id":8,"topo_type":3}], "properties":{"FEATURE_NAME":"P3"}},
{"type":"topology", "tg_id":7, "primitives":[{"topo_id":2,"topo_type":3}], "properties":{"FEATURE_NAME":"P4"}},
{"type":"topology", "tg_id":8, "primitives":[{"topo_id":1,"topo_type":3}], "properties":{"FEATURE_NAME":"P5"}}
]}

プリミティブのフェイス、エッジ、およびノードを指定するために、次の例ではプリミティブの識別子を定義しています。

http://example:8080/mapviewer/dataserver/tilsmenv?topology=city_data&face_ids=-1&edge_ids=3,4&node_ids=5

このリクエストのレスポンスは、次のようなものになります。

{"type":"TopologyPrimitives",
"topology":"city_data",
"srs":0,
"bbox":[0, 0, 57, 38],
"face_attr_names":["FACE_ID","BOUNDARY_EDGE_ID","ISLAND_EDGE_ID_LIST","ISLAND_NODE_ID_LIST"],
"face_attr_types":["integer","integer","array:integer","array:integer"],
"edge_attr_names":["EDGE_ID","START_NODE_ID","END_NODE_ID","NEXT_LEFT_EDGE_ID","PREV_LEFT_EDGE_ID","NEXT_RIGHT_EDGE_ID","PREV_RIGHT_EDGE_ID","LEFT_FACE_ID","RIGHT_FACE_ID"],
"edge_attr_types":["integer","integer","integer","integer","integer","integer","integer","integer","integer"],
"node_attr_names":["NODE_ID","EDGE_ID","FACE_ID"],
"node_attr_types":["integer","integer","integer"],
"primitives":[
{"type":"Face", "properties":{"FACE_ID":"-1", "BOUNDARY_EDGE_ID":"0", "ISLAND_EDGE_ID_LIST":[-1,-2,4,6]}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[25,30,25,35]}, "properties":{"EDGE_ID":"3", "START_NODE_ID":"2", "END_NODE_ID":"3", "NEXT_LEFT_EDGE_ID":"-3", "PREV_LEFT_EDGE_ID":"2", "NEXT_RIGHT_EDGE_ID":"2", "PREV_RIGHT_EDGE_ID":"3", "LEFT_FACE_ID":"2", "RIGHT_FACE_ID":"2"}},
{"type":"Edge", "geometry":{"type":"LineString", "coordinates":[36,38,38,35,41,34,42,33,45,32,47,28,50,28,52,32,57,33]}, "properties":{"EDGE_ID":"4", "START_NODE_ID":"5", "END_NODE_ID":"6", "NEXT_LEFT_EDGE_ID":"-5", "PREV_LEFT_EDGE_ID":"-4", "NEXT_RIGHT_EDGE_ID":"4", "PREV_RIGHT_EDGE_ID":"5", "LEFT_FACE_ID":"-1", "RIGHT_FACE_ID":"-1"}},
{"type":"Node", "geometry":{"type":"Point", "coordinates":[36, 38]}, "properties":{"NODE_ID":"5", "EDGE_ID":"4", "FACE_ID":"0"}}
]}

3.1.3 マップ・データ・サーバーから返されたデータの解釈

マップ・データ・サーバーは、圧縮されたGeoJSON形式でデータを返します。パフォーマンスと情報の実用性を向上するために、標準GeoJSONにいくつかのマイナーな変更と追加が実施されています。

次に、レスポンス例を示します。

{"type":"FeatureCollection",
"collectionName":"theme1",
"srs":3857,
"geodetic":false,
"bbox":[-17566686.86258, 2414218.89842, -7905675.57465, 8629389.76988],
"attr_names":["CITY","STATE_ABRV","POP90","RANK90"],
"attr_types":["string","string","double","double"],
"features":[
{"type":"Feature","_id":"AAASQ3AAEAAAAMbAAA","geometry": {"type":"Point", "coordinates":[-119.99823, 38.9052]},"properties":{"CITY":"SOUTH LAKE TAHOE", "SALES":"125.8", "NAME":"FACTORY STORES AT THE Y", "_label_":"FACTORY STORES AT THE Y"},"styles":{"rendering":{"style":"M.SMALL CIRCLE"},"labeling":{"style":"T.RED STREET", "columns":["_label_"]}}},
{"type":"Feature","_id":"AAASQ3AAEAAAAMbAAB","geometry": {"type":"Point", "coordinates":[-121.95073, 37.53356]},"properties":{"CITY":"FREMONT", "SALES":"186.8", "NAME":"OHLONE VILLAGE", "_label_":"OHLONE VILLAGE"},"styles":{"rendering":{"style":"M.SMALL CIRCLE"},"labeling":{"style":"T.RED STREET", "columns":["_label_"]}}},
{"type":"Feature","_id":"AAASQ3AAEAAAAMbAAC","geometry": {"type":"Point", "coordinates":[-118.48844, 34.02353]},"properties":{"CITY":"SANTA MONICA", "SALES":"9.1", "NAME":"SANTA MONICA PLACE", "_label_":"SANTA MONICA PLACE"},"styles":{"rendering":{"style":"M.SMALL CIRCLE"},"labeling":{"style":"T.RED STREET", "columns":["_label_"]}}},
{"type":"Feature","_id":"AAASQ3AAEAAAAMbAAD","geometry": {"type":"Point", "coordinates":[-118.55093, 34.42104]},"properties":{"CITY":"SANTA CLARITA", "SALES":"52.6", "NAME":"VALENCIA TOWN CENTER", "_label_":"VALENCIA TOWN CENTER"},"styles":{"rendering":{"style":"M.SMALL CIRCLE"},"labeling":{"style":"T.RED STREET", "columns":["_label_"]}}},
{"type":"Feature","_id":"AAASQ3AAEAAAAMbAAE","geometry": {"type":"Point", "coordinates":[-122.56007, 38.08187]},"properties":{"CITY":"NOVATO", "SALES":"119.1", "NAME":"VINTAGE OAKS AT NOVATO", "_label_":"VINTAGE OAKS AT NOVATO"},"styles":{"rendering":{"style":"M.SMALL CIRCLE"},"labeling":{"style":"T.RED STREET", "columns":["_label_"]}}}]}

レスポンスには、最小ヘッダーおよび地物の配列が含まれます。ヘッダーには、空間参照システム(srs) ID、および結果データの最小の枠ボックスが含まれます。地物の配列には、属性名とそのタイプが含まれています。有効なタイプ名には、"byte"、"short"、"int","long"、"float"、"double"、"char"、"string"、"boolean"、"date"があります。

それぞれの地物には、次のフィールドが適用されます。

  • type: 常にFeatureです。

  • _id: オプションのIDまたはkey属性。

  • geometry: 変更済のGeoJSON形式でエンコードされた実際のジオメトリ。

  • properties: 地物に関するすべてのプロパティ(名前と値のペア)を格納しているオブジェクト。

  • styles: オプションのスタイリング情報オブジェクト。2つの埋込みオブジェクトrenderinglabelingが含まれています。これらは、同じ構造体を共有しています。基本的に、オブジェクトにはstyleフィールドとオプションのcolumns配列が含まれています。現時点では、事前定義済テーマのみがレスポンスに含まれるスタイリング情報をサポートしています。そのため、動的テーマのレスポンスには、スタイリング情報が含まれません。

  • label_box: 4つの要素の配列。ラベル・ボックスのminXminYmaxX、およびmaxYを指定しています。ポリゴンにのみ、ラベル・ボックスが含まれている可能性があります。

ラベル・テキストは、_label_という名前の疑似プロパティとして、常にプロパティ・リストに含まれている点に注意してください。

3.1.4 マップ・データ・サーバー・エラーの処理

マップ・データ・サーバーは、データ・リクエストを処理できない場合に、エラー・オブジェクトを含むJSONレスポンスを送信します。このJSONエラー・オブジェクトは、次のようなものになります。

{"error":
  {"code": "ora-500",
   "message": "Table requested does not exist",
   "details": "maybe a stack trace here..."
  }
}

前述のJSONオブジェクトでは、codeはマップ・データ・サーバーのみが理解するエラー・コードになり、messageには警告ダイアログでユーザーに表示できる短いメッセージが含まれています。また、detailsは、詳細を含めることができるオプションのフィールドです(これが含まれている場合は、スタック・トレースなどになります)。

3.2 マップ・タイル・サーバー

マップ・タイル・サーバーは、事前に生成される固定サイズのマップ画像タイルをフェッチ、キャッシュおよび提供するマップ画像キャッシング・エンジンです。

これは、マップ視覚化コンポーネント・サーバーの一部であるJavaサーブレットとして実装されます。マップ・タイル・サーバーは、タイルのズーム・レベルおよびタイル位置(メッシュ・コード)によって指定されたマップ画像タイルを要求するリクエストを受け付け、リクエストされたタイルをクライアントに返送します。

マップ・タイル・サーバーの基本的なワークフローを、図3-1に示します。

図3-1 マップ・タイル・サーバーのワークフロー

図3-1の説明が続きます
「図3-1 マップ・タイル・サーバーのワークフロー」の説明

図3-1のように、マップ・タイル・サーバーは、マップ・タイルを求めるリクエストを受信すると、該当するタイルをキャッシュ・ストレージ・システム内で検索します。該当するタイルがキャッシュされていると、マップ・タイル・サーバーはそのタイルをクライアントに送信します。該当するタイルがキャッシュされていない場合は、該当するタイルをフェッチしてキャッシュに保存した後、クライアントに送信します。

マップ視覚化コンポーネント管理ツールを使用すると、マップ・タイル・サーバーを管理できます。

3.2.1 マップ・タイル・サーバーの概念

この項では、Oracle Mapsを効果的に使用するために知っておくべき、マップ・タイル・サーバーに関する概念について説明します。

3.2.1.1 マップ・タイル層とマップ・タイル・ソース

マップ・タイル層はすべてマップ・タイル・サーバーで管理されます。マップ・タイル・サーバーは、マップ・タイル層に属するマップ画像タイルのフェッチおよび格納を実行した後、マップ画像タイルをクライアントに返します。マップ・タイル・サーバーでは複数のマップ・タイル層を管理できます。

どのマップ・タイル層にも、事前定義済のズーム・レベルを複数持たせることができます。各ズーム・レベルに、0からn-1 (nはズーム・レベルの総数)のズーム・レベル番号のうち1つが割り当てられます。ズーム・レベル0は最もズーム・アウトしたレベル、ズーム・レベルn-1は最もズーム・インしたレベルです。

マップは、ズーム・レベルごとに、同一サイズの小さな一連のマップ画像タイルに均等に分割されています。クライアントは、そのズーム・レベルおよびタイル・メッシュ・コードによってマップ・タイルを指定します。

マップ・タイル層は、次の2つのタイプのソースから得られます。

  • マップ視覚化コンポーネント内部のベース・マップ(マップ視覚化コンポーネントのマップ・レンダリング・エンジンによってレンダリングされる)。マップ視覚化コンポーネント・ベース・マップは、事前定義済の一連のテーマから構成され、データベース・ビューUSER_SDO_MAPS内で事前定義済である必要があります。

  • 外部Webマップ・サービス・プロバイダによってレンダリングされたマップ。外部Webマップ・サービス・プロバイダは、Webを介したクライアント・リクエストに対してマップのレンダリングおよび表示を実行するサーバーです。外部マップ・サービス・プロバイダからマップをフェッチできるアダプタを正しく構成すると、マップ・タイル・サーバーは該当する外部マップ・サービス・プロバイダによって生成された一連のマップ・タイルをフェッチして表示できるようになります。(マップ・タイル・サーバーが内部で動作しているマップ視覚化コンポーネント以外のマップ視覚化コンポーネント・インスタンスも、外部マップ・サービス・プロバイダとみなされます。)

3.2.1.2 マップ画像タイルのストレージ

Oracle Mapsには、マップ画像タイルのストレージのための3つのオプションがあります。

3.2.1.2.1 ローカル・ファイル・システムを使用してタイルを保存する

ファイル・システムには各タイル層の独自のストレージ・ルート・ディレクトリがあり、タイル層定義では<cache_storage>要素のroot_path属性によって指定されます。この属性が指定されていない場合は、mapViewerConfig.xmlファイルの<tile_storage>要素に指定されたデフォルトのストレージの場所がルート・パスとして使用されます。たとえば、ルート・パスが/scratch/tilecache/として定義され、MVDEMOというデータ・ソースに19のズーム・レベルを持つDEMO_MAPというタイル層が含まれている場合は、サーバーのインスタンス化の後に/scratch/tilecache/MVDEMO.DEMO_MAPフォルダが作成されます。このフォルダには、19個のサブフォルダが含まれており(/0/1、…、/18)、画像タイルがズーム・レベル別に各サブフォルダに保存されます。

各ズーム・レベル下に、マップ・タイルのサブフォルダを編成するための2つのオプションがあります。1つはデフォルトのオプションで、メッシュ・コードのツリー構造を使用します。もう1つは、xyzストレージ・スキームと呼ばれており、タイルの行と列の値をサブフォルダおよびタイル名として使用してマップ・タイルを保存します。どちらのストレージ・オプションも各ズーム・レベルに対するタイルのメッシュ・コード値から開始します(タイル・メッシュ・コードの詳細は、「タイル・メッシュ・コード」を参照)。ズーム・レベルにおける各タイルは、メッシュ・コード値のペア(mx, my)を使用して表すことができます。mxおよびmyは、それぞれ水平方向および垂直方向の整数値です。左下隅のタイルは、(0, 0)の値を持ちます。また、タイルの行とタイルの列値のペア(tile_column, tile_row)を使用してタイルを配置することもできます。左上隅のタイルは、(0, 0)の値を持ちます。

3.2.1.2.2 データベース表にタイルを保存する

画像タイルは、データベース表に保存できます。その手順は次のとおりです。

  1. 画像タイルを保存する表を作成します。次に例を示します。

    CREATE TABLE tile_dbt (
      tile_layer varchar2(64),
      zoom_level number,
      x number,
      y number,
      modified TIMESTAMP,
      data BLOB);
    COMMIT;
    
  2. USER_SDO_CACHED_MAPSビューでタイル層のTILES_TABLE列を更新します。たとえば、DEMP_MAPというタイル層があり、ステップ1で作成した表をマップ・タイルの保存に使用する場合は、次のようにタイル層のTILES_TABLE列を更新します。

    UPDATE user_sdo_cached_maps SET tiles_table='tiles_dbt' WHERE name='DEMP_MAP';
    
  3. マップ視覚化コンポーネント・サーバーを再起動して、変更を有効にします。

この例を使用すると、タイル層DEMP_MAPのマップ画像タイルはデータベース表TILE_DBTに保存されます。

3.2.1.2.3 タイルを保存せずに直接ストリーミングする

タイルの内容が常に変更される可能性がある場合(雲量のリアルタイム衛星画像マップなど)、または画像タイルを保存しない場合は、タイルを保存せずに直接にストリーミングできます。

このオプションを選択するには、タイル層の定義で<map_tile_layer>要素のpersistent_tiles属性をfalseに設定します。(persistent_tiles属性のデフォルト値はtrueです。)例3-1では、persistent_tiles属性がfalseに設定されたDEMO_MAPというタイル層が挿入されているため、このタイル層のマップ画像タイルはキャッシュされません。

例3-1 タイルを保存せずにストリーミングする

INSERT INTO user_sdo_cached_maps values(
'DEMO_MAP',
'an example tile layer that does not cache image tiles',
'',
'YES',
'YES',
'<map_tile_layer name="DEMO_MAP_TREEMESH" image_format="PNG" http_header_expires="168.0" concurrent_fetching_threads="3" persistent_tiles="false">
   <internal_map_source data_source="mvdemo" base_map="DEMO_MAP" bgcolor="#dddddd" out_of_bounds_color="#eeddff"/>
   <tile_storage root_path="/temp" short_path="false" />
   <coordinate_system srid="8307" minX="-180.0" maxX="180.0" minY="-90.0" maxY="90.0"/>
   <tile_image width="256" height="256"/>
   <tile_dpi  value="90.7142857"/>
   <tile_meters_per_unit  value="111319.49079327358"/>
   <zoom_levels levels="19" min_scale="2132.729583849784" max_scale="559082264.0287178"/>
</map_tile_layer>',
'DEMO_MAP',
'');
COMMIT;
3.2.1.3 マップ・タイルの座標系

マップ・タイル・サーバーでは、同一サイズの小さな矩形のイメージ・タイルとして一連のマップ画像をキャッシュし、管理します。タイル処理は現在、任意の2次元のデカルト座標系でサポートされています。測地座標系も、デカルト座標系であるかのようにマッピングされる場合(図3-2のように経度および緯度が単に2つの直交軸として取り扱われる場合)はサポートされています。

図3-2 経度/緯度座標系を使用したタイル処理

図3-2の説明が続きます
「図3-2 経度/緯度座標系を使用した四角形処理」の説明

ズーム・レベルごとに、マップ・タイルはマップ座標系全体を2つの次元(XとY。図3-2では緯度と経度)に沿って均等に分割して作成されます。マップ・タイル・サーバーは、マップ画像タイルを作成する際、マップ座標系のこの次元情報を必要とします。そのため、マップ・タイル層の構成設定でこの情報を指定する必要があります。

マップ座標系全体は1つの矩形として表現でき、その境界線は(Xmin, Ymin)および(Xmax, Ymax)として指定します(Xminは座標系で許可される最小のX値、Yminは許可される最小のY値、Xmaxは許可される最大のX値、Ymaxは許可される最大のY値)。図3-2の場合、Xminは-180、Yminは-90、Xmaxは180、Ymaxは90です。

また、マップ・タイル・サーバーがマップ・スケールを計算できるように、座標系の空間参照ID (SRID)も指定する必要があります。

3.2.1.4 タイル・メッシュ・コード

各マップ・タイルは、(Mx, My)という整数のペアとして定義されるメッシュ・コードによって指定します(MxはタイルのXディメンション・インデックス、MyはタイルのYディメンション・インデックスを指定する)。タイルがXminから始まるXディメンション上のi番目のタイルである場合、Mxはi-1になります。タイルがYminから始まるYディメンション上のj番目のタイルである場合、Myはj-1になります。マップ上のタイルのメッシュ・コードを、図3-3に示します。

図3-3 タイルのメッシュ・コード

図3-3の説明が続きます
「図3-3 タイルのメッシュ・コード」の説明

JavaScriptマップ・クライアントは、Webブラウザにマップを表示するのに必要なタイルを自動的に計算し、メッシュ・コードを指定したリクエストをサーバーに送信します。メッシュ・コードはアプリケーションにとって透過的であり、アプリケーションの開発者はメッシュ・コードを直接取り扱う必要がありません。

3.2.1.5 マップ・タイル・リクエスト

マップ・タイル・サーバーは、マップ・タイル・リクエストを処理します。マップ・タイル・リクエストは、キー/値ペア形式またはREST形式になります。

  • キー/値ペア形式のマップ・タイル・リクエスト

    たとえば、データソースDS_NAMEにタイル層TL_NAMEがある場合、ズーム・レベル2およびメッシュ・コード(3.2)のマップ・タイル画像をPNG形式で取得するには、URLの形式を次のようにします。

    http://localhost:8080/mapviewer/mcserver?request=gettile&format=PNG&zoomlevel=2&mapcache=DS_NAME.TL_NAME&mx=3&my=2
    
  • REST形式のマップ・タイル・リクエスト

    REST形式のリクエストの一般的な形式は、次のとおりです。

    http://localhost:8080/mapviewer/mcserver/DS_NAME/TL_NAME/{zoom}/{row}/{column}.png
    

    たとえば、前述のキー/値ペアの例に示したマップ・タイル・リクエストと同じリクエストをREST形式で送信する場合、URLは次のようになります。

    http://localhost:8080/mapviewer/mcserver/DS_NAME/TL_NAME/2/1/3.png
    

キー/値ペア形式のメッシュ・コードには左下隅の原点がありますが、REST形式ではタイルの行と列をリクエストするため原点が左上隅にあります。この2つの形式は異なる原点を持つため、myrow値は異なりますが、mx値とcolumn値は同じになります。

通常、マップ・タイル・リクエストは、マップ視覚化コンポーネントのJavaScript APIライブラリでカプセル化されるため、そのAPIがマップ・タイル・リクエストを処理します。ただし、サード・パーティ製のJavaScript APIを使用してマップ視覚化コンポーネント・サーバーと通信している場合は、対象のアプリケーションでマップ・タイル・リクエストの形式を指定する必要があります。たとえば、Leaflet JavaScript APIを使用してマップ視覚化コンポーネント・サーバーからマップ・タイルを取得する場合は、次に示すように、L.tileLayerのURLテンプレートを設定する必要があります。

http://localhost:8080/mapviewer/mcserver/DS_NAME/TL_NAME/{z}/{y}/{x}.png.
3.2.1.6 タイル処理ルール

マップの分割方法およびタイルの作成方法を決めるタイル処理ルールを作成する必要があります。マップ・タイル・サーバーは、そのようなタイル処理ルールを使用してマップを小さなマップ画像タイルに分割し、タイル・ストレージ・システムに格納します。そのようなルールは、JavaScriptマップ・クライアントも使用します。

1つのズーム・レベルに対応するタイルはすべて同じサイズなので、マップ・タイル・サーバーはタイルの分割を実行するために次の情報を必要とします。

  • 画面ピクセルで指定したマップ・タイル画像のサイズ(幅と高さ)。これは、タイル画像の物理サイズです。

  • マップ座標系に従って指定されたタイル・サイズ。たとえば、マップで測地座標系を使用する場合、タイルの幅と高さは度の単位で指定します。このサイズは、タイルの幅と高さを使用して明示的に指定することもできますし、マップ・スケールを使用して暗黙的に指定することもできます。(マップ・スケールとタイル画像のサイズから、マップ座標系に従ってタイルの幅と高さを求めることができます。)

先の情報が、ズーム・レベルに対応するタイル処理ルールになります。どのズーム・レベルも、独自のタイル処理ルールを持つ必要があります。マップ・タイル・サーバーに対して構成設定を指定する場合は、「マップ・タイル・サーバーの構成」で示すように、タイル処理ルールを定義する必要があります。

3.2.1.7 タイルの背景色と範囲外の色

タイル層メタデータ定義には、タイルの色に影響を与える2つの属性があります。それらは、bgcolor (背景色)とout_of_bounds_color (範囲外の色)です。bgcolor属性の値はタイル層の有効データ領域内の塗りつぶしに使用され(有効データ領域はminX, minY, maxY, maxYで定義される)、out_of_bounds_color属性の値は有効データ領域の外側にある領域の塗りつぶしに使用されます。これらの属性のデフォルト値は同じです(Color(192, 192, 192))。

タイルを生成しようとした時点で例外によりタイルのフェッチ・プロセスが失敗した場合、有効データ領域内かどうかにかかわらず、範囲外の色で塗りつぶされたタイルがその代替として使用されます。ただし、このようなタイル・フェッチ処理の例外による代替タイルは、ディスクに永続的に保存されず、むしろ、一時的にクライアントにストリーミングされます。クライアント・ブラウザのキャッシュ内の一時タイル・データがパージされるか、別のクライアントがリクエストを開始した場合、マップ視覚化コンポーネントは後続のリクエストでタイル生成を再試行します。

bgcolornoneに設定すると、タイルは透明になります。つまり、bgcolorおよびout_of_bounds_colorの両方の属性値がHTMLページの背景色によって置換されます。

3.2.2 マップ・タイル・サーバーの構成

マップ・タイル・サーバーの構成設定は、ローカルな構成ファイルおよびデータベース・ビューに格納されています。それらの設定は、カスタマイズが可能です。

3.2.2.1 マップ・タイル・サーバーのグローバル構成

ロギング・オプションやデフォルトのキャッシュ・ストレージ・ディレクトリといったマップ・タイル・サーバーのグローバル設定は、マップ視覚化コンポーネント構成ファイルmapViewerConfig.xml(ディレクトリ$MAPVIEWER_HOME/web/WEB-INF/confの下)に格納されています。

マップ・タイル・サーバーの構成設定は、次の例で示すように、トップレベルの<mapperConfig>要素の中の<map_tile_server>要素で定義されています。

<map_tile_server>
   <tile_storage default_root_path="/scratch/tilecache/"/>
</map_tile_server>

<tile_storage>要素は、マップ・タイル・ストレージについての設定を指定します。default_root_path属性では、キャッシングされたタイル画像が格納されるデフォルトのファイル・システム・ディレクトリを指定します。デフォルトのルート・ディレクトリは、設定されていない場合または有効でない場合、$MAPVIEWER_HOME/web/tilecacheになります。マップ・タイル層の構成でそれ自体のマップ・タイル・ストレージ・ディレクトリが指定されていない場合は、今示したディレクトリの下にサブディレクトリが1つ作成され、マップ・タイル層用に使用されます。このサブディレクトリの名前は、マップ・タイル層の名前と同じになります。

3.2.2.2 マップ・タイル層の構成

マップ・タイル層の構成設定は、メタデータ・ビューUSER_SDO_CACHED_MAPSに格納されています。詳細は、「xxx_SDO_CACHED_MAPSビュー」を参照してください。通常、このビューは直接操作せず、マップ視覚化コンポーネント管理ツールを介して使用して、マップ・タイル層を構成します。

どのデータベース・ユーザー(スキーマ)も、独自のUSER_SDO_CACHED_MAPSビューを持ちます。このビュー内の各エントリには、各マップ・タイル層の構成設定が格納されます。マップ・タイル層がマップ視覚化コンポーネントの内部ベース・マップまたはテーマに基づいている場合、そのマップ・タイル層に関連付けられているベース・マップまたはテーマは、マップ・タイル層の構成設定が保存されている場所と同じデータベース・スキーマで定義されている必要があります。

マップ・タイル・サーバーは、マップ視覚化コンポーネント・データソースによって指定されているデータベース接続を使用してUSER_SDO_CACHED_MAPSビューに問合せを実行し、マップ・ソースの構成を取得します。この処理は、マップ視覚化コンポーネントの管理リクエストの結果としてマップ・タイル・サーバーが起動された場合またはマップ視覚化コンポーネントに新しいデータソースが追加された場合に実行されます。

USER_SDO_CACHED_MAPSビューのDEFINITION列については、マップ・ソース定義に次の一般的な形式があります。

  <map_tile_layer 
     name = "map tile layer name"
     image_format ="tile-image-format">
    <internal_map_source 
      data_source="name-of-data-source"
      base_map="name-of-MapViewer-base-map"
      bgcolor="base-map-background-color"
      antialias="whether-to-turn-on-antialiasing"
      />
    </internal_map_source>
    <external_map_source 
       url="external-map-service-url" 
       adapter_class="name-of-adapter-class"
       proxy_host=" proxy-server-host "
       proxy_port="proxy-server-port"
       timeout="request-timeout"
       request_method="http-request-method: 'GET'|'POST'">
      <properties>
        <property name="property-name" value="property-value"/>
        …
      </properties>
    </external_map_source>
    <tile_storage 
       root_path="disk-path-of-cache-root-directory"
    </tile_storage>
    <coordinate_system
       srid="coordinate-system-srid" 
       minX="minimum-allowed-X-value" 
       maxX="maximum-allowed-X-value"
       minY="minimum-allowed-Y-value" 
       maxY="maximum-allowed-Y-value">
    </coordinate_system>
    <tile_image
       width="tile-image-width-in-screen-pixels" 
       height="tile-image-height-in-screen-pixels" >
    </tile_image>
    <tile_bound>
       <coordinates> … </coordinates>
    </tile_bound>
    <zoom_levels
       levels="number-of-zoom-levels"
       min_scale="map-scale-at-highest-zoom-level" 
       max_scale="map-scale-at-lowest-zoom-level"
       min_tile_width="tile-width-specified-in-map-data-units-at-
                       highest-zoom-level" 
       max_tile_width="tile-width-specified-in-map-data-units-at-
                       lowest-zoom-level">
      <zoom_level 
         description="zoom-level-description"
         level_name="zoom-level-name"
         scale="map-scale-of-zoom-level"
         tile_width ="tile-width-specified-in-map-data-units"
         tile_height ="tile-height-specified-in-map-data-units">
        <tile_bound>
          <coordinates> … </coordinates>
        </tile_bound>
      </zoom_level>
      …
    </zoom_levels>
  </map_tile_layer>

マップ・タイル層を定義するXMLのDTDは、「マップ・タイル層」にリストされています。

例3-2は、ベース・マップに基づいた内部マップ・タイル層のXML定義を示しています。例3-3は、ベース・マップではなくテーマに基づいた内部マップ・タイル層のXML定義を示しています。また、例3-4は、外部マップ・タイル層のXML定義を示しています。<map_tile_layer>要素およびそのサブ要素の説明は、これらの例の後に示します。

例3-2 ベース・マップに基づいた内部マップ・タイル層のXML定義

<?xml version = '1.0'?>
<!-- XML definition of an internal map tile layer.
-->
   <map_tile_layer image_format="PNG">
      <internal_map_source base_map="demo_map"/>
      <tile_storage root_path="/scratch/mapcache/"/>
      <coordinate_system 
         srid="8307"
         minX="-180" maxX="180" 
         minY="-90" maxY="90"/>
      <tile_image width="250" height="250"/>
      <zoom_levels>
         <zoom_level description="continent level" scale="10000000"/>
         <zoom_level description="country level" scale="3000000"/>
         <zoom_level description="state level" scale="1000000"/>
         <zoom_level description="county level" scale="300000"/>
         <zoom_level description="city level" scale="100000"/>
         <zoom_level description="street level" scale="30000"/>
         <zoom_level description="local street level" scale="10000"/>
      </zoom_levels>
   </map_tile_layer>

例3-3 テーマに基づいた内部マップ・タイル層のXML定義

<?xml version = '1.0' encoding = 'UTF-8'?>
<map_tile_layer name="TL1" image_format="PNG" http_header_expires="168.0" utfgrid="true" utfgrid_resolution="4" concurrent_fetching_threads="3">
     <internal_map_source data_source="MVDEMO" bgcolor="none" out_of_bounds_color="#ffffff" base_map="" db_tile_table=""/>
     <tile_storage root_path="/temp" xyz_storage_scheme="true"/>
     <coordinate_system srid="3857" minX="-2.0037508E7" minY="-2.0037508E7" maxX="2.0037508E7" maxY="2.0037508E7"/>
     <tile_image width="256" height="256"/>
     <tile_dpi value="90.714"/>
     <tile_meters_per_unit value="1.0"/>
     <zoom_levels levels="19" min_scale="2132.72958384" max_scale="5.59082264028E8" min_tile_width="152.874538064" max_tile_width="4.00751429065E7">
          <zoom_level level="0" name="level0" tile_width="4.00751429065E7" tile_height="4.00751429065E7"/>
          <zoom_level level="1" name="level1" tile_width="2.003757145325E7" tile_height="2.003757145325E7"/>
          <zoom_level level="2" name="level2" tile_width="1.0018785726625258E7" tile_height="1.001878572662E7"/>
          <zoom_level level="3" name="level3" tile_width="5009392.86331" tile_height="5009392.86331"/>
          <zoom_level level="4" name="level4" tile_width="2504696.431656" tile_height="2504696.431656"/>
          <zoom_level level="5" name="level5" tile_width="1252348.215828" tile_height="1252348.215828"/>
          <zoom_level level="6" name="level6" tile_width="626174.1079140786" tile_height="626174.107914"/>
          <zoom_level level="7" name="level7" tile_width="313087.0539570393" tile_height="313087.053957"/>
          <zoom_level level="8" name="level8" tile_width="156543.5269785" tile_height="156543.5269785"/>
          <zoom_level level="9" name="level9" tile_width="78271.763489" tile_height="78271.763489"/>
          <zoom_level level="10" name="level10" tile_width="39135.8817446" tile_height="39135.8817446"/>
          <zoom_level level="11" name="level11" tile_width="19567.9408723" tile_height="19567.9408723"/>
          <zoom_level level="12" name="level12" tile_width="9783.9704361" tile_height="9783.9704361"/>
          <zoom_level level="13" name="level13" tile_width="4891.9852180" tile_height="4891.9852180"/>
          <zoom_level level="14" name="level14" tile_width="2445.9926090" tile_height="2445.99260903"/>
          <zoom_level level="15" name="level15" tile_width="1222.99630451" tile_height="1222.99630451"/>
          <zoom_level level="16" name="level16" tile_width="611.49815225" tile_height="611.49815225"/>
          <zoom_level level="17" name="level17" tile_width="305.74907612" tile_height="305.74907612"/>
          <zoom_level level="18" name="level18" tile_width="152.87453806" tile_height="152.87453806"/>
   </zoom_levels>
     <auto_update finest_level_to_refresh="13" dirty_mbr_batch="100" dirty_mbr_cap="1000">
          <dirty_mbr_table name="TL1MBR"/>
          <logtable name="TL1LOG"/>
   </auto_update>
     <themes>
          <theme name="UTFGRID_THEME_DEMO_STATES" from_level="0" to_level="18"/>
          <theme name="UTFGRID_THEME_DEMO_COUNTIES" from_level="0" to_level="18"/>
          <theme name="UTFGRID_THEME_DEMO_HIGHWAYS" from_level="0" to_level="18"/>
          <theme name="UTFGRID_THEME_DEMO_CITIES" from_level="0" to_level="18"/>
   </themes>
</map_tile_layer>

例3-4 外部マップ・タイル層のXML定義

<?xml version = '1.0'?>
<!-- XML definition of an external map tile layer.-->
<map_tile_layer name="TILELAYER1" image_format="PNG">
   <external_map_source
     url="http://mycorp.com:7001/mapviewer/wms/"
     request_method="GET"
     adapter_class="oracle.lbs.mapcache.adapter.WMSAdapter"
     adapter_class_path="">
      <properties>
         <property name="datasource" value="mvdemo"/>
         <property name="version" value="1.1.1"/>
         <property name="srs" value="EPSG:4326"/>
         <property name="layers" value="THEME_DEMO_COUNTIES,THEME_DEMO_HIGHWAYS"/>
         <property name="format" value="image/png"/>
         <property name="transparent" value="true"/>
      </properties>
   </external_map_source>
   <tile_storage root_path="/scratch/tmp/"/>
   <coordinate_system srid="8307" minX="-180.0" minY="-90.0" maxX="180.0" maxY="90.0"/>
   <tile_image width="256" height="256"/>
   <!—
         The following <zoom_levels> element does not have any
         <zoom_level> element inside it. But since it has its levels,
         min_scale and max_scale attributes set, map tile server will
         automatically generate the <zoom_level> elements for the 10
         zoom levels.
   -->
   <zoom_levels levels="10" min_scale="1000.0" max_scale="2.5E8">
   </zoom_levels>
</map_tile_layer>

トップレベルの要素は<map_tile_layer>です。image_format属性ではタイル画像の形式を指定しますが、この属性で現在サポートされている値はPNGGIFおよびJPGです。PNGおよびGIFの画像は一般に、ベクター・ベースのマップに適しています。一方、JPG画像は、圧縮率に優れているので、一般に衛星画像のようなラスター・マップに適しています。現在は、PNG形式のタイル画像のみ、バックグラウンドを透明にできます。

  • http_header_expires属性には、キャッシュされたタイル層が失効と見なされるまでの時間数を指定します。

  • utfgrid属性は、trueに設定されている場合に、イメージ・ファイルのコンパニオンUTFGridデータセットが生成されることを示します。(デフォルト値はfalseです)

  • utfgrid_resolution属性では、画像タイルと比較した場合のグリッド・データの精細度を指定します。たとえば、4の値(デフォルト)は、1つのグリッド・セルがコンパニオン画像タイルの4x4ピクセルを表すことを意味します。

  • concurrent_fetching_threads属性では、このタイル層にフェッチする画像タイルに対して作成される可能性のある同時タイル・フェッチ・スレッドの最大数を定義します。(デフォルト値は3です)

  • fetch_larger_tile属性は、true (デフォルト)に設定されている場合、キャッシュ内でタイルが使用できないときには、そのタイルの隣接タイルも生成することをサーバーに通知します。要求されたタイルがキャッシュ内ですでに使用できる場合は、このパラメータがgetTileのパフォーマンスに影響を与えることはありません。デフォルト設定(true)は、サーバーのレスポンス時間の短縮に向いています。

  • persistent_tiles属性は、true (デフォルト)の場合、画像タイルがサーバーのディスク・キャッシュに保存されることを指定します。この属性をfalseに設定すると、getTileリクエストごとにマップ視覚化コンポーネント・サーバーの画像タイル・レンダリング・プロセスが起動され、新しく取得した画像タイルは今後の使用のためにキャッシュされなくなります。falseを指定する可能性のある状況には、(A) GeoRasterテーマがタイル層で使用されていて、マップ視覚化コンポーネントのディスク・キャッシュにラスター画像が複製されないようにする場合、または(B)タイル・サーバーが常に最新の画像タイルを提供するようにする場合があります。

<internal_map_source>要素は、マップ・タイルがマップ視覚化コンポーネントのローカル・インスタンスによってレンダリングされる場合にのみ必須です。

  • base_map属性は、必須であり、マップ・タイル・サーバーによってキャッシングされる事前定義済のマップ視覚化コンポーネント・ベース・マップを指定します。その値は、USER_SDO_CACHED_MAPSビュー内のBASE_MAP列のエントリに一致する必要があります。

  • bgcolor属性は、オプションであり、マップの背景色を指定します。この属性の値をNONEに設定すると、バックグラウンドは透明になります。(現時点では、背景を透明にできるタイル画像はPNG形式のみです)。

  • out_of_bounds_color属性は、オプションです。この属性では、データ境界の外側の領域の色を指定します。データ境界は、<coordinate_system>要素の属性で指定されます。

  • db_tile_table属性はオプションです。この属性では、タイル層の画像タイルをキャッシュするデータベース表を指定します。この属性が指定されていない場合、タイルはマップ視覚化コンポーネントのディスク・キャッシュにキャッシュされます。

<external_map_source>要素は、マップ・タイルが外部マップ・サービス・プロバイダによってレンダリングされる場合にのみ必須です。この要素には、次の属性があります。

  • url属性は、必須であり、マップ・タイルをフェッチできるマップ・サービスのURL (http://myhost/mapviewer/omserverなど)を指定します。

  • adapter_class属性は、必須であり、パッケージ名が含まれる、マップ・アダプタ・クラスのフルネーム(mcsadapter.MVAdapterなど)を指定します。

  • proxy_host属性およびproxy_port属性は、プロキシ・サーバーを介して外部マップ・プロバイダ・サーバーにアクセスする必要がある場合にのみ必要であり、それぞれプロキシ・サーバーのホスト名およびポート番号を指定します。proxy_hostNONEとして指定すると、マップ・タイル・リクエストはすべて、プロキシ・サーバーを経由することなく、リモート・サーバーに直接送信されます。proxy_hostを省略するか、空白を指定すると、マップ・タイル・リクエストの送信時に、mapViewerConfig.xmlファイルで定義されているマップ視覚化コンポーネントのグローバル・プロキシ設定が使用されます。

  • timeout属性は、オプションであり、外部マップ・タイル画像に対するマップ・タイル・サーバーの最大待ち時間(ミリ秒数)を指定します。デフォルトのタイムアウト値は15000です。

  • request_method属性は、オプションであり、マップ・タイル・リクエストを送信する場合のHTTPリクエスト・メソッドです。その値は、POST(デフォルト)またはGETです。

外部マップ・タイル層の詳細および例は、「外部Webマップ・ソースによるマップ・タイル層の作成」を参照してください。

<external_map_source>要素内の<properties>要素には<property>要素を複数含めることができ、そのそれぞれではマップ・タイルをフェッチする際にマップ・アダプタが使用する各ユーザー定義パラメータを指定します。マップ・ソース・アダプタが同一でも、別々のパラメータ・セットを使用すれば、別々のマップ・タイル層をフェッチできます。たとえば、マップ視覚化コンポーネントに付属しているサンプル・マップ視覚化コンポーネント・アダプタmcsadapter.MVAdapterは、次のように定義されたパラメータを受け入れます。

<properties>
   <property name="data_source" value="elocation"/>
   <property name="base_map" value="us_base_map"/>
</properties>

ただし、このアダプタを使用する場合は、value属性の値を変更すれば、同一のデータソースまたは他のデータソースから、別のベース・マップをフェッチできます。

<tile_storage>要素は、マップ・タイル層のストレージ設定を指定します。

  • オプションのroot_path属性では、タイル・ストレージのルート・ディレクトリとして使用するファイル・システム・ディレクトリを指定します。この属性が省略されているか無効であると、mapViewerConfig.xmlファイルで定義されているデフォルトのルート・ディレクトリが使用されます。

  • オプションのxyz_storage_scheme要素では、マップ・タイルのディレクトリ構造がディスク・キャッシュで編成される方法を制御します。デフォルト値(false)にすると、マップ視覚化コンポーネントの内部メッシュ・コード・ストレージ・スキームが使用されます。値がtrueの場合は、XYZストレージ・スキームが使用されます。詳細は、「マップ・タイルのストレージ・スキーム: 内部メッシュ・コードまたはXYZ」を参照してください

<coordinate_system>要素は、マップ座標系を指定し、いくつかの必須属性があります。srid属性では、座標系の空間参照IDを指定します。minX属性ではXディメンションの下限、minY属性ではYディメンションの下限、maxX属性ではXディメンションの上限、maxY属性ではYディメンションの上限を指定します。標準の経度/緯度(WGS 84)座標系の場合、srid値は8307で、minXminYmaxXおよびmaxYの値はそれぞれ-180、-90、180および90です。

内部マップ・タイル層の場合、マップ座標系はデータ座標系と異なっていてもかまいません。それらが異なっている場合、マップ・タイル・サーバーでは<coordinate_system>要素で定義されている座標系にマップ・データを変換し、その座標系を使用してマップ・タイル画像をレンダリングします。

<tile_image>要素は、タイル画像のサイズ設定を指定します。この属性には、タイル画像の幅を画面のピクセル数で指定するwidth属性と、タイル画像の高さを画面のピクセル数で指定するheight属性が必須です。

オプションの<tile_bound>要素では、キャッシングされたマップ・タイルの枠ボックスを指定します。マップ・タイル・サーバーでは、このボックス内のタイルのみをフェッチし、リクエストされたタイルがこのボックスの外部にある場合は空白のタイルを返します。枠ボックスは、マップ・データ座標系内で矩形によって指定します。該当する矩形は、<coordinates>要素により、次の形式で指定します。

<coordinates>minX, minY, maxX, maxY</coordinates>

キャッシュのデフォルトの枠ボックスは、<coordinate_system>要素で指定される枠ボックスと同じです。

オプションの<tile_dpi>要素では、マップ表示画面の解像度を"ドット/インチ(DPI)"の値として指定します。この要素が指定されていない場合は、mapViewerConfig.xmlファイルで指定されている値がタイル層に割り当てられます。マップ視覚化コンポーネントがWMTSサービスでタイル層を公開する際にOGC標準に準拠する必要がある場合は、この要素を値90.714で指定する必要があります

オプションの<tile_meters_per_unit>要素では、単位あたりのメートル数を指定します。この単位は、<coordinate_system>要素のsrid属性で間接的に定義されます。たとえば、sridが3857の場合、単位はメートル数になるため、この属性の値は1.0にする必要があります。また、sridが8307の場合、単位は10進表記の度数になるため、この値を111319.49に設定できます。この要素が指定されていない場合、マップ視覚化コンポーネントの内部プロセスはデータ範囲に従って値を計算します。計算結果は、111319.49に非常に近い値になります。このタイル層がWMTSサービスを提供するためにマップ視覚化コンポーネントによって公開されるときに、sridが8307の場合は、OGC標準に準拠するように、この要素の値を111319.49に設定する必要があります。

<zoom_levels>要素では、事前定義済のズーム・レベルを指定します。事前定義済のズーム・レベルにある画像タイルのみが、マップ・タイル・サーバーによってキャッシングされ、表示されます。<zoom_levels>要素で持つことができる複数の<zoom_level>要素のそれぞれでは、事前定義済の1つのズーム・レベルを指定します。<zoom_level>要素が存在しない場合、マップ・タイル・サーバーは<zoom_levels>要素内の次の属性を使用して、<zoom_level>要素を自動的に生成します。(それらの属性は、省略が可能であり、いずれかの<zoom_level>要素が存在する場合は無視されます。)

  • levelsでは、ズーム・レベルの総数を指定します。

  • min_scaleでは、最高のズーム・レベル(最もズーム・インしたレベル)にあるマップ画像のスケールを指定します。

  • max_scaleでは、最低のズーム・レベル(最もズーム・アウトしたレベル)にあるマップ画像のスケールを指定します。

  • min_tile_widthでは、最高のズーム・レベルにあるマップ・タイルの幅を指定します。この幅は、マップ・データ単位で指定します。

  • max_tile_widthでは、最低のズーム・レベルにあるマップ・タイルの幅を指定します。この幅は、マップ・データ単位で指定します。

各ズーム・レベルの定義をマップ・タイル・サーバーが自動的に生成できるようにするには、前述の属性を次のように組み合せて指定する必要があります。

  • levelsmin_scaleおよびmax_scale

  • levelsmin_tile_widthおよびmax_tile_width

ズーム・レベルをこのように定義すると、マップ・タイル・サーバーは各ズーム・レベルの定義をすべて自動的に導出し、それらのズーム・レベルで生成された<zoom_level>要素を使用してXML定義を更新します。各ズーム・レベルはその後、必要に応じて調整できます。

各ズーム・レベルには、ズーム・レベルの定義順に基づいて、マップ・タイル・サーバーによりズーム・レベル番号が割り当てられます。<zoom_levels>要素内で定義される最初のズーム・レベルはズーム・レベル0、2番目のズーム・レベルはズーム・レベル1、...のようになります。これらのズーム・レベル番号は、事前定義済のズーム・レベルを参照するために、タイル・リクエスト内で使用されます。

<zoom_level>要素は、事前定義済のズーム・レベルを指定し、いくつかの属性を持ちます。description属性は、オプションであり、ズーム・レベルの説明文を指定します。level_name属性は、オプションであり、ズーム・レベルの名前を指定します。scale属性は、ズーム・レベルのマップ・スケールを指定し、tile_width属性およびtile_height属性が定義されていない場合は必須です。tile_width属性およびtile_height属性ではそれぞれ、タイルの幅および高さをマップ・データ単位で指定します。fetch_larger_tiles属性は、オプションであり、小さなマップ画像タイルのかわりに大きなマップ画像をフェッチするかどうかを指定します。値がTRUE(デフォルト)の場合は、複数のマップ・タイルから構成される大きなマップ画像がフェッチされ、小さなマップ画像タイルに分割されます。そのため、マップ・タイル・サーバーとマップ・サービス・プロバイダの間のネットワーク・ラウンドトリップを抑えられます。

<zoom_level>要素では、scale属性か、tile_width要素およびtile_height要素の両方を指定する必要があります。

<zoom_level>要素内の<tile_bound>要素では、ズーム・レベルに合せてキャッシュされたマップ・タイルの枠ボックスを指定します(オプション)。マップ・タイル・サーバーでは、このボックス内のタイルのみをフェッチし、リクエストされたタイルがこのボックスの外部にある場合は空白のタイルを返します。枠ボックスは、マップ・データ座標系内で指定された矩形によって指定します。該当する矩形は、このトピックで説明した<coordinates>要素で指定します。<zoom_level>要素内で<tile_bound>要素を指定すると、XML階層内で上位にある<tile_bound>要素で指定されているキャッシュの枠ボックスの設定全体がオーバーライドされます。

<auto_update>要素では、実表の空間データが変更されたときにタイル層のディスク・キャッシュが自動的に更新される方法を定義します。詳細は、「タイル層定義への<auto_update>要素の追加」を参照してください。

<themes>要素は、テーマに基づいて層を定義します(ベース・マップに基づく層とは異なります)画像のレンダリングに使用されるテーマは、サブ要素にリストされます。各サブ要素<theme>には、メタデータで事前定義済テーマを指定するためのname属性が必要になります。それ以外の2つのオプションの属性from_levelto_levelでは、そのテーマの可視性を定義します。これら2つの属性のデフォルト値は、from_levelが0 (最も少ないマップ詳細が含まれる)、to_levelが最後のレベル(最も多いマップ詳細が含まれる)です。

3.2.2.3 マップ・タイルのストレージ・スキーム: 内部メッシュ・コードまたはXYZ

<file_storage>要素(「マップ・タイル層の構成」を参照)のxyz_storage_scheme属性では、マップ・タイルのディレクトリ構造がディスク・キャッシュで編成される方法を制御します。デフォルトのスキームでは、マップ視覚化コンポーネントの内部メッシュ・コードが使用されますが、XYZストレージ・スキームをかわりに選択することもできます。

図3-4は、両方のストレージ・スキームを示しています。

図3-4 内部メッシュ・コード・スキームとXYZマップ・タイル・ストレージ・スキーム

図3-4の説明が続きます
「図3-4 内部メッシュ・コード・スキームとXYZマップ・タイル・ストレージ・スキーム」の説明'

マップ視覚化コンポーネントの内部メッシュ・コードの詳細は、ユーザーにとって重要ではありません。理解しておく必要があることは、2つの異なるストレージ・スキームのオプションがあり、XYZストレージ・スキームは複数のマップ・データ・プロバイダが使用しているスキームと似ているということです。そのため、オフライン・プロジェクト(ローカル・タイル層)用に複数のズーム・レベルのタイルをエクスポートする場合、XYZストレージ・スキームのほうが直感的であると考えた場合は、それを指定してください。

マップ視覚化コンポーネントのXYZストレージ・スキームでは、サブディレクトリの名前が/z/y/xという形式で付けられます。zはズーム・レベル、yはタイルの行番号、およびxはタイルの列番号になります。たとえば、図3-4では、マップ視覚化コンポーネントのXYXストレージ・スキームは、ズーム・レベル8、タイル行33のタイル列に含まれる画像(74.png75.png76,png77.png)を示しています。

3.2.2.4 外部Webマップ・ソースによるマップ・タイル層の作成

外部Webマップ・ソースを使用してマップ・タイル層を作成するには、次のようにします。

  1. マップ視覚化コンポーネントの管理コンソールにログインします。
  2. 「タイル層の作成」をクリックします。
  3. このタイル層のマップ画像ソースとして「外部」を選択し、「続行」をクリックします。
  4. 外部マップ・ソースのマップ・タイル層の作成 ページで、適切な情報を入力します。

    名前:タイル層の名前。例: TILELAYER1

    データソース:タイル層のデータソース名。例: MVDEMO

    ブラウザのタイル・キャッシュの最大期間(時間):タイルをリフレッシュするまでの最大時間(時間単位)。例: 168

    マップ・サービスのURL:例: http://mycorp.com:7001/mapviewer/wms

    リクエスト・メソッド: HTTP GET

    アダプタ・クラス: oracle.lbs.mapcache.adapter.WMSAdapter

    JARファイルの場所:例: adapterlibs/

    背景: transparent

    アダプタ・プロパティ: (選択し、次の値を入力するたびに「追加」を必要に応じて複数回クリックします。)

    • datasource: 例: mvdemo

    • version: 1.1.1

    • srs: EPSG:4326

    • layers:例: THEME_DEMO_COUNTIES,THEME_DEMO_HIGHWAYS

    • format: image/png

    • transparent: true

    タイル・ストレージ:例: C:\temp

    SRID: 8307

    最小X: -180.0

    最大X: 180.0

    最小Y: -90.0

    最大Y: 90.0

    タイルの幅(ピクセル): 256

    タイルの高さ(ピクセル): 256

    ファイル形式: PNG

    ズーム・レベル数: 10

    マップ・スケール最小値: 1000

    マップ・スケール最大値: 250000000

  5. 「送信」をクリックして、タイル層を作成します。

    情報: 新しいマップ・タイル層が正常に作成されましたというメッセージが表示されます。

作成された層を確認するには、左側の「タイル層の管理」をクリックし、タイル層を選択し、「マップの表示」→「タイルの管理」をクリックしてマップをプレビューします。

3.2.3 マップ・キャッシュの自動更新

マップ・キャッシュの自動更新機能は、ダーティになったキャッシュ・マップ・タイルを定期的に更新します。キャッシュ・マップ・タイルは、更新、挿入または削除操作によって実表内のデータが変更されるとダーティになります。それは、このような変更が、すでにキャッシュされているマップ・タイルの図形、注釈またはレンダリング・スタイルの選択に影響を与える可能性があるからです。ダーティ・タイルの更新は、次のいずれかの操作を呼び出します: a)リフレッシュ:キャッシュされたダーティ・タイルを削除した後、それらを再フェッチ。または、b)クリア:キャッシュされたダーティ・タイルの削除のみ。タイル層の自動更新を有効にするには、次の主要ステップを実行します。

  1. mapViewerConfig.xml構成ファイルへの<dirty_tile_auto_update>要素の追加

  2. タイル層定義への<auto_update>要素の追加

  3. ダーティなMBR表、実表のログ表およびトリガーの作成

タイルの自動更新をテストする場合は、マップ視覚化コンポーネント・サーバーの起動およびマップ・キャッシュの自動更新機能のテストの説明を参照してください。

3.2.3.1 mapViewerConfig.xml構成ファイルへの<dirty_tile_auto_update>要素の追加

<dirty_tile_auto_update>要素を<map_tile_server>要素の子要素として追加します。次に例を示します。

<map_tile_server>
   <tile_storage default_root_path="/scratch/tilecache/"/>
   <dirty_tile_auto_update
     auto_update="true"
     auto_update_interval="1"
     recycle_interval="168"/>
</map_tile_server>

auto_update属性をtrueに設定すると、サーバーの自動更新が有効になります(デフォルトはfalse)。この属性をtrueに設定した場合、サーバー上のすべての適格なタイル層が自動的に更新されます。適格となるには、タイル層が適切に定義されている必要があります(「タイル層定義への<auto_update>要素の追加」を参照)。

auto_update_interval属性は、実表のログ表およびダーティMBR表のチェックを繰り返す間隔を設定します。この値は分単位であり、デフォルト値は1です。この値は数分以下にし、実表の更新頻度が非常に少ない場合でも(日次または週次など)、大きい値にしないでください。実表のログ表およびダーティなMBR表は、マップ視覚化コンポーネント・サーバーを起動する前に作成されている必要があります。この2つの表および関連シーケンスおよびトリガーを作成するサンプル・スクリプトは、「ダーティなMBR表、実表のログ表およびトリガーの作成」に含まれています。

recycle_interval属性は、処理された行をログ表およびダーティなMBR表に保持する期間を指定します。この値は時単位の時間であり、デフォルト値は168です。これより古くなると、処理された行は削除されます。

マップ視覚化コンポーネントが起動されると、mapViewerConfig.xml構成ファイルから<dirty_tile_auto_update>要素がロードされ、そのサーバーのすべてのタイル層に適用されます。この要素が見つからない場合、サーバーのタイル層の自動更新機能は無効になります。

3.2.3.2 タイル層定義への<auto_update>要素の追加

<auto_update>要素は、タイル層定義の<zoom_levels>要素の後に追加します。この要素を追加するには、手動で実行するかマップ視覚化コンポーネントのWebコンソールを使用します。次に例を示します。

 <auto_update
      finest_level_to_refresh="15"
      dirty_mbr_batch="100"
      dirty_mbr_cap="1000">
      <dirty_mbr_table name="mbr_mcau"/>
      <logtable name="log_mcau_tl"/>
   </auto_update>

finest_level_to_refresh属性は、リフレッシュの対象となる最も詳細なレベルを指定します。レベル0から始まり、この指定されたレベルまでがリフレッシュの対象となり(レベル0、レベル1、レベル2、…)、残りのズーム・レベルではダーティなタイルがクリアされます。飲食店の店名変更や新たに開発された道路の挿入など、実表でのデータ修正が地理的に小さい地物であることが多い場合(ほとんどのデータ修正がそうであるように)、この値はタイル層の定義で見つかった最も詳細なズーム・レベルにすることができます。たとえば、0から18までの19のズーム・レベルがある場合は、この属性を18に設定できます。

dirty_mbr_batch属性は、更新するダーティなMBR表からの最大行数を指定します。デフォルト値は100です。この値は、サーバーが一度に大量のタイルを更新するのを防ぎます。大量のダーティ・タイルのリフレッシュまたはクリア操作が必要な場合、それらのタイルは多くの更新で処理され、1つの間隔で処理されるのは1バッチのみです。この属性の最適値を決定するには、次の要素を考慮してください。

dirty_mbr_batchの最適値を正確に計算できる式がないため、ベスト・プラクティスは、様々な設定をテストする環境をセットアップすることです。値を選択するときは、最悪のシナリオを考慮します。回避する2つの極端なシナリオは、a)値が非常に小さいためにリフレッシュ操作の終了後にサーバーがアイドル状態になっているが、ダーティMBR表のダーティMBR行の数が増加し続けるシナリオ、またはb)値が非常に大きいためにサーバーがメモリー不足になり、メモリー不足例外をスローし、すべてのサービスが停止するシナリオです。

dirty_mbr_cap属性は、ログ表が1つの間隔で生成するダーティ・タイルの最大数を指定します。この制約は、リフレッシュ操作のための最も詳細なズーム・レベル、およびクリア操作に設定される残りのズーム・レベルに影響を与える場合があります。ダーティ・タイルの累積カウンタは、ズーム・レベル0から始まり、上限に達するかリフレッシュする最も詳細なレベルに達するまで、レベル1、レベル2へとカウントし続けます。

リフレッシュ用に指定された最も詳細なレベルに到達する前にレベルnで上限に到達した場合、すでにカウントされているレベル0、レベル1、レベル2、…、およびレベルn-1のタイルはリフレッシュ操作の対象となり(削除後に再フェッチ)、現在のズーム・レベル(この例ではレベルn)およびこれより詳細な他のすべてのレベルはクリア操作の対象となります(マップ・タイル・キャッシュから削除され、再フェッチなし)。たとえば、上限値が1000であり、ダーティ・タイル・カウンタがズーム・レベル4で上限に到達した場合、レベル0からレベル3までのすべてのカウント済ダーティ・タイルがリフレッシュの対象となります。その後、レベル3の各ダーティ・タイルは矩形(タイルが地面を覆う矩形領域)を定義するために使用され、この矩形は、レベル4から始まりレベル5およびこのタイル層内の他のすべてのより詳細なズーム・レベルをクリアするためのMBRとされます。

<dirty_mbr_table>要素は、ダーティなMBRの表名を指定します。ダーティMBRはこの表に保存、取得および更新されます。マップ視覚化コンポーネント・サーバーの起動前に、この表を手動で作成しておく必要があります(ダーティなMBR表、実表のログ表およびトリガーの作成の例を参照)。

<logtable>要素は、実表のログ表名を指定します。多くの場合がそうであるように、タイル層が複数の実表に依存している場合は、それぞれの実表内でのすべての変更を、そのトリガーによってこのログ表に挿入する必要があります。スキーマがmapViewerConfig.xmlで定義された複数のデータソースからアクセスされている場合は、実表内の1つの変更につき、各データソース用に1行を挿入する必要があります。

各タイル層が独自のログ表およびダーティMBR表を持つことをお薦めします。これらの表は、サーバーの起動前に手動で作成しておく必要があります(「ダーティなMBR表、実表のログ表およびトリガーの作成」の例を参照)。

3.2.3.3 ダーティなMBR表、実表のログ表およびトリガーの作成

この項では、ダーティなMBR表、実表のログ表およびトリガーを作成するための処理の例を全体的に示します。この例のセグメントは、DEMO_MAPというベース・マップがすでに定義されており、スキーマにアクセスするMVDEMOという1つのデータソースが存在することを前提としています。

例のコード・セグメントには説明のコメントが含まれており、次の処理を実行します。

  1. <auto_update>要素を含むタイル層を作成します。

    insert into user_sdo_cached_maps values(
    'MCAU_TL',
    'a test case for map cache auto update',
    '',
    'YES',
    'YES',
    '<map_tile_layer name="MCAU_TL" image_format="PNG" http_header_expires="168.0" concurrent_fetching_threads="3" fetch_larger_tiles="false">
       <internal_map_source data_source="mvdemo" base_map="DEMO_MAP"/>
       <coordinate_system srid="8307" minX="-180.0" maxX="180.0" minY="-90.0" maxY="90.0"/>
       <tile_image width="256" height="256"/>
       <tile_dpi value="90.7142857"/>
       <tile_meters_per_unit value="111319.49079327358"/>
       <zoom_levels levels="19" min_scale="2132.729583849784" max_scale="559082264.0287178">
       </zoom_levels>
       <auto_update
          finest_level_to_refresh="15"
          dirty_mbr_batch="100"
          dirty_mbr_cap="1000">
          <dirty_mbr_table name="mbr_MCAU_TL"/>
          <logtable name="log_MCAU_TL"/>
       </auto_update>
    </map_tile_layer>',
    'DEMO_MAP',
    '');
    commit;
    
  2. ダーティなMBR表およびそのトリガーを作成します。

    ダーティなMBR表には、リフレッシュおよびクリア操作のためのダーティなMBRが格納されます。この表は、ログ表からジオメトリを使用して移入されます。この表のID列に一意のIDを生成するためにシーケンスおよびトリガーも作成されます。

    -- create the dirty MBR table
    CREATE TABLE mbr_MCAU_TL (     -- dirty MBR table name
      id             number,       -- id, used for tracking the status
      datasource     varchar2(32), -- data source name
      tile_layer     varchar2(32), -- tile layer name
      logtable       varchar2(32), -- basetable's log-table
      refresh_status varchar2(1),  -- n: not refreshed, y: refreshed, p:pending, f: failed
      clear_status   varchar2(1),  -- n: not cleared,   y: cleared,   p:pending, f: failed
      mbr_to_clear   varchar2(1),  -- y/n: use tile's mbr for clearing finer levels
      zoom_level     number,       -- zoom level of this tile
      mx             number,       -- mesh x ordinate 
      my             number,       -- mesh Y ordinate 
      minx           number,       -- tile's minimum x coordinate
      miny           number,       -- tile's minimum y coordinate
      maxx           number,       -- tile's maximum x coordinate
      maxy           number,       -- tile's maximum y coordinate
      insert_time    Date,         -- when the tile MBR was inserted into this table
      update_time    Date          -- most recent update (refresh/clear) time
      );
     
    -- create a sequence for mbr_MCAU_TL
    CREATE SEQUENCE mbr_MCAU_TL_seq
      START WITH 1
      INCREMENT BY 1
      CYCLE
      MAXVALUE 9999999999;
     
    -- create a trigger to get a unique id
    create or replace trigger mbr_MCAU_TL_br
     before insert on mbr_MCAU_TL   -- before inserting the row
     referencing new as new old as old
     for each row  -- for each row 
    begin
      select mbr_MCAU_TL_seq.nextval INTO :new.id FROM dual;
    end;
    /
  3. ログ表を作成します。

    実表のログ表には、タイル層の実表で変更された行が記録されます。各タイル層はマップ・タイルの生成時にその実表内のデータに依存するため、実表に対する変更は(ジオメトリの変更や属性値に対する変更など)、対応するマップ・タイルの表示に影響する場合があります。このような変更は、実表に作成されたトリガーを通じて変更ログ表に記録されます。

    次の文は、ログ表およびシーケンスを作成し、シーケンスを使用して一意のID値を生成して表のトリガーを作成します。

    -- create the log table
    create table log_MCAU_TL(  
      id number,
      geomO sdo_geometry,  -- the affected geometry or its attributes, original geometry
      geomN sdo_geometry,  -- the affected geometry or its attributes, new geometry
      modified Date,       -- when the modified occurred
      status varchar2(1),  -- y: processed, n: not processed
      datasource varchar2(32), -- data source name, more than one ds may access the same log
      tile_layer varchar2(32), -- tile layer name
      basetable  varchar2(32) -- base table name, more than one base table may insert into this log
    );
     
    -- create a sequence for log_MCAU_TL
    CREATE SEQUENCE log_MCAU_TL_seq 
      START WITH 1
      INCREMENT BY 1
      CYCLE
      MAXVALUE 9999999999;
     
    -- create a trigger for log_MCAU_TL to create a unique id
    create or replace trigger log_MCAU_TL_br
     before insert on log_MCAU_TL   -- before inserting
     referencing new as new old as old
     for each row                          -- for each row 
    begin
      select log_MCAU_TL_seq.nextval INTO :new.id FROM dual;
    end;
    /
    
  4. ログ表に変更を挿入するために各実表上のトリガーを作成します。

    実表のトリガーでは、ログ表に挿入されたジオメトリはタイル層と同じ空間参照システム(座標系)に変換されます。mapViewerConfig.xml構成ファイルに定義された複数のデータソースが同じスキーマにアクセスする場合は、各トリガーの定義でこれらのデータソースごとに1つのINSERT文を使用する必要があります。

    次の文で想定されている事項は次のとおりです。

    • MVDEMOという1つのデータソースがMCAU_TLタイル層を含むスキーマにアクセスしています。(したがって、各トリガー定義のINSERT文は1つのみです。)

    • タイル層の空間参照システム(SRID)は8307 (WGS 84の緯度/経度)です。

    • このタイル層にはモニターする実表が4つあります(州、郡、州間および都市)。

    --states trigger
    create or replace trigger states_MCAU_TL_ar
     after insert or update or delete on states   -- any change
     referencing new as new old as old
     for each row                                
     when (old.geom IS NOT NULL OR new.geom IS NOT NULL)
    declare
      oldGeom SDO_GEOMETRY;
      newGeom SDO_GEOMETRY;
      tileSRID  number;
    begin
       tileSRID := 8307;
       oldGeom  := :old.geom;
       if (:old.geom IS NOT NULL) then
         if (:old.geom.SDO_SRID != tileSRID) then
           select sdo_cs.transform(:old.geom, tileSRID)  into oldGeom from dual;
         end if;
       end if;
       newGeom:=:new.geom;
       if (:new.geom IS NOT NULL) then
         if (:new.geom.SDO_SRID!= tileSRID) then
           select sdo_cs.transform(:new.geom, tileSRID)  into newGeom from dual;
         end if;
       end if;
     
       insert into log_MCAU_TL (id, geomO, geomN, modified, status, datasource, tile_layer, basetable)
            values(null, oldGeom, newGeom, sysdate, 'n', 'MVDEMO', 'MCAU_TL', 'states');
    end;
    /
     
    --counties trigger
    create or replace trigger counties_MCAU_TL_ar
     after insert or update or delete on counties
     referencing new as new old as old
     for each row 
     when (old.geom IS NOT NULL OR new.geom IS NOT NULL)
    declare
      oldGeom SDO_GEOMETRY;
      newGeom SDO_GEOMETRY;
      tileSRID  number;
    begin
       tileSRID := 8307;
       oldGeom  := :old.geom;
       if (:old.geom IS NOT NULL) then
         if (:old.geom.SDO_SRID!=tileSRID) then
           select sdo_cs.transform(:old.geom, tileSRID)  into oldGeom from dual;
         end if;
       end if;
       newGeom:=:new.geom;
       if (:new.geom IS NOT NULL) then
         if (:new.geom.SDO_SRID!= tileSRID) then
           select sdo_cs.transform(:new.geom, tileSRID)  into newGeom from dual;
         end if;
       end if;
       insert into log_MCAU_TL (id, geomO, geomN, modified, status, datasource, tile_layer, basetable)
            values(null, oldGeom, newGeom, sysdate, 'n', 'MVDEMO', 'MCAU_TL', 'counties');
    end;
    /
     
    --interstates trigger
    create or replace trigger interstates_MCAU_TL_ar
     after insert or update or delete on interstates 
     referencing new as new old as old
     for each row  
     when (old.geom IS NOT NULL OR new.geom IS NOT NULL)
    declare
      oldGeom SDO_GEOMETRY;
      newGeom SDO_GEOMETRY;
      tileSRID  number;
    begin
       tileSRID := 8307;
       oldGeom  := :old.geom;
       if (:old.geom IS NOT NULL) then
         if (:old.geom.SDO_SRID!=tileSRID) then
           select sdo_cs.transform(:old.geom, tileSRID)  into oldGeom from dual;
         end if;
       end if;
       newGeom:=:new.geom;
       if (:new.geom IS NOT NULL) then
         if (:new.geom.SDO_SRID!= tileSRID) then
           select sdo_cs.transform(:new.geom, tileSRID)  into newGeom from dual;
         end if;
       end if;
     
       insert into log_MCAU_TL (id, geomO, geomN, modified, status, datasource, tile_layer, basetable)
            values(null, oldGeom, newGeom, sysdate, 'n', 'MVDEMO', 'MCAU_TL', 'interstates');
        
    end;
    /
     
    --cities trigger
    create or replace trigger cities_MCAU_TL_ar
     after insert or update or delete on cities  
     referencing new as new old as old
     for each row
     when (old.location IS NOT NULL OR new.location IS NOT NULL)
    declare
      oldGeom SDO_GEOMETRY;
      newGeom SDO_GEOMETRY;
      tileSRID  number;
    begin
       tileSRID := 8307;
       oldGeom  := :old.location;
       if (:old.location IS NOT NULL) then
         if (:old.location.SDO_SRID!=tileSRID) then
           select sdo_cs.transform(:old.location, tileSRID)  into oldGeom from dual;
         end if;
       end if;
       newGeom:=:new.location;
       if (:new.location IS NOT NULL) then
         if (:new.location.SDO_SRID!= tileSRID) then
           select sdo_cs.transform(:new.location, tileSRID)  into newGeom from dual;
         end if;
       end if;
     
      insert into log_MCAU_TL (id, geomO, geomN, modified, status, datasource, tile_layer, basetable)
          values(null, oldGeom, newGeom, sysdate, 'n', 'MVDEMO', 'MCAU_TL', 'cities');
    end;
    /
    commit;
3.2.3.4 マップ視覚化コンポーネント・サーバーの起動およびマップ・キャッシュの自動更新機能のテスト

タイルの自動更新をテストするには、マップ視覚化コンポーネント・サーバーを起動し、実表内の1つ以上の行を変更します。

  1. 実表内の行を変更します。次に例を示します。

    update cities set city='Worcester' where city='Worcester' and state_abrv='MA';
    
  2. ログ表を確認します。次に例を示します。

    select * from log_mcau_tl;
    

    実表のトリガーによって挿入された行が結果に含まれている必要があります。

  3. しばらく待って1つの間隔が経過したころに(この例では1分)、ダーティなMBR表を確認します。次に例を示します。

    select count(*) from mbr_mcau_tl;
    

    サーバーによって挿入されたダーティなMBR行が結果に含まれている必要があります。

また、ダーティなMBR表のrefresh_status列の変化を見ることもできます。行が最初に挿入されると、ステータスは未処理を表すnに設定されます。その後、処理が実行されると保留中を表すpに、更新が完了すると処理済を表すyに変更されます。また、サーバーでは、タイルがサーバーによって更新されたことを確認できます(最も詳細なログ情報を表示するには、サーバーのロガーをfinestに設定する必要があります)。

3.2.4 マップ・タイルのUTFGrid: 地物に関するテキスト情報を含める

タイル層のUTFGridが有効になっていると、UTFGridという名前のデータセットは画像タイルの「コンパニオン」になります。コンパニオンは、画像タイル内の地物に関するテキスト情報を含んでいます。このテキスト情報は、マウス・イベント(マップ地物上でマウスをクリックするなど)への応答時にブラウザで表示できます。

UTFGridデータセットは、JSON形式で保存されます。また、2つのコンポーネント(a)コンパニオン画像タイルをミラーするグリッド・データセットと、(b)すべてのグリッド・セルの属性が含まれています。各グリッド・セルの値は、画像タイル・セルとその属性をリンクするためのキーの役割を果たします。マップ上の各画像ピクセルは、UTFGridグリッド・セルに関連付けられていて、そのセルの値は属性(テキスト文字列)が取得できる場所を示しています。ストレージを効果的に使用するために、各グリッド・セルの値は改訂されたUTF-8コード体系でエンコードされます。

3.2.4.1 タイル層のUTFGridオプションの有効化

マップ・タイル層のUTFGridオプションを有効にするには、そのタイル層のUSER_ADO_CACHED_MAPS行で、<map_tile_layer>要素にutfgrid="true"を指定します。また、オプションとして、utfgrid_resolution属性(デフォルトは4)でUTFGridの解像度を指定します。次に例を示します。

insert into user_sdo_cached_maps values(
'UTFGRID_TL',
'utfgrid enalbled test case ',
'',
'YES',
'YES',
'<map_tile_layer name="UTFGRID_TL" image_format="PNG" http_header_expires="168.0" concurrent_fetching_threads="3" fetch_larger_tiles="false"
    persistent_tiles="true" utfgrid="true" utfgrid_resolution="4">
   <internal_map_source data_source="mvdemo" base_map="UTFGRID_BASEMAP" bgcolor="#dddddd" out_of_bounds_color="#eeddff"/>
   <tile_storage root_path="/temp" xyz_storage_scheme="true"/>
   <coordinate_system srid="8307" minX="-180.0" maxX="180.0" minY="-90.0" maxY="90.0"/>
   <tile_image width="256" height="256"/>
   <tile_dpi  value="90.7142857"/>
   <tile_meters_per_unit  value="111319.49079327358"/>
   <zoom_levels levels="19" min_scale="2132.729583849784" max_scale="559082264.0287178">
   </zoom_levels>
</map_tile_layer>',
'UTFGRID_BASEMAP',
'');
commit;

utfgrid_resolution属性により、UTFGridデータセットに含まれるグリッド・セルの精細度が決まります。デフォルト値の4は、1つのグリッド・セルがコンパニオン画像タイルの4x4の画像ピクセルを表すことを意味します。たとえば、イメージのディメンションが256x256の場合、グリッドのディメンションは64x64になります。また、行10、列20のグリッド・セルは、行40から行43および列80から列83のタイル画像に含まれるピクセルを表します(1つのグリッド・セルが16の画像タイル・ピクセルを表している点に注意してください)。マップ画像タイル内の複数の地物が指定された解像度で1つのグリッド・セルに収まる場合、ピクセルの過半数または多数を占める地物がグリッド・セルに割り当てられます。グリッド・セルに格納されている値は、UTF-8エンコーディングを使用してエンコードされています。

タイル層のUTFGridが有効になっている場合、マップ・サーバーはマップ画像タイルを生成するときに、JSON形式で保存されるUTFGridデータセットも生成します。クライアントがマップ画像タイルをリクエストすると、画像タイルとそのタイルのUTFGrid JSONファイルの両方がレスポンスで返されます。

マップ視覚化コンポーネント・サーバーでは、UTFGrid JSONファイルはそれに対応する画像タイルと同じ場所に保存されます。たとえば、画像タイルが/mapcache/MVDEMO.UTFGRID_TL/0/1/2.PNGにキャッシュされている場合、そのコンパニオンUTFGridファイルは/mapcache/MVDEMO.UTFGRID_TL/0/1/2.JSONで確認できます。

このUTFGridオプションは、現時点では、画像タイルがデータベース表に保存されていて(「データベース表にタイルを保存」を参照)、タイル層のディスク・キャッシュが無効化されている(「タイルを保存せずに直接ストリーミングを行う」を参照)ときにはサポートされません。

3.2.4.2 キーのエンコードとグリッド・セルの値のデコード

1つのタイル層には複数のデータ層またはテーマを含めることができます。それぞれのテーマが独自のグリッド・データセットを保持し、1つのUTFGrid JSONオブジェクトには複数のグリッド・データセットが含まれている可能性があります。各テーマのグリッドでは、その画像タイルに示される地物も各地物のレンダリングするためのスタイルを使用して描画されます。それに関連付けられた画像タイルについては、地物がキーを使用して描画されます。また、キーは各地物に割り当てられた序数になります。この数値は、セルの値にUTF-8エンコードされた値を割り当てるために使用されます。

画像タイル内の地物でマウス・イベントがトリガーされると、画像ピクセルの対応するグリッド・セルが特定できるようになるため、セルの値(UTF-8エンコードされた値)を取得できます。このUTF-8エンコードされた値は、キー(序数)を導出するためにデコードされます。このキーを使用すると、保存されている属性を取得できます。(「UTFGridテスト・ケースの作成」の後半にあるサンプルを参照)。

3.2.4.3 UTFGridテスト・ケースの作成

このテスト・ケースは、サーバー側に焦点を合わせています。重要なステップは2つあります。1つはUTFGrid対応のタイル層を作成すること、もう1つはハードコード化された複数の要求をサーバーに送信することです。(実際のアプリケーションでは、タイル層を使用するためのクライアント側マップ・アプリケーションを用意する必要があります)。

  1. UTFGrid対応のタイル層を作成します。

    すべての空間実表とスタイルがメタデータに存在していると、次の例は4つのテーマ、1つのベース・マップ、および1つのUTFGrid対応タイル層を作成します。地物の属性はテーマの<hidden_info>要素から得られるUTFGrid JSONオブジェクトに格納されているため、<hidden_info>要素は4つのテーマのうちの3つで定義されます。(この4つのテーマのいずれもが<hidden_info>要素を定義していない場合は、このタイル層のUTFGridを有効にしてもUTFGridオブジェクトは空になるため意味がありません。それでも、そのオブジェクトを作成することでサーバーのリソースが消費されてしまいます)。

    -- insert  theme 1
    insert into USER_SDO_THEMES (name, description, base_table, geometry_column, styling_rules) 
    values (
     'UTFGRID_THEME_DEMO_STATES', 
     'for utfgrid testing',
     'STATES',
     'GEOM',
     '<?xml version="1.0" standalone="yes"?>
    <styling_rules>
      <hidden_info>
        <field column="STATE" name="State"/>
        <field column="STATE_ABRV" name="Abrv."/>
        <field column="TOTPOP" name="Population"/>
      </hidden_info>
      <rule>
        <features style="C.S02_COUNTRY_AREA"> </features>
        <label column="STATE_ABRV" style="T.S02_STATE_ABBREVS"> 1 </label>
      </rule>
    </styling_rules>');
     
     
    -- insert theme 2
    insert into USER_SDO_THEMES (name, description, base_table, geometry_column, styling_rules)
    values (
     'UTFGRID_THEME_DEMO_COUNTIES',
     'for utfgrid testing',
     'COUNTIES',
     'GEOM',
     '<?xml version="1.0" standalone="yes"?>
    <styling_rules>
      <!--<hidden_info>
        <field column="COUNTY" name="County"/>
        <field column="FIPSSTCO" name="Fips"/>
        <field column="TOTPOP" name="Population"/>
        <field column="STATE_ABRV" name="State"/>
      </hidden_info>-->
      <rule>
        <features style="L.S06_BORDER_STATE"> </features>
      </rule>
    </styling_rules>');
     
    -- insert theme 3
    insert into USER_SDO_THEMES (name, description, base_table, geometry_column, styling_rules)
    values (
     'UTFGRID_THEME_DEMO_HIGHWAYS',
     'for utfgrid testing',
     'INTERSTATES',
     'GEOM',
     '<?xml version="1.0" standalone="yes"?>
    <styling_rules>
      <hidden_info>
        <field column="HIGHWAY" name="Highway"/>
        <field column="ROUTEN" name="No."/>
      </hidden_info>
      <rule>
        <features style="L.S04_ROAD_INTERSTATE"> </features>
        <label column="routen" style="M.HWY_USA_INTERSTATE_NARROW"> (3-length(routen)) </label>
      </rule>
    </styling_rules>');
     
    -- insert theme 4
    insert into USER_SDO_THEMES (name, description, base_table, geometry_column, styling_rules)
    values (
     'UTFGRID_THEME_DEMO_CITIES',
     'for utfgrid testing',
     'CITIES',
     'LOCATION',
     '<?xml version="1.0" standalone="yes"?>
    <styling_rules>
      <hidden_info>
        <field column="CITY" name="City"/>
        <field column="POP90" name="Population"/>
      </hidden_info>
      <rule>
        <features style="M.ALL_CITY_L2"> (pop90 between 200000 AND 1000000 ) </features>
        <label column="city" style="T.S07_CITIES_L2"> 1 </label>
      </rule>
      <rule>
        <features style="M.ALL_CITY_L3"> (pop90 between 0 and  200000) </features>
        <label column="city" style="T.S07_CITIES_L3"> 1 </label>
      </rule>
    </styling_rules>');
     
    -- insert a basemap
    INSERT INTO USER_SDO_MAPS (name, description, definition)
    values (
     'UTFGRID_BASEMAP',
     'for utfgrid testing',
     '<?xml version="1.0" standalone="yes"?>
      <map_definition>
        <theme name="UTFGRID_THEME_DEMO_STATES" min_scale="1.5E8" max_scale="0.0" scale_mode="RATIO"/>
        <theme name="UTFGRID_THEME_DEMO_COUNTIES" min_scale="8500000.0" max_scale="0.0" scale_mode="RATIO"/>
        <theme name="UTFGRID_THEME_DEMO_HIGHWAYS" min_scale="4.5E7" max_scale="0.0" scale_mode="RATIO"/>
        <theme name="UTFGRID_THEME_DEMO_CITIES" min_scale="7500000.0" max_scale="0.0" scale_mode="RATIO"/>
      </map_definition>' );
     
    -- insert the UTFGrid enabled tile layer
    insert into user_sdo_cached_maps values(
     'UTFGRID_TL',
     'a utfgrid ',
     '',
     'YES',
     'YES',
     '<map_tile_layer name="UTFGRID_TL" image_format="PNG" http_header_expires="168.0" concurrent_fetching_threads="3" fetch_larger_tiles="false"
        persistent_tiles="true" utfgrid="true" utfgrid_resolution="8">
       <internal_map_source data_source="mvdemo" base_map="UTFGRID_BASEMAP" bgcolor="#dddddd" out_of_bounds_color="#eeddff"/>
       <tile_storage root_path="/temp" xyz_storage_scheme="true"/>
       <coordinate_system srid="8307" minX="-180.0" maxX="180.0" minY="-90.0" maxY="90.0"/>
       <tile_image width="256" height="256"/>
       <tile_dpi  value="90.7142857"/>
       <tile_meters_per_unit  value="111319.49079327358"/>
       <zoom_levels levels="19" min_scale="2132.729583849784" max_scale="559082264.0287178">
       </zoom_levels>
    </map_tile_layer>',
     'UTFGRID_BASEMAP',
     '');
    commit;
    
  2. マップ画像とそのUTFGridオブジェクトをリクエストします。

    実際のアプリケーションでは、マップ画像タイルとそのコンパニオンUTFGrid JSONファイルのリクエストは、マップ視覚化コンポーネントHTML5 APIで処理されます。ただし、説明のために、ここではハードコード化された要求による2つのサブステップを示します。

    1. サーバーからの画像タイルをリクエストします。次に例を示します。

      http://localhost:8080/mapviewer/mcserver?request=gettile&format=png&zoomlevel=8&mapcache=MVDEMO.UTFGRID_TL&mx=77&my=94

      サーバーのレスポンスは、次のとおりです。

    2. サーバーからの画像タイルのコンパニオンUTFGridをリクエストします。次に例を示します。

      http://localhost:8080/mapviewer/mcserver?request=getutfgrid&format=json&zoomlevel=8&mapcache=MVDEMO.UTFGRID_TL&mx=77&my=94

      サーバーのレスポンスは、次のとおりです。

      {"UTFGRID_THEME_DEMO_STATES":
      {"keys":["1","2","3"],
      "data":{
      "1":{"State":"New Hampshire","Abrv.":"NH","Population":"1109252"},
      "2":{"State":"Maine","Abrv.":"ME","Population":"1227928"},
      "3":{"State":"Massachusetts","Abrv.":"MA","Population":"6016424"}},
      "grid":[
      "!!!!!!!!!!!!!!!!!###############",
      "!!!!!!!!!!!!!!!!!###############",
      "!!!!!!!!!!!!!!!!!############## ",
      "!!!!!!!!!!!!!!!!!###############",
      "!!!!!!!!!!!!!!!!!############## ",
      "!!!!!!!!!!!!!!!!!#############  ",
      "!!!!!!!!!!!!!!!!!!#########     ",
      "!!!!!!!!!!!!!!!!!!!########     ",
      "!!!!!!!!!!!!!!!!!!!!#######     ",
      "!!!!!!!!!!!!!!!!!!!!######      ",
      "!!!!!!!!!!!!!!!!!!!!######      ",
      "!!!!!!!!!!!!!!!!!!!!!!###       ",
      "!!!!!!!!!!!!!!!!!!!!!!!#        ",
      "!!!!!!!!!!!!!!!!!!!!!!!         ",
      "!!!!!!!!!!!!!!!!!!!!!!          ",
      "!!!!!!!!!!!!!!!!!!!!!!          ",
      "!!!!!!!!!!!!!!!!!$$!!           ",
      "!!!!!!!!!!!!!!!$$$$$$           ",
      "!!!!!!!!!!!!$$$$$$$$$           ",
      "!!!!!!!!!!!$$$$$$$$$$$          ",
      "$$$$$!!!!$$$$$$$$$$$$$$ $$      ",
      "$$$$$$$$$$$$$$$$$$$$$$$$$$      ",
      "$$$$$$$$$$$$$$$$$$$$$$$$$$      ",
      "$$$$$$$$$$$$$$$$$$$$$$$$$       ",
      "$$$$$$$$$$$$$$$$$$$$$           ",
      "$$$$$$$$$$$$$$$$$$$$            ",
      "$$$$$$$$$$$$$$$$$$$             ",
      "$$$$$$$$$$$$$$$$$$              ",
      "$$$$$$$$$$$$$$$$$$              ",
      "$$$$$$$$$$$$$$$$$$$$            ",
      "$$$$$$$$$$$$$$$$$$$$$$          ",
      "$$$$$$$$$$$$$$$$$$$$$$$         "]},
      "UTFGRID_THEME_DEMO_HIGHWAYS":{
      "keys":["1","2","3","4","5","6","7","8","9"],
      "data":{
      "1":{"Highway":"I 93","No.":"93"},
      "2":{"Highway":"I 95","No.":"95"},
      "3":{"Highway":"I 89","No.":"89"},
      "4":{"Highway":"I 293","No.":"293"},
      "5":{"Highway":"I 495","No.":"495"},
      "6":{"Highway":"I 190","No.":"190"},
      "7":{"Highway":"88","No.":"99"},
      "8":{"Highway":"I 290","No.":"290"},
      "9":{"Highway":"I 90","No.":"90"}},
      "grid":[
      "  !                          ## ",
      "  !                        ###  ",
      "  !!                       ##   ",
      "  !!                      ##    ",
      "  !                      ##     ",
      "  !                      ##     ",
      "  !!                    ##      ",
      "   !!                   ##      ",
      "$  !!                   #       ",
      "$$$$!                  ##       ",
      "    !!                ###       ",
      "     !              ###         ",
      "     %!             ##          ",
      "     %!!           ##           ",
      "     %%!           #            ",
      "       !!         ##            ",
      "        !!        ##            ",
      "         !!   &&&&#             ",
      "          !! &&& ##             ",
      "          !! &   #              ",
      "           !&&  ##              ",
      "         &&&!   ##              ",
      "       &&&& !   ##              ",
      "    &&&&    !!  ##              ",
      "'  &&&     ##!###               ",
      "' &&&     #((!!                 ",
      "  &&      #( !!                 ",
      "  &&      (  !!!                ",
      ")))&  *********!                ",
      ")  &***** ##   !                ",
      "*****      ##  !                ",
      "***&&      ##!!!                "]},
      "UTFGRID_THEME_DEMO_CITIES":{
      "keys":["1","2"],
      "data":{
      "1":{"City":"Lowell","Population":"103439"},
      "2":{"City":"Boston","Population":"574283"}},
      "grid":[
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "        !!                      ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "               ##               ",
      "                                ",
      "                                ",
      "                                "]},
      "resolution":"8","rows":"32","columns":"32"}
      

      前述のレスポンスは、テーマUTFGRID_THEME_DEMO_STATESUTFGRID_THEME_DEMO_HIGHWAYS、およびUTFGRID_THEME_DEMO_CITIESのプロパティを格納しているUTFGridオブジェクトを示しています。(テーマUTFGRID_THEME_DEMO_COUNTIESでは<hidden_info>要素が定義されていないため、そのテーマに関するものはレスポンスにリストされません)。

3.2.5 外部マップ・ソース・アダプタ

外部マップ・ソース・アダプタは、マップ・タイル・サーバーと外部マップ・サービス・プロバイダの間のインタフェースです。外部マップ・サービス・プロバイダからマップ画像タイルをフェッチする必要がある場合、マップ・タイル・サーバーはタイルのズーム・レベル、サイズおよび位置に関する情報を指定して、外部マップ・ソース・アダプタをコールします。外部マップ・ソース・アダプタはその後、プロバイダに固有のリクエストを作成した後、そのリクエストを外部マップ・サービス・プロバイダに送信し、得られたイメージ・タイルをマップ・タイル・サーバーに返します。

外部マップ・ソース・アダプタは、1つのJavaクラスであり、Javaの抽象クラスoracle.mapviewer.share.mapcache.MapSourceAdapter(定義は次のとおり)を拡張する必要があります。

public abstract class MapSourceAdapter
{
   public abstract String getMapTileRequest(TileDefinition tile);
   public byte[] getTileImageBytes(TileDefinition tile) ;
   public Properties getProperties() ;
}

このクラスを拡張するアダプタでは、次のメソッドを実装する必要があります。

  • public String getMapTileRequest(TileDefinition tile)

    このメソッドでは、マップ・サービス・プロバイダに送信してマップ画像タイルをフェッチできるHTTPリクエスト文字列を作成するロジックを実装します。たとえば、マップ・タイルのURLがhttp://myhost/mymapserver?par1=v1&par2=v2&par3=v3の場合、このメソッドから返されるHTTPリクエスト文字列はpar1_v1&par2=v2&par3=v3になります。

    マップ・タイル・サーバーは、特定のマップ・タイルが見つからない場合、getTileImageBytesメソッドをコールして該当するタイル画像のバイナリ・データをフェッチします。このメソッドは、getMapTileRequestメソッドをコールし、マップ・タイル・リクエストを作成して該当するタイルをフェッチします。getMapTileRequestメソッドが受け取る唯一のパラメータであるTileDefinitionオブジェクトでは、リクエストされたタイルのズーム・レベル、枠ボックス、画像サイズおよび画像形式を指定します。このメソッドでは、HTTPリクエスト文字列を返します。

また、マップ・ソース・アダプタは、クラスMapSourceAdapterに実装されているすべてのメソッドを継承します。それらの中で、他のメソッドに比べて重要なメソッドは次のとおりです。

  • public byte[] getTileImageBytes(TileDefinition tile)

    このメソッドは、外部マップ・サービス・プロバイダから実際のバイナリ・マップ・タイル画像データをフェッチします。このメソッドは、実装済です。これは、抽象メソッドgetMapTileRequestをコールしてマップ・タイル・リクエストを作成し、そのリクエストを外部マップ・サービス・プロバイダに送信します。HTTPリクエストの送信によってマップ・タイルをフェッチできない場合は、このメソッドをオーバーライドし、マップ・ソースから画像タイルをフェッチするための適切なロジックを実装できます。このメソッドが受け取る唯一のパラメータであるTileDefinitionオブジェクトでは、リクエストされたタイルのズーム・レベル、枠ボックス、画像サイズおよび画像形式を指定します。このメソッドは、マップ・タイル層の構成設定で指定されている画像形式でエンコードされたバイナリ・タイル画像データを返します。

  • public Properties getProperties()

    このメソッドでは、「マップ・タイル層の構成」で説明したマップ・タイル層の構成設定内で定義されている、プロバイダに固有のパラメータを返します。

MapSourceAdapterクラスおよびTileDefinitionクラスは、mvclient.jar(ディレクトリ$MAPVIEWER_HOME/web/WEB/libの中)内でパッケージされています。

外部マップ・ソース・アダプタの例を、例3-5に示します。

例3-5 外部マップ・ソース・アダプタ

/**
 * This is a sample map source adapter that can be used to fetch map 
 * tiles from a map visualization component instance.
 */
package mcsadapter ;
 
import java.awt.Dimension;
import java.net.URL;
import java.util.Properties;
import oracle.lbs.mapclient.MapViewer;
import oracle.lbs.mapcommon.MapResponse;
import oracle.mapviewer.share.mapcache.*;
 
/**
 * The map source adapter must extend class
 * oracle.lbs.mapcache.cache.MapSourceAdapter.
 */
 
public class MVAdapter extends MapSourceAdapter
{
  /**
   * Gets the map tile request string that is to be sent to the map 
   * service provider URL.
   * @param tile tile definition
   * @return request string
   */
  public String getMapTileRequest(TileDefinition tile)
  {
    // Get map source specified parameters
    Properties props = this.getProperties() ;
    String dataSource = props.getProperty("data_source") ;
    String baseMap = props.getProperty("base_map") ;
    // Use oracle.lbs.mapclient.MapViewer to construct the request string
    MapViewer mv = new MapViewer(this.getMapServiceURL()) ;
    mv.setDataSourceName(dataSource);
    mv.setBaseMapName(baseMap);
    mv.setDeviceSize(new Dimension(tile.getImageWidth(), 
                                   tile.getImageHeight()));
    mv.setCenterAndSize(tile.getBoundingBox().getCenterX(), 
                        tile.getBoundingBox().getCenterY(),
                        tile.getBoundingBox().getHeight());
    int format = MapResponse.FORMAT_PNG_STREAM ;
    String req = null ;
    switch(tile.getImageFormat())
    {
      case TileDefinition.FORMAT_GIF:
        mv.setImageFormat(MapResponse.FORMAT_GIF_URL);
        req = mv.getMapRequest().toXMLString().replaceFirst(
                        "format=\"GIF_URL\"", "format=\"GIF_STREAM\"") ;
        break ;
      case TileDefinition.FORMAT_PNG:
        mv.setImageFormat(MapResponse.FORMAT_PNG_URL);
        req = mv.getMapRequest().toXMLString().replaceFirst(
                        "format=\"PNG_URL\"", "format=\"PNG_STREAM\"") ;
        break ;
      case TileDefinition.FORMAT_JPEG:
        mv.setImageFormat(MapResponse.FORMAT_JPEG_URL);
        req = mv.getMapRequest().toXMLString().replaceFirst(
                        "format=\"JPEG_URL\"", "format=\"JPEG_STREAM\"");
        break ;
    }
    
    byte[] reqStr = null ;
    try
    {
      reqStr = req.getBytes("UTF8") ;
    }
    catch(Exception e)
    {}
    // Return the request string.
    return "xml_request="+ new String(reqStr);
  }
}

MapSourceAdapter.getTileImageBytesメソッドの実装を、例3-6に示します。

例3-6 MapSourceAdapter.getTileImageBytesの実装

/**
 * Fetches the map image tile from the external map service provider by 
 * sending the HTTP map tile request to the map service provider, and 
 * return the binary tile image data. You can rewrite this method so that 
 * the adapter can fetch the tile from an external map service provider 
 * that does not accept HTTP requests at all. 
 * @param tile the tile definition
 * @return the binary tile image data. 
 * @throws Exception
 */
public byte[] getTileImageBytes(TileDefinition tile)
  throws Exception
{
  // construct request string
  String request = getMapTileRequest(tile) ;
  
  if(request == null) 
  {
    throw new Exception("Null map tile request string in map source adapter!") ;
  }
 
  // set proxy settings
    Proxy proxy = null ;
 
  /* If the proxyHost is "NONE", the request is sent directly to the 
   * external server. If the proxyHost is a valid host, that host will 
   * be used as the proxy server. If the proxyHost is empty of omitted,  
   * the global proxy setting in mapViewerConfig.xml will be in effect.
   */
  boolean noProxy = "NONE".equalsIgnoreCase(getProxyHost()) ;
  if(getProxyHost()!=null && !noProxy)
  {
    SocketAddress addr = new InetSocketAddress(proxyHost, proxyPort);
    proxy = new Proxy(Proxy.Type.HTTP, addr);
  }
    
  // send the request and get the tile image binary  
  PrintWriter wr = null ;
  BufferedInputStream bis = null;
  try 
  {
    String urlStr = mapServiceURL ;
    if("GET".equalsIgnoreCase(httpMethod))
      urlStr = mapServiceURL + "?" + request ;
    log.finest("http "+httpMethod+": "+urlStr);
      
    URL url = new URL(urlStr);
    // Open a URL connection based on current proxy setting
    URLConnection conn = 
      proxy!=null? url.openConnection(proxy):
                   (noProxy? url.openConnection(Proxy.NO_PROXY):
                             url.openConnection()) ;
    conn.setConnectTimeout(timeOut);
    if("GET".equalsIgnoreCase(getHTTPMethod()))
      conn.connect();
    else
    {
      conn.setDoOutput(true);
      wr = new PrintWriter(conn.getOutputStream());
      wr.print(request);
      wr.flush();
      wr.close();
      wr = null ;
    }
    bis = new BufferedInputStream(conn.getInputStream());
    byte[] result = toBytes(bis) ;
    bis.close();
    bis = null ;
    return result;
  }
  catch(Exception ioe) 
  {
    throw new Exception("Failed to fetch external map tile.", ioe);
  }
  finally 
  {
    try 
    {
      if(bis != null) 
      {
        bis.close();
        bis = null;
      }
      if(wr != null) 
      {
        wr.close();
        wr = null;
      }
    }
    catch(IOException ioee) 
    {
      throw ioee;
    }
  }
}