プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle MapViewerユーザーズ・ガイド
12c リリース1 (12.1)
E59442-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

6 Oracle Maps

Oracle Mapsは、Webベースの高性能な対話型マッピング・アプリケーションを開発するための一連のテクノロジの名前です。Oracle Mapsは、MapViewerに同梱されています。

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

6.1 Oracle Mapsの概要

Oracle Mapsは、次の主要なコンポーネントから構成されています。

  • マップ・タイル・サーバー: 事前に生成されるマップ画像タイルをキャッシングして表示します。

  • 対象地物(FOI)サーバー: Oracle Spatial and Graphによって管理される地理空間地物をレンダリングします。

  • AjaxベースのJavaScriptマッピング・クライアント。(Ajaxは、asynchronous JavaScript and XMLの頭字語です。)このクライアントは、マップの閲覧および操作に適した機能と、柔軟なApplication Program Interface (API)を提供します。

マップ・タイル・サーバー(マップ画像キャッシング・エンジン)は、Oracle MapViewerなどのWeb対応マップ・プロバイダによってレンダリングされたマップ画像タイルのフェッチとキャッシングを自動的に実行します。また、キャッシングされたマップ画像タイルをクライアント(Oracle MapsクライアントAPIを使用して開発されたWebアプリケーション)に提供します。提供されたクライアントはその後、複数のマップ画像タイルをまとめ、1つのシームレスで大きなマップを自動的に作成します。それらのマップ画像タイルは事前に生成されキャッシングされるので、アプリケーション・ユーザーにはマップが高速に表示されます。

対象地物(FOI)サーバー(レンダリング・エンジン)は、Oracle Spatial and Graphによって管理される空間地物層のみでなく、アプリケーションによって作成されるポイント型、線型またはポリゴン型の個々の地理空間地物のレンダリングも実行します。そのようなFOI(通常は、レンダリング対象の画像も関連する一連の属性データも含まれる)は、その後クライアントに送信され、ユーザーによって操作されます。キャッシングされたイメージ・タイル(通常は静的コンテンツを表す)とは異なり、FOIは動的であり、リアルタイムのデータベース・コンテンツまたはアプリケーション・コンテンツを表します。動的なFOIとキャッシングされた静的なマップ・タイルを使用すると、Webマッピング・アプリケーションを構築できます。

JavaScriptマッピング・クライアントは、サーバーからマップ・コンテンツをフェッチしてクライアント・アプリケーションに表示するブラウザ側マップ表示エンジンです。また、マップのドラッグやクリックといったユーザーとの対話に関するマップ関連のカスタマイズ可能なコントロールをアプリケーションに提供します。JavaScriptマッピング・クライアントは、任意のWebアプリケーションまたはポータルと簡単に統合できます。

関連項目:

6.1.1 Oracle Mapsアプリケーションのアーキテクチャ

図6-1は、Oracle Mapsを使用して開発されたWebマッピング・アプリケーションのアーキテクチャを示しています。

図6-1 Oracle Mapsアプリケーションのアーキテクチャ

図6-1の説明は図の下のリンクをクリックしてください。
「図6-1 Oracle Mapsアプリケーションのアーキテクチャ」の説明

アプリケーションは、Oracle Mapsアーキテクチャと次のようにやり取りします(図6-1を参照)。

  • アプリケーションは、JavaScriptを使用して開発され、WebブラウザのJavaScriptエンジン内で動作します。

  • アプリケーションは、JavaScriptマップ・クライアントを起動してマップ・タイル・サーバーからマップ画像タイルをフェッチし、Webブラウザにマップを表示します。

  • アプリケーションは、JavaScriptマップ・クライアントを起動してFOIサーバーから動的空間地物をフェッチし、マップ・タイル上に表示します。

  • JavaScriptマップ・クライアントが、アプリケーションに代わってユーザーとのマップ関連の対話を制御します。

  • マップ・タイル・サーバーは、マップ画像タイル・リクエストを受信すると、リクエストされたタイルがキャッシング済であるかどうかをまずチェックします。該当するタイルがキャッシング済の場合は、キャッシング済のタイルがクライアントに返されます。該当するタイルがまだキャッシングされていない場合は、該当するタイルをマップ・タイル・サーバーがフェッチしてキャッシュに格納した後、クライアントに返します。タイルは、MapViewerのマップ・レンダリング・エンジンまたは外部Webマップ・サービス・プロバイダから直接フェッチできます。

  • FOIサーバーは、リクエストを受信すると、MapViewerのマップ・レンダリング・エンジンを使用して地物画像を生成し、それらの画像を地物属性とともにクライアントに送信します。

6.1.2 Oracle Mapsを使用した単純な例

図6-2は、Oracle Maps JavaScript V1 APIを使用して作成した単純なアプリケーションのインタフェースを示しています。この例と、サンプル・アプリケーション、チュートリアルおよびAPIドキュメントは、別のmvdemo.earファイルに含まれており、このファイルはhttp://www.oracle.com/technetwork/middleware/mapviewer/からダウンロードできます。mvdemo.earファイルは、mapviewer.earファイルと同じコンテナにデプロイする必要があります。


注意:

Oracle Maps JavaScript V1およびV2 APIについては、第6.6項を参照してください。

第6.1.2.1項「V2 APIを使用した単純なアプリケーション」で説明する単純な例も実質的には同じものですが、実装にはV2 APIを使用します。


図6-2で示す単純なアプリケーションには、http://host:port/mvdemo/fsmc/sampleApp.htmlからアクセスできます。このアプリケーションを実行するには、http://host:port/mvdemo/fsmc/tutorial/setup.htmlの手順に従ってデータベース・スキーマおよび必要なマップ・タイル層を設定します。

図6-2 Oracle Maps (V1 API)を使用して作成したアプリケーション

図6-2の説明は図の下のリンクをクリックしてください。
「図6-2 Oracle Maps (V1 API)を使用して作成したアプリケーション」の説明

図6-2に示したアプリケーションでは、顧客をマップ上に表示しています。このマップは、次の2つの層から構成されています。

  • マップ・タイル層では、海、郡の境界線、都市および高速道路が表示されます。Webブラウザに表示されるマップ・タイル層全体は、マップ・タイル・サーバーによってレンダリングされた複数のマップ画像タイルから構成されます。

  • FOI層では、マップ・タイル層上に顧客が赤のドット・マーカーで表示されます。顧客を表すマーカーをユーザーがクリックすると、情報ウィンドウが表示され、該当する顧客の一部の属性が表示されます。顧客のマーカーおよび属性は、FOIサーバーによってレンダリングされます。

これら2つの層以外に、マップの左下隅にはスケール・バー、右上隅にはナビゲーション・パネルが表示されます。

アプリケーション・ユーザーは、マウスを使用してマップをドラッグできます。その場合、マップに現在含まれている空間リージョンに対応して、新しいイメージ・タイルおよびFOIが自動的にフェッチされます。また、ユーザーは、組込みマップ・ナビゲーション・ツールを使用して画像のパンやズームを実行したり、「Show customers」ボックスを選択または選択解除して顧客(赤のドット・マーカー)の表示/非表示を切り替えたりすることもできます。

図6-2で示した単純なアプリケーションのソース・コード全体を、例6-1に示します。

例6-1 単純なアプリケーションのソース・コード(V1 API)

<html>
<head>
<META http-equiv="Content-Type" content="text/html" charset=UTF-8">
<TITLE>A sample Oracle Maps Application</TITLE>
<script language="Javascript" src="jslib/oraclemaps.js"></script>
<script language=javascript>
var themebasedfoi=null
function on_load_mapview() 
{        
  var baseURL  = "http://"+document.location.host+"/mapviewer";
  // Create an MVMapView instance to display the map
  var mapview = new MVMapView(document.getElementById("map"), baseURL);
  // Add a map tile layer as background.
  mapview.addMapTileLayer(new MVMapTileLayer("mvdemo.demo_map"));
  // Add a theme-based FOI layer to display customers on the map
  themebasedfoi = new MVThemeBasedFOI('themebasedfoi1','mvdemo.customers');
  themebasedfoi.setBringToTopOnMouseOver(true);
  mapview.addThemeBasedFOI(themebasedfoi);
  // Set the initial map center and zoom level
  mapview.setCenter(MVSdoGeometry.createPoint(-122.45,37.7706,8307));   
  mapview.setZoomLevel(4);    
  // Add a navigation panel on the right side of the map
  mapview.addNavigationPanel('east');
  // Add a scale bar
  mapview.addScaleBar();
  // Display the map.
  mapview.display();
}
function setLayerVisible(checkBox)
{
  // Show the theme-based FOI layer if the check box is checked and
  // hide the theme-based FOI layer otherwise.
  if(checkBox.checked)
    themebasedfoi.setVisible(true) ;
  else
    themebasedfoi.setVisible(false);
}
</script>
</head>
<body onload= javascript:on_load_mapview() >
<h2> A sample Oracle Maps Application</h2>
<INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show customers
<div id="map" style="width: 600px; height: 500px"></div> 
</body>
</html>

このサンプル・アプリケーションのコンポーネントとクライアント・アプリケーションを作成するプロセスについては、6.7.1.3項を参照してください。

6.1.2.1 V2 APIを使用した単純なアプリケーション

図6-3は、図6-2と同じロジックを使用した単純な例を示していますが、ここではOracle Maps JavaScript V2 APIを使用しています。

図6-3 Oracle Maps (V2 API)を使用して作成したアプリケーション

図6-3の説明は図の下のリンクをクリックしてください。
「図6-3 Oracle Maps (V2 API)を使用して作成したアプリケーション」の説明

図6-3で示した単純なアプリケーションのソース・コード全体を、例6-2に示します。

例6-2 単純なアプリケーションのソース・コード(V2 API)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>A sample Oracle Maps V2 application</TITLE>
<script language="Javascript" src="/mapviewer/jslib/v2/oraclemapsv2.js"></script>
<script language=javascript>
var customersLayer=null;
function on_load_mapview()
{
  var baseURL  = "http://"+document.location.host+"/mapviewer";
  // Create an OM.Map instance to display the map
  var mapview = new OM.Map(document.getElementById("map"),
                           {
                             mapviewerURL:baseURL
                           });
  // Add a map tile layer as background.
  var tileLayer = new OM.layer.TileLayer(
        "baseMap",
        {
            dataSource:"mvdemo",
            tileLayer:"demo_map",
            tileServerURL:baseURL+"/mcserver"
        });
  mapview.addLayer(tileLayer);
  // Set the initial map center and zoom level
  var mapCenterLon = -122.45;
  var mapCenterLat = 37.7706;
  var mapZoom = 4;
  var mpoint = new OM.geometry.Point(mapCenterLon,mapCenterLat,8307);
  mapview.setMapCenter(mpoint);
  mapview.setMapZoomLevel(mapZoom);
  // Add a theme-based FOI layer to display customers on the map
  customersLayer = new OM.layer.VectorLayer("customers",
        {
            def:
                {
                type:OM.layer.VectorLayer.TYPE_PREDEFINED,
                dataSource:"mvdemo", theme:"customers",
                url: baseURL,
                loadOnDemand: false
                }
        });
  mapview.addLayer(customersLayer);
 
  // Add a navigation panel on the right side of the map
  var navigationPanelBar = new OM.control.NavigationPanelBar();
  navigationPanelBar.setStyle({backgroundColor:"#FFFFFF",buttonColor:"#008000",size:12});
  mapview.addMapDecoration(navigationPanelBar);
  // Add a scale bar
  var mapScaleBar = new OM.control.ScaleBar();
  mapview.addMapDecoration(mapScaleBar);
  // Display the map.
  // Note: Change from V1. In V2 initialization and display is done just once
  mapview.init();
}
function setLayerVisible(checkBox)
{
  // Show the customers vector layer if the check box is checked and
  // hide it otherwise.
  if(checkBox.checked)
    customersLayer.setVisible(true) ;
  else
    customersLayer.setVisible(false);
}
</script>
</head>
<body onload= javascript:on_load_mapview() >
<h2>A Sample Oracle Maps V2 Application</h2>
<INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show customers
<div id="map" style="width: 600px; height: 500px"></div>
</body>
</html>

6.1.3 マップ・コンテンツの編成

この項では、Webブラウザ内でマップを表示する際にJavaScriptクライアントが様々なマップ・コンテンツを内部で編成する方法について解説します。アプリケーションは通常1つのマスターHTML DIVオブジェクトを1つのWebページに配置し、JavaScriptクライアントはそのDIVオブジェクト内に様々なコンテンツ層を追加します。

マップ・クライアントによって表示されるマップ・コンテンツは、一連の層によって編成されます。アプリケーション・スクリプトが適切なマップ・クライアントAPIを起動すると、1つのマップ・コンテナ内に一連のマップ層が作成されます。マップ・コンテナは、ユーザー定義のHTML DIVオブジェクトです。Webページ内では、マップ・コンテナのサイズと位置をカスタマイズできます。マップ層のレイアウトを、図6-4に示します。

図6-4 マップ内の一連の層

図6-4の説明は図の下のリンクをクリックしてください。
「図6-4 マップ内の一連の層」の説明

図6-4で示したように、マップ・コンテンツ層には、マップ・タイル、テーマベースFOI、ユーザー定義のFOIまたはレッドライン、情報ウィンドウ、固定図という5つのタイプがあります。固定図層を除く層はすべて、ユーザーがマップをドラッグすると、まとまって移動します。これらの可動層は、マップがドラッグされたりズームされたりすると、マップ・クライアントによって自動的に更新されます。(固定図層が移動されることはありません。)

関連項目:

6.1.3.1 マップ・タイル層

通常のOracle Mapsアプリケーションは、マップ・タイル層を1つ以上持ち、マップ・タイル・サーバーから事前に生成された一連のマップ画像タイルを組み立てて表示します。マップ・タイル層によって表示される静的マップ・コンテンツは、さほど変化しないため、通常はクライアント・アプリケーションによりバックグラウンド・マップとして使用されます。たとえば、6.1.2項および図6-2で説明したサンプル・アプリケーションの場合は、海、郡の境界線、都市および高速道路がすべて、マップ・タイル層として表示されています。マップ・タイル層で実行可能なユーザー操作は、マップのドラッグなどの一部の操作に限られています。

マップ・タイル層は通常、MapViewerベース・マップに関連付けられており、MapViewerサーバーによって管理されます。ただし、外部(MapViewer以外)のマップ・プロバイダにより提供されるマップ画像タイルをキャッシュできるように、マップ・タイル層を構成できます。

また、Oracle Mapsクライアントは、外部のタイル・サーバーによって直接提供されるカスタムまたは組み込まれた外部タイル層を表示することもできます。組込みのGoogle MapsやMicrosoft Bing Mapsタイル層は、その一例です。詳細は、第6.8項「Google MapsとBing Mapsの使用」およびJavaScript APIドキュメントのクラスMVGoogleTileLayerMVBingTileLayerを参照してください。(Google MapsまたはBing Mapsタイル層の上に独自の空間データをオーバーレイする必要がある場合、6.9項「Spherical Mercator座標系へのデータ変換」も参照してください。)

マップ・タイル層は常に、層階層の最下部に位置します。マップ・タイル層には、静的なマップ・コンテンツおよびバックグラウンド・マップ・コンテンツが表示されます。こうした層が複数含まれる場合、すべての層について座標系とズーム・レベルの定義が同一である必要があります。

内部では、マップ・タイル層は、マップDIVコンテナ・ウィンドウのサイズより大きいのが普通です。そのため、ブラウザは、その他のタイルのフェッチおよびキャッシングを実行できます。その結果、それらのタイルは、マップ層がユーザーによってドラッグされるとすぐに表示されます。

6.1.3.2 テーマベースFOI層

テーマベースFOI層は1つ以上存在できます。それぞれのテーマベースFOI層は、MapViewerの事前定義済テーマで定義されている特定の問合せ基準を満たす一連の対話型FOIから構成されています。FOIは、ポイント、線またはポリゴンの場合があります。たとえば、売上高が$100,000を超えている店舗をすべて、ポイントのテーマベースFOI層として表示することもできます。

ユーザーは、マウスを重ねたり、クリックしたりすることにより、FOIを操作できます。アプリケーションでは、そのようなユーザー操作に対するマップ・クライアントの反応方法をカスタマイズできます。

テーマベースFOI層の地物(地理的および非地理的)はすべて、データベースに格納されます。クライアント・アプリケーションから地物がリクエストされると、FOIサーバーにより地物に対して問合せとレンダリングが実行されます。テーマベースFOI層をサーバーからリフレッシュすることなくマップをドラッグできるような余地を設けられるように、テーマベースFOI層の問合せウィンドウをカスタマイズして、マップDIVウィンドウよりも大きくできます。テーマベースFOI層の詳細は、6.4.1項を参照してください。

6.1.3.3 ユーザー定義のFOI層

ユーザー定義FOIとは、クライアント側で定義されるインタラクティブな地物のことです。FOIは、ポイント地物、線地物またはポリゴン地物の場合があります。ユーザーは、テーマベースFOIの場合と同じ方法で、ユーザー定義FOIを操作できます。ただし、一連の地物としてレンダリングされるテーマベースFOI層の場合とは対照的に、ユーザー定義FOIのリクエストおよびレンダリングは個々に実行されます。ジオメトリの表現やレンダリング・スタイルも含め、ユーザー定義FOIの属性はすべて、アプリケーションで提供する必要があります。たとえば、ユーザー指定の始点アドレスおよび終点アドレスに基づいたルート・ジオメトリは、ユーザー定義の線FOIとしてマップに表示する必要があります。

ユーザー定義のFOI層の処理は、アプリケーションが動作するWebブラウザにより、次のように異なります。

  • Microsoft Internet Explorerの場合は、アプリケーションによって追加されたユーザー定義の各FOIがすべて、テーマベースFOI層のすぐ上の層の中に配置されます。該当する層は、最大1つしか存在できません。

  • OperaおよびMozillaベースのブラウザ(Netscape、Firefoxなど)の場合は、ユーザー定義の各FOIがすべて2つの層(一方はポイント地物用、他方はポリラインやポリゴンなどの非ポイント地物用)の内部に配置されます。非ポイント地物層は、ポイント地物層の下に配置されます。

6.1.3.4 情報ウィンドウ層

情報ウィンドウとは、マップ内のカスタマイズ可能なコンテンツが表示される小さなポップアップ・ウィンドウのことです。どの情報ウィンドウも、表示される場合は、ユーザー定義の各FOI層(複数可)のすぐ上の層内に配置されます。情報ウィンドウ層は、最大で1つしか存在できません。

6.1.3.5 固定図層

最上位層には、すべての固定図(著作権表示、スケール・バー、ナビゲーション・パネル、ユーザー定義のマップ装飾地物などの不動要素)が含まれます。(ユーザー定義のマップ装飾地物とは、任意のカスタムなHTMLコンテンツ(マップ・タイトルやカスタム・コントロール・ボタンなど)を含むことができるアプリケーション定義要素のことです。)固定図層は、他のすべてのものの上に表示され、ユーザーがマップをドラッグしても移動されません。

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

マップ・タイル・サーバーは、事前に生成される固定サイズのマップ画像タイルをフェッチ、キャッシュおよび提供するマップ画像キャッシング・エンジンです。これは、MapViewerサーバーの一部であるJavaサーブレットとして実装されます。マップ・タイル・サーバーは、タイルのズーム・レベルおよびタイル位置(メッシュ・コード)によって指定されたマップ画像タイルを要求するリクエストを受け付け、リクエストされたタイルをクライアントに返送します。

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

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

図6-5の説明は図の下のリンクをクリックしてください。
「図6-5 マップ・タイル・サーバーのワークフロー」の説明

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

MapViewer管理ツールを使用すると、マップ・タイル・サーバーを管理できます。

関連項目:

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

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

関連項目:

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

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

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

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

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

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

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

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

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

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

6.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. MapViewerサーバーを再起動して、変更を有効にします。

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

6.2.1.2.3 タイルを保存せずに直接ストリーミングを行う

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

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

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

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;

6.2.1.3 マップ・タイルの座標系

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

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

図6-6の説明が続きます
「図6-6 経度/緯度座標系を使用したタイル処理」の説明

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

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

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

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

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

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

図6-7の説明は図の下のリンクをクリックしてください。
「図6-7 タイル・メッシュ・コード」の説明

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

6.2.1.5 タイル処理ルール

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

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

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

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

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

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

タイル層メタデータ定義には、タイルの色に影響を与える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ページの背景色によって置換されます。

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

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

関連項目:

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

ロギング・オプションやデフォルトのキャッシュ・ストレージ・ディレクトリといったマップ・タイル・サーバーのグローバル設定は、MapViewer構成ファイル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つ作成され、マップ・タイル層用に使用されます。このサブディレクトリの名前は、マップ・タイル層の名前と同じになります。

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

マップ・タイル層の構成設定は、メタデータ・ビューUSER_SDO_CACHED_MAPSに格納されます。通常、このビューは直接操作せず、MapViewer管理ツールを介して使用して、マップ・タイル層を構成します。

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

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

表6-1は、USER_SDO_CACHED_MAPSビューの列を示しています。

表6-1 USER_SDO_CACHED_MAPSビュー

列名 データ型 説明

NAME

VARCHAR2

キャッシング対象マップ・ソースの一意な名前

DESCRIPTION

VARCHAR2

キャッシング対象マップ・ソースのオプションの記述テキスト

TILES_TABLE

VARCHAR2

(現在は未使用)

IS_ONLINE

VARCHAR2

マップ・タイル層がオンラインの場合はYES、マップ・タイル層がオフラインの場合はNO。キャッシュでタイルが見つからず、マップ・タイル層がオンラインの場合、マップ・タイル・サーバーは該当するタイルをフェッチし、フェッチしたタイルをクライアントに返す。タイルが見つからず、マップ・タイル層がオフラインの場合、マップ・タイル・サーバーは該当するタイルをフェッチせず、ブランク画像をクライアントに返す。

IS_INTERNAL

VARCHAR2

マップ・ソースが内部マップ・ソースの場合はYES、マップ・ソースが外部マップ・ソースの場合はNO

DEFINITION

CLOB

マップ・タイル層のXML定義(この項で後述)。

BASE_MAP

VARCHAR2

キャッシング対象のMapViewerベース・マップの名前(マップ・ソースが内部マップ・ソースの場合)

MAP_ADAPTER

BLOB

外部マップ・サービス・プロバイダのアダプタJavaクラスが含まれるjarファイル(この項で後述)。


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は、A.9項にリストされています。

例6-4は内部マップ・タイル層のXML定義、例6-5は外部マップ・タイル層のXML定義を示しています。<map_tile_layer>要素およびそのサブ要素の説明は、これらの例の後に示します。

例6-4 内部マップ・タイル層の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>

例6-5 外部マップ・タイル層の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形式のタイル画像のみ、バックグラウンドを透明にできます。

<internal_map_source>要素は、マップ・タイルがMapViewerのローカル・インスタンスによってレンダリングされる場合にのみ必須です。base_map属性は、必須であり、マップ・タイル・サーバーによってキャッシングされる事前定義済のMapViewerベース・マップを指定します。その値は、USER_SDO_CACHED_MAPSビュー内のBASE_MAP列のエントリに一致する必要があります。bgcolor属性は、オプションであり、マップのバックグラウンド・カラーを指定します。この属性の値をNONEに設定すると、バックグラウンドは透明になります。(現在、MapViewerでレンダリングできるのは、透明なPNGマップ・タイルのみです。)

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

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

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

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

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

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

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

<external_map_source>要素内の<properties>要素には<property>要素を複数含めることができ、そのそれぞれではマップ・タイルをフェッチする際にマップ・アダプタが使用する各ユーザー定義パラメータを指定します。マップ・ソース・アダプタが同一でも、別々のパラメータ・セットを使用すれば、別々のマップ・タイル層をフェッチできます。たとえば、MapViewerに同梱されているサンプルのMapViewerアダプタ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ファイルで定義されているデフォルトのルート・ディレクトリが使用されます。

<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>要素で指定される枠ボックスと同じです。

<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>要素で指定されているキャッシュの枠ボックスの設定全体がオーバーライドされます。

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

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

  1. MapViewer管理コンソールにログインします。

  2. 「タイル層の作成」をクリックします。

  3. このタイル層のマップ画像ソースとして「外部」を選択し、「続行」をクリックします。

  4. 外部マップ・ソースのマップ・タイル層の作成 ページで、適切な情報を入力します。

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

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

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

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

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

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

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

    背景: transparent

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

    • データソース: 例: mvdemo

    • バージョン: 1.1.1

    • SRS: EPSG:4326

    • レイヤー:例: THEME_DEMO_COUNTIES,THEME_DEMO_HIGHWAYS

    • 形式: image/png

    • 透明: true

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

    SRID: 8307

    最小X: -180.0

    最大X: 180.0

    最小Y: -90.0

    最大Y: 90.0

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

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

    ファイル形式: PNG

    ズーム・レベル数: 10

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

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

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

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

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

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

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

外部マップ・ソース・アダプタは、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()

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

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

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

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

/**
 * This is a sample map source adapter that can be used to fetch map 
 * tiles from a MapViewer 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メソッドの実装を、例6-7に示します。

例6-7 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;
    }
  }
} 

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

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

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

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

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

タイルの自動更新をテストする場合は、6.3.4項「MapViewerサーバーの起動およびマップ・キャッシュの自動更新機能のテスト」の説明を参照してください。

6.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に設定した場合、サーバー上のすべての適格なタイル層が自動的に更新されます。適格となるには、タイル層が適切に定義されている必要があります(6.3.2項を参照)。

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

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

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

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

<auto_update>要素は、タイル層定義の<zoom_levels>要素の後に追加します。この要素を追加するには、手動で行うかMapViewer 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バッチのみです。この属性の最適値を決定するには、次の要素を考慮してください。

  • auto_update_intervalの値(6.3.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はこの表に保存、取得および更新されます。MapViewerサーバーを起動する前に、この表を手動で作成しておく必要があります(6.3.3項の例を参照)。

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

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

6.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;
    

6.3.4 MapViewerサーバーの起動およびマップ・キャッシュの自動更新機能のテスト

タイルの自動更新をテストするには、MapViewerサーバーを起動し、実表内の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に設定する必要があります)。

6.4 対象地物(FOI)サーバー

対象地物(FOI)とは、Webブラウザ内で動作するJavaScriptマップ・クライアントを使用して操作できるビジネス・エンティティまたは地理的地物のことです。FOIデータは、動的に表示され、マップ・タイル層の一部ではありません。FOIにはポイント、線文字列、ポリゴンなどの任意の空間ジオメトリ・タイプを使用できます。FOIの検索、参照、検査および操作機能は、位置ベースのサービスにとって必要不可欠です。

FOIサーバーは、MapViewer内で動作するJavaサーブレットです。これは、データベースに対する問合せ、FOI画像のレンダリング、およびクライアントに対するFOI画像とFOI属性データの送信を実行することにより、JavaScriptマップ・クライアントから受け取るFOIリクエストに応答します。JavaScriptマップ・クライアントは、FOI画像をエンド・ユーザーに表示し、画像を操作する機能を提供します。

FOIサーバーは、テーマベースおよびユーザー定義という2つのタイプのFOIリクエストを受け付けます。いずれのタイプのFOIリクエストも、リクエストのタイプに適したデータ層を返します。

関連項目:

6.4.1 テーマベースFOI層

テーマベースFOI層は、類似した特性を備えデータベースに格納される空間地物の集合です。クライアントは、テーマベースFOI層リクエストをFOIサーバーに送信することにより、テーマベースFOI層をフェッチします。このリクエストの結果として、特定の問合せ基準を満たす一連のFOIデータ・エントリが得られます。各FOIデータ・エントリは、該当するFOI画像と、JavaScriptマップ・クライアントがクライアント側の双方向性を実装する際に使用できる一連のFOI属性から構成されます。

テーマベースFOI層は、事前定義済のMapViewerテーマ(6.4.1.1項を参照)または動的JDBC問合せテーマ(6.4.1.3項を参照)に基づいており、FOIデータのレンダリングに必要なすべての情報を定義します。この情報には、ジオメトリ地物の格納先の表、データベース問合せ時に使用される基準、FOIデータの一部である属性およびFOI画像のレンダリング時に使用されるスタイルが含まれます。事前定義済テーマの定義および構成は、Map Builderツール(第7章を参照)を使用して行えます。

関連項目:

6.4.1.1 事前定義済テーマベースFOI層

クライアントは、事前定義済テーマベースFOIリクエストを使用してFOIデータをリクエストする場合、事前定義済テーマの名前、地物画像のスケール、およびジオメトリ地物に対する問合せの際に使用する問合せウィンドウを指定する必要があります。テーマの名前はアプリケーションが定義する必要がありますが、地物画像のスケールおよび問合せウィンドウはJavaScriptマップ・クライアントによって自動的に計算されます。

たとえば、次のような定義を持つCUSTOMERSという名前の表上では、CUSTOMERSという事前定義済テーマを定義できます。

SQL> DESCRIBE CUSTOMERS
 Name                              Null?  Type
 --------------------------------- ------ ----------------------------
 NAME                                      VARCHAR2(64 CHAR)
 CITY                                      VARCHAR2(64 CHAR)
 COUNTY                                    VARCHAR2(64 CHAR)
 STATE                                       VARCHAR2(64 CHAR)
 LOCATION                                  SDO_GEOMETRY
 SALES                                     NUMBER

LOCATION列は、顧客マーカーのレンダリングに使用される空間列です。

CUSTOMERSテーマのXMLスタイリング・ルールを、例6-8に示します。

例6-8 FOI層用事前定義済テーマのXMLスタイリング・ルール

<?xml version="1.0" standalone="yes"?>
<styling_rules>
  <hidden_info>
    <field column="CITY" name="City"/>
    <field column="SALES" name="Sales"/>
  </hidden_info>
  <rule>
    <features style="M.CIRCLE"> </features>
    <label column="NAME" style="T.TEXT"> 1 </label>
  </rule>
</styling_rules>

例6-8のスタイリング・ルールでは、次の事柄を指定しています。これらの指定がマップ表示に与えている影響を見るには、6.1.2項「図6-2 Oracle Maps (V1 API)を使用して作成したアプリケーション」を参照してください。

  • マーカー・スタイルM.CIRCLEは、顧客のレンダリングに使用。

  • NAME列は、ラベル付け用属性として使用(label column="NAME")。NAME列の値(顧客の名前)は、ユーザーがマウスを顧客マーカーの上に移動したときにJavaScriptマップ・クライアントが表示する情報ウィンドウに含まれる。

  • 情報ウィンドウには、該当する顧客の<hidden_info>要素(この例ではCITYおよびSALES)で指定されている列の値も含まれる。各<field>要素では、2つの属性を指定する。つまり、columnではデータベース列を指定し、nameでは情報ウィンドウで使用されるテキスト文字列を指定する。

6.4.1.2 テンプレート付き事前定義済テーマ

MapViewerの事前定義済テーマには、標準の事前定義済テーマとテンプレート付き事前定義済テーマがあります。いずれのタイプの事前定義済テーマも、USER_SDO_THEMESビューを使用して定義します。ただし、標準の事前定義済テーマの問合せ条件は固定ですが、テンプレート付き事前定義済テーマの問合せ条件には動的なバインディング変数を含められ、それらの値はテーマ・リクエストの発行時に変更可能です。

バインディング変数を2つ使用するテンプレート付き事前定義済テーマのXMLスタイリング・ルールを、例6-9に示します(該当するテキストは<features>要素内の太字部)。

例6-9 テンプレート付き事前定義済テーマのXMLスタイリング・ルール

<?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.CIRCLE">(city=:1 and sales>:2)</features>
    <label column="NAME" style="T.TEXT"> 1 </label>
  </rule>
</styling_rules>

例6-9では、必要条件を満たす地物が存在する都市の名前をバインディング変数:1、必要条件を満たす地物の最低売上高をバインディング変数:2で指定しています。(つまり、指定した都市で特定の最低値を超える売上高を持つ顧客のみに、店舗マーカーが表示されます。)これら2つのバインディング変数の値は、テーマの定義時には確定されず、クライアントがサーバーに送信するリクエストの中で与えられます。

6.4.1.3 動的JDBC問合せのテーマベースFOI層

クライアントは、動的JDBCテーマベースFOIリクエストを使用してFOIデータをリクエストする際、JDBCテーマの完全な定義を指定する必要があります。テーマの定義では、すべてのジオメトリ属性および非ジオメトリ属性を含め、レンダリング・スタイルと、FOIデータの問合せに使用されるSQL問合せを指定する必要があります。

例6-10は、各顧客位置の周りにバッファを表示するFOI層を作成するためのJavaScriptクライアント・コードを示しています。

例6-10 動的JDBC問合せのテーマ

var theme = '<themes><theme name="JDBC_THEME" >' +
   '<jdbc_query asis="true" spatial_column="location" 
        jdbc_srid="8307" render_style="C.RED" 
        datasource="mvdemo">' + 
   'select sdo_geom.sdo_buffer(A.location,1,0.005,'+
   '\'unit=mile arc_tolerance=0.005\') location '+
   ' from customers A' +
   '</jdbc_query></theme></themes>' ;      
buffertheme = new MVThemeBasedFOI('buffertheme',theme);

6.4.2 ユーザー定義のFOIリクエスト

ユーザー定義FOIとは、クライアント側で定義される地物のことです。地物の集合としてレンダリングされるテーマベースFOI層とは異なり、ユーザー定義FOIの場合はリクエストとレンダリングが個々に実行されます。

ジオメトリの表現やレンダリング・スタイルも含め、ユーザー定義FOIの属性はすべて、アプリケーションで提供する必要があります。JavaScriptマップ・クライアントでは、ジオメトリ表現およびレンダリング・スタイルに関する情報を指定したリクエストを、FOIサーバーに送信します。FOIサーバーは、FOI画像をレンダリングし、クライアントに返します。レンダリング・スタイルは、USER_SDO_STYLESビュー内で事前定義済である必要があります。

6.5 マップ・テンプレート

マップ・テンプレートは、自己完結型で自立した空間データとマッピング・メタデータのセットを提供します。アプリケーション開発者やエンド・ユーザーの手動設定なしに、MapViewerによるインタラクティブでフル機能のマップ作成エクスペリエンスを提供します。マップ・テンプレートは、テーマ・マッピングのためにWebページにプラグインする準備ができている事前定義済スタイル、テーマおよびタイル層を提供します。多くの場合、データ・レイヤーのセットには事前定義された階層関係が含まれています(該当する場合)。Oracle Maps V2 (HTML5) APIは、マップ・テンプレートを使用し、層コントロール、マップ凡例、層の表示順序、最初のマップ表示の中心およびズーム・レベルなどのマップ機能を自動的に設定できます。

マップ・テンプレートの作成および維持には、Oracle MapViewer Template Builderを使用します(第9章を参照)。

Oracle Maps V2 APIを使用してマップ・テンプレートをロードするには、6.7.2.2項を参照してください。

マップ・テンプレートは次の構造ルールに従う必要があります。

  • 各マップ・テンプレートには、それに関するすべてのメタデータが含まれている単一の構成ファイルが必要です。ファイルはJSON形式で、ファイル名はconfig.jsonで終わる必要があります。構成ファイルには使用可能なすべての層のリストが含まれます。

  • 1つ以上のGeoJSONファイルに実際の地理空間データ層が含まれます。通常、GeoJSONファイルには、単一の層に関するすべてのデータが含まれます。たとえば、states.jsonファイルにはすべての州のジオメトリおよび属性、zipcodes.jsonファイルにはすべての郵便番号の境界および属性を含めることができます。各GeoJSONファイルの名前は、メイン構成ファイル内の対応する<l;ayer>要素の名前と一致する必要があります(大/小文字区別)。

マップ・テンプレートの構成ファイルは、次を含めることができます。

  • マップのプロパティ:対象マップ領域を定義するプロパティ。デフォルトのマップの中心およびズーム・レベルが含まれます。例:

    "init": {
            "center": [-100, 38],
            "zoomLevel": 4,
            "layers": ["us_states"],
            "tileLayer": "Oracle maps",
            "customUniverse": {
                "srid": 8307,
                "bounds": [-180, -90, 180, 90, 8307],
                "numberOfZoomLevels": 10
            },
            "copyright": {
                "anchorPosition": 5,
                "textValue": "©2014 Oracle Corp",
                "fontSize": 13,
                "fontFamily": "Times New Roman"
            },
            "navigation": {
                "style": 2
            }
        }
    
  • ベクター層:それぞれが単一のGeoJSONファイルに対応する、1つ以上のベクター層。例:

    "vectorLayers": [       
            {
                "dn": "us_counties",
                "uri": "/mvdemo/datapacks/usa_counties.json",
                "cn": ["USA Counties", "US counties", "United States Counties", "Counties of USA"],
                "pl": ["us_states"],
                "styles": {
                    "normal": "mutedColor1",
                    "mouseOver": "hoverColor1",
                    "selected": "selectedColor1"
                }
            },
            {
                "dn": "us_states",
                "uri": "/mvdemo/datapacks/usa_states.json",
                "cn": ["USA States", "US states", "States of USA", "States"],
                "cl": ["us_counties", "us_airports"],
                "styles": {
                    "normal": "mutedColor1",
                    "mouseOver": "hoverColor1",
                    "selected": "selectedColor1"
                }
            },
            {
                "dn": "us_airports",
                "uri": "/mvdemo/datapacks/us_airports.json",
                "cn": ["Airports", "US airports", "Airports of USA"],
                "pl": ["us_states"],
                "styles": {
                    "normal": "marker1",
                    "mouseOver": "pulse1"
                }
            }
        ]
    
  • タイル層:使用する1つ以上のタイル層。通常、デフォルトのタイル層が最初の背景として使用され、他のタイル層がある場合はエンド・ユーザーが実行時に選択して切り替えることができます。例:

    "tileLayers": [
            {
                "dn": "Oracle maps",
                "vendor": "oracle"
            },
            {
                "dn": "Google maps",
                "vendor": "google"
            },
            {
                "dn": "Bing maps",
                "key": "<your_bing_maps_key>",
                "vendor": "bing"
            },
            {
                "dn": "Nokia maps",
                "vendor": "nokia",
                "mapTypes": "normal,terrain,satellite",
                "key": "<your_nokia_key>",
                "secondary_key": "<your_app_id>"
            }
        ]
    
  • スタイル:ベクター層で使用できるレンダリングおよびラベル付けスタイルの指定に使用します。例:

    "styles": [
            {
                "dn": "mutedColor1",
                "type": "color",
                "def": {
                    "fill": "#cccccc",
                    "strokeThickness": 1,
                    "stroke": "#444444",
                    "fillOpacity": 0.4
                }
            },
            {
                "dn": "hoverColor1",
                "type": "color",
                "def": {
                    "strokeThickness": 2.5,
                    "stroke": "#ffff00"
                }
            },
            {
                "dn": "selectedColor1",
                "type": "color",
                "def": {
                    "fill": "#cccc00",
                    "fillOpacity": 0.3
                }
            }
    ]
    

6.6 Oracle Maps JavaScript API

Oracle Maps JavaScriptクライアントは、ブラウザベースのマップ視覚化エンジンであり、マップ・タイル・サーバーおよびFOIサーバーの上位で動作します。次の機能が実装されています。

  • マップ・タイル・サーバーからマップ・タイルをフェッチし、マップ・タイル層としてWebブラウザに表示する機能。

  • FOIリクエストをFOIサーバーに送信し、ユーザー定義の地物およびOracle Spatial and Graph問合せベースの地物をマップ・タイル層の上にオーバーレイ表示する機能。

  • マップ・ナビゲーション用のドラッグ、FOIのクリック、矩形の描画、レッドライニングなどのユーザー操作を制御する機能。

    矩形の描画とは、アプリケーション・ユーザーが矩形の1つの隅をクリックした後、マウス・ボタンを押したままマウスを対角の隅までドラッグし、マウス・ボタンを離して矩形を作成することです。

    レッドライニングとは、アプリケーション・ユーザーがマウス・ボタンをクリックした後、マウスを移動しクリックを複数回実行する(各クリックにより、まっすぐな線分を使用してレッドラインを伸ばす)ことにより、ポリゴンまたはポリラインを作成することです。(多くの場合レッドラインの描画は赤色でレンダリングされますが、任意の色を使用する線スタイルも指定できます。)

これらの機能にアクセスするには、JavaScript API (いくつかのJavaScriptクラスから構成される)を使用します。JavaScript APIには、次に示す2つのバージョンがあります。

Oracle Maps JavaScript API (V1およびV2)内の全クラスの詳細は、Javadocスタイルのリファレンス・ドキュメント(mvdemo.earファイルに同梱されており、次の場所で利用可能)を参照してください。

http://host:port/mvdemo/api/oracle_maps_api.jsp (V1)

http://host:port/mvdemo/api/oracle_maps_html5_api.jsp (V2)

V1 APIおよびV2 APIのチュートリアルとデモは、ルート・コンテキスト・パス/mvdemoで、スタンドアロンのパッケージ・アプリケーションとして提供されます。このチュートリアルでは、まず基本事項(マップ・タイル層の表示、ナビゲーション・パネルの追加、インタラクティブな地物と情報ウィンドウの表示)について説明した後、より複雑なトピック(イベント・リスナーの登録、プログラムによるスタイルの作成と使用、空間フィルタ処理など)に移ります。

すべてのチュートリアルは、MVDEMOサンプル・データセット(Oracle Technology NetworkのMapViewerページから入手可能)に基づいており、mvdemoという名前のデータソースを前提としています。チュートリアル・ページには、3つのパネルがあります。左にはサンプル・コード(デモ)のタイトルがリストされます。いずれかをクリックすると、マップ(そのサンプル・コードの実行結果)が右上のパネルに表示されます。下のパネルには「JavaScript」および「HTML」というタブがあり、それぞれのタブに、選択したデモのJavaScriptおよびHTMLコードが表示されます。

6.6.1 JavaScript API V1

Oracle Maps JavaScriptクライアントの機能にアクセスするには、次のものを含むいくつかのJavaScriptクラスから構成される、JavaScript APIバージョン1 (V1)を使用します。

  • MVMapViewクラスは、該当APIのメインのエントリ・ポイントです。ほとんどのマップ制御インタフェースが実装されています。

  • MVMapTileLayerクラス(以前の名称はMVBaseMapクラス)は、マップ・タイル・サーバーによってレンダリングされたマップ・タイルを表示するマップ・タイル層を定義します。

  • MVThemeBasedFOIクラスでは、テーマベースFOI層の定義および制御を実行します。

  • FOIクラスでは、ユーザー定義FOIの定義と制御を実行します。

  • MVSdoGeometryクラスでは、ジオメトリ・オブジェクトを定義します。ジオメトリには、Oracle Spatial and Graphでサポートされている任意のジオメトリ・タイプを使用できます。

  • MVRedLineToolクラスでは、レッドライン・ユーティリティの定義および制御を実行します。

  • MVRectangleToolクラスでは、矩形ツールの定義および制御を実行します。

  • MVOverviewMapクラスでは、メイン・マップが小さな矩形としてミニチュア表示される概要マップ(自体は矩形ツール内にあるマップ)の定義および制御を実行します。

  • MVMapDecorationクラスでは、マップ装飾の定義および制御を実行します。

MVMapViewは、Webブラウザ内の全マップ操作におけるメインのエントリ・クラスです。ユーザーのWebマッピング・アプリケーションにロジックを追加するための必須のインタフェースはすべて、MVMapViewなどのクラスによって提供されます。そのような論理的インタフェースには、次のようなものがあります。

  • マップ・クライアント・インスタンスを作成し、それをWebページ内で作成したマップ・コンテナDIVオブジェクトと関連付ける。

  • マップの中心やズーム・レベルなどのマップ・パラメータを構成するもの。

  • マップ・タイル層を作成し、操作するもの。

  • テーマベースFOI層を作成し、操作するもの。

  • ユーザー定義の各FOIを作成し、操作するもの。

  • マップ上に情報ウィンドウを表示するもの。

  • マップ・タイトル、カスタムな著作権表示、コントロール・ボタンなどの固定のマップ装飾を作成するもの。

  • ナビゲーション・バー、スケール・バー、矩形ツール、レッドライン・ツール、概要マップなどの組込みユーティリティにアクセスするもの。

  • イベント・リスナーを使用してイベント処理をカスタマイズするもの。適切なAPIメソッドを使用すると、イベント・リスナーをMVMapViewクラス、MVThemeBasedFOIクラスおよびMVFOIクラスに追加できます。

6.6.2 JavaScript API V2

Oracle Maps JavaScript APIバージョン2 (V2)は、最新のブラウザの機能を利用します。次のような機能があります。

  • maps.oracle.com、Nokia Maps、Bing Maps、OpenStreet Mapsなどのマッピング・サービス・プロバイダをはじめとする、様々なサード・パーティのマップ・タイル・サービスに対する組込みのサポート

  • レンダリング・スタイルおよび効果(グラデーション、アニメーション、ドロップ・シャドウなど)のオンザフライ適用による、クライアント側での地理空間データの優れたレンダリング

  • 多くのポイントの自動クラスタリングとクライアント側でのヒート・マップの生成

  • 属性値と空間述語(問合せウィンドウ)に基づく、クライアント側での地物のフィルタ処理

  • 優れた一連の組込みコントロールおよびツール(カスタマイズ可能なナビゲーション・バーと情報ウィンドウ、構成可能な層コントロール、レッドライン・ツール、距離測定ツールなど)

V2 APIには、既存のOracle Maps JavaScript V1 APIアプリケーションとの後方互換性はありません。V2固有の地物を既存のV1アプリケーション(つまり、MVThemeBasedFOIなどのクラスを使用する、V1 APIで記述されたアプリケーション)で使用する場合は、まずそれらのアプリケーションを移行する必要があります。

ただし、既存のサーバー側の事前定義済スタイルおよびテーマは、V2 APIと連携して動作しません。たとえば、次のコード・スニペットでは、関連する事前定義済スタイルを持つ事前定義済テーマmvdemo.customersに基づいて、インタラクティブなベクター層を作成します。

var baseURL  = "http://"+document.location.host+"/mapviewer";
var layer = new OM.layer.VectorLayer("layer1",  
 {
     def:{
                type:OM.layer.VectorLayer.TYPE_PREDEFINED, 
                dataSource:"mvdemo", 
                theme:"customers", 
                url: baseURL
            }
  });

V2 APIには、次の最上位クラスおよびサブパッケージがあり、これらはすべてネームスペースOMに含まれています。

  • Mapクラスは、このAPIのメイン・クラスです。

  • Featureクラスは、個々の地理的地物(V1ではFOIとして知られている)を表します。

  • MapContextクラスは、現在のマップの中心点やズーム・レベルなど、いくつかの重要なコンテキスト情報をカプセル化した最上位クラスです。通常はイベント・リスナーに渡されます。

  • controlパッケージには、ナビゲーション・バーや概要マップなど、すべてのマップ・コントロールが含まれています。

  • eventパッケージには、すべてのマップおよび層イベント・クラスが含まれています。

  • filterパッケージには、表示したベクター層の地物を選択またはサブセット化するためのすべてのクライアント側フィルタ(空間またはリレーショナル)が含まれています。

  • geometryパッケージには、様々なジオメトリ・クラスが含まれています。

  • layerパッケージには、様々なタイルおよびベクター層クラスが含まれています。タイル層クラスには、Oracle、Nokia、Bing、OpenStreetMapなど、いくつかのオンライン・マップ・サービスへのアクセスが含まれています。ベクター層は、インタラクティブな地物層であり、V1のMVThemeBasedFOIおよびMVFOIクラスに対応しています。

  • infowindowパッケージには、カスタマイズ可能な情報ウィンドウと、それらのスタイルが含まれています。

  • styleパッケージには、クライアント側のベクター・データに適用できるスタイルが含まれています。また、アニメーション、グラデーション、ドロップ・シャドウなどのビジュアル効果も含まれています。

  • toolパッケージには、距離測定ツール、レッドライン・ツール、ジオメトリ描画ツールなど、様々なマップ・ツールが含まれています。

  • universeパッケージには、組込み(事前定義済)マップ汎用が含まれています。マップ汎用は、マップ・コンテンツの枠ボックスと一連のズーム・レベル定義を定義します。これは、V1 APIのタイル層の構成と似ています。

  • utilパッケージには、様々なユーティリティ・クラスが含まれています。

  • visualfilterパッケージでは、グラデーションやドロップ・シャドウなど、様々なビジュアル効果を実現するためのインタフェースが提供されます。

OM.Mapは、Webブラウザ内の全マップ操作におけるメインのエントリ・クラスです。このクラスや他のクラスにより、アプリケーション固有のロジック、操作および双方向性をWebマッピング・アプリケーションに追加するためのインタフェースが提供されます。次のようなアプリケーション・ロジックおよび操作があります。

  • マップ・クライアント・インスタンスを作成し、それをWebページ内で作成したマップ・コンテナDIVオブジェクトと関連付ける。

  • マップの中心やズーム・レベルなどのマップ・パラメータを構成するもの。

  • マップ・タイル層を作成し、操作する(オプション)。V1の場合と異なり、V2ではマップ・タイル層は必須ではありません。アプリケーションに含めることができるのは、ズーム・レベルとスケールをプログラムによって定義するカスタム汎用を使用する、インタラクティブなベクター層のみです。

  • ベクター層(V1ではFOIとして知られている)を作成し、操作する。

  • マップ上に情報ウィンドウを表示するもの。

  • マップ・タイトル、著作権表示、マップ・コントロールなどの固定のマップ装飾を作成する。

  • ナビゲーション・パネル、矩形ツール、円形ツール、スケール・バー、概要マップ・パネルなどの組込みユーティリティにアクセスする。

  • イベント・リスナーを使用してイベント処理を(したがって、マップの相互作用も)カスタマイズする。

V2 APIを使用したアプリケーションの開発の詳細は、第6.7.2項「V2 APIの使用」とOracle提供のチュートリアルおよびデモを参照してください。

6.6.3 V1 APIとV2 APIの類似点と相違点

V1 APIとV2 APIの主な類似点は次のとおりです。

ただし、大きな相違点がいくつかあります。

  • V2を使用した、クライアント側でのインタラクティブな地物のレンダリング(つまり、HTML5 CanvasまたはSVGを使用)により、クライアントの双方向性とユーザーの操作性が向上します。

  • V1の「FOIサーバー」に対応するV2のデータ・サーバーは、地物のベクター・ジオメトリと属性をクライアントにストリーミングして、ローカルでレンダリングを実行できるようにします。このため、V1の「FOI層」はV2ではベクター層と呼ばれます。

  • V2では、インタラクティブなベクター層を表示するために、バックグラウンド・マップ・タイル層は必要ありません。このため、たとえばV2では、アプリケーションがバックグラウンド・タイル層を使用することなく、州のテーマ・マップを(人口の五分位値別に色分けするなどして)表示することが可能です。

  • V2 APIはJQueryおよびJQueryUIに依存し、これらをインクルードします。このため、oraclemapsv2.jsjquery-1.7.2.min.jsおよびjquery-ui-1.8.16.min.jsをインクルードします。アプリケーションでもJQueryとJQueryUIを使用し、これらをすでにインクルードしている場合は、Oracle Maps V2ライブラリをロードするかわりに、ファイルoraclemapsv2_core.js<script>タグ内で使用します。つまり、次を使用します。

    <script src="/mapviewer/jslib/v2/oraclemapsv2_core.js"></script>

    次は使用しません。

    <script src="/mapviewer/jslib/v2/oraclemapsv2.js"></script>

表6-2に、V1とV1のクラス間の一般的な対応関係を示します。この関係は常に一対一ではありません。

表6-2 V1とV2のAPIクラス間の対応関係

V1 APIクラス V2 APIクラス

MVMapView

OM.Map

MVMapTileLayerMVBingTileLayer、組込みタイル層

OM.layer.TileLayerOM.layer.BingTileLayerElocationTileLayerNokiaTileLayerOSMTileLayer

MVCustomMapTileLayer

カスタム・タイル層は、現在のリリースのV2では直接サポートされていません。ただし、OM.layer.TileLayerを拡張し、getTileURLコールバック関数を提供することによって、カスタム・タイル層を使用できます。

MVThemeBasedFOI

OM.layer.VectorLayer

MVFOI

OM.Feature

MVSdoGeometry

OM.geometryとそのサブクラス

MVEvent

OM.eventとそのサブクラス

MVInfoWindowTab

OM.infowindow.MVInfoWindowTab

スタイル(MVStyleColorMVXMLStyleMVBucketStyleMVBarChartStyleなど)

OM.styleとそのサブクラス

ツール(MVToolbarMVDistanceToolMVCircleToolなど)

OM.toolとそのサブクラス

装飾とコントロール(MVNavigationPanelMVMapDecorationMVScaleBarなど)

OM.controlとそのサブクラス


6.7 Oracle Mapsアプリケーションの開発

すべてのマップ・データがOracleデータベースに格納されており、Oracle Fusion MiddlewareにMapViewerがデプロイされている場合は、使用しているAPIバージョンに関連する項の手順に従ってOracle Mapsを使用すれば、Webベースのマッピング・アプリケーションを開発できます。

6.7.1 V1 APIの使用

バージョン1 (V1) APIを使用してOracle Mapsアプリケーションを開発するには、次の項の手順に従います。

6.7.1.1 1つまたは複数のマップ・タイル層の作成

MapViewerがサービスを提供するクライアント側に表示される各マップ・タイル層について、対応するマップ・タイル層をMapViewerサーバー側に作成する必要があります。たとえば、6.1.2項で説明したサンプル・アプリケーションの場合、クライアント側にマップ・タイル層として海、郡の境界線、都市および高速道路を表示するには、サーバー側にマップ・タイル層を作成する必要があります。ただし、タイル層がカスタムまたは組込み外部タイル層の場合、サーバー側にタイル層を定義する必要はありません。

マップ・タイル層を作成する場合は、マップ・タイル画像のレンダリング元となるマップ・ソースが使用可能な状態にあることを事前に確認する必要があります。データベースに格納されているマップ・データに基づいてマップ・タイル画像をレンダリングする場合は、事前定義済の一連のテーマから構成されるMapViewerベース・マップを作成する必要があります。(ベース・マップの作成は、第7章で説明するMap Builderツールを使用して行えます。)外部マップ・プロバイダを使用してマップ・タイル画像をレンダリングする場合は、マップ・タイル・サーバーによって指定されているタイル画像の定義を使用して外部サーバーからマップ画像をフェッチできるマップ・ソース・アダプタを作成する必要があります。

マップ・ソースが使用可能な状態にある場合は、1.6.3項で説明したように、MapViewer管理ページを使用して、マップ・タイル層を作成できます。マップ・タイル層を作成する場合は、適切な座標系の定義、マップ・ソースの定義(内部または外部)およびズーム・レベルの定義(ズーム・レベルの数とマップ・スケール)を指定する必要があります。

マップ・タイル層は、作成し終わったら、MapViewerに同梱されているJavaServer Page (JSP)デモ・アプリケーションを使用してテストできます。JSPデモ・アプリケーションには、http://host:port/mapviewer/fsmc/omaps.jspでアクセスできます。このアプリケーションでは、ユーザーの入力に基づいて、MapViewerインスタンスで定義されている任意のマップ・タイル層によって表示されるマップを表示できます。

6.7.1.2 FOIメタデータの定義

データベース問合せの結果に基づきアプリケーションで動的地物をテーマベースFOI層として表示する必要がある場合は、テーマベースFOI層ごとに、事前定義済のMapViewerテーマを作成する必要があります。個々の動的地物をアプリケーションでユーザー定義FOIとして表示する必要がある場合は、FOIサーバーによって使用されるレンダリング・スタイル(複数可)を定義してFOI画像をレンダリングする必要があります。事前定義済のテーマおよびレンダリング・スタイルを作成するには、Map Builderツール(第7章を参照)を使用します。

6.7.1.3 V1 APIを使用したクライアント・アプリケーションの作成

Webブラウザ内で動作するOracle Mapsクライアント・アプリケーションは、プラグインを必要としない純粋なHTMLページおよびJavaScriptページです。そのため、そのようなアプリケーションは、純粋なHTMとしてコンテンツを配信する任意のWebテクノロジを使用して作成できます。そのようなテクノロジには、JavaServer Pages、Javaサーブレット、ASP、.NET C#などがあります。この項では純粋なHTML形式を使用したクライアント・アプリケーションの開発についてのみ説明しますが、それは他のWebテクノロジにも簡単に適用できます。

6.1.2項例6-1で示したように、Oracle Mapsアプリケーションのソース・コードは通常HTMLページにパッケージされますが、それは次の部分から構成されます。

  • <script>要素: Oracle Mapsクライアント・ライブラリをブラウザのJavaScriptエンジンにロードします。例6-1の場合、この要素は次のとおりです。

    <script language="Javascript" src="jslib/oraclemaps.js"></script>
    
  • HTML DIV要素 - Webページ内でマップ・コンテナとして使用されます。DIV要素のサイズと位置は、ユーザーのニーズに合わせてカスタマイズできます。例6-1の場合、この要素は次のとおりです。

    <div id="map" style="left:10; top:60;width: 600px; height: 500px"></div>
    
  • JavaScriptコード: マップ・クライアント・インスタンスの作成および初期化を実行します。マップ・クライアント・インスタンスの作成、初期マップ・コンテンツ(マップ・タイル層、FOI層など)の設定、初期マップの中心とズーム・レベルの設定、アプリケーションに固有なロジックの実装、マップの表示、およびその他のアプリケーションに固有なロジックの実装が実行されます。

    このコードは、JavaScript関数(サーバーからクライアントWebブラウザにHTMLページがロードされたときに実行される)の中にパッケージします。例6-1の場合、この関数はon_load_mapviewという名前です。

    function on_load_mapview() 
    {        
      var baseURL  = "http://"+document.location.host+"/mapviewer";
      // Create an MVMapView instance to display the map
      var mapview = new MVMapView(document.getElementById("map"), baseURL);
      // Add a map tile layer as background.
      mapview.addMapTileLayer(new MVMapTileLayer("mvdemo.demo_map"));   
      // Add a theme-based FOI layer to display customers on the map
      var themebasedfoi = new MVThemeBasedFOI('themebasedfoi1','mvdemo.customers');
      themebasedfoi.setBringToTopOnMouseOver(true);
      mapview.addThemeBasedFOI(themebasedfoi);
      // Set the initial map center and zoom level
      mapview.setCenter(MVSdoGeometry.createPoint(-122.45,37.7706,8307));   
      mapview.setZoomLevel(4);    
      // Add a navigation panel on the right side of the map
      mapview.addNavigationPanel('east');
      // Add a scale bar
      mapview.addScaleBar();
      // Display the map.
      mapview.display();
    }
    

    この関数は、<body>要素のonload属性で指定するため、Webページがロードされた後に実行されます。例6-1の場合、このコードは次のとおりです。

    <body onload= JavaScript:on_load_mapview() >
    
  • その他のHTML要素およびJavaScriptコード: アプリケーションに固有なその他のユーザー・インタフェースおよび制御ロジックを実装します。6.1.2項例6-1の場合、JavaScript関数setLayerVisibleは、ユーザーが「Show customers」チェック・ボックスを選択または選択解除したときにテーマベースFOI層を表示または非表示にするために実装されています。setLayerVisible関数のコードは、次のとおりです。

    function setLayerVisible(checkBox)
    {
            // Show the theme-based FOI layer if the check box is checked
            // and hide the theme-based FOI layer otherwise.
      if(checkBox.checked)
        themebasedfoi.setVisible(true) ;
      else
        themebasedfoi.setVisible(false);
    }
    

    この関数は、チェック・ボックスを定義する<INPUT>要素のonclick属性で指定されているので、該当するチェック・ボックスをユーザーがクリックするたびに実行されます。例6-1の場合、このコードは次のとおりです。

    <INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show customers
    

6.7.2 V2 APIの使用

V2 APIを使用したアプリケーションの開発は、V1 APIのプロセスと似ています。ベース・マップ、マップ・タイル層およびインタラクティブな層またはテーマに使用するすべての空間データがOracleデータベースに格納されている場合、Map Builderツールを使用したマップ作成プロセスは、どちらのAPIでも同じです。

基礎となるベース・マップおよび層をOracleデータベース内で管理する場合、クライアント・アプリケーションに表示される各マップ・タイル層は、対応するデータベース・メタデータ・エントリをUSER_SDO_CACHED_MAPSメタデータ・ビュー内に保持している必要があります(第6.2.2.2項を参照)。同様に、インタラクティブな層がデータベース・コンテンツに基づいている場合、その層はメタデータ・エントリをUSER_SDO_THEMESビュー内に保持している必要があります(第2.9項、特に第2.9.2項を参照)。このようなタイル層とインタラクティブな層、およびそれらのスタイルとスタイリング・ルールは、Map Builderツールを使用して定義できます(第7章を参照)。

バージョン2 (V2) APIを使用してOracle Mapsアプリケーションを開発するには、次の基本的な手順に従います。

  1. oraclemapsv2.jsライブラリをインポートします。

    このAPIは、MapViewer EARアーカイブの一部としてパッケージされた単一のJavaScriptライブラリに含まれています。

  2. MapViewerをデプロイおよび起動した後、次のように<script>タグを通じてライブラリをロードします。

    <script  type="text/javascript" url="http://localhost:8080/mapviewer/jslib/v2/oraclemapsv2.js"/>
    
  3. HTMLページ内で、インタラクティブなマップを格納する<DIV>タグを作成します。(これはV1 APIの場合と同じです。)

  4. すべてのマップ表示関数を処理するクライアント側マップ・インスタンスを作成します。

    クラスの名前はOM.Mapであり、これがV2 APIのメインのエントリ・ポイントです。このため、V2のOM.Mapは、V1のMVMApViewと同等です。

  5. マップ汎用を設定します(次のオプション手順を実行した場合は除く)。

    基本的に、マップ汎用はマップ全体のエクステント、ズーム・レベルの数、およびオプションで各ズーム・レベルの解像度(ピクセル当たりのマップ単位)を定義します。V1 APIでは、この情報はタイル層の定義に含まれています。これらはV2でも引き続き機能しますが、V2ではインタラクティブなベクター層やテーマを表示するために、事前定義済タイル層は必要ありません。たとえば、地域別の売上を示すインタラクティブなテーマ・マップには、バックグラウンド・マップやタイル層は必要ありません。

  6. (オプション)バックグラウンド・マップとして機能するタイル層を追加します。

    タイル層には、データベースのmvdemo.demo_mapや、サポートされているNokia Mapsなどのサービスを使用できます。タイル層を追加した場合、マップ汎用も暗黙的に定義されるため、前述の手順(マップ汎用の設定)を実行する必要はありません。

  7. 1つまたは複数のインタラクティブなベクター層を追加します。

    OM.layer.VectorLayerは、V1 APIのMVThemeBasedFOIと同等です。主な相違点は、OM.VectorLayerがHTML5 (CanvasまたはSVG)テクノロジを使用して、すべてのデータをブラウザ内にレンダリングすることです。このため、別途指定されていないかぎり、ベクター層のすべてのコンテンツを一度ロードした後に、マップのズームまたはパン操作でデータベースへの問合せやデータのフェッチが発生することはありません。

  8. 1つまたは複数のマップ・コントロール、ツールおよびその他のアプリケーション固有のUIコントロールを追加して、表示する層、スタイリングおよびビジュアル効果をユーザーが設定できるようにします。

テーマがデフォルトでストリーミングされるのを防ぐ必要がある場合は、認証の追加によって保護する必要があります。つまり、MapViewer web.xmlファイルにセキュリティ制約を追加し、様々なテーマへのアクセスを認可するmds.xmlファイルを構成します。詳細は、1.6.2.16項「HTML5 API用のマップ・データ・サーバーの構成および保護」を参照してください。

V2 APIの使用の詳細な手順と関連情報は、Oracle提供のチュートリアルとデモを参照してください。

関連項目:

6.7.2.1 V2 APIを使用したクライアント・アプリケーションの作成

Oracle Maps V2アプリケーションはWebブラウザ内で動作し、その要件はHTML5 (Canvas)のサポートとJavaScriptの有効化のみです。追加のプラグインは必要ありません。

6.1.2項例6-1「単純なアプリケーションのソース・コード(V1 API)」で示したように、Oracle Mapsアプリケーションのソースは通常HTMLページにパッケージされますが、それは次の部分から構成されます。

  • <script>要素 - Oracle Maps V2クライアント・ライブラリをブラウザのJavaScriptエンジンにロードします。例:

    <script src="/mapviewer/jslib/v2/oraclemapsv2.js"></script>
    
  • HTML <div>要素 - マップを格納します。例:

    <div id="map" style="width: 600px; height: 500px"></div>
    
  • JavaScriptコード - マップ・クライアント・インスタンスを作成し、初期マップ・コンテンツ(タイルおよびベクター層)、初期マップの中心とズームおよびマップ・コントロールを設定します。このコードは、HTMLページがロードされたとき、または準備完了になったときに実行される関数の中にパッケージします。この関数は、HTMLページの<body>要素のonload属性で指定します。例:

    function on_load_mapview()
    {
      var baseURL  = "http://"+document.location.host+"/mapviewer";
      // Create an OM.Map instance to display the map
      var mapview = new OM.Map(document.getElementById("map"),
                               {
                                 mapviewerURL:baseURL
                               });
      // Add a map tile layer as background.
      var tileLayer = new OM.layer.TileLayer(
            "baseMap",
            {
                dataSource:"mvdemo",
                tileLayer:"demo_map",
                tileServerURL:baseURL+"/mcserver"
            });
      mapview.addLayer(tileLayer);
      // Set the initial map center and zoom level
      var mapCenterLon = -122.45;
      var mapCenterLat = 37.7706;
      var mapZoom = 4;
      var mpoint = new OM.geometry.Point(mapCenterLon,mapCenterLat,8307);
      mapview.setMapCenter(mpoint);
      mapview.setMapZoomLevel(mapZoom);
      // Add a theme-based FOI layer to display customers on the map
      customersLayer = new OM.layer.VectorLayer("customers",
            {
                def:
                    {
                    type:OM.layer.VectorLayer.TYPE_PREDEFINED,
                    dataSource:"mvdemo", theme:"customers",
                    url: baseURL,
                    loadOnDemand: false
                    }
            });
      mapview.addLayer(customersLayer);
      // Add a navigation panel on the right side of the map
      var navigationPanelBar = new OM.control.NavigationPanelBar();
      navigationPanelBar.setStyle(
    {backgroundColor:"#FFFFFF",buttonColor:"#008000",size:12});
      mapview.addMapDecoration(navigationPanelBar);
      // Add a scale bar
      var mapScaleBar = new OM.control.ScaleBar();
      mapview.addMapDecoration(mapScaleBar);
      // Display the map.
      // Note: Change from V1. In V2 initialization and display is done just once
      mapview.init();
    }
    
  • その他のHTML要素およびJavaScriptコード - アプリケーション固有のその他のユーザー・インタフェースおよび制御ロジックを実装します。たとえば、HTML <input>要素をJavaScript関数setLayerVisibleとともに使用して、層の表示コントロールを実装します。setLayerVisible関数のコードは、次のとおりです。

    function setLayerVisible(checkBox)
    {
      // Show the customers vector layer if the check box is checked and
      // hide it otherwise.
      if(checkBox.checked)
        customersLayer.setVisible(true) ;
      else
        customersLayer.setVisible(false);
    }
    

    この関数は、チェック・ボックスを定義する<input>要素のonclick属性で指定します。次の例では、ユーザーが「Show Customers」チェック・ボックスをクリックしたときに関数を実行します。

    <INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show Customers
    

6.7.2.2 V2 APIを使用したマップ・テンプレートのロード

Oracle Maps V2 APIでは、マップ・テンプレート構成ファイルをロードできます(6.5項「マップ・テンプレート」を参照)。ユーザーはこのマップ・テンプレートのコンテンツを使用してアプリケーションを作成できます。

次の例は、マップ・テンプレートを初期化し、現在のマップ・インスタンスと関連付け、テンプレートのベクター層をマップ・インスタンスに追加します。

<script type="text/javascript"> 
 var mapper; 
 var subLayer; 
  
  $(document).ready(function() { 
  
  mapper = new OM.Map( 
    document.getElementById('map'), 
    {mapviewerURL: "http://" + document.location.host + "/mapviewer"} 
  ); 
  
  var template = new OM.template.Template({ 
      name: "myTemplate", 
      url: "config.json" 
  }); 
  
  //this call initializes the template and binds it to the current map instance 
  template.setupMapControls(mapper); 
 
  ...

 // add layers to map instance
    var tc = template.getConfig();
    var layers = tc.vectorLayerList();
    for (var i = 0; i < layers.length; i++)
    {
      if (layers[i] === 'us_states')
       continue;
 
      myLayer = template.getVectorLayer(layers[i], layers[i]);
      myLayer.setVisible(false);
      mapper.addLayer(myLayer);
     }
 
  ...
 
  mapper(init);
 
  // associate events with a vector layer
  /adds a right-click listener to the us_states layer that displays the child layer of the clicked state.
 
  var statesLayer = mapper.getLayerByName("us_states");
                   
  statesLayer.addListener(OM.event.MouseEvent.MOUSE_RIGHT_CLICK, function(evt) {
     mapper.removeLayer(mapper.getLayerByName(subLayer));
     var targetFeature = evt.feature,
        targetStyle = targetFeature.getRenderingStyle(),      
        state_abrv = targetFeature.getAttributes()["STATE_ABRV"];
     subLayer = state_abrv + " Counties";
 
     //gets the child layer, but only those in state_abrv.
       var vector = template.getChildLayer(subLayer, "us_states", "Counties of USA", [state_abrv]);
       vector.setRenderingStyle(targetStyle);
       mapper.addLayer(vector);
     }); 
 
  ...
     }
</script>

6.8 Google MapsとBing Mapsの使用

アプリケーションでは、Google MapsタイルまたはMicrosoft Bing Mapsタイルを組込みのマップ・タイル層として表示できます。これを行うには、MVGoogleTileLayerまたはMVBingTileLayerのインスタンスをそれぞれ作成し、マップ・ウィンドウに追加します。Oracle Mapsクライアントは、内部的に公式のGoogle MapsまたはBing Maps APIを使用して、Google MapsまたはMicrosoft Bing Mapsサーバーによって直接提供されるマップを表示します。

  • Google Mapsタイルを使用するには、タイルの使用方法がGoogleによって規定されているサービス条件に適合する必要があります(https://developers.google.com/readme/termsを参照)。

  • Bing Mapsタイルを使用するには、Bing Mapsアカウントを取得する必要があります。使用方法は、Microsoftが規定するライセンス要件に適合する必要があります(http://www.microsoft.com/maps/を参照)。

Google MapsまたはMicrosoft Bing Mapsタイル層の上部にユーザー独自の空間データをオーバーレイする必要がある場合は、6.9項「Spherical Mercator座標系へのデータ変換」を参照してください。

次の項では、組込みマップ・タイル層を使用する2つのオプションについて説明します。

6.8.1 クライアント側でのGoogle MapsおよびBing Mapsマップ・タイル層の定義

組込みのマップ・タイル層をクライアント側で定義するには、MVGoogleTileLayerまたはMVBingTileLayerオブジェクトを作成し、それをMVMapViewオブジェクトに追加する必要があります。(Oracle Fusion Middlewareリリース11.1.1.6では、MVGoogleTileLayerはデフォルトでGoogle Mapsバージョン3 APIを使用し、MVBingTileLayerはデフォルトでBing Mapsバージョン7 APIを使用します。)

たとえば、Googleタイルを使用するには、マップにGoogleタイル層を追加します。

mapview = new MVMapView(document.getElementById("map"), baseURL);
tileLayer = new MVGoogleTileLayer() ;
mapview.addMapTileLayer(tileLayer);

アプリケーションで、メソッドMVGoogleTileLayer.setMapTypeまたはMVBingTileLayer.setMapTypeを起動して、マップ・タイプをマップ・プロバイダがサポートするタイプのいずれか(道路、衛星、ハイブリッドなど)に設定できます。

使用例と詳細は、JavaScript APIドキュメントのMVGoogleTileLayerMVBingTileLayer、およびチュートリアル・デモの組込みGoogle Mapsタイル層組込みBing Mapsタイル層を参照してください。

6.8.2 サーバー側での組込みマップ・タイル層の定義

サーバー側で定義した組込みマップ・タイル層は、クライアント側で標準のMapViewerタイル層として使用できます。サーバー側で組込みマップ・タイル層を定義するには、次の手順に従います。

  1. MapViewer管理ページにログインします(1.6.1項を参照)。

  2. マップ・タイル層の管理タブを選択し、「作成」をクリックします。

  3. マップ・ソースのタイプを選択するように求められたら、Google MapsまたはBing Mapsを選択し、「続行」をクリックします。

  4. タイル層を定義するデータソースを選択します。

  5. マップ・プロバイダから取得したライセンス・キーを設定します。

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

サーバー側で作成した組込みマップ・タイル層は、MapViewerが提供する他のタイル層のように使用できます。外部JavaScriptライブラリをロードするために、<script>タグを追加する必要はありません。

次の例は、サーバー側に定義したBing Mapsタイル層を示しています。

mapview = new MVMapView(document.getElementById("map"), baseURL);
// The Bing tile layer is defined in data source "mvdemo".
tileLayer = new MVMapTileLayer("mvdemo.BING_MAP") ; 
mapview.addMapTileLayer(tileLayer);

アプリケーションで、メソッドMVMapTileLayer.setMapTypeを起動して、マップ・タイプをマップ・プロバイダがサポートするタイプのいずれか(道路、衛星、ハイブリッドなど)に設定できます。

6.9 Spherical Mercator座標系へのデータ変換

Google MapsやMicrosoft Bing Mapsのような一般的なオンライン・マップ・サービスは、地図にSpherical Mercator投射を使用します。Oracle Databaseリリース11.1.0.7より前の製品を使用し、Google MapsやMicrosoft Bing Mapsといったタイル層の上に独自の空間データをオーバーレイする必要がある場合は、タイル層の座標系と独自のデータ座標系間で座標系の変換を正しく処理できるように、データベースを設定する必要があります(2つの座標系が異なる場合)。


注意:

この項のアクションを実行するには、データベースのリリースが10.2.0.1以降である必要があります。

Google MapsはSpherical Mercator座標系(EPSG: 3785)を使用しています。これは、Yahoo! MapsやMicrosoft Bing Mapsなどの商用APIプロバイダの間でも広く使用されています。この座標系(SRID 3785)は、Oracle Spatial and Graphリリース11.1.0.7より前の製品では提供されていませんでした。独自データをこの座標系に変換するためにMapViewerおよびOracle Spatial and Graphを有効にするには、先にこの座標系定義をOracleデータベースに追加する必要があります(まだ定義されていない場合)。

この座標系が定義されているかチェックするには、以下の文を入力します。

SELECT srid FROM mdsys.cs_srs WHERE srid=3785;

この文で行が返された場合、この項のアクションを実行する必要はありません。この文で行が返されない場合は、この項のアクションを実行して、独自の空間データをタイル層の上にオーバーレイできるようにする必要があります。

次の手順を実行します。

  1. DBAロールを持つユーザーなど、権限のあるユーザーとしてデータベースに接続します。

  2. 次のようにcsdefinition.sqlスクリプトを実行します。($OC4J_HOMEを、MapViewerがデプロイされているOC4Jインスタンスのルート・ディレクトリと置き換え、コマンドを1行で入力します。)

    • Linux: $OC4J_HOME/j2ee/home/applications/mapviewer/web/WEB-INF/admin/csdefinition.sql

    • Windows: $OC4J_HOME\j2ee\home\applications\mapviewer\web\WEB-INF\admin\csdefinition.sql

  3. 必要に応じて、指定の座標系からSpherical Mercator座標系に変換する際に、Oracle Spatial and Graphがデータ変換をスキップするように変換ルールを作成します。このような変換ルールを作成する必要があるかどうか判断するには、6.9.1項を参照してください。

  4. パフォーマンスを向上させるために空間データを事前に変換するか、MapViewerによって実行時にデータ変換を行ってください(「オンザフライ」)。データベースのリリースが10.2.0.4より前の場合、事前に変換するしか手段はありません。

    • すべてのデータをSpherical Mercator座標系に事前に変換するには、すべてのデータにSDO_CS.TRANSFORM_LAYERプロシージャを使用し、変換されたデータをマッピングに使用します。(Oracle Spatial and Graph開発者ガイドのSDO_CS.TRANSFORM_LAYERのリファレンスの項を参照してください。)

    • MapViewerで実行時にデータを変換する場合、マッピングに使用する前にデータを変換しないでください。

6.9.1 データ変換をスキップするトランスフォーメーション・ルールの作成

空間データは通常、WGS84やBNGなどの楕円データに基づく座標系で使用されます。この場合、データをSpherical Mercator座標系に変換する際に、Oracle Spatial and Graphはデフォルトでデータ変換を適用します。これによって、ユーザーのデータとGoogle Mapsや他のマップ・サービス・タイルとの間で、わずかな不一致や誤差が発生します。この問題を解決するには、指定の座標系からSpherical Mercator座標系に変換する際に、Oracle Spatial and Graphがデータ変換をスキップするように変換ルールを作成します。

例6-11は、csdefinition.sqlスクリプトに含まれている、こうしたトランスフォーメーション・ルールを作成するSQL文を示します。ただし、使用する空間データの座標系が例6-11に示すルールの対象でない場合は、データの座標系がこれらのルールの対象でなければ、独自のルールを作成できます。(座標系の変換ルールの作成の詳細は、Oracle Spatial and Graph開発者ガイドを参照してください。)

図6-11 csdefinition.sqlスクリプトに定義されたトランスフォーメーション・ルール

-- Create the tfm_plans, that is, the transformation rules.
-- Note: This will result in an incorrect conversion since it ignores a datum
-- datum between the ellipsoid and the sphere. However, the data will match
-- up better on Google Maps.
 
-- For wgs84 (8307)
call sdo_cs.create_pref_concatenated_op( 83073785, 'CONCATENATED OPERATION 8307 3785', TFM_PLAN(SDO_TFM_CHAIN(8307, 1000000000, 4055, 19847, 3785)), NULL);
 
-- For 4326, EPSG equivalent of 8307
call sdo_cs.create_pref_concatenated_op( 43263785, 'CONCATENATED_OPERATION_4326_3785', TFM_PLAN(SDO_TFM_CHAIN(4326, 1000000000, 4055, 19847, 3785)), NULL); 
 
-- For OS BNG, Oracle SRID 81989
call sdo_cs.create_pref_concatenated_op( 819893785, 'CONCATENATED OPERATION 81989 3785', TFM_PLAN(SDO_TFM_CHAIN(81989, -19916, 2000021, 1000000000, 4055, 19847, 3785)), NULL); 
 
-- For 27700, EPSG equivalent of 81989
call sdo_cs.create_pref_concatenated_op( 277003785, 'CONCATENATED_OPERATION_27700_3785', TFM_PLAN(SDO_TFM_CHAIN(27700, -19916, 4277, 1000000000, 4055, 19847, 3785)), NULL);
commit;

6.10 外部タイル層の動的な表示

Oracle Maps JavaScript APIでは、定義またはタイル画像がサーバー側に格納されていない場合でも、外部タイル層の動的な表示がサポートされます。基本的には、クラスMVCustomTileLayerを使用して、ESRI ArcGISタイル・サーバー、OpenStreetマップ・タイル・サーバー、その他のベンダー固有のマップ・タイル・サーバーなど、Web上にある任意の外部マップ・タイル・サーバーから直接提供されるタイル層を参照して表示できます。

これを行うには、新しいMVCustomTileLayerインスタンスの作成時に、次のことを行う必要があります。

  • マップ・タイル層の構成(特に座標系、境界およびズーム・レベル)を確認する。

  • Oracle Mapsからのタイル・リクエストを外部タイル・サーバーからのタイルURLに変換できる関数を提供する。

タイル層の構成にはJSONオブジェクトの形式が使用され、通常は次の例のような形式になります。

var mapConfig = {mapTileLayer:"custom_map", format:"PNG", 
coordSys:{srid:8307,type:"GEODETIC",distConvFactor:0.0, minX:-180.0,minY:-90.0,maxX:180.0,maxY:90.0}, 
zoomLevels: 
[{zoomLevel:0,name:"level0",tileWidth:15.286028158107968,tileHeight:15.286028158107968,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:1,name:"level1",tileWidth:4.961746909541633,tileHeight:4.961746909541633,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:2,name:"level2",tileWidth:1.6105512127664132,tileHeight:1.6105512127664132,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:3,name:"level3",tileWidth:0.5227742142726501,tileHeight:0.5227742142726501,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:4,name:"level4",tileWidth:0.16968897570090388,tileHeight:0.16968897570090388,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:5,name:"level5",tileWidth:0.05507983954154727,tileHeight:0.05507983954154727,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:6,name:"level6",tileWidth:0.017878538533723076,tileHeight:0.017878538533723076,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:7,name:"level7",tileWidth:0.005803187729944108,tileHeight:0.005803187729944108,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:8,name:"level8",tileWidth:0.0018832386690789012,tileHeight:0.0018832386690789012,tileImageWidth:256,tileImageHeight:26},
{zoomLevel:9,name:"level9",tileWidth:6.114411263243185E-4,tileHeight:6.114411263243185E-4,tileImageWidth:256,tileImageHeight:256} ]
};

Oracle Mapsからのタイル・リクエストを外部タイル・サーバーからのタイルURLに変換できる関数を提供するには、次の例のような関数を指定します。

function getMapTileURL(minx, miny, width, height, level) 
{
 var x = (minx-mapConfig.coordSys.minX)/mapConfig.zoomLevels[level].tileWidth ; 
var y = (miny-mapConfig.coordSys.minY)/mapConfig.zoomLevels[level].tileHeight ; 
return "http://localhost:8888/mapviewer/mcserver?request=gettile&format=" + mapConfig.format + "&zoomlevel="+level+"&mapcache=mvdemo.demo_map&mx=" + Math.round(x) + "&my=" + Math.round(y) ;
}

前述の例において、アプリケーションによって実装された関数getMapTileURL()は、マップ・タイル画像を外部タイル・サーバーからフェッチし、そのマップ・タイル画像の左上隅を、Oracle Mapsクライアントによって指定されたマップ位置(minx,miny)に配置する、有効なURLを提供します。各マップ・タイル画像には、指定されたサイズ(width,height)および指定されたズーム・レベル(level)が使用されます。この特定の例で実際に返されるのは、ローカルMapViewerタイル・サーバーからのgettile URLですが、この方法はMapViewer以外のどのタイル・サーバーにも適用できます。

新しいカスタム・タイル層は、組込みのマップ・タイル層であるかのように、クライアントmapViewerに追加されます。