ヘッダーをスキップ
Oracle Application Server MapViewerユーザーズ・ガイド
10g(10.1.3.1.0)
B40016-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

2 OracleAS MapViewerの概念

この章では、OracleAS MapViewerの使用前に熟知しておく必要がある概念について説明します。

基本概念には、スタイル、テーマ、ベース・マップ、マッピング・メタデータおよびマップがあります。

この章の主な項目は、次のとおりです。

2.1 OracleAS MapViewerの概要

アプリケーションでOracleAS MapViewerが使用された場合、特定のスタイル(色およびパターンなど)が特定のテーマ(つまり、都市、河川および高速道路などの空間地物の集合)に適用され、マップ(Webページに表示するGIF画像など)がレンダリングされます。たとえば、アプリケーションにより、州立公園が緑色で表示され、レストランが赤い星印でマーク付けされたマップが表示される場合があります。通常、マップには、政治的または物理的エンティティ(あるいはその両方)を表す複数のテーマがあります。たとえば、マップには国や州の境界線、都市、山脈、河川および史跡が表示されます。マップがレンダリングされた場合、各テーマは、完全な画像の中の1つのレイヤーを表します。

OracleAS MapViewerを使用すると、スタイル、テーマおよびベース・マップを定義し、各テーマに1つ以上のスタイルを適用するためのルールを含めることができます。これらのスタイル、テーマ、ベース・マップおよび関連するルールは、データベース内の、MDSYSスキーマのマップ定義表に格納され、ユーザーはメタデータ・ビューを使用して参照できます。データベース・インスタンス内のすべてのスタイルは、全ユーザーによって共有されます。ユーザーがアクセスできるマッピング・メタデータ(一連のスタイル、テーマおよびベース・マップ)は2.8項で説明するOracleAS MapViewerメタデータ・ビュー(USER_SDO_STYLES、USER_SDO_THEMES、USER_SDO_MAPSなど)によって決定されます。特定のユーザーがアクセスできるマップ定義オブジェクトのセットは、ユーザーのマッピング・プロファイルとも呼ばれます。スタイル、テーマおよびベース・マップは、Map Builderツール(第7章を参照)を使用して管理できます。

2.2 スタイル

スタイルは、空間地物を表す際に使用できる視覚属性です。ポイント地物、線地物および領域地物を表す基本的なマップの記号およびラベルは、個別のスタイルとして定義および格納されます。各スタイルには一意の名前があり、1つ以上のグラフィック要素がXML構文で定義されます。

各スタイルは、次のいずれかのタイプとなります。

表2-1は、各タイプのスタイルに適用可能なジオメトリ・タイプをリストしています。

表2-1 スタイル・タイプおよび適用可能なジオメトリ・タイプ

スタイル・タイプ 適用可能なジオメトリ・タイプ

(任意のタイプ)

マーカー

ポイント、線

領域

ポリゴン

テキスト

(任意のタイプ)

拡張

(任意のタイプ)


データベース・ユーザーのすべてのスタイルは、そのユーザーのUSER_SDO_STYLESビューに格納されます。このビューについては、2.8項および2.8.3項を参照してください。

mapリクエストの一部として、任意のスタイル・タイプの動的に定義されるスタイル(一時的スタイル)も作成できます。動的に定義されるスタイルを作成するには、<map_request>要素内でXML要素を使用してスタイルを定義します。(4.3.4項で説明するように、JavaBean APIを使用して、動的に定義されるスタイルをmapリクエストに追加することもできます。)OracleAS MapViewerでは、mapリクエストの処理時に、これらの定義から動的に定義されるスタイルを作成し、リクエストが完了すると廃棄します。

スタイルのタイプの詳細(各タイプを定義するためのXML形式に関する情報を含む)は、付録Aを参照してください。

2.2.1 バケットのラベル・スタイルの指定

コレクションベースのバケット・スタイルおよび個々の範囲ベースのバケット・スタイル(それぞれA.6.1.1項A.6.1.2項で説明)には、各バケット要素でlabel_style属性を使用して、ラベリング・スタイルを指定できます。例2-1では、V.RB1という拡張スタイルを作成します。このスタイルでは、各バケットにテキスト・ラベル・スタイルが割り当てられ(label_style属性を使用)、一部のスタイルは複数のバケットに使用されます。

例2-1 各バケットにテキスト・ラベル・スタイルを指定した拡張スタイル

<?xml version="1.0" ?>
<AdvancedStyle>
  <BucketStyle>
     <Buckets>
      <RangedBucket seq="0"  label="10k or less"  high="10000"
        style="c.rb13_1"  label_style="T.AIRPORT NAME"/>
      <RangedBucket seq="1"  label="10k - 20k" low="10000" high="20000"
        style="c.rb13_2"  label_style="T.CITY NAME"/>
      <RangedBucket seq="2"  label="20k - 30k" low="20000" high="30000"
        style="c.rb13_3"  label_style="T.CITY NAME"/>
      <RangedBucket seq="4"  label="30k - 40k" low="30000" high="40000"
        style="c.rb13_4"  label_style="T.CITY NAME"/>
      <RangedBucket seq="5"  label="40k - 50k" low="40000" high="50000"
        style="c.rb13_5"  label_style="T.CITY NAME"/>
      <RangedBucket seq="6"  label="50k - 75k" low="50000" high="75000"
        style="c.rb13_6"  label_style="T.ROAD NAME"/>
      <RangedBucket seq="7"  label="75k - 100k" low="75000" high="100000"
        style="c.rb13_7"  label_style="T.PARK NAME"/>
      <RangedBucket seq="8"  label="100k - 125k" low="100000" high="125000"
        style="c.rb13_8"  label_style="T.RED STREET"/>
      <RangedBucket seq="9"  label="125k - 250k" low="125000" high="250000"
        style="c.rb13_9"  label_style="T.ROAD NAME"/>
      <RangedBucket seq="10"  label="250k - 450k" low="250000" high="450000"
        style="c.rb13_10"  label_style="T.ROAD NAME"/>
      <RangedBucket seq="11"  label="450k - 650k" low="450000" high="650000"
        style="c.rb13_11"  label_style="T.ROAD NAME"/>
      <RangedBucket seq="12"  label="650k up"   low="650000" style="c.rb13_13"/>
      </Buckets>
  </BucketStyle>
</AdvancedStyle>

個々の範囲ベースのバケットでは、下限値は含まれますが上限値は含まれません(ただし、他の範囲の値より大きい値が含まれる範囲では、上限値は含まれます)。いずれの範囲にも、他の範囲の値と重複する値の範囲を含めることはできません。

例2-1V.RB1スタイルがmapリクエストで使用されると、図2-1のようなマップが表示されます。ここでは郡名が様々なテキスト・スタイル(この場合は郡の総人口により異なる)を反映したラベルで表示されています。

図2-1 異なるバケットに応じた様々なラベル・スタイル

図2-1の説明は図の下
「図2-1 異なるバケットに応じた様々なラベル・スタイル」の説明

例2-1では、最後のバケットを除くすべてのバケットでラベル・スタイルを指定しています。ラベル・スタイルが指定されていないバケットに分類される地物の場合、その地物に適用されるラベル・スタイル(ある場合)は、次の条件によって決まります。

  • テーマのスタイリング・ルールの<label>要素で、拡張スタイル以外のラベル・スタイルが指定されている場合、その地物のラベルには指定されたラベル・スタイルが使用されます。次の例では、<label>要素のスタイル指定(T.STATE_NAME)が<features>要素のスタイル指定(V.RB1)と異なっているため、指定されたラベル・スタイルを持たないバケットに分類される地物はT.STATE_NAMEスタイルを使用してラベルが付けられています。

    <?xml version="1.0" standalone="yes"?>
    <styling_rules>
      <rule column="TOTPOP">
        <features style="V.RB1">
        </features>
        <label column="county" style="T.STATE NAME">
            1
        </label>
      </rule>
    </styling_rules>
    
    
  • テーマのスタイリング・ルールの<label>要素で、ラベル・スタイルとして拡張スタイルが指定されている場合、地物にはラベルが付きません。(図2-1で一部の郡にラベルがないのはこのためです。)次の例では、<features>要素と<label>要素の両方で拡張スタイルV.RB1が指定されているため、ラベル・スタイルの指定がないバケットに分類される地物にはラベルが付きません。

    <?xml version="1.0" standalone="yes"?>
    <styling_rules>
      <rule column="TOTPOP">
        <features style="V.RB1">
        </features>
        <label column="county" style="V.RB1">
            1
        </label>
      </rule>
    </styling_rules>
    

2.2.2 テキスト・ラベルおよびマーカーの方向設定

テキスト・ラベルおよびマーカーの方向は、方位ポイントを使用して、マップ上で制御できます。方位ポイントは、Oracle Database 10gリリース1(10.1)のOracle Spatialで導入された特殊なポイント・ジオメトリです。方位ポイントでは、座標がそのポイントの位置と仮想終点の両方を表し、方位ベクトルを示します。方位ベクトルに従い、テキストの整列やマーカー記号の回転が行われます。方位ベクトルについては、3.2.5項およびその項の図3-3を参照してください。方位ポイントの詳細は、『Oracle Spatialユーザーズ・ガイドおよびリファレンス』を参照してください。

2.2.2.1 テキスト・スタイルの方位の制御

ポイントのテキスト・ラベルを方位ベクトルの方向に向けるには、mapリクエストでOracle Spatial方位ポイントとしてポイントを指定します。OracleAS MapViewerで方位ポイントのラベルを付けると、ポイントの位置のテキスト・ラベルは自動的に中央揃えになり、ラベルが方位ベクトルの方向を指すように位置が調整されます。

各地物を同様にラベル付けするには、その位置を方位ポイントとして指定する必要があります。これらの方位ポイントを1つの表にまとめ、ポイント・ジオメトリを含む列で空間索引を作成できます。これにより、ラベリングとして希望するテキスト・スタイルを指定し、ポイント自体がマップ上に表示されないようにレンダリング・スタイルに透明の色スタイルを指定することで、表に基づいたテーマを作成できます。

例2-2は、座標(12,14, 0.3,0.2)を持つ1つの方位ポイントにラベルを付けるmapリクエストです。(12,14)は、ポイントのX座標およびY座標を表し、(0.3,0.2)は方位ベクトルを表します。例では、テキストは表示されても、下にあるポイントが表示されないようにするために、動的に定義される透明色スタイル(transparent_color)を使用して、ポイントをレンダリングします。

例2-2 方位ポイントのラベル付け

<map_request
  title="Labeling Oriented Points"
  datasource="my_datasource"   width="400"  height="300"
  antialiase="true"
  format="PNG_STREAM">

  <themes>
    <theme name="theme1">
       <jdbc_query
         spatial_column="geom"  jdbc_srid="8265"
         render_style="transparent_color"
         label_column="label" label_style="t.street name"
         datasource="tilsmenv">
         SELECT SDO_GEOMETRY(2001, 8265, NULL,
                      SDO_ELEM_INFO_ARRAY(1, 1, 1, 3, 1, 0),
                      SDO_ORDINATE_ARRAY(12, 14, .3, .2))
         geom, 'Oriented Point' label FROM dual
       </jdbc_query>
     </theme>
  </themes>

  <styles>
    <style name="transparent_color">
      <svg width="1in" height="1in">
        <g class="color" style="stroke:#ff0000;stroke-opacity:0">
          <rect width="50" height="50"/>
        </g>
      </svg>
    </style>
  </styles>
</map_request>

図2-2は、例2-2のリクエストにより生成されるマップの一部を示しています。(ラベルは方位ポイントという語句です。)

図2-2 方位ポイントのラベルのマップ表示

図2-2の説明は図の下
「図2-2 方位ポイントのラベルのマップ表示」の説明

2.2.2.2 マーカーの方位の制御

方位ポイントにマーカー・スタイルが適用される場合、OracleAS MapViewerではマーカー・スタイルを自動的に回転し、方位ベクトルの方向を指すようにします。マーカー・スタイルを回転する場合は、マーカーの中央を中心にして回転します。

図2-3は、方位ポイントを使用してマーカー・スタイルの方位を制御する方法を示しています。この図では、まず元のマーカー・スタイルが回転なしで示されています。しかし、マーカーが2.2.2.1項例2-2と同じ方位ポイントに適用されると、マーカー・スタイルは方位ベクトルを反映するために、それに応じて回転します(この例では約34度左回り)。

図2-3 方位マーカー

図2-3の説明は図の下
「図2-3 方位マーカー」の説明

2.2.3 テキスト・スタイルのスティッキー化

テキスト・スタイルを「スティッキー」として指定すると、そのテキスト・スタイルをラベル・スタイルとして使用する地物はすべて、該当するテキスト・ラベルが常にマップに描画されます。例2-3に示すスタイルのXML定義では、sticky属性をtrueに設定しています。

例2-3 sticky属性を持つテキスト・スタイル

<?xml version="1.0" standalone="yes"?>
<svg width="1in" height="1in">
<desc></desc>
 <g class="text" sticky="true" style = "font-style:plain;font-size:11pt;font-weight:bold;fill:#000000">
    Hello World!
</g>
</svg>

2.2.4 任意のスタイルを持つサンプル画像の取得

データベースに格納されている事前定義済スタイルのサンプル画像を取得する場合は、単純なHTTPリクエストをMapViewerサーバーに発行します。このリクエストでは、サンプル画像のサイズ、背景色および返される画像の形式を指定できます。このようなリクエストは、スタイルの視覚リストをWebページに表示したり、カスタムなmap凡例を作成したり、様々なスタイルの表示様式を見たりする場合に便利です。

HTTPリクエストには次のようなパラメータがあり、styを除いてすべてオプションです。

  • sty(必須)ではスタイルの名前を指定します。

  • dsでは該当するスタイルにアクセスできるデータソースを指定します。デフォルト時は、MapViewerのデフォルトのデータソースが使用されます。

  • wでは、サンプル画像の幅(ピクセル数)を指定します。デフォルト値は20です。

  • hでは、サンプル画像の高さ(ピクセル数)を指定します。デフォルト値は20です。

  • fでは、サンプル画像の形式を指定します。指定可能な値は、png(直接PNG画像ストリーム)png_url(PNG画像のURL)、gif(直接GIF画像ストリーム)またはgif_url(GIF画像のURL)です。デフォルト値はpngです。その場合、MapViewerサーバーは、生成されたPNG画像データをサーバー・ディスクに保存することなく、ストリーミングによりクライアントに直接返します。

  • bgでは、サンプル画像の背景色を指定します。形式は、rrggbb(たとえば、グレーの場合は808080)にしてください。デフォルト値は、ffffff(白)です。

  • aaでは、サンプル画像をアンチエイリアシング・モードでレンダリングするかどうかを指定します。デフォルト値は、文字列trueです。アンチエイリアシングを使用しない場合は、文字列falseを指定します。

次の例では、グレーの背景色でデフォルト・サイズの20x20ピクセルのアンチエイリアシングされたPNG画像を生成し、MapViewerデフォルト・データソースのM.STARというマーカー・スタイルを表示しています。

http://www.mycorp.com/mapviewer/omserver?sty=m.star&bg=808080

先のリクエストでは、図2-4のような表示が生成されます。

図2-4 指定したマーカー・スタイルのサンプル画像

図2-4の説明は図の下
「図2-4 指定したマーカー・スタイルのサンプル画像」の説明

次の例では、デフォルトの白の背景色で幅が60ピクセル、高さが25ピクセルのアンチエイリアシングされたGIF画像を生成し、mvdemoというMapViewerデータソースのL.PHという線スタイルを表示しています。

http://www.mycorp.com/mapviewer/omserver?sty=l.ph&ds=mvdemo&f=gif&w=60&h=25&aa=true

先のリクエストでは、図2-5のような表示が生成されます。

図2-5 指定した線スタイルのサンプル画像

図2-5の説明は図の下
「図2-5 指定した線スタイルのサンプル画像」の説明

2.3 テーマ

テーマは、特定のデータ層のビジュアル表現です。通常、テーマは、空間ジオメトリ層、すなわち表またはビューのSDO_GEOMETRY型の列に関連付けられます。たとえば、US_STATESというテーマは、STATES表のGEOMETRYという列に関連付けられます。その他のタイプのテーマには、次のものがあります。

テーマを定義する場合、実表またはビュー、その表またはビューの空間データ列、およびスタイリング・ルールのセットを指定する必要があります。事前定義済テーマ(2.3.1項を参照)の場合、定義はデータベースに永続的に格納されます。ただし、mapリクエストで定義を指定することにより、テーマを動的に定義(すなわち、2.3.2項で説明しているJDBCテーマを作成)することもできます。

テーマがビュー内の空間層ジオメトリに関連付けられている場合、そのビューは1つ以上の表をベースにできます。ただし、該当するビューが複数の表をベースとしている(つまり、結合ビューである)場合は、USER_SDO_THEMESビューのSTYLING_RULES列の定義でkey_column属性(A.7項を参照)を指定する必要があります。次の例では、VIEW_THEMEという名前の結合ビュー内のGIDという列をkey_column属性で指定しています。

UPDATE user_sdo_themes SET styling_rules=
'<?xml version="1.0" standalone="yes"?>
<styling_rules key_column="gid">
<rule>
   <features style="L.PH"/>
   <label column="label" style="M.FLASH_SHIELD1">1</label>
</rule>
</styling_rules>' WHERE name='VIEW_THEME';

2.3.1 事前定義済テーマ

事前定義済テーマは、定義がすでにユーザーのデータベース・スキーマに格納されているテーマです。データベース・ユーザーのすべての事前定義済テーマは、そのユーザーのUSER_SDO_THEMESビュー(2.8項の特に2.8.2項を参照)に格納されています。mapリクエストで事前定義済テーマを指定する場合、指定が必要なのはテーマ名のみです。OracleAS MapViewerでは、そのテーマの定義を自動的に検索し、それに基づいて問合せを作成し、関連の空間データおよび属性データを取得して、そのテーマのスタイリング・ルールに従ってテーマをレンダリングします。

各事前定義済テーマは、実表またはビューと関連付ける必要があります。テーマをビューに基づいたものにする場合は、ビュー所有者のUSER_SDO_GEOM_METADATAビュー(『Oracle Spatialユーザーズ・ガイドおよびリファレンス』を参照)に、ビューとその空間列を指定する行を挿入する必要があります。ビューが結合ビューの場合(つまり、複数の表に基づいている場合)、テーマのスタイリング・ルールでkey_column属性(A.7項を参照)を指定する必要があります。これは、OracleAS MapViewerがデフォルトで、実表の行IDに基づき事前定義済テーマのジオメトリをキャッシュするためです。しかし、結合ビューの場合にはROWID擬似列がないため、キー列を指定する必要があります。

多くのテーマ(ただし、GeoRaster、ネットワークまたはトポロジのテーマ以外)で、グラフィカルなMap Builderツールを使用して、多様な複雑性を持つ事前定義済テーマを作成できます。Map Builderツールについては、第7章を参照してください。

2.3.1.1 事前定義済空間ジオメトリ・テーマのスタイリング・ルール

各事前定義済テーマは、1つ以上のスタイリング・ルール、すなわちテーマの表示方法を制御するXML形式の仕様に関連付けられています。この項では、事前定義済空間ジオメトリ・テーマ(例2-4で示すAirportテーマなど)のスタイリング・ルールについて説明します。画像、GeoRaster、ネットワークおよびトポロジなど、その他のタイプのテーマには、それぞれに固有のスタイリング・ルールがあり、これらについては、各テーマの項で説明します。ただし、すべてのタイプのテーマのスタイリング・ルールは、XML文書の<styling_rules>要素の下にまとめられており、この要素はUSER_SDO_THEMESビューで各事前定義済テーマのSTYLING_RULES列に格納されています。(<styling_rules> DTDについては、A.7項を参照のこと。)


注意:

この章で示す例のスタイル名の接頭辞には、次のネーミング規則を使用しています。v.は変数(拡張スタイル)、m.はマーカー、c.は色、l.は線、t.はテキストを示します。(スタイルが現行ユーザーのスキーマにない場合は、所有者のスキーマ名の後にコロンを付けて指定する必要があります。たとえば、mdsys:c.redのように指定します。)

XML文書の内容(文字データ)で、<および>を表すには、それぞれ&lt;および&gt;を使用してください。使用しない場合、WHERE CATEGORY > 'B'などにおける<または>が、XMLパーサーによりXMLタグの一部として解釈されます。


例2-4 Airportテーマに対するスタイリング・ルールのXML定義

<?xml version="1.0" standalone="yes"?>
<styling_rules>
  <rule>
    <features style="c.black gray">
    runway_number &gt; 1
    </features>
    <label column="name" style="t.airport name">
      1
    </label>
  </rule>
  <rule>
    <features style="m.airplane">
    runway_number = 1
    </features>
  </rule>
</styling_rules>

各スタイリング・ルールには、必須の<features>要素およびオプションの<label>要素があります。<features>要素では、属性値に基づいて選択される表またはビューの行(地物)と、選択された地物に使用されるスタイルが指定されます。<label>要素では、選択された地物に注釈を付けるかどうか、さらに、注釈を付ける場合はテキスト・ラベルに使用する表またはビュー内の列が指定されます。

例2-4では、Airportテーマに関連付けられた2つのスタイリング・ルールを示します。

  • 1つ目のルールでは、条件runway_number &gt; 1(つまり、1より大きい滑走路番号)を満たす行のみが選択されるように指定しており、これらの行はc.black grayというスタイルを使用してレンダリングされます。<features>要素の値として、有効なSQL WHERE句の条件を使用できます。値が指定されていない場合、WHERE句の条件は適用されません。たとえば、次のように定義されているとします(つまり、runway_number &gt; 1の条件が省略されています)。

    <?xml version="1.0" standalone="yes"?>
    <styling_rules>
      <rule>
        <features style="c.black gray"/>
        <label column="name" style="t.airport name">
          1
        </label>
      </rule>
    </styling_rules>
    
    

    この場合、すべての空港地物が選択され、c.black grayという色スタイルを使用してレンダリングされます。

    さらに、1つ目のルールに含まれる<label>要素では、表またはビュー内のNAME列を使用して各空港に注釈を付け、t.airport nameというテキスト・スタイルを使用するように指定しています。<label>要素の値には任意のSQL式を使用できます。この値を使用して、地物に注釈を付けるかどうかを決定します。値が0(ゼロ)より大きい場合、地物に注釈が付けられます。この場合、値が定数1であるため、<features>要素で指定されたすべての地物に、NAME列の値を使用して注釈が付けられます。ある地物について値が0(ゼロ)以下である場合、この地物には注釈が付けられません。

  • 2つ目のルールは、滑走路が1つのみである空港に適用されます。このルールには<label>要素がないため、このような空港にはすべて注釈が付けられません。さらに、2つ目のルールを満たす地物は、<features>要素で指定されるように、異なるスタイル(m.airplane)を使用してレンダリングされます。

2つ以上のルールが指定されている場合、ルールのSQL問合せ(1つ目から最後まで)に対しUNION ALL操作が実行され、表またはビューから必要条件を備えた地物がフェッチされます。

ルールに拡張スタイルが指定されている場合、必要条件を満たす地物をフェッチするための問合せのSELECTリストには、空間列、属性列(1つまたは複数)、地物スタイル名、ラベル情報、WHERE句および地物問合せが含まれます。属性列の値および指定した地物スタイルの定義に基づいて、各地物がスタイルに関連付けられます。

2.3.1.2 事前定義済テーマのキャッシュ

デフォルトでは、事前定義済テーマの空間データが処理のためOracleAS MapViewerレンダリング・エンジンによってデータベースからフェッチされると、OracleAS MapViewerは自動的にこのデータをキャッシュします。逆に、動的(JDBC)テーマのデータはOracleAS MapViewerではキャッシュされません。事前定義済テーマのデータをキャッシュしない場合(ベースとなる実表が常に更新されているテーマの場合など)は、そのテーマの<styling_rules>要素のcaching属性をNONEに設定できます。(caching属性を含む<styling_rules>要素については、A.7項を参照してください。)

ベース・データが統計または読取り専用で、使用頻度の高いテーマの場合、最良のパフォーマンスを得るためにcaching ALLを指定します。これにより、OracleAS MapViewerでは、テーマ定義に最初にアクセスした際に、すべての地物(関連付けられた空間データ、属性データ、およびスタイリング情報を含む)をフェッチし、それらをOracleAS MapViewerのメモリーにキャッシュして、テーマの空間データ用のメモリー内Rツリーを作成します。そのテーマを要求する後続のリクエストはすべて、データベースに送信されずに、ローカルで発生します。

caching属性値がNORMAL(デフォルト)の場合、そのテーマを必要とするマップがリクエストされるたびに、OracleAS MapViewerは空間データと関連の属性データを取得するための問合せをデータベースに対して行います。ただし、行IDまたはユーザー指定のキー列により参照される空間ジオメトリ・データがすでにキャッシュされている場合は、非Pickle化処理(RAWデータベース・ジオメトリ形式からJavaジオメトリ・オブジェクトへの変換)はスキップされます。それでも、メモリーに問題がなく、使用頻度の高いテーマを完全にキャッシュできる場合、最初のロードの後にそのテーマへのデータベース・アクセスを事実上すべて排除するためには、caching ALLを指定する必要があります。

OracleAS MapViewer空間データ・キャッシュはグローバルであるため、OracleAS MapViewerがアクセスするすべての事前定義済テーマは、グローバルな固定サイズのメモリー・キャッシュを得るため競合します。キャッシュは完全にメモリー内にあり、キャッシュの最大サイズは、1.5.2.6項での説明のとおりに指定できます。キャッシュの上限に達すると、直前にアクセスされたデータ用に、キャッシュ・データが古い順にキャッシュから削除されます。ただし、caching ALLで指定したテーマのデータはキャッシュから削除されず、OracleAS MapViewerがこれらのテーマをデータベースに再び問い合せることはありません。

2.3.2 JDBCテーマ

JDBCテーマは、mapリクエストによって動的に定義されるテーマです。JDBCテーマは、事前定義済テーマのように、データベースに永続的には格納されません。

JDBCテーマの場合、必須の空間データ(ジオメトリ、または画像、GeoRaster、ネットワーク、トポロジなどのその他のタイプのデータ)をすべて取得する有効なSQL問合せを指定する必要があります。テーマ・マッピングや空間データ分析など、属性データが必要な場合は、問合せでもそれを選択する必要があります。つまり、JDBCテーマに対する正しく完全な問合せを指定することが必要です。問合せの他に、そのテーマに使用するレンダリングおよびラベリングのスタイルも指定できます。

空間ジオメトリに基づいたJDBCテーマの場合、OracleAS MapViewerでは次のルールに従い、問合せで指定された列を処理します。

  • SDO_GEOMETRY型の列は、空間データ列として扱われます。

  • 名前または別名がJDBCテーマのlabel_column属性で指定されたものと一致する列は、ラベリング列として扱われ、その値はラベルのテキストとして使用されます。

  • その他の列は属性データ列として扱われ、OracleAS MapViewerにより使用される場合も、使用されない場合もあります。たとえば、レンダリング・スタイルが拡張スタイルの場合、すべての属性列は問合せのSELECTリストに指定された順序で、そのスタイルによって処理されます。したがって、テーマ・マッピングを実行し、拡張スタイルを使用している場合は、ジオメトリ列とオプションのラベリング列の他に、テーマ・マッピングに必要なすべての属性列を指定する必要があります。(ラベリング列が属性列である場合もあり、その場合はSELECTリストでその列を指定する必要はありません。)

例2-5は、JDBCテーマが含まれるmapリクエストです。

例2-5 mapリクエストのJDBCテーマ

<?xml version="1.0" standalone="yes"?>
<map_request title="My MAP" datasource = "mvdemo">

  <themes>
    <theme name="jdbc_theme_1">
       <jdbc_query
            datasource="mvdemo"
            jdbc_srid="41052"
            spatial_column="geometry"
            render_style="C.RED">
          SELECT geometry from states where name='MA'
       </jdbc_query>
     </theme>
  </themes>

</map_request>

例2-5でJDBCテーマについてOracleAS MapViewerが実行する全問合せは、次のとおりです。

SELECT geometry FROM states WHERE name='MA';

このリクエストでは、OracleAS MapViewerは、このJDBCテーマの問合せの実行結果として、選択されたジオメトリのみが含まれるマップを生成します。ただし、より一般的な場合では、mapリクエストで複数のJDBCテーマを使用してベース・マップの上に追加の動的データを表示する必要があります。さらに、mapリクエストには問合せウィンドウが関連付けられている場合があります。つまり、ユーザーはベース・マップ全体に含まれる領域の一部のみを参照できます。この場合、JDBCテーマのSQL問合せでは、不必要な結果を排除するために空間ウィンドウの問合せが行われます。

JDBCテーマの詳細は、3.2.9項<jdbc_query>要素を参照してください。

2.3.2.1 複雑なJDBCテーマのデータベースへの格納

場合によっては、JDBCテーマのSQL問合せは非常に複雑であり、問合せを保存する必要があります。この場合、事前定義済テーマを定義してから(この定義は、データベースのUSER_SDO_THEMESビューに格納されます)、そのテーマのスタイリング・ルールに<features>要素の内容としてSQL全問合せを含めることができます。

<features>要素で指定された地物スタイルは、全問合せを使用して取得されたジオメトリのレンダリングに使用されます。すでにSQL全問合せにFROM句が含まれているため、こうしたテーマに対して定義された実表は無視されます。それでもUSER_SDO_THEMESビューで定義されたジオメトリ列は必要であり、ユーザー指定のSQL問合せで選択されたジオメトリ列と同じである必要があります。スタイリング・ルールに<label>要素がある場合、ラベル・テキストが含まれる列が問合せで選択されているかぎり、指定されたラベル・スタイルがジオメトリのラベル付けに使用されます。

例2-6は、複雑なSQL問合せを含む、事前定義済テーマの<styling_rules>要素の例です。

例2-6 事前定義済テーマの複雑な問合せ

<?xml version="1.0" standalone="yes"?>
 <styling_rules>
   <rule>
     <features style="L.POOR_ROADS" asis="true">
        select sdo_lrs.clip_geom_segment(geometry,start_measure,end_measure)
              geometry
        from (select /*+ no_merge use_hash(a b) */
                a.street_id, name, start_measure, end_measure, geometry
             from (select /*+ no_merge */ a.street_id, name, geometry
                   from philly_roads a
                   where sdo_filter(geometry,sdo_geometry(2002,41124,null,
                    sdo_elem_info_array(1,2,1),
                                       sdo_ordinate_array(?,?,?,?)),
                                 'querytype=window')='TRUE') a,
                   philly_road_conditions b
             where condition='POOR' and a.street_id = b.street_id)
     </features>
   </rule>
 </styling_rules>

例2-6が事前定義済テーマとして定義されている場合でも、ユーザーがこのテーマを含むマップをリクエストした場合、実行時にはOracleAS MapViewerによりJDBCテーマとして処理されます。OracleAS MapViewerでは、通常のJDBCテーマと同様に、デフォルトでSQL問合せにウィンドウ・フィルタ処理(問合せウィンドウがmapリクエストに含まれる場合)が課せられます。このデフォルトの動作を無視して指定した問合せ文字列が変更なしで実行されるようにするには、例2-6に示すように、<features>要素にasis="true"と指定します。(asis属性の詳細は、3.2.9項を参照してください。)

2.3.3 テーマ・マッピング

テーマ・マッピングは、属性値に基づいた空間地物の描画を意味します。OracleAS MapViewerでは、テーマ・マッピングにより、地物の属性を示すために色または記号が地物に適用されたマップが作成されます。たとえば、Countiesテーマは、各郡の人口密度に直接マップされる様々な色相の色を使用して描画できます。また、Earthquakesテーマは塗りつぶした円によって表示でき、円のサイズは各地震の規模または被害にマップされます。

テーマ・マッピングを実行するには、まずテーマ・マップのタイプに適した拡張スタイルを作成し、次にレンダリング・スタイルとして拡張スタイルを指定して、地物のテーマを作成する必要があります。テーマのスタイリング・ルールでは、表またはビューで属性列も指定する必要があります。この値は、拡張スタイルにより地物をテーマ別にレンダリングする方法を厳密に決定するために使用されます。

たとえば、各地域に使用されている色が、ある製品の売上高のレベルを反映するマップを表示するとします。このためには、個々の範囲ベースの一連のバケットを定義する拡張スタイルを作成します(A.6.1.2項を参照)。各バケットには製品売上高の値の事前定義済範囲が含まれており、バケットはレンダリング・スタイルに関連付けられています。(各地域は、売上高の値が含まれている範囲に関連付けられたスタイルを使用してレンダリングされます。)また、範囲に対してチェックされる属性値を示す列の名前も指定します。つまり、拡張スタイルは売上高の値に基づいて地域をマップする方法を定義し、テーマのスタイリング・ルールは拡張スタイルと実際の売上高の値を含む属性列を関連付けます。

図2-6は、拡張スタイルとテーマとの関係と、スタイルおよびテーマが実表とどのように関連しているかを示しています。この図では、V.SALESという拡張スタイルによって一連のバケットが定義されています。SALES_BY_REGIONという事前定義済テーマでは、そのスタイリング・ルール内でスタイルV.SALESを指定しています。また、このテーマでは、REGIONS表のSALES列を、値がスタイル内のバケット範囲と比較される列として識別します。(各バケットは、2.2.1項で説明しているように、レンダリング・スタイルに加えて、あるいはそのかわりに、ラベリング・スタイルと関連付けることができます。)

図2-6 テーマ・マッピング: 拡張スタイルとテーマの関係

図2-6の説明は図の下
「図2-6 テーマ・マッピング: 拡張スタイルとテーマの関係」の説明

OracleAS MapViewerでは、図2-6で示した個々の範囲ベースのバケットに加えて、A.6.1項で説明しているその他のバケット・スタイルもサポートします。円グラフを描く場合など、テーマ・マッピングに複数の属性列を使用することもできます(3.1.9項を参照)。

この項の後半では、テーマ・マッピングのその他の例を示します。

例2-7は、EarthquakesテーマのXML定義です。

例2-7 Earthquakesテーマに対するスタイリング・ルールのXML定義

<?xml version="1.0" standalone="yes"?>
<styling_rules theme_type="nature">
  <rule column="RICHTER_SCALE">
    <features style="v.earthquakes">
    </features>
  </rule>
</styling_rules>

例2-7のテーマには、ルールが1つのみ含まれます。<rule>要素には、例2-4Airportテーマにはないcolumnという属性が含まれます。column属性では、テーマ・マッピングに必要な属性値を指定する1つ以上の列(カンマ区切り)が指定されます。<features>要素に指定されたスタイルは、v.earthquakesという拡張スタイルです。

Earthquakesテーマの定義のもう1つの部分では、レンダリングされるデータが含まれる表が指定されます。この表には、空間データの(SDO_GEOMETRY型の)列に加えて、RICHTER_SCALEという列も含める必要があります。(該当する表とSDO_GEOMETRY型の列はそれぞれ、USER_SDO_THEMESビューのBASE_TABLE列およびGEOMETRY_COLUMN列で指定する必要があります。USER_SDO_THEMESビューについては、2.8.2項を参照してください。)RICHTER_SCALE列はNUMBER型である必要があります。その理由については、例2-8の拡張スタイル定義を参照してください。

例2-8 Earthquakesテーマの拡張スタイル定義

<?xml version="1.0" ?>
<AdvancedStyle>
  <VariableMarkerStyle basemarker="m.circle" startsize="7" increment="4">
     <Buckets>
          <RangedBucket seq="0"  label="less than 4"  high="4"/>
          <RangedBucket seq="1"  label="4 - 5" low="4" high="5"/>
          <RangedBucket seq="2"  label="5 - 6" low="5" high="6"/>
          <RangedBucket seq="3"  label="6 - 7" low="6" high="7"/>
          <RangedBucket seq="4"  label="7 and up" low="7"/>
      </Buckets>
  </VariableMarkerStyle>
</AdvancedStyle>

このスタイルでは、m.circleというマーカーを使用して地震の場所を示すように指定されています。地震についてレンダリングされるマーカーのサイズは、その行のRICHTER_SCALE列の数値によって左右されます。この例では5つのバケットがあり、それぞれが事前に決定された値の範囲に相当します。たとえば、地震がリヒター・スケールでマグニチュード5.7である場合、マーカー・サイズは15ピクセル(7 + 4 + 4)となります。これは、5.7という値が3つ目のバケット(5 - 6)に分類され、開始マーカー・サイズが7ピクセル(startsize="7")であり、各範囲の増分が4(increment="4")であるためです。


注意:

label 属性値(label="less than 4"など)はマップに表示されず、拡張スタイル用にコンパイルされたラベルにのみ使用されます。

seq 属性値(seq="0"など)はMapViewerにより無視されます。OracleAS MapViewerでは、定義内の要素の順序によってのみ順序が決まります。


例2-8では、<VariableMarkerStyle>タグが使用されています。次の例では、カリフォルニアにおける国勢調査区画のテーマ・マッピングの作成で、<ColorSchemeStyle>タグが使用されています。例2-9では、人口密度のテーマ・マッピングに目盛付きカラー・スケールが使用されています。例2-10は、目盛付きカラー・スケールを使用した平均世帯収入のテーマ・マッピングです。例2-11も平均世帯収入のテーマ・マッピングですが、各収入範囲に、目盛付きスケールではなく固有の色スタイルが使用されています。

例2-9 目盛付きカラー・スキームを使用した人口密度のマッピング

# ca pop density usbg_hhinfo
<?xml version="1.0" standalone="yes"?>
<styling_rules theme_type="political">
<rule column="densitycy">
   <features style="v.CA Pop density">
   </features>
 </rule>
</styling_rules>

USBG_HHINFOという表には、DENSITYCYという列(例2-9で使用)が含まれています。この人口密度テーマに対応するスタイル(v.CA Pop density)の定義は、次のとおりです。

<?xml version="1.0" ?>
<AdvancedStyle>
  <ColorSchemeStyle basecolor="#ffff00" strokecolor="#00aaaa">
     <Buckets low="0.0" high="20000.0" nbuckets="10"/>
  </ColorSchemeStyle>
</AdvancedStyle>

基本色(basecolor)およびストロークの色(strokecolor)は、16進法を使用して指定された24ビットRGB(赤-緑-青)値です。基本色の値は、1つ目のバケットに使用されます。後続の各バケットの色値は、最初に基本色をRGBからHSB(色相-彩度-輝度)モデルに変換してから、輝度を各バケットの固定増分ずつ下げることで取得されます。したがって、1つ目のバケットの輝度が最も高くなり、最後のバケットの輝度が最も低くなります。

例2-9の場合のように、例2-10では基本色および目盛付きカラー・スキームを使用していますが、今回は世帯収入を示すことが目的です。

例2-10 目盛付きカラー・スキームを使用した平均世帯収入のマッピング

<?xml version="1.0" standalone="yes"?>
<!-- # ca hh income theme  table = usbg_hhinfo  -->
<styling_rules>
<rule column="avghhicy">
   <features style="v.ca income">
   </features>
 </rule>
</styling_rules>

USBG_HHINFOという表には、AVGHHICYという列(例2-10および例2-11で使用)が含まれています。この平均世帯収入テーマに対応するスタイル(v.ca income)の定義は、次のとおりです。

<?xml version="1.0" ?>
<AdvancedStyle>
  <ColorSchemeStyle basecolor="#ffff00" strokecolor="#00aaaa">
  <!-- # income range with a color gradient -->
     <Buckets>
          <RangedBucket seq="0" label="less than 10k"  high="10000"/>
          <RangedBucket seq="1" label="10-15k" low="10000" high="15000"/>
          <RangedBucket seq="2" label="15-20k" low="15000" high="20000"/>
          <RangedBucket seq="3" label="20-25k" low="20000" high="25000"/>
          <RangedBucket seq="4" label="25-35k" low="25000" high="35000"/>
          <RangedBucket seq="5" label="35-50k" low="35000" high="50000"/>
          <RangedBucket seq="6" label="50-75k" low="50000" high="75000"/>
          <RangedBucket seq="7" label="75-100k" low="75000" high="100000"/>
          <RangedBucket seq="8" label="100-125k" low="100000" high="125000"/>
          <RangedBucket seq="9" label="125-150k" low="125000" high="150000"/>
          <RangedBucket seq="10" label="150-250k" low="150000" high="250000"/>
          <RangedBucket seq="11" label="250-500k" low="250000" high="500000"/>
          <RangedBucket seq="12" label="500k and up"   low="500000"/>
      </Buckets>
  </ColorSchemeStyle>
</AdvancedStyle>

個々の範囲ベースのバケットでは、下限値は含まれますが上限値は含まれません(ただし、他の範囲の値より大きい値が含まれる範囲では、上限値は含まれます)。いずれの範囲にも、他の範囲の値と重複する値の範囲を含めることはできません。

例2-11では、各平均世帯収入範囲に固有の色スタイルが使用されています。

例2-11 各収入範囲の色を使用した平均世帯収入のマッピング

<?xml version="1.0" standalone="yes"?>
<!-- # ca hh income theme  table = usbg_hhinfo  -->
<styling_rules>
<rule column="avghhicy">
   <features style="v.ca income 2">
   </features>
 </rule>
</styling_rules>

v.ca income 2スタイルの定義は、次のとおりです。

<?xml version="1.0" ?>
<AdvancedStyle>
 <BucketStyle>
  <Buckets>
   <!-- # income ranges with specific colors -->
   <RangedBucket seq="0" label="less than 10k"  high="10000" style="c.rb13_1"/>
   <RangedBucket seq="1" label="10-15k" low="10000" high="15000" style="c.rb13_2"/>
   <RangedBucket seq="2" label="15-20k" low="15000" high="20000" style="c.rb13_3"/>
   <RangedBucket seq="3" label="20-25k" low="20000" high="25000" style="c.rb13_4"/>
   <RangedBucket seq="4" label="25-35k" low="25000" high="35000" style="c.rb13_5"/>
   <RangedBucket seq="5" label="35-50k" low="35000" high="50000" style="c.rb13_6"/>
   <RangedBucket seq="6" label="50-75k" low="50000" high="75000" style="c.rb13_7"/>
   <RangedBucket seq="7" label="75-100k" low="75000" high="100000" style="c.rb13_8"/>
   <RangedBucket seq="8" label="100-125k" low="100000" high="125000" style="c.rb13_9"/>
   <RangedBucket seq="9" label="125-150k" low="125000" high="150000" style="c.rb13_10"/>
   <RangedBucket seq="10" label="150-250k" low="150000" high="250000" style="c.rb13_11"/>
   <RangedBucket seq="11" label="250-350k" low="250000" high="350000" style="c.rb13_12"/>
   <RangedBucket seq="12" label="350k and up"   low="350000" style="c.rb13_13"/>
  </Buckets>
 </BucketStyle>
</AdvancedStyle>

<RangedBucket>の各定義には、スタイルが指定されています。

次の各例では、様々な石油会社が経営するガソリン・スタンドを識別するための拡張スタイルと、このスタイルを使用したテーマを作成しています。<CollectionBucket>タグを使用して、例2-12に示すように、列値(ShellEssoTexacoBP、およびAviaBenzinexQ8TotalWitte Pompのいずれかと、その他すべてのデフォルト・カテゴリ)をその会社のガソリン・スタンドに適したスタイルに関連付けます。

例2-12 Gasoline Stationsテーマの拡張スタイル定義

<?xml version="1.0" ?>
<AdvancedStyle>
<BucketStyle>
 <Buckets>
  <CollectionBucket seq="0" label="Shell" style="m.shell gasstation">
   Shell
  </CollectionBucket>
  <CollectionBucket seq="1" label="Esso" style="m.esso gasstation">
   Esso
  </CollectionBucket>
  <CollectionBucket seq="2" label="Texaco"  style="m.texaco gasstation">
   Texaco
 </CollectionBucket>
  <CollectionBucket seq="3" label="BP"  style="m.bp gasstation">
   BP
  </CollectionBucket>
  <CollectionBucket seq="4" label="Other"  style="m.generic gasstation">
   Avia,Benzinex,Q8,Total,Witte Pomp
  </CollectionBucket>
  <CollectionBucket seq="5" label="DEFAULT" style="m.default gasstation">
   #DEFAULT#
  </CollectionBucket>
  </Buckets>
</BucketStyle>
</AdvancedStyle>

例2-12に関する注意は、次のとおりです。

  • m.esso gasstationm.texaco gasstationおよびその他のスタイル名は、名前の単語間にスペースがあります。

  • これらの名前は大/小文字が区別されません。したがって、名前を区別する手段として大/小文字を使用しないでください。たとえば、m.esso gasstationM.ESSO GASSTATIONは同じ名前とみなされます。

  • デフォルト・コレクション・バケットは、バケットの値として#DEFAULT#を使用することで指定できます。このバケットは、他のバケットで指定されていない列値(ガソリン・スタンド名)に使用します。

次に、会社名が含まれる表内の列(MERK)を指定するテーマ(theme_gasstation)が定義されます。例2-13では、このテーマのスタイリング・ルールを示します。

例2-13 Gasoline Stationsのテーマ定義のスタイリング・ルール

<?xml version="1.0" standalone="yes"?>
<styling_rules>
  <rule column="merk">
    <features style="v.gasstations">
    </features>
    <label column="merk" style="t.SansSerif red 10">
      1
    </label>
  </rule>
</styling_rules>

このテーマは、表2-2に示す列が含まれるNED_GASSTATIONS表に依存しています(開発者の言語がオランダ語であることを反映した列名となっています)。

表2-2 Gasoline Stationsテーマで使用される表

データ型

FID

NOT NULL NUMBER

ID

NUMBER

NAAM

VARCHAR2(31)

STRAAT_

VARCHAR2(30)

NR

NUMBER

TV

VARCHAR2(1)

AAND

VARCHAR2(2)

PCODE

VARCHAR2(6)

PLAATS

VARCHAR2(10)

GEOM

SDO_GEOMETRY

MERK

VARCHAR2(40)


この表では、GEOM列には空間ジオメトリが含まれ、MERK列には会社名(ShellEssoなど)が含まれます。

theme_gasstationテーマのスタイリング・ルールでは、GEOM列の内容により指定された場所のマーカー(v.gasstationsスタイル)が、その行のMERK列の値によって決定されるように指定しています。スタイルv.gasstations例2-12を参照)では、列値がShellの場合はスタイルm.shell gasstationを使用し、列値がEssoの場合はスタイルm.esso gasstationを使用する、などのように指定しています。また、列値がAviaBenzinexQ8TotalおよびWitte Pompのいずれかの場合はスタイルm.generic gasstationを使用し、列値が前述のいずれでもない場合はスタイルm.default gasstationを使用するように指定しています。

2.3.3.1 外部属性データを使用したテーマ・マッピング

先に説明したテーマ・マッピングでは、属性データ(総売上高の母集団など)も地理空間データ(境界線や位置などを表すジオメトリ・オブジェクト)も同じデータベース内にあることが前提でした。ただし、属性データは、現在のデータベースの外部にあるソースから得られる場合もあります。たとえば、属性データは、別のデータベース上で実行されるビジネス・インテリジェンス(BI)問合せの集約結果が反映される場合もありますし、スプレッドシートからエクスポートされた売上高値のカンマ区切りリストから得られる場合もあります。そのような属性データ、つまり地理空間データが含まれるデータベースの外部から得られる属性データは、外部属性データと呼ばれています。

MapViewerで外部属性データを使用するには、非空間データ・プロバイダ・プラグイン・メカニズムを使用する必要があります。その場合は、カスタムなデータ・プロバイダが、同一のmapリクエスト内でMapViewerテーマ(事前定義済または動的)と関連付けられます。MapViewerは、該当するテーマを処理する際、非空間データ・プロバイダをコールし、該当するテーマのためにフェッチされている空間データと非空間属性データを結合します。

非空間データ・プロバイダを使用するには、次の手順を実行します。

  1. MapViewerの定義済インタフェースoracle.mapviewer.share.ext.NSDataProviderを実装することにより、Java非空間データ・プロバイダを実装します。

  2. (構成ファイル内で)非空間データ・プロバイダの実装をMapViewerに登録します。その場合、実装で依存する可能性がある一連のグローバル・パラメータを指定することもできます。ただし、カスタム・データ・プロバイダの各実装クラスには、一意なIDを割り当てる必要があります。

  3. 非空間データ・プロバイダの実装クラスが含まれるライブラリを、MapViewerのライブラリ・パス(MapViewerのweb/WEB-INF/libディレクトリなど)に入れます。

  4. 次のメソッドをMapViewer JavaクライアントAPIクラスMapViewer上で起動し、非空間データ・プロバイダの実装をmapリクエストに含めます。

    addNSDataProvider(java.lang.String providerId,
                      java.lang.String forTheme,
                      java.lang.String spatialKeyColumn,
                      java.lang.String customRenderingStyle,
                      java.util.Properties params,
                      long timeout)
    
    

    addNSDataProviderのパラメータについては、http://host:port/mapviewer/mapclientという形式のURLで利用可能なJavadoc参照情報でMapViewerを参照してください。hostおよびportは、OC4JまたはOracle Application Serverが着信リクエストをリスニングする場所です。たとえば、http://www.mycorp.com:8888/mapviewer/mapclientがそれに該当します。

例2-14は、単純な非空間データ・プロバイダの実装を示しています。この実装は、デフォルトの非空間データ・プロバイダとしてMapViewerにも提供されます。

例2-14 非空間(外部)データ・プロバイダの実装

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Properties;
import java.util.Vector;

import oracle.mapviewer.share.ext.NSDataSet;
import oracle.mapviewer.share.ext.NSDataProvider;
import oracle.mapviewer.share.ext.NSRow;
import oracle.lbs.util.Logger;

import oracle.mapviewer.share.Field;

/**
 * A simple implementation of the NSDataProvider interface. When invoked, it supplies tabular attribute data to MapViewer out
 * of a file or URL. The data in the file must be orgazined as following: <br>
 * <UL>
 *   <LI> The first line contain a single character which is the delimiter
 *        between columns in the subsequent lines.
 *   <LI> Each line after the first in the file represent one data row
 *   <LI> Each field in the row must be separated by the delimiter char only
 *   <LI> The first field in each line must be a string (key) that serves as the
 *         key; the rest of the fields must be numeric values
 * </UL>
 *
 * When incorporating this data provider in a map request, one of the following
 * two parameters must be specified:
 * <UL>
 *   <LI> file  if the custom data is stored in a local file; this parameter
 *        specifies the full path to that file
 *   <LI> url  if the custom data can be accessed from a web; this parameter
 *        specifeis the full URL to the data file.
 * </UL>
 *
 *
 */
public class NSDataProviderDefault implements NSDataProvider
{
  private static Logger log = Logger.getLogger("oracle.sdovis.nsdpDefault");

  public boolean init(Properties params)
  {
    return true;
  }

  public NSDataSet buildDataSet(Properties params)
  {
    String file = params.getProperty("file");
    if(file!=null)
      return readFromFile(file);

    String url = params.getProperty("url");
    if(url!=null)
      return readFromUrl(url);

    log.error("Must supply either file or url for default NS data provider.");
    return null;
  }

  public void destroy()
  {
  }

  protected NSDataSet readFromFile(String file)
  {
    BufferedReader in = null;
    try{
      in   = new BufferedReader(new FileReader(file));
      String line = in.readLine();
      String delimiter = line.substring(0,1);

      Vector rows = new Vector();

      while ( (line=in.readLine()) != null)
      {
        NSRow row = buildRow(line, delimiter);
        if(row!=null)
          rows.add(row);
      }

      NSDataSet res = new NSDataSet(rows);
      return res;
    }catch(Exception ex)
    {
      log.error(ex);
      return null;
    } finally
    {
      try{
        if(in!=null)
          in.close();
      }catch(Exception e){}
    }
  }

  protected NSDataSet readFromUrl(String url)
  {
    log.error("url not supported yet.");
    return null;
  }

  protected NSRow buildRow(String line, String delimiter)
  {
    if(line==null || line.length()<1)
      return null;

    String[] fields = line.split(delimiter);
    if(fields==null || fields.length==0)
      return null;

    Field[] row = new Field[fields.length];

    Field a = new Field(fields[0]);
    a.setKey(true);

    row[0] = a;

    for (int i = 1; i < fields.length; i++)
    {
      try{
        double d = Double.parseDouble(fields[i]);
        a = new Field(d);
        row[i] = a;
      }catch(Exception e)
      {
        log.warn("invalid row field (key="+fields[0]+")");
        return null;
      }
    }

    return new NSRow(row);

  }
}

2.3.4 テーマの外観に影響を与える属性

<theme>要素の一部の属性は、テーマに関連付けられるデータを決定するかわりに、マップ表示の外観にのみ影響を与えます。これらの外観関連の属性は、マップの生成時にテーマの処理およびレンダリングを行うかどうか、またその方法を制御します。例には次の属性が含まれています。

  • min_scaleおよびmax_scaleは、テーマを様々なマップ・スケール(解像度のレベル)で表示するかどうかを決定します。たとえば街路のマップを表示する場合、州全体を表示するときなど、街路の表示が密集しすぎるため使用しづらいマップ・スケールがあります。この場合は街路用のテーマを作成し、適切なスケールの場合はテーマの影響を受ける個々の街路が表示され、適切でない場合は表示されないように、最小および最大のスケール値を指定します。

  • labels_always_onは、テーマのラベルが別のラベルと重なる場合に表示するかどうかを決定します。適切なlabels_always_on値を選択し、mapリクエスト内で処理されるテーマの適切な順序を選択することで、ラベルの重複の度合いと、どのラベルを優先的に表示するかを制御できます。

  • fast_unpickleは、使用する非Pickle化(アンストリーム)の方法を決定します。表示のパフォーマンスと精度のどちらを優先するかの選択となる場合があります。

  • fixed_svglabelvisible_in_svgselectable_in_svgonclickonmousemoveonmouseoverおよびonmouseoutは、SVGマップの外観に影響を与えます。

外観関連の属性を指定するには、<theme>要素(3.2.15項を参照)をXML APIまたはJavaBeanベースのAPI(特に4.3項を参照)で使用します。

2.3.5 イメージ・テーマ

イメージ・テーマは、遠隔操作および航空写真術などによる、地理的参照画像(ラスター)データを視覚化するのに便利な、特殊なOracleAS MapViewerテーマです。

イメージ・テーマは、動的に、あるいはデータベースで(事前定義済テーマとして)永続的に定義できます。イメージ・テーマは、マップ内でベクトル(非画像)・テーマとともに使用できます。図2-7は、イメージ・テーマ(ボストン市の一部の航空写真を示したもの)に、ボストン市内の様々な種類の道路を示すテーマを重ねたマップを示しています。

図2-7 イメージ・テーマおよびボストンの道路を示すその他のテーマ

図2-7の説明は図の下
「図2-7 イメージ・テーマおよびボストンの道路を示すその他のテーマ」の説明

イメージ・テーマを定義する前に、次のルールに従って画像データを編成する必要があります。

  • 画像データを、データベース表内のBLOB列に元の形式(JPEGなど)で格納するか、元の画像ファイルを指すOracle interMediaオブジェクト(ORDSYS.ORDImage)として格納します。ORDSYS.ORDImageオブジェクトの作成については、『Oracle interMediaユーザーズ・ガイド』を参照してください。

  • ジオメトリ(SDO_GEOMETRY)列を同じ表に追加し、各画像の最小外接矩形(MBR)をその列に格納します。

    MBR列の各ジオメトリには、ピクセル領域で表したサイズではなく、画像の地理的範囲を含めます。たとえば、正射写真画像のサイズが2000×2000ピクセルでも、(936000, 248000)の角を始点とした、幅と高さが8000mの土地矩形をその範囲とする場合、ジオメトリ列のMBRには(936000, 248000, 944000, 256000)と移入する必要があります。

  • ジオメトリ列のエントリをUSER_SDO_GEOM_METADATAビューに挿入します。

  • ジオメトリ列に対して空間索引を作成します。

イメージ・テーマを事前定義するには、2.3.5.1項のガイドラインに従います。mapリクエストで動的なイメージ・テーマを定義するには、2.3.2項および3.2.9項で説明しているJDBCテーマの定義に関するガイドラインに従いますが、動的なイメージ・テーマに関する次の追加の考慮事項に注意してください。

  • イメージ・テーマを定義する場合、元の画像解像度情報を指定する必要があります。

  • デフォルトでは、イメージ・テーマを使用したマップを生成する場合、OracleAS MapViewerによって画像データが自動的にスケール変更されるため、現在の問合せウィンドウに適合します。この自動スケール変更を無効にするには、mapリクエストでimagescaling="false"と指定します。

イメージ・テーマの定義についてOracleAS MapViewerでは、GIF、JPEG、PNGおよびTIFFの画像形式しかサポートしていません。OracleAS MapViewerで他の画像形式のデータを視覚化するには、Javaのoracle.sdovis.CustomImageRendererインタフェースを使用してカスタム・イメージ・レンダラを実装した後、実装クラスをmapViewerConfig.xmlファイルに登録し、特殊な形式の画像データに使用するカスタム・イメージ・レンダラをOracleAS MapViewerに通知する必要があります。カスタム・イメージ・レンダラの実装および登録の詳細は、付録Cを参照してください。

イメージ・テーマを指定したmapリクエストの例と、OracleAS MapViewerによるリクエストの処理方法の説明は、3.1.6項例3-6を参照してください。

2.3.5.1 事前定義済イメージ・テーマの作成

事前定義済イメージ・テーマを作成するには、USER_SDO_THEMESビュー(2.8.2項を参照)に行を挿入することにより、イメージ・テーマの定義をデータベースに格納する必要があります。例2-15では、イメージ・テーマの定義を格納します。

例2-15 事前定義済イメージ・テーマの作成

INSERT INTO user_sdo_themes  VALUES (
   'IMAGE_LEVEL_2',
   'Orthophotos at pyramid level 2',
   'IMAGES',
   'IMAGE_MBR',
   '<?xml version="1.0" standalone="yes"?>
    <styling_rules theme_type="image" image_column="image"
                   image_format="JPEG" image_resolution="2"
                   image_unit="M">
      <rule >
        <features style="C.RED"> plevel=2 </features>
      </rule>
    </styling_rules>' );

例2-15では、IMAGE_LEVEL_2という名前のイメージ・テーマを作成しています。実表(すべての画像データおよび関連するMBRが格納される表)はIMAGESで、画像の最小外接矩形(MBR)はIMAGE_MBR列に格納されます。USER_SDO_THEMESビューのSTYLING_RULES列には、1つの<styling_rules>要素を含むXML文書が挿入されます。

イメージ・テーマの<styling_rules>要素には、次の属性があります。

  • このテーマがイメージ・テーマとして認識されるためには、theme_typeimageにする必要があります。

  • image_columnは、実際の画像データが格納される実表またはビューの列を指定します。

  • image_formatは、画像データの形式を識別する文字列です。GIFまたはJPEGと指定した場合、OracleAS MapViewerでは常に画像データをレンダリングできます。他の値(ECWなど)を指定した場合は、画像を正しくレンダリングするために、カスタム・イメージ・レンダラを実装してOracleAS MapViewerに登録している必要があります。カスタム・イメージ・レンダラの実装の詳細は、付録Cを参照してください。

  • image_resolutionは、元の画像解像度(ピクセル当たりのimage_unit単位の数)を識別するオプション属性です。

  • image_unitはオプション属性です。ただし、image_resolution属性を指定した場合は必須です。image_unit属性は、メートルに対するMのように、解像度の単位を指定します。この属性の値は、MDSYS.SDO_DIST_UNITS表のSDO_UNIT列に含まれている値のいずれかである必要があります。例2-15では、画像の解像度はピクセル当たり2mです。

<styling_rules>要素のDTDについては、A.7項を参照してください。

2.3.6 GeoRasterテーマ

GeoRasterテーマは、GeoRasterオブジェクトを視覚化するのに便利な、特殊なOracleAS MapViewerテーマです。GeoRasterはOracle Spatialの機能で、ラスター画像およびグリッド・データとその関連メタデータの格納、索引付け、問合せ、分析および配信を行います。GeoRasterオブジェクトは、SDO_GEORASTERデータ型を使用して定義します。GeoRasterの詳細は、『Oracle Spatial GeoRaster』を参照してください。

OracleAS MapViewerでGeoRasterテーマを使用する前に、Java Advanced Imaging(JAI)ライブラリ・ファイル(jai_core.jarおよびjai_codec.jar)がOracleAS MapViewerライブラリ・パスにあることを確認します(1.4項を参照)。GeoRasterデータで次のアクションを実行する必要もあります。

  1. GeoRasterデータのセル座標と現実の地上座標(またはその他のローカル座標)を関連付けるために、GeoRasterデータを地理参照します。

    Oracle Database 10gリリース1(10.1)を使用している場合は、空間解像度の値も設定する必要があります。

  2. ラスター・データと関連付けられた空間エクステント(フットプリント)を生成または定義します。

  3. オプションで、ラスター画像またはデータを異なるサイズと異なる解像度で表す、ピラミッド・レベルを生成します。

  4. USER_SDO_GEOM_METADATAビューに、GeoRaster表の名前とGeoRaster列(つまり、SDO_GEORASTER型の列)のSPATIALEXTENT属性を指定する行を挿入します。次の例では、GEOR_COLUMNというGeoRaster列のあるGEOR_TABLEという表を指定する行を挿入しています。

    INSERT INTO USER_SDO_GEOM_METADATA VALUES
    ( 'geor_table',
      'geor_column.spatialextent',
      SDO_DIM_ARRAY(
        SDO_DIM_ELEMENT('X', 496602.844, 695562.844, 0.000005),
        SDO_DIM_ELEMENT('Y',8788409.499,8973749.499, 0.000005)
      ),
      82279   -- SRID
    );
    
    
  5. GeoRaster表の空間エクステントに空間索引を作成します。次の例では、GEOR_TABLEという表の空間エクステントにGEOR_IDXという空間索引を作成しています。

    CREATE INDEX geor_idx ON geor_table(geor_column.spatialextent)
      INDEXTYPE IS MDSYS.SPATIAL_INDEX;
    
    

2.3.6.1項例2-19では、使用するGeoRasterデータを準備し、GeoRasterテーマをデータベースに格納します。

OracleAS MapViewerでは、GeoRaster表のオブジェクトに関する2種類のmapリクエストをサポートします。

  • 1つ以上のGeoRasterオブジェクトを選択するためのSQL文を含むリクエスト

  • ラスター・データ表名とSDO_GEORASTERオブジェクト内のrasterID属性値との組合せにより1つのGeoRasterオブジェクトを指定するリクエスト(SDO_GEORASTERオブジェクト内のrasterID属性値は、GeoRaster表のどの主キー列またはID列とも異なり、関係ありません。)

次の要素と属性は、GeoRasterテーマの定義に適用されます。

  • <jdbc_georaster_query>要素: 動的に定義されるGeoRasterテーマであることを指定します。1つ以上のGeoRasterオブジェクトを選択するためにSQL文を使用するテーマの場合、この要素にはSQL問合せ文(終了セミコロンなし)が含まれます。この要素の完全なDTDは、3.2項のmapリクエストDTDに含まれています。

  • georaster_table属性: GeoRaster表の名前を指定します。

  • georaster_column属性: GeoRaster表内のSDO_GEORASTER型列の名前を指定します。

  • polygon_mask属性(オプション): GeoRaster画像のポリゴン・マスクの外側の部分を透明にするマスクとして使用されるポリゴンを表す2次元の座標のセットを指定します。座標は、x1、y1、x2、y2、...のように定義します。データ座標領域にマスク座標が格納されている必要があります。

  • raster_bands属性(オプション): 赤、緑および青のチャネルに割り当てられるバンド構成を指定します。1つの値のみを指定すると、その結果表示される画像では1バンド(単色画像のグレー・レベル)が使用されます。2つの値を指定すると、それらは赤と緑のチャネルに使用され、GeoRasterメタデータに格納されているデフォルトの青のバンドが青のチャネルに使用されます。この属性を指定しない場合、OracleAS MapViewerではGeoRasterメタデータに格納されているデフォルト値が使用されます。

  • raster_pyramid属性(オプション): ピラミッド・レベル(解像度のレベル)を指定します。この属性を指定しない場合、OracleAS MapViewerでは、現行ウィンドウの問合せおよびデバイス領域に最適なピラミッド・レベルが計算されます。

  • raster_id属性(定義にSQL文が含まれていない場合のみ): mapリクエスト用に、1つのGeoRasterオブジェクトのSDO_GEORASTERオブジェクト定義内のrasterID属性値を指定します。

  • raster_table属性(オプション、定義にSQL文が含まれていない場合のみ): mapリクエスト用に、1つのGeoRasterオブジェクトに関連付けられたラスター・データ表を指定します。

例2-16では、1つのGeoRasterオブジェクトを選択するSQL文を含むGeoRasterテーマを定義しています。テーマでは、バンド1を赤チャネル、バンド2を緑チャネル、バンド3を青チャネルに割り当てます。raster_pyramid属性は指定されていないため、地理参照処理の間または後に設定される空間解像度の値を使用して、OracleAS MapViewerが最適なピラミッド・レベルを計算します。(例2-16で、WHERE句のgeorid=1は、PCI_IMAGEという名前のGeoRaster表にあるGEORIDという名前の列を参照していることに注意してください。)

例2-16 SQL文を含むGeoRasterテーマ

<theme name="georaster_theme">
  <jdbc_georaster_query
    georaster_table="pci_image"
    georaster_column="georaster"
    raster_bands="1,2,3"
    jdbc_srid="82301"
    datasource="mvdemo"
    asis="false"> SELECT georaster FROM pci_image WHERE georid =1
  </jdbc_georaster_query>
</theme>

例2-17では、SDO_GEORASTERオブジェクトのrasterID属性値が1(raster_id="1")である単一のGeoRasterオブジェクトを指定し、RDT_PCIというラスター・データ表に関連付けられているGeoRasterテーマを定義しています。このテーマでは、ピラミッド・レベルを2としています。

例2-17 ラスターIDおよびラスター・データ表を指定するGeoRasterテーマ

<theme name="georaster_theme">
  <jdbc_georaster_query
    georaster_table="pci_image"
    georaster_column="georaster"
    raster_id="1"
    raster_table="rdt_pci"
    raster_pyramid="2"
    raster_bands="1,2,3"
    jdbc_srid="82301"
    datasource="mvdemo"
    asis="false">
  </jdbc_georaster_query>
</theme>

2.3.6.1 事前定義済GeoRasterテーマの作成

事前定義済GeoRasterテーマを作成するには、USER_SDO_THEMESビュー(2.8.2項を参照)に行を挿入することにより、GeoRasterテーマの定義をデータベースに格納する必要があります。例2-18では、GeoRasterテーマの定義を格納します。

例2-18 事前定義済GeoRasterテーマの作成

INSERT INTO user_sdo_themes  VALUES (
   'GEOR_BANDS_012',
   'Band 0 for red, 1 for green, 2 for blue',
   'GEOR_TABLE',
   'GEOR_COLUMN',
   '<?xml version="1.0" standalone="yes"?>
    <styling_rules theme_type="georaster" raster_table="RDT_PCI"
                   raster_id="1" raster_bands="0,1,2">
    </styling_rules>' );

例2-18では、GEOR_BANDS_012というGeoRasterテーマを作成しています。この例では、バンド0が赤チャネル、バンド1が緑チャネル、バンド2が青チャネルに割り当てられています。GeoRaster表の名前(この例の場合はGEOR_TABLE)はUSER_SDO_THEMESビューのBASE_TABLE列、GeoRaster列の名前(この例の場合はGEOR_COLUMN)はGEOMETRY_COLUMN列、<styling_rules>要素が1つ含まれるXML文書はSTYLING_RULES列に挿入されます。

GeoRasterテーマの<styling_rules>要素では、このテーマがGeoRasterテーマとして認識されるように、theme_typegeorasterとする必要があります。

GeoRasterテーマの<styling_rules>要素では、例2-18で示したように、2.3.6項で解説したraster_bandsraster_pyramidraster_idraster_tableなどの属性を指定できます。また、GeoRasterテーマの<styling_rules>要素をルール定義にすることもできます。たとえば、WHERE句の条件georid=1を満たすGeoRasterオブジェクトをGeoRaster表から選択するGeoRasterテーマを作成するには、例2-18<styling_rules>要素を次のように置き換えます。

<styling_rules theme_type="georaster">
  <rule>
    <features> georid=1
    </features>
  </rule>
</styling_rules>

<styling_rules>要素のDTDについては、A.7項を参照してください。

例2-19では、データベースに格納されているGeoRasterテーマで使用するGeoRasterデータを準備します。コード例のコメントは、主要な手順を簡単に説明しています。GeoRasterデータの要件および使用手順の詳細は、『Oracle Spatial GeoRaster』を参照してください。

例2-19 GeoRasterテーマで使用するGeoRasterデータの準備

connect scott/tiger

SET ECHO ON
SET FEEDBACK 1
SET NUMWIDTH 10
SET LINESIZE 100
SET PAGESIZE 10000
SET SERVEROUTPUT ON SIZE 5000
SET LONG 20000
SET TIMING ON
call dbms_java.set_output(5000);

-------------------------------------------------------------------
-- Create a GeoRaster table (a table that has a
-- column of SDO_GEORASTER object type).
-------------------------------------------------------------------

create table georaster_table
    (georid     number primary key,
     type       varchar2(32),
     georaster  sdo_georaster);

-------------------------------------------------------------------
-- Create the GeoRaster DML trigger on the GeoRaster table.
--
-- This is REQUIRED for all GeoRaster tables.
-- It is used to manage the GeoRaster sysdata table.
-------------------------------------------------------------------

call sdo_geor_utl.createDMLTrigger('georaster_table', 'georaster');

-------------------------------------------------------------------
-- Create a raster data table (RDT).
--
-- It is used to store cell data of GeoRaster objects.
-- This step is not a requirement. If the RDT table does not
-- exist, the GeoRaster procedures or functions will generate it
-- automatically whenever needed.
-- However, for huge GeoRaster objects, some tuning and setup on those
-- tables can improve the scalability and performance significantly.
-- In those cases, it is better for users to create the RDTs.
-- The primary key must be added to the RDT if you create it.
-------------------------------------------------------------------

create table rdt_geor of sdo_raster
  (primary key (rasterId, pyramidLevel, bandBlockNumber,
                rowBlockNumber, columnBlockNumber))
  lob(rasterblock) store as (nocache nologging);

commit;

----------------
-- Import the image.
----------------

connect system/manager;

call dbms_java.grant_permission('MDSYS','SYS:java.io.FilePermission',
  'lbs/demo/images/l7_ms.tif', 'read' );

call dbms_java.grant_permission('SCOTT','SYS:java.io.FilePermission',
  'lbs/demo/images/l7_ms.tif', 'read' );

connect scott/tiger;

 declare
  geor SDO_GEORASTER;
begin
  delete from georaster_table where georid = 1;
 insert into georaster_table
    values( 1, 'TIFF', sdo_geor.init('rdt_geor', 1) );
 select georaster into geor
    from georaster_table where georid = 1 for update;
  sdo_geor.importFrom(geor, '', 'TIFF', 'file',
    'lbs/demo/images/l7_ms.tif');
  update georaster_table set georaster = geor where georid = 1;
  commit;
end;/

connect system/manager;

call dbms_java.revoke_permission('MDSYS','SYS:java.io.FilePermission',
       'lbs/demo/images/l7_ms.tif', 'read' );

call dbms_java.revoke_permission('SCOTT','SYS:java.io.FilePermission',
       'lbs/demo/images/l7_ms.tif', 'read' );

connect scott/tiger;

--------------------------
-- Change the GeoRaster format (optional).
--------------------------

declare
  gr1 sdo_georaster;
begin
  --
  -- Using changeFormat with a GeoRaster object:
  --

  -- 1. Select the source GeoRaster object.
  select georaster into gr1
    from georaster_table where georid = 1;

  -- 2. Make changes. (Interleaving is application-dependent. For TIFF images,
  --    the default interleaving is BSQ.)
  sdo_geor.changeFormat(gr1, 'blocksize=(512,512,3) interleaving=BIP');

  -- 3. Update the GeoRaster object in the GeoRaster table.
  update georaster_table set georaster = gr1 where georid = 1;

  commit;
end;/

---------------------------
-- Generate pyramid levels (strongly recommended, but optional).
---------------------------

declare
  gr sdo_georaster;
begin

  -- 1. Select the source GeoRaster object.
  select georaster into gr
    from georaster_table where georid = 1 for update;

  -- 2. Generate pyramids.
  sdo_geor.generatePyramid(gr, 'resampling=NN');

  -- 3. Update the original GeoRaster object.
  update georaster_table set georaster = gr where georid = 1;

  commit;
end;/

-----------------------------
-- Georeference the GeoRaster object.
-----------------------------

DECLARE
  gr sdo_georaster;
BEGIN
  SELECT georaster INTO gr FROM georaster_table WHERE georid = 1 FOR UPDATE;
  sdo_geor.georeference(gr, 82216, 1,
                        sdo_number_array(30, 0, 410000.000000),
                        sdo_number_array(0, -30,3759000.000000));
  UPDATE georaster_table SET georaster = gr WHERE georid = 1;
  COMMIT;
END;/

-----------------------------
-- Set the spatial resolutions (required for 10gR1 only)
-----------------------------
-- If you are using Oracle Database Release 10.1, set spatial resolutions. (Not
-- required if you are using Release 10.2.) The spatial resolution values of
-- (30, 30) are from the ESRI world file or from the georeferencing information;
-- however, you may have to compute these values if they are not part of
-- the original georeferencing metadata.
DECLARE
  gr sdo_georaster;
BEGIN
  SELECT georaster INTO gr FROM georaster_table WHERE georid = 1 FOR UPDATE;
  sdo_geor.setSpatialResolutions(gr, sdo_number_array(30, 30));
  UPDATE georaster_table SET georaster = gr WHERE georid = 1;
  COMMIT;
END;
/

------------------------
-- Update the spatial extent.
------------------------

DECLARE
  sptext sdo_geometry;
BEGIN
  SELECT sdo_geor.generateSpatialExtent(a.georaster) INTO sptext
          FROM georaster_table a WHERE a.georid=1 FOR UPDATE;
  UPDATE georaster_table a SET a.georaster.spatialextent = sptext WHERE a.georid=1;
  COMMIT;
END;/

commit;

------------------------------------------------------------------
-- Create metadata information for the GeoRaster spatial extent column.
------------------------------------------------------------------

INSERT INTO USER_SDO_GEOM_METADATA
  VALUES (
  'GEORASTER_TABLE',
  'georaster.spatialextent',
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('X', 410000.0, 470000.0, 0.000005),
    SDO_DIM_ELEMENT('Y', 3699000.0,3759000., 0.000005)
     ),
  82216   -- SRID
);

------------------------
-- Create a spatial index on the spatial extent.
------------------------

CREATE INDEX georaster_idx ON georaster_table(georaster.spatialextent)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;

--------------------------------------------------------
-- Create a predefined GeoRaster theme for OracleAS MapViewer.
--------------------------------------------------------

INSERT INTO user_sdo_themes  VALUES (
   'GEORASTER_TABLE',
   'GeoTiff image',
   'GEORASTER_TABLE',
   'GEORASTER',
   '<?xml version="1.0" standalone="yes"?>
    <styling_rules theme_type="georaster" raster_table="RDT_GEOR"
                   raster_id="1" raster_bands="0,1,2">
    </styling_rules>' );

commit;

2.3.7 ネットワーク・テーマ

ネットワーク・テーマは、Oracle Spatialネットワーク・データ・モデルを使用して定義されるネットワークを視覚化するのに便利な、特殊なOracleAS MapViewerテーマです。ネットワークは一連のノードおよびリンクで構成されています。通常、リンクおよびパスには方向がありますが、ネットワークは有向にも無向にもできます。ネットワークは、ネットワーク階層と呼ばれる様々な抽象レベルに編成できます。OracleAS MapViewerでは、ネットワーク内のネットワーク空間表で同じ座標系が使用され、『Oracle Spatialトポロジおよびネットワーク・データ・モデル』で説明されているように、これらの表の索引付けおよび登録がされているものと想定しています。

ネットワークのノード、リンクおよびパス表には、SDO_GEOMETRY型のジオメトリが格納されます。これらのジオメトリを使用するJDBCテーマを作成できます。さらに、有向ネットワークのリンクの方向など、ネットワークの様々な面を考慮した動的テーマを定義できます。

次の要素と属性は、ネットワーク・テーマの定義に適用されます。

  • <jdbc_network_query>要素: 動的に定義されるネットワーク・テーマであることを指定します。この要素の完全なDTDは、3.2項のmapリクエストDTDに含まれています。

  • network_name属性: ネットワークの名前を指定します。

  • network_level属性(オプション): このテーマを適用するネットワーク階層レベルを指定します。(非階層ネットワークの場合、1を指定します。これがデフォルト値です。)

  • link_style属性(オプション): リンクに使用されるスタイル名を指定します。

  • direction_style属性(オプション): リンクの方向マーカー(方向を示す矢印の画像など)に使用されるスタイル名を指定します。

  • bidirection_style属性(オプション): 双方向リンクに使用されるスタイル名を指定します。

  • direction_position属性(オプション): リンクの始点を基準とした方向マーカーの位置を、0と1の間の数値で指定します。たとえば、0.85は、リンクの始点と終点の間隔の85パーセントの位置を示します。

  • direction_markersize属性(オプション): 方向マーカーのサイズ(ピクセル数)を指定します。

  • direction_multimarker属性(オプション): リンク上で方向マーカーを繰り返すかどうかを指定します。trueの場合、方向マーカーは指定した開始位置に配置された後、所定の距離ごとに配置されます。false(デフォルト値)の場合、方向マーカーは繰り返されません。

  • link_labelstyle属性(オプション): link_labelcolumn属性で指定した列内のリンク・ラベルに使用されるスタイル名を指定します。

  • link_labelcolumn属性(オプション): link_labelstyle属性で指定されたスタイルを使用してレンダリングされるリンク・ラベルを含む列名を指定します。

  • node_style属性(オプション): ノードに使用されるスタイル名を指定します。

  • node_markersize属性(オプション): ノード・マーカーのサイズ(ピクセル数)を指定します。

  • node_labelstyle属性(オプション): node_labelcolumn属性で指定した列内のノード・ラベルに使用されるスタイル名を指定します。

  • node_labelcolumn属性(オプション): node_labelstyle属性で指定されたスタイルを使用してレンダリングされるノード・ラベルを含む列名を指定します。

  • path_ids属性(オプション): レンダリングされる格納済パスの1つ以上のパスID値を指定します。パスが複数の場合は、カンマでパスID値を区切ります。たとえば、path_ids="1,3,4"は、パスID値が1、3および4のパスがレンダリングされることを指定します。

  • path_styles属性(オプション): path_ids属性で指定したパスに関連付けられた1つ以上のスタイル名を指定します。たとえば、path_styles="C.RED,C.GREEN,C.BLUE"は、path_ids属性で指定した1番目、2番目および3番目のパスをそれぞれレンダリングするために使用されるスタイルを指定します。

  • path_labelstyle属性(オプション): path_labelcolumn属性で指定した列内のパス・ラベルに使用されるスタイル名を指定します。

  • path_labelcolumn属性(オプション): path_labelstyle属性で指定されたスタイルを使用してレンダリングされるパス・ラベルを含む列名を指定します。

ネットワーク分析に関連するその他のネットワーク・テーマ属性については、2.3.7.2項を参照してください。

ネットワーク・テーマは、リンク、ノードおよびパスの属性、またはこれらの組合せを併用することができます。そのような場合、OracleAS MapViewerでは最初にリンク、次にパス、ノードの順にレンダリングします。

例2-20では、NYC_NETというネットワークのリンクおよびノードの表示のための属性を指定するネットワーク・テーマを定義しています。

例2-20 ネットワーク・テーマ

<theme name="net_theme" user_clickable="false">
  <jdbc_network_query
    network_name="NYC_NET"
    network_level="1"
    jdbc_srid="8307"
    datasource="mvdemo"
    link_style="C.RED"
    direction_style="M.IMAGE105_BW"
    direction_position="0.85"
    direction_markersize="8"
    node_style="M.STAR"
    node_markersize="5"
    asis="false">
  </jdbc_network_query>
</theme>

2.3.7.1 事前定義済ネットワーク・テーマの作成

事前定義済ネットワーク・テーマを作成するには、USER_SDO_THEMESビュー(2.8.2項を参照)に行を挿入することにより、ネットワーク・テーマの定義をデータベースに格納する必要があります。例2-21では、ネットワーク・テーマの定義を格納します。

例2-21 事前定義済ネットワーク・テーマの作成

INSERT INTO user_sdo_themes  VALUES (
   'NYC_NET_1',
   'New York City network',
   'NYC_NET_LINK_TABLE',
   'GEOMETRY',
   '<?xml version="1.0" standalone="yes"?>
    <styling_rules
              theme_type="network"
              network_name="NYC_NET"
              network_level="1">
      <rule>
         <features>
           <link
              style="C.RED"
              direction_style="M.IMAGE105_BW"
              direction_position="0.85"
              direction_markersize="8">
           </link>
           <path
              ids="1,3"
              styles="C.BLUE,C.GREEN">
           </path>
           <node
              style="M.CIRCLE"
              markersize="5">
           </node>
         </features>
         <label>
           <link column="LINK_ID" style="T.STREET NAME"> 1 </link>
         </label>
      </rule>
    </styling_rules>' );

例2-21では、NYC_NETという名前のネットワークのラベル1に対して、NYC_NET_1というネットワーク・テーマを作成しています。ネットワーク表の名前(この例の場合はNYC_NET_LINK_TABLE)はUSER_SDO_THEMESビューのBASE_TABLE列、リンク・ジオメトリ列の名前(この例の場合はGEOMETRY)はGEOMETRY_COLUMN列、<styling_rules>要素が1つ含まれるXML文書はSTYLING_RULES列に挿入されます。

ネットワーク・テーマの<styling_rules>要素では、このテーマがネットワーク・テーマとして認識されるように、theme_typenetworkとする必要があります。リンク、パスおよびノードの要素は、例2-21の場合と同様に、同じ<features>要素で指定できます。

  • リンク地物のルールでは、すべてのリンクのC.REDスタイルと方向マーカーの属性を指定します。

  • パス地物のルールでは、パスID値が1であるパスにC.BLUEスタイルを、パスID値が3であるパスにC.GREENスタイルを指定します。

  • ノード地物のルールでは、M.CIRCLEスタイルを指定し、マーカー・サイズを5と指定します。

例2-21では、リンクに<label>要素も含まれており、リンク列LINK_IDとラベル・スタイルT.STREET NAMEを指定しています。

<styling_rules>要素のDTDについては、A.7項を参照してください。

2.3.7.2 ネットワーク分析でのOracleAS MapViewerの使用

ネットワーク・モデルのJava APIには、いくつかのネットワーク分析機能が用意されています。OracleAS MapViewerネットワーク・テーマを、最短パス分析機能とコスト内分析機能をサポートするように定義できます。属性には、両方の機能に適用されるものと、適切な関連機能に対してのみ適用されるものがあります。

すべてのネットワーク分析機能に対して、2.3.7項で説明している<jdbc_network_query>要素とネットワーク関連属性が、ネットワーク・テーマの定義に適用されます。

最短パス分析では、次の属性がネットワーク・テーマの定義に適用されます。

  • analysis_algorithm属性: 使用する最短パス分析アルゴリズムを指定します。DIJKSTRAまたはASEARCHのいずれかを指定します。

  • shortestpath_style属性: 最短パスに使用するスタイル名を指定します。

  • shortestpath_startnode属性: 分析に使用する開始ノードを指定します。

  • shortestpath_endnode属性: 分析に使用する終了ノードを指定します。

  • shortestpath_startstyle属性(オプション): 開始ノードに使用されるスタイル名を指定します。

  • shortestpath_endstyle属性(オプション): 終了ノードに使用されるスタイル名を指定します。

例2-22では、最短パス分析に使用できるネットワーク・テーマを定義します。

例2-22 最短パス分析用のネットワーク・テーマ

<theme name="shortest_path_theme" user_clickable="false">
  <jdbc_network_query
    network_name="BI_TEST"
    network_level="1"
    jdbc_srid="0"
    datasource="mvdemo"
    analysis_algorithm="DIJKSTRA"
    shortestpath_style="L.PH"
    shortestpath_startnode="20"
    shortestpath_endnode="101"
    shortestpath_startstyle="M.STAR"
    shortestpath_endstyle="M.CIRCLE"
    asis="false">
  </jdbc_network_query>
</theme>

コスト内分析では、次の属性がネットワーク・テーマの定義に適用されます。

  • analysis_algorithm属性: WITHINCOSTにしてください。

  • withincost_startnode属性: 分析に使用する開始ノードを指定します。

  • withincost_cost属性: 含めるノードのコスト削減値を指定します。開始ノードから指定値以下のコストで到達可能なすべてのノードが、結果として表示されます。開始ノードから到達不能なノード、または到達までに指定値より大きなコストが必要なノードは表示されません。

  • withincost_startstyle属性(オプション): 開始ノードに使用されるスタイル名を指定します。

  • withincost_style属性: 開始ノードと指定したコスト削減値内の各ノード間のパス表示で、リンクに使用されるスタイル名を指定します。

例2-23では、コスト内分析に使用可能なネットワーク・テーマを定義しています。

例2-23 コスト内分析用のネットワーク・テーマ

<theme name="within_cost_theme" user_clickable="false">
  <jdbc_network_query
    network_name="BI_TEST"
    network_level="1"
    jdbc_srid="0"
    datasource="mvdemo"
    analysis_algorithm="WITHINCOST"
    withincost_startnode="20"
    withincost_style="L.PH"
    withincost_cost="1"
    withincost_startstyle="M.STAR"
    asis="false">
  </jdbc_network_query>
</theme>

2.3.8 トポロジ・テーマ

トポロジ・テーマは、Oracle Spatialトポロジ・データ・モデルを使用して定義されるトポロジを視覚化するのに便利な、特殊なOracleAS MapViewerテーマです。トポロジ・データ・モデルを使用することにより、トポロジ内のノード、エッジおよびフェースに関するデータを処理できます。ノード、エッジおよびフェースの空間表現は、SDO_GEOMETRY型の空間ジオメトリです。ノードおよびエッジの場合、ジオメトリは明示的に格納されます。フェースの場合は、基線(外側と内側)が格納され、その結果フェース・ジオメトリを生成できます。

ノード、エッジ、フェースの空間表現の他に、トポロジには地物も指定できます。地物(トポロジ・ジオメオリとも呼ばれる)は、実際のオブジェクトの空間表現です。各地物はSDO_TOPO_GEOMETRY型のオブジェクトとして定義されます。このオブジェクトはトポロジ・ジオメトリ・タイプ、トポロジ・ジオメトリID、トポロジ・ジオメトリ層IDおよびトポロジIDを識別します。詳細は、『Oracle Spatialトポロジおよびネットワーク・データ・モデル』を参照してください。

OracleAS MapViewerでは、トポロジ地物をレンダリングできます。トポロジのノード、エッジおよびフェースを表示するために、デバッグ・モード(この項の後半で説明)でテーマをレンダリングすることもできます。OracleAS MapViewerでは、トポロジ・テーマごとに、USER_SDO_TOPO_METADATAビューに格納されているトポロジ・メタデータ情報を使用します。

次の要素と属性は、トポロジ・テーマの定義に適用されます。

  • <jdbc_topology_query>要素: これが動的に定義されるトポロジ・テーマであることを指定します。この要素にはSQL問合せ文(終了セミコロンなし)を指定できます。この要素の完全なDTDは、3.2項のmapリクエストDTDに含まれています。

  • topology_name属性: トポロジ名を指定します。

  • feature_table属性: 地物表名を指定します。

  • spatial_column属性: SDO_TOPO_GEOMETRY型の空間地物列名を指定します。

  • label_column属性: 各地物で使用されるテキスト・ラベルを含む地物表の列を指定します。

  • label_style属性: ラベル列のラベルをレンダリングするために使用されるテキスト・スタイル名を指定します。

  • render_style属性: トポロジのレンダリングに使用されるスタイル名を指定します。

例2-24では、CITY_DATAトポロジのLAND_PARCELS表の地物およびラベルを表示するための属性を指定するトポロジ・テーマを定義しています。SQL文は、空間地物列およびラベル列を指定し、地物表のすべての行を含みます。

例2-24 トポロジ・テーマ

<theme name="topo_theme" user_clickable="false">
  <jdbc_topology_query
    topology_name="CITY_DATA"
    feature_table="LAND_PARCELS"
    label_column="FEATURE_NAME"
    spatial_column="FEATURE"
    label_style="T.CITY NAME"
    render_style="C.COUNTIES"
    jdbc_srid="0"
    datasource="topology"
    asis="false">select feature, feature_name from land_parcels
  </jdbc_topology_query>
</theme>

OracleAS MapViewerでは、トポロジのノード、エッジおよびフェースをレンダリングするデバッグ・モードもサポートしています。デバッグ・モードを指定するには、<theme>要素にmode="debug"属性を含めます。この項で前述した<jdbc_topology_query>属性の他に、デバッグ・モードでは次の属性を使用できます。

  • edge_style属性: エッジのレンダリングに使用されるスタイル名を指定します。

  • edge_label_style属性: エッジ・ラベルのレンダリングに使用されるテキスト・スタイル名を指定します。

  • edge_marker_style属性: エッジ・マーカーに使用されるマーカー・スタイル名を指定します。

  • edge_marker_size属性: エッジ・マーカーのサイズ(ピクセル数)を指定します。

  • node_style属性: ノードのレンダリングに使用されるスタイル名を指定します。

  • node_label_style属性: ノード・ラベルのレンダリングに使用されるテキスト・スタイル名を指定します。

  • face_style属性: フェースのレンダリングに使用されるスタイル名を指定します。

  • face_label_style属性: フェース・ラベルのレンダリングに使用されるテキスト・スタイル名を指定します。

例2-25では、CITY_DATAトポロジのすべての地物表の地物、エッジ、ノードおよびフェースをレンダリングするための、デバッグモード・トポロジ・テーマを定義しています。

例2-25 デバッグ・モードを使用するトポロジ・テーマ

<theme name="topo_theme" mode="debug" user_clickable="false">
  <jdbc_topology_query
    topology_name="CITY_DATA"
    edge_style="C.RED"
    edge_marker_style="M.IMAGE105_BW"
    edge_marker_size="8"
    edge_label_style="T.EDGE"
    node_style="M.CIRCLE"
    node_label_style="T.NODE"
    face_style="C.BLUE"
    face_label_style="T.FACE"
    jdbc_srid="0"
    datasource="topology"
    asis="false">
  </jdbc_topology_query>
</theme>

2.3.8.1 事前定義済トポロジ・テーマの作成

事前定義済トポロジ・テーマを作成するには、USER_SDO_THEMESビュー(2.8.2項を参照)に行を挿入することにより、トポロジ・テーマの定義をデータベースに格納する必要があります。例2-26では、トポロジ・テーマの定義を格納します。

例2-26 事前定義済トポロジ・テーマの作成

INSERT INTO user_sdo_themes  VALUES (
   'LANDPARCELS',
   'Topology theme for land parcels',
   'LAND_PARCELS',
   'FEATURE',
   '<?xml version="1.0" standalone="yes"?>
    <styling_rules theme_type="topology" topology_name="CITY_DATA">
      <rule>
        <features style="C.RED"></features>
        <label column="FEATURE_NAME" style="T.TEXT STYLE"> </label>
      </rule>
    </styling_rules>' );

例2-26では、CITY_DATAというトポロジ用にLANDPARCELSというトポロジ・テーマを作成しています。地物表の名前(この例の場合はLAND_PARCELS)はUSER_SDO_THEMESビューのBASE_TABLE列、地物列の名前(この例の場合はFEATURE)はGEOMETRY_COLUMN列、<styling_rules>要素が1つ含まれるXML文書はSTYLING_RULES列に挿入されます。

トポロジ・テーマの<styling_rules>要素では、このテーマがトポロジ・テーマとして認識されるように、theme_typetopologyとする必要があります。例2-26のテーマでは、CITY_DATAトポロジのすべての土地区画地物をC.REDスタイルを使用してレンダリングし、地物表のFEATURE_NAME列の値にはT.TEXT STYLEラベル・スタイルを使用する、1つのスタイリング・ルールを定義しています。

<styling_rules>要素のDTDについては、A.7項を参照してください。

2.4 マップ

マップは、次のような要素および属性の組合せで構成できます。

これらの要素および属性をmapリクエストで指定した場合、生成されるマップの内容と外観が定義されます。mapリクエストで使用可能な要素および属性の詳細は、第3章を参照してください。

マップには、ベース・マップと、ウィンドウ内で相互に積み重ねてレンダリングした多数のテーマを含めることができます。マップには、マップ内のすべてのテーマで共有する必要がある、関連付けられた座標系が含まれます。たとえば、マップ座標系が8307(経度/緯度(WGS 84)に相当、GPSデバイスで使用される最も一般的な座標系)の場合、マップ内のすべてのテーマにこの座標系を使用して定義されたジオメトリが必要です。

マップにテーマを追加するには、ベース・マップ名を指定するか、プログラム・インタフェースを使用してテーマを追加します。テーマが追加される順序によりテーマのレンダリングの順序が決まり、最後に指定されたテーマが最上部に配置されるため、バックグラウンドおよびフォアグラウンドに必要なテーマを必ず把握しておいてください。

データベース・ユーザーのすべてのベース・マップ名および定義は、そのユーザーのUSER_SDO_MAPSビューに格納されます。このビューについては、2.8項および2.8.1項を参照してください。USER_SDO_MAPSビューのDEFINITION列には、ベース・マップのXML定義が含まれます。

例2-27では、ベース・マップの定義を示しています。

例2-27 ベース・マップのXML定義

<?xml version="1.0" ?>
<map_definition>
<theme name="theme_us_states"    min_scale="10"  max_scale="0"/>
<theme name="theme_us_parks"     min_scale="5"   max_scale="0"/>
<theme name="theme_us_highways"  min_scale="5"   max_scale="0"/>
<theme name="theme_us_streets"   min_scale="0.05" max_scale="0"/>
</map_definition>

ベース・マップ内の各テーマは、このテーマの表示範囲である参照可能なスケール範囲に関連付けることができます。例2-27では、mapリクエストが0.05以下で0より大きいマップ・スケール(この場合、非常に細かな詳細を示すスケール)に対するものでないかぎり、theme_us_streetsというテーマは表示されません。min_scale属性およびmax_scale属性が指定されていない場合、ベース・マップを表示すると常にテーマが表示されます。(マップ・スケールの詳細は、2.4.1項を参照してください。)

ベース・マップ内のテーマの表示順序は、ベース・マップ定義でのテーマの順序と同じです。例2-27では、最初にtheme_us_statesテーマ、次にtheme_us_parkstheme_us_highways、最後に(マップ・スケールがすべての指定範囲内である場合)theme_us_streetsがレンダリングされます。

2.4.1 マップのサイズおよびスケール

マップ・サイズは、マップ・データ領域の単位で表したマップの高さです。たとえば、マップ・データがWGS 84地理座標内にあり、マップの中心が(-120.5, 36.5)でサイズが2の場合、マップの高さは2度(10進)、Y(緯度)の下限値は35.5度(10進)、上限値は37.5度(10進)です。

マップ・スケールは、画面またはデバイス上の1インチで表される、ユーザーのデータ領域内の単位数で表されます。OracleAS MapViewerのマップ・スケールは、マップ・スケールの一般的な表現方法である1/nの分母値です。この場合の意味は次のとおりです。

  • 分子の1は、表示されたマップ上の1単位(OracleAS MapViewerでは1インチ)です。

  • 分母のnは、表示されたマップ上の1単位(OracleAS MapViewerでは1インチ)で表される測定単位(度(10進)、メートル、マイルなど)の数値です。

次に例を示します。

  • コンピュータ・ディスプレイ上の1インチがユーザー・データの0.5度(10進)に相当する場合、分数は1/0.5となります。この分数の10進値は2.0ですが、OracleAS MapViewerのスケール値は0.5です。

  • コンピュータ・ディスプレイ上の1インチがユーザー・データの2マイルに相当する場合、分数は1/2となります。この分数の10進値は0.5ですが、OracleAS MapViewerのスケール値は2です。

  • コンピュータ・ディスプレイ上の1インチがユーザー・データの10マイルに相当する場合、分数は1/10となります。この分数の10進値は0.1ですが、OracleAS MapViewerのスケール値は10です。

<theme>要素のmin_scale属性およびmax_scale属性は、テーマの参照可能なスケール範囲を示します。これらの属性は、現在のマップ・スケールに応じて、テーマが表示されるかどうかを制御します。min_scaleのデフォルトのスケール値は正の無限大であり、max_scaleのデフォルト値は負の無限大です(つまり、デフォルトではすべてのマップ・スケールにおいてテーマが表示され、可能な場合は表示特性が割り当てられます)。

  • min_scaleは、テーマを表示するためにディスプレイをこの値までズームインする必要のあるスケール値です。たとえば、公園のmin_scale値が5であり、現在のマップ・スケール値が5以下で、しかもmax_scale値より大きい場合、公園はディスプレイに含まれます。ただし、ディスプレイをズームアウトしてマップ・スケール値が5より大きくなると、公園はディスプレイに含まれません。

  • max_scaleは、テーマを表示しないためにディスプレイをこの値を超えるまでズームインする必要のあるスケール値です。たとえば、郡のmax_scale値が3であり、現在のマップ・スケール値が3以下である場合、郡はディスプレイに含まれません。ただし、ディスプレイをズームアウトしてマップ・スケール値が3より大きくなると、郡はディスプレイに含まれます。

min_scaleの大きな値は、大まかなマップ詳細と、地図製作における小さいスケールに関連付けられており、max_scaleの大きな値は、細かいマップ詳細と、地図製作における大きいスケールに関連付けられています。(OracleAS MapViewerでのマップ・スケールの意味は、地図製作のマップ・スケールにおける一般的な意味とは異なる点に注意してください。)テーマのmin_scale値は、max_scale値より大きくする必要があります。2.4項例2-27には、min_scale値とmax_scale値が含まれています。

OracleAS MapViewerによって戻されるマップの現在のマップ・スケールを決定するには、まずマップ・サイズ、つまりマップ・データに関連付けられた座標系におけるマップの高さ(垂直範囲)を調べます。たとえば、高さが10(マイル、メートル、度(10進)などの測定単位がデータに関連付けられています)のマップがリクエストされ、サイズが500×350ピクセル(350が高さ)のデバイスにマップが描画されるとします。OracleAS MapViewerでは、一般的な画面解像度として96dpiが使用されます。96ピクセルは1インチであるため、戻されるマップの高さは3.646インチ(350/96 = 3.646)です。この例では、マップのサイズは10であるため、マップ・スケールはおよそ2.743(10/3.646 = 2.743)となります。

また、scale_modeテーマ属性値をratioとして指定すれば、単位を指定することなく、1:50000のスケールを表す50000のようなマップ・スケール値を使用してマップをリクエストできます。(scale_modeテーマ属性値がscreen_inchの場合、スケールは単位を表します。)単位なしで定義されているスケールを使用するには、中心および比率スケールを指定してマップをリクエストします。

比率スケールに相当するMapViewerの画面インチ・スケールを見つけるには、次の手順を実行します。

  1. 1画面ピクセルが何メートルに相当するのかを求めます。たとえば、画面解像度が96dpi(dots per inch)の場合、1画面ピクセルは画面上で0.000265(= 0.0254/96)メートルに相当します。

  2. 次のようにして、1画面ピクセルのマップ・スケール(mapdotScaleの値)を求めます。

    • 投影データ(メートル)の場合は、ステップ1の結果に比率スケールを掛けます。たとえば、比率スケールが50000で画面解像度が96dpiの場合、結果は1ピクセル当たり13.25(= 50000 * 0.000265)メートルになります。

    • 測地データ(度)の場合は、ステップ1の結果に1度当たりのメートル数(地球の表面上)を掛けます。(この数値は、データに関連付けられている座標系によって異なります。)たとえば、1度が111195メートルで、画面解像度が96dpiの場合、結果は1ピクセル当たり29.466675(= 111195 * 0.000265)メートルになります。

    • 他の単位を使用するデータの場合は、メートルを使用する投影データのアプローチを使用します。

  3. MapViewerのスケールは画面ピクセル単位ではなく画面インチ単位なので、ステップ2の結果にdpi値を掛けます。たとえば、ステップ2の結果が13.25メートル(96dpi時)の場合、1画面インチは1272(= 13.25 * 96)メートルになります。

2.4.2 map凡例

map凡例は、マップの上に描画される挿入図であり、様々な色、記号、線、パターンなどが表す内容を説明したものです。凡例の内容および外観を柔軟に指定できます。次のことが可能です。

  • バックグラウンド、枠線スタイルおよびフォントのカスタマイズ

  • 凡例における1つ以上の列の使用

  • 凡例エントリを区切る空白の追加

  • 凡例エントリのインデント

  • 拡張スタイルを含む任意のOracleAS MapViewerスタイルの使用

例2-28は、凡例を含むリクエストからの抜粋です。

例2-28 mapリクエストに含まれる凡例

<?xml version="1.0" standalone="yes"?>
<map_request
             basemap="density_map"
             datasource = "mvdemo">
  <center size="1.5">
     . . .
  </center>

  <legend bgstyle="fill:#ffffff;fill-opacity:128;stroke:#ff0000"
          position="NORTH_WEST" font="Dialog">
    <column>
      <entry text="Map Legend" is_title="true"/>
      <entry style="M.STAR" text="center point"/>
      <entry style="M.CITY HALL 3" text="cities"/>
      <entry is_separator="true"/>
      <entry style="C.ROSY BROWN STROKE" text="state boundary"/>
      <entry style="L.PH" text="interstate highway"/>
      <entry text="County population:"/>
      <entry style="V.COUNTY_POP_DENSITY" tab="1"/>
    </column>
  </legend>

  <themes>
     . . .
  </themes>

</map_request>

図2-8は、例2-28で指定した凡例のあるマップを示しています。

図2-8 凡例付きのマップ

図2-8の説明は図の下
「図2-8 凡例付きのマップ」の説明

例2-28および図2-8に関する注意は次のとおりです。

  • この例は、単一列を使用した凡例を示していますが、凡例には複数の列を作成できます。

  • 列定義内の各エントリでは、ラベル・テキストおよびそのテキストが凡例のタイトルである(is_title="true")かどうか、スタイル名および関連テキスト、または垂直余白を追加(この例ではcitiesエントリの後)するためのセパレータ(is_separator="true")を識別できます。

mapリクエストへの凡例の追加の詳細は、3.2.11項を参照してください。

さらに、マップ・タイトル、注釈またはロゴ(あるいはその組合せ)を指定する場合は、凡例およびその他の地物の位置が異なるようにしてください。(マップ・タイトル、注釈およびロゴについては、1.5.2.5項を参照してください。)凡例のデフォルト位置はSOUTH_WESTです。

2.5 データソース

データソースは、データベースのスキーマまたはユーザーに対応します。データベース・スキーマ内で空間データを描画するには、まずそのスキーマ用のデータソースを永続的または動的に定義(作成)する必要があります。

各mapリクエストでは、マスター・データソースを指定する必要があります。ただし、mapリクエストに追加された個々のテーマには異なるデータソースを指定できます。これにより、異なるデータベース・スキーマに格納されているデータの集約が容易になります。データソースが指定されていないテーマは、マスター・データソースに関連付けられます。ベース・マップ(したがって、それに含まれるテーマ)は、常にマスター・データソースに関連付けられます。テーマを処理する際、定義で参照されるスタイルと同様に、基礎となるデータはすべてそのテーマに関連付けられたデータソースからアクセス可能であることが必要です。

各データソースには、関連付けられたレンダラ(マッパーまたはマップ・メーカーとも呼ばれる)があります。その数は、<map_data_source>要素のnumber_of_mappers属性で定義されています。この属性とmax_connections属性(どちらも1.5.2.12項を参照)は、mapリクエストの処理時に、データソースごとに作成されるデータベース接続数に影響を与えます。データソースで指定されたレンダラの数は、そのデータソースに対して処理可能な同時リクエストの最大数でもあります。各追加レンダラに必要なメモリーの量はわずかですが、多数(100など)のレンダラを指定すると、処理が認められたmapリクエスト数が多すぎる場合に基礎となるCPUリソースに負荷がかかり、OracleAS MapViewerサーバー全体のパフォーマンスに影響を及ぼすという不都合が生じる可能性があります。

各データソースには、独自の内部メタデータ・キャッシュがあります。メタデータ・キャッシュには、そのデータソースから作成されたすべての事前定義済テーマやアクセス済の全スタイルの定義が保持されています。これにより、必要なときにスタイルや事前定義済テーマを繰り返しデータベースに問い合せる必要がなくなります。

2.6 マップの生成方法

mapリクエストがOracleAS MapViewerサーバーに着信すると、サーバーではリクエスト内のマスター・データソースに関連付けられたレンダラから使用されていないものを選択します。この項では、OracleAS MapViewerサーバーでマップを生成する際のプロセスについて説明します。つまり、OracleAS MapViewerでは次の手順が実行されます。

  1. 受信XML mapリクエストを解析し、処理します。

  2. テーマごとにデータを準備します(同時に実行)。

  3. 各テーマをレンダリングし、ラベルを付けます。

  4. 最終的な画像またはファイルを生成します。

OracleAS MapViewerにより生成された各マップは、有効なXML mapリクエストを受信した結果です。(JavaBeanベースのAPIを使用する場合、リクエストは自動的にXML文書に変換され、OracleAS MapViewerサーバーに渡されます。)XML mapリクエストは解析され、その内容が検証されます。次に、OracleAS MapViewerではXMLリクエストで指定されている動的スタイルを作成します。ベース・マップに含まれるすべてのテーマ(ベース・マップが指定されている場合)と、指定された事前定義済テーマやJDBCテーマから、テーマ・リストが作成されます。リクエストで指定されている個々の地物は、すべて1つの一時テーマにまとめられます。つまり、受信リクエストの解析後、マップで表示されるデータはすべて、テーマのリストの形でOracleAS MapViewerレンダリング・エンジンに提示されます。

リスト内でのテーマの順序付けは、テーマのレンダリングの順序を決定するため重要です。ベース・マップ(存在する場合)に含まれるすべてのテーマがまずリストに追加され、次に指定されたすべてのテーマ(事前定義済またはJDBC)が追加されます。個々の地物をすべて含むテーマは最後のテーマとして追加されます。リクエストされたmapのその他の地物(凡例、マップのタイトル、脚注など)が作成され、後でレンダリングするために保存されます。

OracleAS MapViewerでは、リクエスト内のテーマごとにデータを準備するための別々の実行スレッドが作成され、テーマの準備が同時に行われます。事前定義済テーマの場合は、テーマの定義とその他の情報(現行のmapリクエスト・ウィンドウなど)に基づいて問合せを作成することを意味します。この問合せは実行のためデータベースに送信され、結果のセットが戻されます。OracleAS MapViewerでは結果セットに基づき、レンダリング可能な個々のオブジェクトを作成します。

mapリクエストのすべてのテーマを準備し、必要なデータをすべて収集すると、OracleAS MapViewerはマップのレンダリングを開始します。結果のマップを保持するために空の新しいメモリー内画像を作成し、必要なバックグラウンド(色または画像)を描画します。次にテーマ・リスト内のすべてのテーマをレンダリングします。


注意:

すべての画像テーマまたはGeoRasterテーマは、テーマ・リスト内での位置には関係なく、常に最初にレンダリングされます。しかし、その他のすべてのテーマは、テーマ・リスト内での出現順にレンダリングされます。

テーマごとに、OracleAS MapViewerの内部で決定された順序で地物がレンダリングされます。各地物のレンダリングには、レンダリング・スタイルの描画メソッドを起動する必要があります。すべてのテーマがレンダリングされると、ラベリング・プロセスが開始します。地物にテキストでラベルを付ける必要のある各テーマに対して、OracleAS MapViewerは地物のタイプ(ポリゴンまたは線など)に応じてラベル付けのための特定のアルゴリズムを起動します。

すべてのテーマをレンダリングし、(必要に応じて)ラベルを付けると、OracleAS MapViewerは内部のmap画像上にその他のマップ地物(凡例など)を描画します。次に、その画像を元のmapリクエストで指定されている形式(PNGまたはGIFなど)に変換します。ただし、SVGマップの場合は、内部画像を使用するかわりにまず空のSVG mapオブジェクトを作成し、レンダリング・プロセスの結果としてSVG文書を作成し、それをmapオブジェクトに挿入します。

2.7 OracleAS MapViewerでのWorkspace Managerのサポート

Workspace Managerは、データベース内の1つ以上の表をバージョン対応表にできるOracle Databaseの機能です。表がバージョン対応表の場合、作業領域のユーザーには、自動的に対象のデータベース行の正しいバージョンが表示されます。Workspace Managerの詳細は、『Oracle Databaseアプリケーション開発者ガイド-Workspace Manager』を参照してください。

特定の作業領域から、作業領域の特定のセーブポイントで、あるいは作業領域の特定の日付に近いポイントで、マップをリクエストできます。Workspace Managerのサポートに関連する<theme>要素の属性は、次のとおりです。

workspace_name属性は、OracleAS MapViewerでWorkspace Managerサポートを使用するために必要です。

workspace_savepoint属性もworkspace_date属性も指定しない場合、OracleAS MapViewerは定義されている作業領域の最新のバージョンに移動します。workspace_savepoint属性とworkspace_date属性の両方を指定すると、セーブポイント名のかわりに指定した日付がOracleAS MapViewerによって使用されます。

例2-29は、Workspace Managerサポート関連の属性(太字で表示)を使用する動的テーマの定義を示しています。この例では、セーブポイントsp1での作業領域wsp_1に関連するデータがレンダリングされます。

例2-29 mapリクエストのWorkspace Manager関連の属性

<?xml version="1.0" standalone="yes"?>
<map_request
 . . .
  <themes>
    <theme name="wmtheme" user_clickable="false"
       workspace_name="wsp_1" workspace_savepoint="sp1" >
       <jdbc_query
         spatial_column="GEOM"
         render_style="stylename"
         jdbc_srid="8307"
         datasource="mvdemo"
         asis="false"> select GEOM,ATTR from GEOM_TABLE
       </jdbc_query>
     </theme>
  </themes>
 . . .
</map_request>

OracleAS MapViewerの事前定義済テーマのキャッシング(2.3.1.2項を参照)およびWorkspace Manager関連のOracleAS MapViewer属性の使用についての考慮事項は次のとおりです。

OracleAS MapViewer管理リクエスト(第7章を参照)でのWorkspace Managerサポート関連の要素は次のとおりです。

<list_workspace_name>要素は、最新のmapリクエストのworkspace_name属性で指定されている現行作業領域名を戻します。作業領域が指定されていない場合(つまり、現行のOracleAS MapViewerセッションのmapリクエストでworkspace_name属性が指定されていない場合)またはLIVE作業領域が指定されている場合には、LIVE作業領域が戻されます。Workspace Managerが現在のOracle Databaseにインストールされていない場合、リクエストは失敗します。

例2-30では、管理リクエストに<list_workspace_name>要素を使用しています。

例2-30 管理リクエスト内の<list_workspace_name>要素

<?xml version="1.0" standalone="yes"?>
<non_map_request>
  <list_workspace_name data_source="mvdemo"/>
</non_map_request>

wsp_1が現行作業領域である場合、例2-30のレスポンスは次のようになります。

<?xml version="1.0" ?>
<non_map_response>
  <workspace_name succeed="true" name="wsp_1"/>
</non_map_response>

作業領域が指定されていない場合またはLIVE作業領域が指定されている場合は、例2-30のレスポンスは次のようになります。

<?xml version="1.0" ?>
<non_map_response>
  <workspace_name succeed="true" name="LIVE"/>
</non_map_response>

Workspace Managerが現在のOracle Databaseにインストールされていない場合、例2-30のレスポンスは次のようになります。

<?xml version="1.0" ?>
<non_map_response>
  <workspace_name succeed="false"/>
</non_map_response>

<list_workspace_session>要素は、現行作業領域名と現行コンテキスト名を戻します。作業領域が指定されていない場合(つまり、現行のOracleAS MapViewerセッションのmapリクエストでworkspace_name属性が指定されていない場合)またはLIVE作業領域が指定されている場合には、LIVE作業領域に関する情報が戻されます。Workspace Managerが現在のOracle Databaseにインストールされていない場合、リクエストは失敗します。

例2-31では、管理リクエストに<list_workspace_session>要素を使用しています。

例2-31 管理リクエスト内の<list_workspace_session>要素

<?xml version="1.0" standalone="yes"?>
<non_map_request>
  <list_workspace_session data_source="mvdemo"/>
</non_map_request>

wsp_1が現行作業領域であり、コンテキストがLATESTである場合、例2-31のレスポンスは次のようになります。

<?xml version="1.0" ?>
<non_map_response>
  <workspace_session succeed="true" name="wsp_1" context="LATEST"
     context_type="LATEST"/>
</non_map_response>

作業領域が指定されていない場合またはLIVE作業領域が指定されている場合で、コンテキストがLATESTの場合、例2-31のレスポンスは次のようになります。

<?xml version="1.0" ?>
<non_map_response>
  <workspace_session succeed="true" name="LIVE" context="LATEST"
     context_type="LATEST"/>
</non_map_response>

Workspace Managerが現在のOracle Databaseにインストールされていない場合、例2-31のレスポンスは次のようになります。

<?xml version="1.0" ?>
<non_map_response>
  <workspace_session succeed="false"/>
</non_map_response>

2.8 OracleAS MapViewerのメタデータ・ビュー

ベース・マップ、テーマおよびスタイルを説明するマッピング・メタデータは、MDSYSが所有するグローバル表のSDO_MAPS_TABLE、SDO_THEMES_TABLEおよびSDO_STYLES_TABLEに格納されています。ただし、これらの表を直接更新しないでください。OracleAS MapViewerの各ユーザーには、そのユーザーに関連付けられたスキーマで使用可能な次のビューがあります。

USER_SDO_xxxビューには、ユーザー(スキーマ)が所有するマッピング要素(スタイル、テーマ、ベース・マップ)に関するメタデータ情報が含まれ、ALL_SDO_xxxビューには、ユーザーがSELECT権限を持つマッピング要素に関するメタデータ情報が含まれます。

ALL_SDO_xxxビューには、オブジェクト所有者のスキーマを識別するOWNER列が含まれます。USER_SDO_xxxビューに、OWNER列は含まれません。

データベースで定義されたすべてのスタイルは、すべてのユーザーが、自分のテーマ、テキスト・スタイルを含むマーカーまたは拡張スタイルを定義するために参照できます。ただし、テーマおよびベース・マップはユーザー間で共有されないため、たとえば、自分が作成したベース・マップで別のユーザーのテーマは参照できません。

マッピング・メタデータへのアクセスには、次のルールが適用されます。

OracleAS MapViewerメタデータ・ビューは、次のファイルで定義されます。

$ORACLE_HOME/lbs/admin/mapdefinition.sql

次の各項では、各セットのビューについて説明します。

2.8.1 xxx_SDO_MAPSビュー

USER_SDO_MAPSビューおよびALL_SDO_MAPSビューには、表2-3に示す列があります。

表2-3 xxx_SDO_MAPSビュー

列名 データ型 説明

OWNER

VARCHAR2

ベース・マップを所有するスキーマ(ALL_SDO_MAPSのみ)

NAME

VARCHAR2

ベース・マップに関連付ける一意の名前

DESCRIPTION

VARCHAR2

ベース・マップに関するオプションの記述テキスト

DEFINITION

CLOB

ベース・マップに関連付ける、テーマおよびテーマのスケール値範囲情報のリストのXML定義


2.8.2 xxx_SDO_THEMESビュー

USER_SDO_THEMESビューおよびALL_SDO_THEMESビューには、表2-4に示す列があります。

表2-4 xxx_SDO_THEMESビュー

列名 データ型 説明

OWNER

VARCHAR2

テーマを所有するスキーマ(ALL_SDO_THEMESのみ)

NAME

VARCHAR2

テーマに関連付ける一意の名前

DESCRIPTION

VARCHAR2

テーマに関するオプションの記述テキスト

BASE_TABLE

VARCHAR2

空間ジオメトリ列が含まれる表またはビュー

GEOMETRY_COLUMN

VARCHAR2

空間ジオメトリ列(SDO_GEOMETRY型)の名前

STYLING_RULES

CLOB

テーマに関連付けるスタイリング・ルールのXML定義


2.8.3 xxx_SDO_STYLESビュー

USER_SDO_STYLESビューおよびALL_SDO_STYLESビューには、表2-5に示す列があります。

表2-5 xxx_SDO_STYLESビュー

列名 データ型 説明

OWNER

VARCHAR2

スタイルを所有するスキーマ(ALL_SDO_STYLESのみ)

NAME

VARCHAR2

スタイルに関連付ける一意の名前

TYPE

VARCHAR2

COLOR、MARKER、LINE、AREA、TEXTまたはADVANCEDのいずれかの値

DESCRIPTION

VARCHAR2

スタイルに関するオプションの記述テキスト

DEFINITION

CLOB

スタイルのXML定義

IMAGE

BLOB

画像ベースの記号(マーカーの場合)または充填文字(領域の場合)を使用するマーカー・スタイルまたは領域スタイルの画像内容(airport.gifなど)

GEOMETRY

SDO_GEOMETRY

(今後使用予定)


Oracle Databaseのリリースに応じて、ALL_SDO_STYLESビューに、MDSYSスキーマが所有するサンプル・スタイルが含まれる場合があります。これらのスタイルがシステムで定義されている場合にはテーマ定義およびmapリクエストで指定できます。また、独自スタイルの定義に使用するアイデアのためのXML定義を検査できます。

現行ユーザー以外のスキーマが所有しているスタイル(または他のタイプのOracleAS MapViewerオブジェクト)を指定するには、スキーマ名を指定し、スキーマ名とオブジェクト名の間にピリオドではなくコロン(:)を使用する必要があります。次の<jdbc_query>要素からの抜粋は、MDSYSスキーマが所有するC.REDというスタイルを参照します。

<jdbc_query . . . render_style="MDSYS:C.RED">
. . .
 </jdbc_query>

例2-32では、MDSYSスキーマが所有し、現在定義されているすべてのスタイルの名前を検索して、そのいずれかのスタイルのタイプ、説明およびXML定義を表示します。(出力結果の例は、読みやすいようにリフォーマットされています。)

例2-32 MDSYSスキーマ所有のスタイルの検索

SELECT owner, name FROM all_sdo_styles
  WHERE owner = 'MDSYS';

OWNER                            NAME
-------------------------------- --------------------------------
MDSYS                            C.BLACK
MDSYS                            C.BLACK GRAY
MDSYS                            C.BLUE
MDSYS                            C.COUNTIES
MDSYS                            C.FACILITY
. . .
MDSYS                            L.MAJOR STREET
MDSYS                            L.MAJOR TOLL ROAD
MDSYS                            L.MQ_ROAD2
MDSYS                            L.PH
MDSYS                            L.POOR_ROADS
MDSYS                            L.PTH
MDSYS                            L.RAILROAD
MDSYS                            L.RAMP
MDSYS                            L.SH
MDSYS                            L.STATE BOUNDARY
. . .
MDSYS                            M.REDSQ
MDSYS                            M.SMALL TRIANGLE
MDSYS                            M.STAR
MDSYS                            M.TOWN HALL
MDSYS                            M.TRIANGLE
MDSYS                            T.AIRPORT NAME
MDSYS                            T.CITY NAME
MDSYS                            T.MAP TITLE
MDSYS                            T.PARK NAME
MDSYS                            T.RED STREET
MDSYS                            T.ROAD NAME
MDSYS                            T.SHIELD1
MDSYS                            T.SHIELD2
MDSYS                            T.STATE NAME
MDSYS                            T.STREET NAME
. . .

-- Display the type, description, and XML definition of one style.
SET LONG 4000;
SELECT owner, name, type, description, definition
  FROM all_sdo_styles WHERE name = 'L.PH';

OWNER   NAME     TYPE       DESCRIPTION
------  -----    ------     ------------------
MDSYS   L.PH     LINE       Primary highways

DEFINITION
---------------------------------------------------------------------------
<?xml version="1.0" standalone="yes"?>
<svg width="1in" height="1in">
<desc></desc>
<g class="line" style="fill:#33a9ff;stroke-width:4">
<line class="parallel" style="fill:#aa55cc;stroke-width:1.0"/>
</g>
</svg>