MapXtreme 2008 バージョン 7.0.0 開発者ガイド このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、このマニュアルに記載されている事項 に関して一切の責任を負いかねますのでご了承ください。このマニュアルを Pitney Bowes Software Inc., One Global View, Troy, New York 12180-8399 の書面に よる許諾なしに複製することは禁じられています。 ? 2009 Pitney Bowes Software Inc. All rights reserved.Pitney Bowes Business Insight、MapInfo、Group 1 Software、お よ び MapXtreme 2008 は、Pitney Bowes Software の傘下部門である Pitney Bowes Business Insight および関連会社の商標です。 アメリカ : 電話 : (518) 285-6000 ファックス : (518) 285-6070 営業部 : (800) 327-8627 公共機関向け営業部 : (800) 619-2333 テクニカル サポート : (518) 285-7283 テクニカル サポート ファックス : (518) 285-6080 www.pbinsight.com UK および EMEA : 電話 : 44 1753 848200 ファックス : 44 1753 621140 テクニカル サポート : 44 1753 848229 www.pbinsight.co.uk アジア太平洋 : 電話 : 61.2.9437.6255 ファックス : 61.2.9439.1773 テクニカル サポート : 1800 648 899 www.pbinsight.com.au Pitney Bowes MapInfo 製品のお問合せ先については、www.pbinsight.com/contactus をご覧ください。 このソフトウェアに含まれる SpatiaLite v.2.3 ライブラリは、Mozilla Public License Version 1.1 の下でライセンス供与されます。ライセンスは www.mozilla.org/ MPL からダウンロードできます。このライブラリのソース コードは、www.gaia-gis.it/spatialite/sources.html から入手できます。 ここに記載されている製品は、各代理製造元の登録商標です。登録商標名は編集の目的でのみ使用されるもので、この使用によって所有者の法律上の権利 を侵害するものではありません。 2009 年 12 月 目次 第 1 章: MapXtreme の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 MapXtreme の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 主な機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 MapXtreme への移行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 MapXtreme の使い方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 サポート リソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 第 2 章: はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 インストール要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 システム要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 最小システム要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 その他のソフトウェア要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 サポートされているデータベース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 インストールの種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 開発 (SDK) インストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 展開 (ランタイム環境) インストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 複数のバージョンのインストールと使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 MapXtreme ライセンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 ライセンスの種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 ライセンスの取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 ライセンス ファイルの場所 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 トラブルシューティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 ライセンスに関する既知の問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 インストールの前に . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 管理者権限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 .NET Framework と Visual Studio を最初にインストールしておく . . . . . . . . . . . . . . . . . . . 38 IIS 7.0 (Windows Vista、Windows Server 2008、Windows 7). . . . . . . . . . . . . . . . . . . . . . . . . 38 Wow64 環境での MapXtreme のデフォルト インストール ディレクトリ . . . . . . . . . . . . . 39 その他のインストール機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 現在の環境への MapXtreme のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 開発者ガイド iii 目次 MapXtreme へのアップグレード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 既存の Web サイトのアップデート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 既存のデスクトップ アプリケーションのアップデート . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Visual Studio でのアプリケーションの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 マップ アプリケーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 ASP.NET Web アプリケーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 MapXtreme コントロール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 テンプレートがない場合の ASP.NET Web アプリケーションの構築 . . . . . . . . . . . . . . . . . . . 51 アプリケーションの配布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 ランタイム インストーラを使った配布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 カスタム インストーラを使った配布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Web サイトの展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 データにアクセスするアプリケーションの配布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 プロキシ サーバの背後に展開される MapXtreme Web アプリケーション . . . . . . . . . . . . 57 配布する Web アプリケーションの一時ディレクトリへのアクセス権限 . . . . . . . . . . . . 57 アプリケーション データ ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 展開インストールのトラブルシューティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 第 3 章: マッピングの概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 マッピングと MapXtreme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 マップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 テーブル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 レイヤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 フィーチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 ラベルと凡例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 主題図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 ワークスペース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 座標系と投影法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 MapXtreme でのジオコード化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 MapXtreme でのルーティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 第 4 章: MapXtreme のアーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 MapXtreme アーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 オブジェクト モデルの概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 MapInfo.Data 名前空間. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 MapInfo.Data.Find 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 MapInfo.Engine 名前空間. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 MapInfo.Geometry 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 MapInfo.Mapping 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 MapInfo.Mapping.Legends 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 MapInfo.Mapping.Thematics 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 開発者ガイド iv 目次 MapInfo.Persistence 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 MapInfo.Raster 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 MapInfo.Styles 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 MapInfo.WebControls 名前空間. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 MapInfo.Windows 名前空間. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 MapInfo.Tools 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 MapInfo.Geocoding 名前空間. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 MapInfo.Routing 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 アプリケーションのアーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Web アプリケーションのアーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 デスクトップ アプリケーションのアーキテクチャ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 第 5 章: Web アプリケーション、コントロール、およびツール . . . . . . . . . . . . . . . 77 Web アプリケーションのリクエスト/レスポンスのライフサイクル . . . . . . . . . . . . . . . . . . . 78 MapXtreme Web アプリケーションのコンポーネント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 MapXtreme セッション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 バックグラウンド マップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 MapControl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 マップ ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 状態管理とプール機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 MapXtreme Web コントロールとツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Web コントロールとツールについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Web コントロールのアーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 マップ ツールのアーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 マップ ツールの動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 MapXtreme Web コントロールの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Web コントロールの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 イベント処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 エラーの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 状態管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 カスタム ツールの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 カスタム Web コントロールの使用と配布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Web アセンブリの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Web アプリケーションへの InfoTool の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 ASP.NET AJAX と MapXtreme Web アプリケーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 ASP.NET AJAX コントロールを MapXtreme Web アプリケーションに追加する方法 . . 94 MapXtreme タイル ハンドラ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 MapXtreme タイル ハンドラの使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 キャッシュ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 HTML/XHTML 検証の問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 開発者ガイド v 目次 ポスト バック Web コントロールから JavaScript Web コントロールへの移行 . . . . . . . . . . 100 データの読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 コントロールの置き換え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 状態およびイベントの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Web コントロールの特殊な使用法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 フレーム内での Web コントロールの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 テーブル セル内での MapControl の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Web コントロールのローカライズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 第 6 章: 状態管理について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 状態管理とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 状態管理の選択肢 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 アプリケーションを作成する前の検討事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 InProc 開発モデル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 InProc 開発モデルの長所と短所 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 InProc 管理: 解説 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 InProc 開発モデルを使用するアプリケーションの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . 112 InProc 開発モデルを使用する MapXtreme テンプレートの使用 . . . . . . . . . . . . . . . . . . . . 113 プール オブジェクトの状態管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 プールとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 プールの長所と短所 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Pooled アプリケーションの状態の保存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 手動状態管理: 解説 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Pooled アプリケーションにおける手動状態管理の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . 118 手動状態管理の詳細 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 主題図サンプルの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 アプリケーションの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 StateManager のインプリメント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 適切な順序での MapXtreme オブジェクトのシリアル化. . . . . . . . . . . . . . . . . . . . . . . . . . 122 MapXtreme オブジェクトの自動デシリアライズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 初期リクエストの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 以降のリクエストの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 MapXtreme Session の詳細 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Microsoft COM+ オブジェクト プールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 第 7 章: Web アプリケーションのパフォーマンス . . . . . . . . . . . . . . . . . . . . . . . . . 129 Web アプリケーションのパフォーマンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 ユーザ数について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 パフォーマンス チューニング. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 IIS サーバの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 開発者ガイド vi 目次 第 8 章: デスクトップ アプリケーション、コントロール、ダイアログ、ツール. . 135 デスクトップ アプリケーションの計画. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 デスクトップ アプリケーションのベスト プラクティス . . . . . . . . . . . . . . . . . . . . . . . . . 136 MapXtreme と COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 サンプル アプリケーションおよびプロジェクト テンプレート . . . . . . . . . . . . . . . . . . . 137 MapInfo.Windows.Controls 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 デスクトップ アプリケーションで使用可能な主要コントロール. . . . . . . . . . . . . . . . . . . . . 139 MapControl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 MapToolStripButtons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 MapToolBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 レイヤの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 MapInfo.Windows.Dialogs 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 CreateThemeWizard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 コントロールとダイアログ ボックスのカスタマイズ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 MapInfo.Tools 名前空間の概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 MapXtreme デスクトップ ツール API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 表示 (View) ツール. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 選択 (Select) ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 追加 (Add) ツール. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 カスタム (Custom) ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 図形作成 (Shape) ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 情報チップの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 ツールのカスタマイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 ツール イベント. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 選択 (Select) ツールを使用した FeatureGeometry の編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 フィーチャの形状変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 ノードの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 プログラムによる形状変更とノードの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 第 9 章: 中核 MapXtreme クラスでの作業 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 ISession インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 セッションの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Session.Dispose メソッドの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 ISessionEventHandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 シリアライゼーションと永続化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 シリアライゼーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 永続化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Selection (選択) クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Selection プロパティの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Selection の強調表示とエクスポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 SelectionChangedEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 開発者ガイド vii 目次 Selection クラスと Selections クラスの ISerializable インターフェイス . . . . . . . . . . . . . . 172 Selection のコード例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 別のフィーチャ内のフィーチャの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 テーブル内の選択範囲を調べる . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 テーブルのすべてのフィールドの取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Selection に合わせたマップ ビューの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 イベントの引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 第 10 章: データでの作業 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 MapInfo.Data 名前空間の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Catalog とテーブル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 テーブル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Catalog (カタログ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 サポートされているテーブルの種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 カタログとテーブルの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 開いているテーブルの検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 テーブルを閉じる . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 テーブルを圧縮する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 テーブル イベントとカタログ イベントのリッスン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 テーブル メタデータ (TableInfo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 TAB ファイル メタデータの検証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 新しいテーブルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 テーブルへの式フィールドの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 データ ソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 正しいデータ ソースの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 データへのアクセス方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 データ リーダー、MemTable、結果セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 ADO.NET データ プロバイダの使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 データ バインド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 テーブルをマップ作成可能にする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 MapInfo ADO.NET データ プロバイダ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 MIConnection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 MICommand. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 MIDataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 MapInfo SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Feature と Feature コレクション. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Feature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Feature コレクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Feature の検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Catalog 検索メソッド. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 SearchInfo と SearchInfoFactory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 開発者ガイド viii 目次 データの分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 データ アクセス パフォーマンスの強化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 第 11 章: 式の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 式の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 式の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 where 句 – ブール式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 式内の関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 式の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 第 12 章: DBMS のデータへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 リモートの空間データへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 .TAB ファイルを使用するリモート テーブル アクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 .TAB ファイルを使用しないリモート テーブル アクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 DBMS データと X/Y フィールドとのマッピング. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Oracle データへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 ジオメトリ変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Oracle での Z 値と M 値のサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 SDO_GEOMETRY Arc および Circle の変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 変換できない Oracle オブジェクトの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 中心点のサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Oracle 空間参照系 (SRID) のサポート. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 OCI 接続ダイアログ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 MS SQL Server データへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 SQL Server 2008 のサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 DBMS 接続文字列の形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 ODBC 接続文字列の形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Web アプリケーションの ODBC レイヤおよびプール . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Oracle Spatial の接続文字列の形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 接続文字列の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 サーバ テーブル クエリでのマップ作成可能テーブルの定義 . . . . . . . . . . . . . . . . . . . . . . . . 241 ジオメトリ フィールド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 キー フィールド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 属性データへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 パフォーマンスに関する問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 キャッシュの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 キャッシュとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 キャッシュの動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 TableInfoServer オブジェクトおよび CacheSettings プロパティ . . . . . . . . . . . . . . . . . . . . 245 MapInfo_MapCatalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 DBMS への空間データのロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 手動による MapInfo MapCatalog の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 開発者ガイド ix 目次 MapInfo_MapCatalog への行の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 レコードごとのスタイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Symbol 句、Pen 句および Brush 句の構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Text オブジェクトの制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 トラブルシューティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 第 13 章: アプリケーションへのマッピング機能の追加 . . . . . . . . . . . . . . . . . . . . . 257 MapInfo.Mapping 名前空間とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 マッピングのベース クラス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 MapExport (マップのエクスポート) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 MapFactory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 MapLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 MapViewList、MapView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 MapControl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Layers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 FeatureLayer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Layers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 MapLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 UserDrawLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 ObjectThemeLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 GroupLayer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 LabelLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 GraticuleLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 レイヤ フィルタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 IVisibilityConstraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 コード例: Animation レイヤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 LabelLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 LabelSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 LabelModifier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 ILabelSourceFilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 LabelProperties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 ラベルの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 ラベルの優先度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 ラベル レイヤの選択可能性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 コード例: LabelLayer の作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 湾曲ラベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Adornments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Legends. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 ScaleBar 修飾. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 Title 修飾 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 開発者ガイド x 目次 フィーチャ スタイル修飾子. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 FeatureStyleModifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 FeatureStyleModifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 FeatureOverrideStyleModifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 マップの印刷 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 第 14 章: 場所の検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 Find の機能の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Find の処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 番地の照合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 調整領域テーブルの照合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Find の結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Data.Find 名前空間の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Find. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 FindAddressRange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 FindCloseMatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 FindResult. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 Find 処理の調整 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 MapInfow.abb ファイルの編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 第 15 章: 主題図と凡例の使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 主題図の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 Mapping.Thematics 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 修飾子主題図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 オブジェクト主題図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 GraduatedSymbolTheme (サイズ可変シンボル主題図) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 サイズ可変シンボル主題図の用途 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 PieTheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 円グラフ主題図の用途 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 円グラフ主題図/棒グラフ主題図を含むマップの印刷 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 BarTheme (棒グラフ主題図) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 棒グラフ主題図の用途 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 円グラフ主題図および棒グラフ主題図の表示サイズの制御 . . . . . . . . . . . . . . . . . . . . . . 297 RangedTheme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 レンジ主題図の用途 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 レンジ値の種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 RangedLabelTheme (レンジラベル主題図) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 RangedLabelTheme クラスの用途. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 レンジ主題図とシリアライゼーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 IndividualValueTheme (個別値主題図) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 IndividualValueTheme クラスの用途 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 カスタム ビットマップ シンボルを使用する IndividualValueTheme の作. . . . . . . . . . . . . . . 301 開発者ガイド xi 目次 IndividualValueLabelTheme (個別値ラベル主題図) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 IndividualValueLabelTheme クラスの用途. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 個別値主題図とシリアライゼーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 DotDensityTheme (ドット密度主題図). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 DotDensityTheme クラスの用途 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 二変数主題図マップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 凡例の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 主題図凡例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 シンボル凡例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 凡例の書式設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 第 16 章: マップのスタイル設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 MapInfo.Styles 名前空間の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 StyleFactory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 スタイルの説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 AreaStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 BitmapPointStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 CompositeStyle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 SimpleInterior. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 Font. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 FontPointStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 GridStyle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 RasterStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 Hillshade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 Inflection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 SimpleLineStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 BasePointStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 BaseLineStyle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 BaseInterior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 StockStyles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 TextStyle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 SimpleVectorPointStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 定義済みのスタイルと StyleRepository クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 StyleRepository クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 スタイルの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 スタイルとレイヤ管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 カスタム ビットマップ スタイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 スタイルのオーバーライド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 FeatureOverrideStyleModifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 開発者ガイド xii 目次 第 17 章: 空間オブジェクトと座標系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 MapInfo.Geometry 名前空間とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 ジオメトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 Geometry オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 FeatureGeometry オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 Geometry オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 マップへの FeatureGeometry の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 ポリゴン内のポイントの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 座標系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 CoordSys オブジェクトの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 Geometry オブジェクトの座標系の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 MapControl 内のマップの座標系を調べる方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 MapXtreme への座標系の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 第 18 章: ラスタとグリッドの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 MapInfo.Raster 名前空間の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 ラスタ イメージ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 ラスタ クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 ラスタ イメージと座標系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 ラスタ再投影 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 ラスタ イメージの制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 コード サンプル: マップへのラスタ イメージの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 ラスタ ハンドラ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 カスタム ラスタ ハンドラの構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 グリッド イメージ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 グリッド クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 コード サンプル: マップへのグリッド イメージの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . 344 コード サンプル: グリッド マップからのデータの取得 . . . . . . . . . . . . . . . . . . . . . . . . . . 345 グリッド作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 グリッド補間クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 逆距離加重 (IDW) 補間クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 不定形三角網 (TIN) 補間クラス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 IInterpolator インターフェイス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 グリッド スタイル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 グリッド イメージと色調変化点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 色調変化点の計算方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 グリッド レイヤの色調変化値および色の計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 レリーフ色分け . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 [グリッド スタイル] ダイアログ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 GridInfoForm サンプル アプリケーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 開発者ガイド xiii 目次 第 19 章: ジオコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 MapInfo.Geocoding 名前空間の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 ジオコード化に関連した主要なクラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 GeocodeRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 GeocodeResponse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 GeocodeClientFactory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 GeocodingConstraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 AddressCandidates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 BaseGeocodeMatchCode と GeocodeMatchCode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 CandidateAddress. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 ジオコード モデルについて. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 ジオコード化のトレードオフ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 住所について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 カスタム ユーザ ディクショナリとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 Geocoding World とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 場所のジオコード化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 番地のジオコード化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 交差点のジオコード化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 郵便番号のジオコード化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 ガゼッティア型のジオコード化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 バッチ ジオコード処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 制約を使った正確なジオコード化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 一致制約とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 一致制約を緩和した場合の影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 近い一致の正確さについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 近い一致が 1 件存在 (S カテゴリ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 複数の候補からの最適一致 (M カテゴリ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 郵便番号中心点の一致 (Z カテゴリ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 地理的中心点での一致 (G カテゴリ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 一致が存在しない . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 第 20 章: Web Map Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 MapXtreme の Web Map Service の概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 WMS の処理について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 WMS サーバの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 手順 1: Web.config ファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 手順 2: ホストするデータ用の有効な WMS 構成ファイルの作成 . . . . . . . . . . . . . . . . . . 375 手順 3: WMS サーバの構成およびテスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 WMS サーバのレイヤ情報の構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 WMS レイヤのリクエスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 開発者ガイド xiv 目次 第 21 章: ルーティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 MapInfo.Routing 名前空間の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 主なルーティング クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 ルートの計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 ポイントツーポイント ルーティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 マルチポイント ルーティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 マトリックス ルーティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 高度なルート オプション. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 ルート設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 運転用指示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 ルート ジオメトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 回避するポイント、フィーチャ、セグメント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 時間ベース ルーティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 等値ルーティング (運転時間と運転距離) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 等時線の作成 (運転時間) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 等距離線の作成 (運転距離) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 ルーティング データを使用したリクエストの更新. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 セグメント情報の取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 一時更新 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 第 22 章: 線形リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 線形リファレンスとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 線形リファレンスでの M 値の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 指標値決定メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 線形リファレンス操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 動的セグメンテーション操作 (PerpendicularOffset) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 曲線の順序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 線形リファレンスのサンプル アプリケーション. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 第 23 章: Web Feature Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 Web Feature Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 WFS サーバの処理について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 WFS サーバの構成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 手順 1: Web.config ファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 手順 2: ホストするフィーチャ用の有効な WFS 構成ファイルの作成. . . . . . . . . . . . . . . 418 手順 3: WFS サーバの構成およびテスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 開発者ガイド xv 目次 MapXtreme WFS クライアントのプログラムによる使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 WFS クエリでのフィルタの使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 WFS レスポンスからのマップ レイヤの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 第 24 章: ワークスペース マネージャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 ワークスペース マネージャの機能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 ワークスペースの形式と内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 ワークスペース マネージャのメニュー コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 [ファイル] メニューのコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 [ビュー] メニューのコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 [マップ] メニューのコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 [ツール] メニューのコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 [機能拡張] メニュー コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 レイヤの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 レイヤ管理ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 レイヤ ツリー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 レイヤ管理ウィンドウのタブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 マップの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 レイヤの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 主題図レイヤの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 ラベル レイヤの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 グループ レイヤの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 スタイル オーバーライドの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 経緯度線レイヤの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 ワークスペース マネージャの機能の使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 GDI+ による透過性とアンチエイリアスを用いたレンダリングの拡張 . . . . . . . . . . . . . 456 半透明効果の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458 湾曲ラベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 経緯度線レイヤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 第 25 章: GeoDictionary マネージャの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 GeoDictionary マネージャの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 GeoDictionary マネージャの変更点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 GeoDictionary マネージャのユーザ インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 GeoDictionary マネージャの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 GeoDictionary ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 サンプルの .dct file. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 開発者ガイド xvi 目次 付録 A: MapXtreme への移行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475 MapXtreme のオブジェクト モデルと MapX の比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 各オブジェクト モデルに固有の相違点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 付録 B: MapXtreme アプリケーションを作成および展開する方法 . . . . . . . . . . . . 487 MapXtreme サンプルのカスタマイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 デスクトップ アプリケーションの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 サンプル アプリケーションの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 アプリケーションの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 リリース モードでのビルド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 デスクトップ アプリケーションのパッケージ化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 デスクトップ アプリケーションの展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Web アプリケーションの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 サンプル Web アプリケーションの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 アプリケーションの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 状態管理について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 リリース モード向けの構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 Web アプリケーションのパッケージ化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 Web アプリケーションの展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 付録 C: カスタマイズMapXtreme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 カスタマイズ可能なクラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 MapInfo.Data.Provider 名前空間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 Engine.CustomProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 FeatureStyleModifier または FeatureOverrideStyleModifier . . . . . . . . . . . . . . . . . . . . . . . . . . 511 UserDrawLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 Windows.Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 スタイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 GmlFeatureCollection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 WorkSpacePersistence および WorkSpaceLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 ワークスペース マネージャ機能拡張. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 ワークスペース機能拡張の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 機能拡張の読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 機能拡張のアンロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 機能拡張の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 アプリケーション データ ファイルの場所 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 略語ファイルの検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 開発者ガイド xvii 目次 付録 D: MapInfo ワークスペースについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 MapInfo ワークスペースとは. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 ワークスペースの構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 ヘッダー セクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 接続セクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 データソース定義セクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 マップ定義セクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 .GST からプログラムによる .MWS ワークスペースの作成 . . . . . . . . . . . . . . . . . . . . . . . 532 付録 E: 拡張可能データ プロバイダ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 拡張可能データ プロバイダの概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536 必須コンポーネント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538 オプションの基本構築ブロック: ベース クラス、ヘルパ、ユーティリティ. . . . . . . . . . . . 540 サンプル: COTW (Center of the World) データ プロバイダ . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 オプションのインターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 IDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 IDataSourceDefinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 ITableModifyProcessor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 データ プロバイダの作成とテスト. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 SpatiaLite サンプル データ プロバイダ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 高度なトピックと重要な検討事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 ジオメトリの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 座標系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 スタイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 永続化プロバイダ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 シリアライゼーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 認証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 スレッド セーフ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559 付録 F: MapXtreme アプリケーションからの印刷 . . . . . . . . . . . . . . . . . . . . . . . . . 561 概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 MapXtreme の印刷オプションについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 印刷サイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 透過ラスタの特殊処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 透過ベクトルの特殊処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 可能な場合ラスタ データを True Color で表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 GDI+ による透過性とアンチエリアシング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 ディザリング方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565 ポリゴンの穴の特殊処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565 開発者ガイド xviii 目次 パターンのスケール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565 デバイスへの直接出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 拡張メタファイル (EMF) を使用する出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 アプリケーションへの印刷のインプリメント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 印刷に関する一般的なヒント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 マップ内に凡例を印刷する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 これまでに知られている印刷に関する問題の対処方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 プラットフォームに依存しない問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572 プラットフォーム固有の問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572 付録 G: スタイルのルックアップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 フィル パターン. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 インデックス番号の指定方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 ライン スタイル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 ベクトル シンボル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 MapInfo Arrows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 MapInfo Cartographic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 MapInfo Miscellaneous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 MapInfo Oil & Gas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 MapInfo Shields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 MapInfo Real Estate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 Map Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 MapInfo Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 MapInfo Transportation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594 MapInfo Weather . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594 カスタム シンボル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 MapXtreme アイコン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 付録 H: MapInfo コードスペースの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 MapInfo コードスペースの定義. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 付録 I: 座標系の要素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 投影法とそのパラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606 投影法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607 投影法の測地系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 単位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620 座標系の原点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620 測地系の変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 カスタム測地系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 カスタム測地系の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 National Transformation v.2 (NTv2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627 座標系と投影法に関する情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630 開発者ガイド xix 目次 付録 J: ユーザ定義のメタデータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 メタデータと MapCatalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .632 ユーザ定義のメタデータにおける TableInfoServer クエリのサポート . . . . . . . . . . . . . . . . .632 ColumnHints プロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .632 付録 K: ローカライゼーション キット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 ローカライゼーション キット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .638 システム要件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .640 ローカライゼーション キットの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .640 サテライト アセンブリのビルド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .641 コマンド ラインからのビルド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .642 サテライト アセンブリへの秘密鍵の署名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .643 付録 L: 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645 用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .646 索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653 xx MapXtreme 2008 v6.8 MapXtreme の概要 Pitney Bowes Business Insight 社が提供する .NET プログラミングの世界によう こそ。Microsoft の .NET Framework をサポートするために、MapXtreme は、デ スクトップ、従来型のクライアント/サーバ、Web などの環境を対象に、マッ ピング アプリケーションの開発および拡張を実行する単一オブジェクト モデ ルを提供します。 MapXtreme は、データの視覚化とマッピングによる的確な意思決定、資産管理 および効率的な運営などを必要とする企業向けのアプリケーション開発ツール です。MapXtreme は、位置情報の分析や定義などの機能を、デスクトップ、ク ライアント/サーバ、Web ベースの製品に統合する必要がある企業向けに開発 されています。MapXtreme は、最適な販売拠点の選定、製品の搬送の効率化、 資産を管理および保護する方法など、ビジネス上の重要な意思決定に活用でき る強力な分析ツールキットです。また、開発作業で MapXtreme を活用すれ ば、開発期間を短縮し、パフォーマンス、信頼性、セキュリティを向上できま す。 この章の構成 「MapXtreme の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 「MapXtreme への移行」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 「MapXtreme の使い方」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1 MapXtreme の概要 MapXtreme は Pitney Bowes Business Insight の主要な Windows 用の開発ツールキットで、.NET の使 用経験がある開発者は、位置情報を活用する高機能なデスクトップ アプリケーションおよびクラ イアント/サーバ アプリケーションを作成できます。 この SDK を使用すると、お気に入りの .NET プログラム言語でアプリケーションを開発できま す。また、デスクトップ コードと Web 配布コードの共有や再利用を行ったり、標準プロトコルを 使用してさまざまなソースのデータにアクセスしたりできます。 MapXtreme のオブジェクト モデル (Microsoft .NET Framework で開発した 100 パーセント管理され たコードの API) を使用すると、これがすべて可能です。Framework の CLR (Common Language Runtime) は、簡単に開発を行うことができる土台を提供します。 MapXtreme を構成するコンポーネントや機能を、次に示します。 • • • • • • 製品フレームワーク : MapXtreme オブジェクト モデルは、Microsoft .NET Framework 2.0 を使用 して構築されています。MapXtreme アプリケーションを開発する際には、.NET Framework の バージョン 2.0、3.0 または 3.5 を対象とするように選択して、それらのバージョンでサポート されている機能を使用することができます。詳細については、「第 4 章、69 ページの「オブ ジェクト モデルの概要」 」を参照してください。 開発環境ツール : さまざまなテンプレート、コントロール、サンプル コード、およびツールを 使用し、Visual Studio で Windows Forms アプリケーションおよび ASP.NET アプリケーションを 開発できます。これらのコンポーネントを拡張することにより、オブジェクト モデルを通じて さらに高度な機能を使用できるようになります。データ管理ユーティリティとしては、アプリ ケーションで使用するテーブル管理を行うユーティリティ (Geodictionary マネージャ) とワーク スペースの操作性や移植性を高めるユーティリティ (ワークスペース マネージャ) の 2 種類が提 供されています。「第 5 章: 「Web アプリケーション、コントロール、およびツール」」およ び「第 8 章: 「デスクトップ アプリケーション、コントロール、ダイアログ、ツール」」を参 照してください。 完全なマッピングおよび分析機能 : マップの作成と表示、データ アクセス、主題図マップ、ラ スタおよびグリッド操作、オブジェクトの処理および表示など。 スケーラブルなインフラストラクチャ : セッション オブジェクト プール機能やキャッシュ機能 は、Web アプリケーションに高いパフォーマンスを提供します。MapXtreme の XML ベースの ワークスペース形式で情報を保存し、セッションやユーザ情報を保持します。「第 9 章: 「中 核 MapXtreme クラスでの作業」」を参照してください。 実行時コンポーネントの配布: MapXtreme では、Windows Installer テクノロジ (マージ モジュー ル) によって、導入されたアプリケーションで使用されている実行時コンポーネントのインス トールや再配布を実行します。「第 2 章、52 ページの「アプリケーションの配布」 」を参照 してください。 詳細なマニュアル : 製品マニュアルは、Visual Studio 開発環境の統合コンポーネントとして取得 します。MapXtreme ラーニング リソース ページから、今回のリリースの新機能や変更された 機能をはじめとする、すべての製品リソースを参照することができます。リソース ページに は、Windows の [スタート] メニューからアクセスできます。 主な機能 MapXtreme には、Windows Forms や ASP.NET Web アプリケーションを効率的に開発するための機 能やツールが搭載されています。アプリケーションの基礎となるマップを作成する場合や、基本 的なマッピング機能を追加して既存アプリケーションをサポートする場合には、いずれも同じフ レームワークやツールを使用できます。以下に、MapXtreme の機能の概要を示します。 22 MapXtreme 2008 v7.0.0 第 1 章 : MapXtreme の概要 Pitney Bowes Business Insight 社のマッピング製品を初めてお使いになる方は、基本的な内容につい て、第 3 章: 「マッピングの概念」を参照してください。 MapXtreme にアップグレードする開発者の方は、新機能と変更された機能をリリース ノートでご 覧いただけます。MapX の機能と MapXtreme .NET の機能の対応付けについては、24 ページの 「MapXtreme への移行」も参照してください。 機能 * 目的 テーブル、レイヤ、フィー MapXtreme のマップは、ポイント、境界、番地などの地理的な特 チャ 徴で構成されます。このようなフィーチャ情報は、テーブルに格 納され、マップのレイヤで表示されます。 データ アクセス MapXtreme は、空間および非空間 RDBMS、MS Access、dBase、 ASCII、ネイティブの MapInfo テーブル (.TAB) など、さまざまな ソ ー ス の デ ー タ を サ ポ ー ト し ま す。す べ て の デ ー タ 操 作 は、 MapInfo.Data 名前空間を使って実行されます。操作には、テーブ ルの追加や削除、各種データ ソースに対するデータの挿入、更 新、削除などが含まれます。 .NET データ プロバイダのサポート : あらゆる ADO.NET データ プ ロバイダを MapInfo.Data のテーブルとして扱うことができます。 これにより、マップ作成に対応していない外部データを使用する ことが可能になります。 Web サービス MapXtreme では、クライアントと API を提供しており、いくつか の有名な Web サービス (ジオコード化、ルーティング、WMS、お よび WFS) にアクセスできます。 選択と検索 属性や空間クエリを使えば、条件に合うデータだけを検索できま す。 主題図マッピング 最も広く使われているデータ分析の 1 つが、主題図マップを使っ て、関 連 性 や 潜 在 的 な デ ー タ を 視 覚 的 に 示 す 方 法 で す。 MapXtreme では、レンジ、個別値、可変シンボル、ドット密度、 円グラフ、棒グラフという 6 種類の主題図を作成および使用でき ます。 ラベル付け MapXtreme が提供する高度なラベル付け機能では、名前やその他 の情報 (フィールドのデータや式) を使ってフィーチャにラベルを 付けるだけでなく、ラベル自体にレンジ主題図や個別値主題図を 作成して、テキストだけでなくメッセージを表示することも可能 です。 マップ スタイル ラベル付けはマップ スタイルの形式の 1 つであり、マップ上で自 由にコントロールできます。また、スタイルは、フィーチャ、修 飾 ( マップ タイトル)、ダイア ログ ボックス、テキストなど、 MapXtreme の各種機能で使用されるマップ フィーチャの色、パ ターン、フォント、ライン スタイル、シンボルを指します。 開発者ガイド 23 MapXtreme への移行 機能 * 目的 地理情報の処理と分析 この処理では、郵便番号の境界を組み合わせて販売区域を作るな ど、既存のフィーチャから新しいフィーチャを作成します。ま た、フィーチャの地理的な位置の座標を使って、他のフィーチャ との関連性を把握します。たとえば、ポイントの 5 マイル圏内に バッファを作り、このバッファ ゾーン内に他のポイントがないか を確認します。 投影法と座標系 この 2 つは、2 次元マップで位置を示す手法です。データの座標 系を把握することにより、フィーチャを正しく配置でき、精密な 表示と計測が可能になります。MapXtreme は、幅広い種類の投影 法や座標系をサポートしており、ユーザ独自の投影法や座標系の 作成にも対応します。 * 言語または地域によっては、この製品のいくつかの機能またはツールがサポートされない場合が あります。詳細については、マップインフォ・ジャパン株式会社または MapInfo 代理店にお問い合 わせください。 MapXtreme への移行 以下は、MapX/MapXtreme v3.0 と .NET を基盤とした MapXtreme の機能比較表です。新しいアーキ テクチャについては、相当する機能が存在しない場合があります。この表の右側に掲載した MapXtreme トピックの詳細については、開発者ガイドや、オンライン ヘルプおよびオブジェクト モデルを参照してください。MapXtreme の MapX オブジェクト モデルおよび同等の機能の完全な リストについては、付録 A: 「MapXtreme への移行」を参照してください。 MapX5.0 /MapXtreme3.0 Map オブジェクト MapXtreme Map クラス : レイヤのコレクションを保持します。 MapControl : フォーム上でマップを表示する方法です。 MapInfo.Mapping 名前空間 MapXBroker Session クラス : MapXtreme をベースとするすべてのアプリケー ションの基点です。 関連トピック : MICommand、カタログ、プール MapInfo.Engine 名前空間 レイヤ中心のモデル テーブル中心のモデル 関連トピック : テーブル メタデータ (TableInfo クラス)、Feature ク ラ ス、Column クラス (MI_Geometry、MI_Style、MI_Key)、 MapInfo ADO.NET データ プロバイダ MapInfo.Data 名前空間 24 MapXtreme 2008 v7.0.0 第 1 章 : MapXtreme の概要 MapX5.0 /MapXtreme3.0 MapXtreme データセット、データ バイ Table.AddColumns() メソッドを使って、テーブルに一時フィール ンド ドを追加します。 関連トピック : Geodictionary マネージャ MapInfo.Data 名前空間 Geosets、 Geoset マネージャ ワークスペース (.MWS) : 新しい XML 形式。Geoset がサポートさ れます。 関連トピック : ワークスペース マネージャ MapInfo.Persistence 名前空間 注釈 修飾 : 単一のマップにある凡例、タイトル、スケール バー、その 他ユーザ定義オブジェクト MapInfo.Mapping 名前空間 主題図マッピング 同じ主題図マップ型。主題図は、レイヤではありません。 関連トピック : 修飾子主題図 (サイズ可変シンボル、円グラフ、 棒グラフ)、オブジェクト主題図 (レンジ、個別値、ドット密度) MapInfo.Mapping.Thematic 名前空間 フィーチャ レイヤとフィー FeatureGeometry : すべてのジオメトリはオブジェクトです。これ チャ コレクション に は、Point、MultiPoint、Curve、MultiCurve、Polygon、 MultiPolygon、Ring があります。 ジ オメトリには、Rectangle、Rounded Rectangle、Ellipse、Legacy Arc、Legacy Text があります。 関連トピック : CoordSysFactory (登録済みの座標系)、オブジェク ト処理 (下記の FeatureProcessor を参照) MapInfo.Geometry 名前空間 FeatureFactory FeatureProcessor クラス : オブジェクト処理を行う Buffer、 Combine、Intersection、ConvexHull。 関連トピック : FeatureGeometry クラスの Difference (旧リリースの Erase) MapInfo.Geometry 名前空間 ツール デスクトップ ツール SelectRegion は、マウス ボタンへの割り当 てやマウス ホイールの設定により、ズームを実行します。 MapInfo.Tools 名前空間 開発者ガイド 25 MapXtreme の使い方 MapX5.0 /MapXtreme3.0 MapXtreme ラスタ イメージとグリッド 新しいテーブル構造、RasterImageInfo、GridImageInfo。 イメージ 関連トピック : コントロール可能なスタイル : 明るさ、コントラ スト、色/グレー スケール、透明度、1 色の透明度 MapInfo.Raster 名前空間 ラベル オブジェクトとラベ LabelLayer : ラベルとレイヤを別々に並び替えることが可能で ル コレクション す。LabelSource : ラベル付けに使用するデータ ソースからの情報 です。 MapInfo.Mapping 名前空間 Selection オブジェクト Selection クラス : テーブルに関連付けられたフィーチャのリスト を格納するマルチフィーチャ コレクションです。 MapInfo.Engine 名前空間 空間サーバの接続性 MI ADO.NET データ プロバイダ、MapInfo SQL 言語。 MapInfo.Data 名前空間 Style オブジェクト Style クラス : 新しいオブジェクト モデル。Style は、他のオブ ジェクトのプロパティではなく、オブジェクトとして扱われ、情 報は MI_Style フィールドに格納されます。 関 連 トピック : MapInfo.Mapping FeatureStyleModifiers、FeatureOverrideStyleModifiers 名前空間の MapInfo.Styles 名前空間 MapXtreme の使い方 MapXtreme は、.NET の経験がない開発者にも経験がある開発者にも一様に多くの効果をもたらし ます。ここでは、豊富なサポート体制や資料が提示されているので、MapInfo コンポーネントを短 期間で学習でき、開発スケジュールの中断を最小限に抑えます。 サポート リソース MapInfo 社は、初めて MapInfo 製品をお使いになる開発者の方を責任を持ってサポートします。 Visual Studio 環境への迅速な移行や環境の準備をサポートする各種ツールとして、次のようなリ ソースを提供しています。 MapXtreme のラーニング リソース ページ ラーニング リソース ページには、MapXtreme のインストール後、Windows の [スタート] メニュー からアクセスすることができます。ここでは、開発のベスト プラクティス、コード サンプル、 Web アプリケーションに関するチュートリアル、MapInfo Web サイト上にあるすべてのマニュアル 26 MapXtreme 2008 v7.0.0 第 1 章 : MapXtreme の概要 やオンライン リソースへのリンクなど、MapXtreme に関する幅広い情報を表示することができま す。このページを参照しながら、MapXtreme を十分に活用して、ビジネス ニーズに合ったマッピ ング アプリケーションの開発を続けることができます。 マニュアルとヘルプ この『MapXtreme 開発者ガイド』では、MapXtreme の開発環境と名前空間について概要を説明し ます。Visual Studio の ヘ ル プ で は、MapInfo の強力なマッ ピング コンポーネントを統合した Windows デスクトップ アプリケーションや Web ベース アプリケーションを開発する際に、必要と なる API レ ベ ル の 詳細な情報が提供されます。マニュアルに関するご意見は、 [email protected] に送信してください。 注意 上記の電子メール アドレスは、ソフトウェアやマニュアルの内容に関する質問の問い合わ せには使用しないでください。このような質問は、テクニカル サポート (下記を参照) にお 問い合わせください。 MapInfo 社のマッピング製品を初めて操作および開発する方は、必ず「第 3 章: 「マッピングの概 念」」を参照してください。 MapXtreme のリリース ノートを Pitney Bowes Business Insight Web サイトから必ずダウンロードし て、最新バージョンに関する情報を確認してください。 開発者コミュニティ ページ 「Pitney Bowes Business Insight Code Exchange」は、MapXtreme に関連したコードを共有するための 開発者コミュニティ コード リソース ページです。 テクニカル サポート Pitney Bowes Business Insight 社は、MapInfo ソフトウェア製品のユーザを対象に、他社にはない優 れたテクニカル サポートを提供しています。テクニカル サポート部門は、MapInfo ソフトウェア の登録ユーザを対象に技術的なサポートを提供しますので、MapInfo 製品のあらゆる機能を完全に 理解する必要はありません。テクニカル サポートの内容については、Pitney Bowes Business Insight Web サイト (www.pbinsight.com) を参照してください。 開発者ガイド 27 MapXtreme の使い方 28 MapXtreme 2008 v7.0.0 はじめに この章では、MapXtreme アプリケーションのインストール、設定、および配布 について説明します。 この章の構成 「インストール要件」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 「インストールの種類」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 「MapXtreme ライセンス」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 「インストールの前に」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 「現在の環境への MapXtreme のインストール」 . . . . . . . . . . . . . . . . . 40 「MapXtreme へのアップグレード」 . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 「Visual Studio でのアプリケーションの作成」 . . . . . . . . . . . . . . . . . . 45 「テンプレートがない場合の ASP.NET Web アプリケーションの構 築」51 「アプリケーションの配布」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 2 インストール要件 ここでは、MapXtreme をインストールするためのシステム要件について説明します。 システム要件 Pitney Bowes Business Insight で は、MapXtreme が以下のオペレーティングシステム、.NET Framework、開発環境、および Web ブラウザに対応していることを確認しています。 オペレーティング システム • • • • • • • Windows XP Professional SP2 および SP3 Windows XP Professional Edition x64 SP2* Windows Server 2003 Standard Edition SP2 Windows Server 2003 Standard Edition x64 SP2 * Windows Server 2003 Web Edition SP2 Windows Server 2003 Enterprise Edition SP2 Windows Server 2003 Enterprise Edition x64 SP2 * • • • • Windows Server 2008 Standard Edition (x86、x64) SP1 Windows Server 2008 Enterprise Edition (x86、x64) SP1 Windows Vista Ultimate (x86、x64) Windows 7 Ultimate (x86、x64) 開発フレームワークと IDE のサポート † • • ブラウザ Microsoft .NET Framework 2.0 SP2 Visual Studio 2005 SP1(Professional Edition および Standard Edition) • Visual Studio 2008 SP1(Professional Edition および Standard Edition) • • • Internet Explorer 6.0** Internet Explorer 7.0** Internet Explorer 8.0** • Firefox 2.0、3.0、3.5 * 32 ビットのエミュレーション モードは、Microsoft の Windows-on-Windows (WoW64) テクノロジでのみサ ポートされます。 † ここには推奨される開発環境 (IDE) が示されています。このほかの IDE も使用できますが、MapXtreme イ ンストーラでテンプレート、サンプル、およびヘルプ システムを統合することはできません。 ** MapXtreme のラーニング リソースは、デフォルトのブラウザ設定に関係なく、自動的に Internet Explorer に 表示されます。これによって、デフォルトのブラウザ設定が変更されることはありません。 MapXtreme をインストールするためには、開発システムや展開先システムに .NET Framework 2.0 が インストールされている必要があります。MapXtreme のテンプレート、サンプル、およびヘルプ システムが統合されるように、使用するフレームワークに合った開発環境 (IDE) もインストールし ておくことをお勧めします。 注意 30 MapXtreme は、Borland Delphi 開発フレームワーク、Cold Fusion Web 開発フレームワーク、 HAHT Web 開発フレームワークには対応していません。 MapXtreme 2008 v7.0.0 第 2 章 : はじめに MapXtreme インストーラは .NET Framwork 2.0 を検索します。.NET Framework 2.0 がコンピュータ にインストールされていない場合、Framework をインストールする必要があることを示すメッセー ジが表示され、 MapXtreme のインストールが終了します。Microsoft .NET Framework のインストー ラは MapXtreme の製品 CD に収録されています。Framework をインストールするには、MapXtreme CD ブラウザのメイン ページで、[インストール] > [Microsoft .NET Framework] を選択します。 MapXtreme では、Microsoft Visual Studio の Express Editions をサポートしていません。 最小システム要件 メモリ Windows Server 2003: 256 メガバイト (MB) RAM Windows Server 2008: 512 MB RAM Windows XP: 256 MB RAM Windows Vista: 1 ギガバイト (GB) RAM Windows 7: 1 GB RAM (32 ビット)、2 GB RAM (64 ビット) プロセッサ Windows XP: 800 MHz Pentium III クラスのプロセッサ Windows Vista、Windows 7: 1 GHz プロセッサ Windows Server 2008: 1.4 GHz (x64) プロセッサ ビデオ カード 256 色以上に対応しているグラフィックス カード その他のソフトウェア要件 • • データ アクセス用に MDAC 2.7 以降 (MDAC 2.8 は MapXtreme 製品 CD に収録されています) IIS 5、IIS 6、 IIS 7 のいずれか (IIS 7 は Classic.ASP.NET 統合モードおよび II6 互換モードでサ ポート) サポートされているデータベース 次のデータベースがサポート対象となります。 • • • Microsoft Access 97 Microsoft Access 2000 Oracle 9iR • • • • Oracle 10G、10GR2 Oracle 11G (11.1.0.6.0 および 11.1.0.7.0) Microsoft SQL Server 2000 Microsoft SQL Server 2005 • • • Microsoft SQL Server 2008 (および SQL Native Client 10) MapInfo SpatialWare® 4.8.1 for Microsoft SQL Server 2000 MapInfo SpatialWare® 4.9 for Microsoft SQL Server 2000 • • MapInfo SpatialWare® 4.9 および 4.9.2 for Microsoft SQL Server 2005 MapInfo SpatialWare® 4.9.2 for Microsoft SQL Server 2008 32 ビットおよび 64 ビット エディション 開発者ガイド 31 インストールの種類 インストールの種類 MapXtreme には、開発 (SDK) と展開 (ランタイム環境) の 2 種類のインストール オプションが用意 されています。どちらのインストールを行うかは、製品の CD ブラウザから選択することができま す。 開発 (SDK) インストール 開発インストールでは、MapXtreme ソフトウェア開発キット (SDK) がコンピュータにインストー ルされます。デスクトップ アプリケーションおよび Web アプリケーションを開発する場合は、こ のインストールを選択します。この SDK はインストール時に Microsoft Visual Studio IDE と自動的 に統合され、.NET Framework と連携動作します。SDK には、開発作業を簡略化する C# と VB のア プリケーション テンプレートが用意されています。 SDK のインストール手順については、「40 ページの「現在の環境への MapXtreme のインストー ル」」を参照してください。インストール ダイアログ ボックスのヘルプ ボタンをクリックして、 手順を参照することもできます。 展開 (ランタイム環境) インストール 展開インストールではランタイム環境がインストールされ、MXTRuntimeNCP.exe (MapXtreme ソフ トウェアのコピー プロテクトされているバージョンの場合は MXTRuntimeSCP.exe) がコピーされま す。ランタイム インストーラのインストール手順については、「52 ページの「ランタイム インス トーラを使った配布」」を参照してください。 複数のバージョンのインストールと使用 複数のバージョンの MapXtreme を同じコンピュータに同時にインストールできます。それぞれの バージョンの MapXtreme は、個別のディレクトリにインストールされます。 また、前のバージョンの MapXtreme を使って作成したデスクトップ アプリケーションと Web アプ リケーションを、新しいバージョンで実行することもできます。 異なるバージョンの MapXtreme で作成されたものであれば、複数の ASP.NET アプリケーションを 同じコンピュータで実行できます。MapXtreme のバージョンごとにアプリケーション プールを作 成し、各プールに ASP.NET アプリケーションを適切に配置します。コマンド プロンプトから iisreset を実行して IIS を再起動するか、またはアプリケーションが割り当てられているアプリケー ション プールをリサイクルします。アプリケーションは独自のプロセス空間で動作し、適切な バージョンの MapXtreme を読み込みます。 以上の説明は、作成に使用した MapXtreme のバージョンが異なるデスクトップ アプリケーション には該当しません。デスクトップ アプリケーションは、常に独自のプロセス空間で実行されま す。 32 MapXtreme 2008 v7.0.0 第 2 章 : はじめに MapXtreme ライセンス MapXtreme のインストールすべてにおいて、ライセンス (.lic) ファイルが必要です。インストール 時に提供されるライセンスと、Pitney Bowes Business Insight 社から取得する必要のあるライセンス があります。ここでは、ライセンスの種類と Pitney Bowes Business Insight からの取得方法について 説明します。 ライセンスの種類 MapXtreme には、目的やニーズに合わせて選べるように、SDK (開発)、ランタイム (展開)、試用版 の 3 種類のライセンスが用意されています。 SDK ライセンス SDK (ソフトウェア開発キット) ライセンス (MapXtremeSDK.lic) は、デスクトップ アプリケーショ ンおよび Web アプリケーションを開発するためのライセンスです。このライセンスを使って開発 されたアプリケーションでは、マップ ウィンドウの左上隅に小さなウォーターマークが表示され ます。 ランタイム ライセンス ランタイム (展開) ライセンスは、デスクトップ アプリケーションおよび Web アプリケーションの すべてのランタイム インストールに必要です。 • • • NCP バージョンの MapXtreme を使用して作成したデスクトップ ランタイムを配布する場合 は、ランタイム ライセンス (MapXtremeDesktop.lic など) で複数のインストールを行うことがで きます。 SCP バージョンの MapXtreme を使用して作成したデスクトップ ランタイムを配布する場合 は、インストールごとに 1 つのライセンス (MapXtremeDesktopIntl.lic など) が必要です。 NCP バージョンまたは SCP バージョンの MapXtreme を使用して作成した Web ランタイムを配 布する場合は、インストールごとに 1 つのライセンス (MapXtremeWeb.lic など) が必要です。 配布パッケージにライセンスを含める方法については、「34 ページの「展開用のランタイム ライ センス」」を参照してください。 試用版ライセンス 試用版ライセンス (MapXtremeTrial.lic) は、MapXtreme の SDK と試用版で提供されます。このライ センスは、インストールの日付から 60 日で有効期限が切れます。試用版ライセンスを使って開発 されたアプリケーションの場合、有効期限の残り日数を示すウォーターマークがマップに表示さ れます。 ライセンスの取得 開発用の SDK ライセンス コピー プロテクトがほどこされていないソフトウェア開発キット (NCP SDK) のユーザには、イン ストール時に、試用版ライセンスだけでなく無期限の SDK ライセンス (MapXtremeSDK.lic) が自動 的に付与されます。永久ライセンスによって、無期限に SDK を使用できます。他のいかなる SDK ライセンスも必要ありません。 開発者ガイド 33 MapXtreme ライセンス コピー プロテクトがほどこされた SDK (SCP SDK) のユーザには、試用版ライセンスのみが付与さ れます。SDK を無期限に使用するためには、Pitney Bowes Business Insight 社から永久 SDK ライセ ンスを取得する必要があります。永久ライセンスを取得するには、MILicenseNodeID.exe (Program Files\Common files\MapInfo\MapXtreme\7.x.x\License Tool) を実行して、マシン固有の一意のハード ウェア ID を生成します。この ID は、MILicenseNodeID.txt というテキスト ファイルに生成されま す。 Pitney Bowes Business Insight 社は、この情報を使用して、インストールごとににカスタム ライ セ ン ス を 生 成 し ま す。ラ イ セ ン ス 取 得 に 関 す る 詳 細 に つ い て は、Program Files\MapInfo\MapXtreme\7.x.x\Documentation\PDF\SoftwareCopyProtectionNotice_SCP.pdf または 製品の外箱に記載されているソフトウェアコピー防止措置に関する文書を参照してください。こ の文書で最寄の Pitney Bowes Business Insight 社 (またはその代理店) を確認し、電子メールまたは ファックスでお問い合わせください。永久ライセンスを取得したら、配布アプリケーションを使 用し始める前に、ライセンス ファイルを Program Files\Common Files\ MapInfo\MapXtreme\7.x.x フォルダにコピーします。 試用版のユーザが永久ライセンスを取得するには、製品を購入する必要があります。 展開用のランタイム ライセンス MapXtreme では、各展開にランタイム ライセンスを含める必要があります。このためには、パッ ケージの中でライセンスを提供するか、顧客が自分でライセンスを取得できるようにライセンス ツールを含める必要があります。ランタイム ライセンスは、Pitney Bowes Business Insight 社から取 得します。この種類のライセンスでは、マップにはウォーターマークが一切表示されません。 必要なランタイム ライセンスの種類は、ビルドしているアプリケーションの種類と、使用する MapXtreme のバージョンによってそれぞれ異なります。次の表で、自分の状況に当てはまるもの を見つけてください。 展開タイプ MapXtreme の SDK バージョン ノード ロック ランタイム ライセンスの取得方法 デスクトップ 非コピープロテクト × (NCP) マップインフォ・ジャパン株式会社または MapInfo 代理店に問い合わせて、1 つ以上の 使用権を取得します。 デスクトップ コピープロテクト ○ (SCP) 使用権ごとにノード ID ファイルを生成し、 それをマップインフォ・ジャパン株式会社 または MapInfo 代理店に送信します。 Web NCP ○ 使用権ごとにノード ID ファイルを生成し、 それをマップインフォ・ジャパン株式会社 または MapInfo 代理店に送信します。 Web SCP ○ 使用権ごとにノード ID ファイルを生成し、 それをマップインフォ・ジャパン株式会社 または MapInfo 代理店に送信します。 展開先マシンのノード ID を生成するには、ライセンス ツールの MILicenseNodeID.exe を実行し、 作成されたテキスト ファイルをマップインフォ・ジャパン株式会社または MapInfo 代理店に送信 し ま す。ラ イ セ ン ス ツ ー ル は、MapXtreme SDK と共に、Program Files\Common 34 MapXtreme 2008 v7.0.0 第 2 章 : はじめに Files\MapInfo\MapXtreme\7.x.x\License Tool にインストールされます。MapXtreme のパッケージまた は Program Files\MapInfo\MapXtreme\7.x.x\Documentation\PDF にあるソフトウェア コピー プロテク トに関するライセンス申請書を参照してください。 ライセンス ツールは、マージ モジュール MapInfoMXTConfig_7.x..x.msm に含まれています。配布 に MapInfoCoreEngine.msm を含めると、ユーザはこのツールを自動的に取得します。「第 2 章、52 ページの「ランタイム インストーラを使ったアプリケーション配布の手順」 」を参照してくださ い。 注意 一般に、デスクトップ ベースの配布用に Web ライセンスを使用することはできません。ま た、Web ベースの配布用にデスクトップ ライセンスを使用することもできません。SCP バージョンの場合、ライセンス (Web またはデスクトップ) は配置対象のコンピュータに ノード ロックされます。 ライセンスについて Pitney Bowes Business Insight 社に問い合わせる際には、MapXtreme のバージョ ン (6.x.x または 7.x.x) を指定してください。 ライセンス ファイルの場所 ライセンスの場所または格納先については、次の表を参照してください。 ライセンスの 種類 ライセンス名 ライセンスの場所 開発 SDK NCP MapXtremeSDK.lic Program Files\Common Files\MapInfo\MapXtreme\7.x.x SDK SCP MapXtremeSDK.lic Program Files\Common Files\MapInfo\MapXtreme\7.x.x ランタイム デスクトップ MapXtremeDesktop.lic NCP アプリケーションの実行可能ファイルと同じフォル ダに置き、他のアプリケーションと競合しないよう にします。 デスクトップ MapXtremeDesktopIntl.lic SCP アプリケーションの実行可能ファイルと同じフォル ダに置き、他のアプリケーションと競合しないよう にします。 Web NCP MapXtremeWeb.lic Program Files\Common Files\MapInfo\MapXtreme\7.x.x Web SCP MapXtremeWeb.lic Program Files\Common Files\MapInfo\MapXtreme\7.x.x MapXtremeTrial.lic Program Files\Common Files\MapInfo\MapXtreme\7.x.x 試用版 SDK NCP SDK SCP 評価版 開発者ガイド 35 MapXtreme ライセンス トラブルシューティング MapXtreme のライセンスに関する問題が発生した場合、次の表を参考にして問題を解決します。 問題が発生した場合は、適切なライセンスが正しい場所にインストールされていることを必ず確 認してください (前出の「ライセンス ファイルの場所」を参照)。 ライセンスの問題のトラブルシューティング 問題の内容 考えられる原因 "MapXtreme 200x に 有 効 な ラ リモート デスクトップが使用 イセンスが見つかりませんで さ れ て い る 可 能 性 が あ り ま した。" と表示される。 す。ターミナル サービスに対 応した新しいライセンスが必 要です。 解決法 サーバをリセットし、新しいラ イセンスを適切なディレクトリ に格納して、IIS および ASP.NET のワーカー プロセスを再起動し ます。 ライセンス ファイルが破損し 一度コンピュータからライセン ている可能性があります。 スを削除し、新しいライセンス を再度生成して適切なディレク トリに格納し、IIS を再起動しま す。 権限が不足している可能性が ASP.NET のユーザ アカウント あります。 に、Temp ディレクトリと Framework ディレクトリに対す る読み取り/書き込み権限がある ことを確認します (「57 ページの 「配布する Web アプリケーショ ンの一時ディレクトリへのアク セス権限」」を参照)。 COM+ アクティベーション エ 最も 多い原因は、ライセンス ラー ファイルの不具合または破損 で す。COM+ オブジェクトの 初期化が中断されてしまうた め、COM+ で低レベルの OS 障 害が発生します。 Pitney Bowes Business Insight の Web サイトからダウンロー ドした試用版を使っていると きにライセンス例外が発生す る (mapinfo.coreengine.dll で System.ComponentModel.Licen seException が発生)。 一度コンピュータからライセン スを削除し、新しいライセンス を再度生成して適切なディレク トリに格納し、IIS を再起動しま す。 システム時計が過去の時間に 試用版を別のコンピュータにイ 戻されていることが検出され ンストールするか、有効なライ た た め、MapXtreme 試用版ラ センスを購入してください。 イセンスが無効になりまし た。 試用版にマージ モジュール 配 布 は 想 定 さ れ て い な い た ランタイム ライセンスを購入し (MSM) が 存 在 し な い め、マージ モジュールは試用 てください。 (\Common files\Merge 版から除外されています。 Modules\)。 36 MapXtreme 2008 v7.0.0 第 2 章 : はじめに ライセンスの問題のトラブルシューティング (続き) 問題の内容 考えられる原因 Volume Shadow Copy サービス Veritas のバックアップに関連 が原因でライセンスが検出さ した問題です。バックアップ ソフトウェアに合わせてネッ れない。 トワークが変更されているこ と が 考 え ら れ ま す。バ ッ ク アップ プロセスによってファ イルがロックされ、アクセス できなくなっている可能性が あります。 解決法 バックアップ プロセスが Exponare プロセスと同じ ID で実 行されているかどうか確認して ください。実行されている場合 は、ターミナル サービスが問題 になっている可能性がありま す。新しいライセンスを取得す ることによって問題を解決でき ます。 既存の MapXtreme フォルダが 既存のディレクトリに無効な 古い無効なライセンスを探して 原因で有効なライセンスが検 ライセンス ファイルが存在す 削除します。新しいライセンス るために、エラーになってい を適切なディレクトリに格納し 出されない。 てください。 る可能性があります。 Exponare に付属の MapXtreme システムに複数のネットワー 正しいライセンス ファイルを取 のライセンスで一部のサイト ク カードが装着されていま 得します。新しいライセンスを 適切なディレクトリに格納して す。 のロックを解除できない。 ください。 ライセンス ファイルを MapXtreme\7.x.x フ ォ ル ダ と Web アプリケーション フォル ダの両方に置かないと MapXtreme のロックが解除さ れない。 サーバの実行方法と、使用し ているユーザ ID に対し、権限 が不適切である可能性があり ます。 MapXtreme のライセンス ファ ターミナル サービス イルの有効期限が約 15 日間 しかない。 正しい権限を設定してください ( 「57 ページの「配布する Web ア プリケーションの一時ディレク トリへのアクセス権限」」を参 照)。 ターミナル サービスに対応した 最新ビルドのライセンス ジェネ レータを使用していることを確 認してください。 Virtual PC を 削 除 し た と こ ろ、MapXtreme ラ イ セ ン ス ノー ド ID が 変 化 し、 Exponare ライセンスが試用版 ライセンスに戻ってしまっ た。 Virtual PC を削除すると、ネッ 新しいライセンスを取得してく トワーク ノード ID が変化し、 ださい。 ライセンスが無効になりま す。 インストール直後の初回使用 時 で あ る に も か か わ ら ず、 "MapXtreme 試 用 ラ イ セ ン ス の期限が切れました。" とい うエラー メッセージが表示さ れる。 付属の NCP SDK ライセンスを NCP SDK CD に収録されている 使用せずに、ランタイム (展開) 永久 SDK ライセンスを使用して ライセンスを生成してインス ください。 トールした。 開発者ガイド 37 インストールの前に ライセンスに関する既知の問題 以下は、MapXtreme のライセンスに関する既知の問題です。これらの問題を解決するには、テク ニカル サポートに問い合わせてください (「27 ページの「テクニカル サポート」」を参照)。 • • ウイルス ソフトウェアによってライセンス電子メールの内容が削除され、ライセンス ファイ ルが Null になる。 ライセンス ジェネレータで破損したライセンス ファイルが作成されることがある。 インストールの前に 必ず次の準備を行ってから、MapXtreme のインストールを開始してください。 管理者権限 MapXtreme をインストールするには、自分が対象マシンの管理者であるか、現在のユーザが管理 者グループのメンバーである必要があります。これは、SDK インストールとランタイム インス トールのどちらの場合も同じです。 注意 インストーラが COM+ オブジェクトの登録を実行するため、Windows Vista の場合、通常の 管理者権限では不十分です。Vista ユーザは、Setup.exe を右クリックして [管理者として実 行] を選択し、インストーラ用のシステム特権を取得する必要があります。 .NET Framework と Visual Studio を最初にインストールしておく MapXtreme をインストールする前に、.NET Framework およびそのフレームワークに合った Visual Studio 環境をインストールしておく必要があります。 注意 Visual Studio 以外の開発環境を使用することもできますが、その場合、テンプレート、サン プル、およびオンライン ヘルプ システムは統合されません。 IIS 7.0 (Windows Vista、Windows Server 2008、Windows 7) Microsoft Internet Information Services 7.0 は Windows Vista、Windows Server 2008、および Windows 7 Ultimate に 付 属 し て い ま す ( た だ し、必ずしもインストールされているとは限りません)。 MapXtreme では、IIS 6.0 互換モードおよび Classic ASP.NET 統合モードを使用して、IIS 7.0 をサ ポートします。 MapXtreme をインストールする前に、次の手順に従って IIS 7.0 を構成します。 1. Windows 認証と匿名認証を有効にします。 a. b. c. d. 38 管理ツールにアクセスし、[IIS] を右クリックして [管理者として実行] を選択します。 [既定の Web サイト] を選択します。 [認証] をダブルクリックします。 Windows Vista、Windows Server 2008、および Windows 7 では、Windows 認証と匿名認証を 右クリックし、[有効にする] を選択します。 MapXtreme 2008 v7.0.0 第 2 章 : はじめに 2. [IIS 6 メタベースおよび IIS 6 構成との互換性] Web 管理ツールを有効にします。 a. Windows Vista および Windows Server 2008 では、コントロール パネルを開き、[プログラム と機能] をクリックします。 b. Windows 7 では、コントロール パネルを開き、[プログラム] をクリックして、[プログラム と機能] をクリックします。 c. 右側のパネルの [Windows の機能の有効化または無効化] をクリックします。[Windows の機 能] ダイアログ ボックスが表示されます。 d. [Internet Information Services] チェック ボックスをオンにします。 e. Windows Vista および Windows 7 では、[Web 管理ツール] をダブルクリック (展開) し、[IIS 6 と互換性のある管理] をダブルクリックして、[IIS 6 メタベースおよび IIS 6 構成との互換性] チェック ボックスをオンにします。 f. Windows Server 2008 では、[管理ツール] をダブルクリック (展開) し、[IIS 6 と互換性のある 管理] をダブルクリックして、[IIS 6 メタベース] チェック ボックスをオンにします。 Windows Vista、Windows Server 2008、および Windows 7 システム上の Visual Studio を使用して Web アプリケーションを開発する場合は、MapXtreme のインストール前またはインストール後に、次 の IIS 機能も有効にする必要があります。 • • [Internet Information Services] : [World Wide Web サービス]: [アプリケーション開発機能] • .NET 拡張機能 • ASP.NET • ISAPI 拡張機能 • ISAPI フィルタ [Internet Information Services]: [World Wide Web サービス]: [セキュリティ] • Windows 認証 MapXtreme Web サンプル アプリケーションを IIS 7.0 で実行するためには、IIS 7.0 を切り替えて "Classic .NET AppPool" を使用する必要もあります。 Wow64 環境での MapXtreme のデフォルト インストール ディレクトリ MapXtreme は 32 ビット アプリケーションであり、64 ビット システム上では Microsoft の Wow64 (Windows-on-Windows 64-bit) テクノロジを介して動作します。Wow64 は、32 ビット アプリケー ション (x86) と 64 ビット オペレーティング システム (x64) の差を吸収するエミュレーション レイ ヤです。 Wow64 で注意すべき点の 1 つは、MapXtreme に使用されるデフォルト インストール ディレクトリ の場所です。64 ビット システムには、ネイティブ 64 ビット インストール (C:\Program Files) 用 と、64 ビット エミュレーション モードで動作する 32 ビット アプリケーション用に、Program Files ディレクトリが 2 つ存在します。MapXtreme をはじめとする 32 ビット アプリケーションのデフォ ルト インストール ディレクトリは次のとおりです。 C:\Program Files(x86)\MapInfo\MapXtreme\7.x.x\ 7.x.x は、MapXtreme のバージョンを表します。 開発者ガイド 39 現在の環境への MapXtreme のインストール MapXtreme サンプル アプリケーションの Web.config ファイルには、両方のデフォルト パスが含ま れています。MapXtreme を別の場所にインストールした場合は、その場所を Web.config ファイル に反映しないと、サンプルが適切に動作しません。 注意 English US (ENU) 以外の Windows 環境では、デフォルト インストール ディレクトリ C:\Programmer\ がカスタム インストール場所と見なされます。次の例のように、実際のイ ンストール ディレクトリに合わせてサンプルの Web.config ファイルを編集する必要があり ます。 <configuration> <appSettings> <add key="MapInfo.Engine.Session.Workspace" value="C:\Programmer\MapInfo\MapXtreme\7.x.x\Samples\Data\World.mws" /> </appSettings> </configuration> その他のインストール機能 MapXtreme CD には、オンラインで確認できるインストール手順が収録されています。インストー ル中に表示されるインストール ダイアログのヘルプ ボタンをクリックして、この手順を表示する こともできます。 MapXtreme では、世界各国のサンプル データが無償で提供されています。データをインストール するには、CD ブラウザで [サンプル データのインストール] を選択します。[カスタム] を選択する と、必要なデータだけをインストールできます。[すべて] (デフォルト) を選択すると、約 450 MB の世界各国のデータ セットが Program Files\MapInfo\MapXtreme\7.x.x\Samples\Data にインストール されます。 注意 このデータ インストーラを実行しなくても、MapXtreme に付属のサンプル アプリケーショ ンは使用できます。そのための基本的なサンプル データは、自動的に \Data フォルダにイ ンストールされます。 MapXtreme CD ブラウザには、開発者ガイドの PDF 版へのリンクも示されています。 現在の環境への MapXtreme のインストール MapXtreme をインストールするには 1. MapXtreme CD を CD ドライブに挿入します。 2. CD ブラウザのメイン ページで、[インストール] をクリックします。インストールの説明ペー ジが表示されます。 3. SDK をインストールする場合は [開発インストール] を、ランタイム バージョンをインストー ルする場合は [展開インストール] を選択します。 注意 40 展開インストールには、ランタイム ライセンスが必要です。「34 ページの「展開用の ランタイム ライセンス」」を参照してください。 MapXtreme 2008 v7.0.0 第 2 章 : はじめに 4. [SDK (ソフトウェア開発キット) のインストール] または [ランタイム環境のインストール] を選 択します。最初のダイアログ ボックスで、[次へ] をクリックして次の画面に進みます。展開イ ンストールの場合は、手順 10 に進みます。 注意 この画面からは、インストールの手順を確認したり、サンプル したりすることもできます。 データをインストール 5. 最初に表示されるダイアログ ボックスに記載されている情報を読み、[次へ] をクリックして次 に進みます。 6. ライセンス契約に同意して [次へ] をクリックします。[ユーザ情報] ダイアログ ボックスが表 示されます。 7. [ユーザ情報] ダイアログ ボックスの各ボックスに、ユーザ名と会社名を入力します。また、必 要に応じてパッケージに記載された製品のシリアル番号を入力してください。[次へ] をクリッ クします。[セットアップ タイプ] ダイアログ ボックスが表示されます。 8. [セットアップ タイプ] ダイアログ ボックスで、[すべて] または [カスタム] のいずれかを選択し ま す。イ ン ス ト ー ル す る コ ン ポーネントを選択する場合、またはデフォルト (C:\Program Files\MapInfo\MapXtreme\7.x.x) 以外のフォルダにインストールする場合は、[カスタム] を選択 します。[次へ] をクリックします。[すべて] を選択した場合は、手順 10 に進みます。[カスタ ム] を選択した場合は、手順 9 に進みます。 注意 MapXtreme をデフォルト以外の場所にインストールする場合、あるいは English US (ENU) 以外の Windows XP のバージョンでインストールする場合は、インストール後に 実行するすべてのサンプル Web アプリケーションの web.config ファイルを変更すること が必要になります。web.config ファイルの変更方法については、サンプル Web アプリ ケーションの ReadMe.rtf ファイルを参照してください。 9. 前の手順で [カスタム] を選択した場合は、インストールしたいコンポーネントを選択するか、 [変更] をクリックしてインストール先の新しいパスを指定します。 [次へ] をクリックします。 10. [プログラムをインストールする準備ができました] ダイアログ ボックスで、[インストール] を クリックします。 11. [MapXtreme をインストールしています] ダイアログボックスが表示されます。 12. [InstallShield ウィザードを完了しました] ダイアログ ボックスで、 ラーニング リソース ページ を表示する必要がなければ [ラーニング リソースの起動] チェック ボックスをオフにし、[完了] をクリックしてソフトウェア インストーラを終了します。MapXtreme SDK インストールの場合、MapXtreme ラーニング リソース ページは Windows の [スタート] ボ タンからいつでも参照できます。ランタイム インストールの場合は参照できません。 MapXtreme へのアップグレード MapXtreme は、<インストール ディレクトリ>\MapInfo\MapXtreme\7.x.x.x という形式を使用して、 独自のディレクトリにインストールされます。x.x.x は現行バージョンを表します。前のバージョ ンが上書きされることはありません。これにより、同じ製品の複数の異なるバージョンを共存さ せることができます。 開発者ガイド 41 MapXtreme へのアップグレード 1 つのマシンで異なるバージョンを使用している場合、異なるバージョンのプロジェクトを開くと きは、その前に必ず Visual Studio を終了しておきます。Web アプリケーションの場合は、インター ネット インフォメーション サービス (IIS) をリセットする必要もあります。この作業を行うには、 コンソール ウィンドウで、または [スタート] メニューの [ファイル名を指定して実行] から iisreset.exe コマンドを実行します。 既存の Web サイトのアップデート 旧 バ ー ジョ ン の MapXtreme で 作 成 した Web サイトを実行するには、アプリケーションの Web.config ファイルを編集して、新しいバージョンのアセンブリを指定する必要があります。次の 例には、追加する必要がある 4 つの MapXtreme アセンブリが示されています。アセンブリの 1 つ である MapInfo.CoreEngine.Wrapper は、MapXtreme v6.8.0 から追加されました。MapXtreme v6.7.1 以前のバージョンで作成した Web アプリケーションをアップデートするには、このアセンブリを 追加する必要があります。 上の図に従って、Web.config ファイルを編集し、MapXtreme アセンブリのバージョン番号と公開 キー トークンを追加してください。バージョン番号と公開キー トークンを調べるには、[スタート ] メニューの [ファイル名を指定して実行] ダイアログ ボックスに「assembly」と入力します。グ ローバル アセンブリ キャッシュ (GAC) ツールによって、システムのすべてのアセンブリが表示さ れます。 42 MapXtreme 2008 v7.0.0 第 2 章 : はじめに Assembly ウィンドウは、[スタート] > [すべてのプログラム] > [コントロール パネル] > [管理ツール ] > [Microsoft .NET Framework 2.0 構成] を選択し、[アセンブリ キャッシュの管理] を選択して、表 示することもできます。 編集が終わったら、Web.config ファイルを保存して Web サイトを再構築します。 既存のデスクトップ アプリケーションのアップデート 旧バージョンの MapXtreme で作成したデスクトップ アプリケーションを再コンパイルできます。 このとき、コントロールをフォームに追加し直すことが必要な場合があります。 その前に、いくつかの作業を行う必要があります。 • [ローカル コピー] プロパティを "False" に設定する • 新しいアセンブリをプロジェクトに追加する • アセンブリを新しいアセンブリにリダイレクトする [ローカル コピー] プロパティを "False" に設定する コントロールの [ローカル コピー] プロパティが "False" に設定されていることを確認します。 MapXtreme デスクトップ コントロールを Windows フォームにドラッグすると、[ローカル コピー] プ ロ パ テ ィ が "True" に 設 定 さ れている参照が読み込まれるという既知の問題があります。 MapXtreme の参照では、グローバル アセンブリ キャッシュ (GAC) 内にあるアセンブリを指定する 必要がありますが、[ローカル コピー] が "True" に設定されているとローカル bin パスが指定されま す。 開発者ガイド 43 MapXtreme へのアップグレード ASP.NET Web アプリケーションでも、MapXtreme Web コントロールをフォームにドラッグ アンド ドロップした場合や、MapXtreme テンプレートに基づいていないコンソール アプリケーションを 作成する場合には、同じ動作が行われます。この場合も同じ方法で回避します。[ローカル コピー] プロパティを FALSE に設定します。 MapXtreme Web サイト テンプレート、または MapXtreme Web サイト テンプレートに基づいたサン プル アプリケーションを使用している場合は、この問題は発生しません。 新しいアセンブリをプロジェクトに追加する MapXtreme v6.7.1 以前のバージョンで作成したアプリケーションの場合、 MapInfo.CoreEngine.Wrapper と MapInfo.CommonDialogExt の 2 つのアセンブリを追加する必要もあ ります。 MapInfo.CoreEngineWrapper.dll は、MapXtreme Web サイト アプリケーションに必要です。どちらの アセンブリも、デスクトップ アプリケーションに必要です。 MapXtreme アセンブリを新しいバージョンにリダイレクトする 現在のバージョンのアセンブリを使用するようにアプリケーションをリダイレクトする必要があ ります。Microsoft では、アセンブリをリダイレクトする複数の方法を提供しています。詳細につ いては、Microsoft の .NET Framework に関するデベロッパー センターを参照してください。 アプリケーション構成ファイル アプリケーション構成ファイルを使用してアセンブリのリダイレクトを行うことをお勧めしま す。構成ファイルは、アプリケーションと同じディレクトリに配置し、アプリケーションの名前 に基づく名前にする必要があります。たとえば、myApp.exe というアプリケーションの構成ファイ ルの名前は myApp.exe.config とします。 アプリケーション構成ファイルの設定は、発行者ポリシー ファイルの設定より優先されます。 アセンブリをリダイレクトするには、現行バージョンのバージョン番号と公開キー トークンを調 べて、これをアプリケーション構成ファイルに追加する必要があります。バージョン番号の形式 は X.x.x.x です。たとえば、7.0.0.532 などとなります。 この情報を調べるには、[スタート] メニューの [ファイル名を指定して実行] ダイアログ ボックス に、「assembly」と入力します。グローバル アセンブリ キャッシュ (GAC) ツールによって、シ ステムのすべてのアセンブリが表示されます。Assembly ウィンドウは、[スタート] > [すべてのプ ログラム] > [コントロール パネル] > [管理ツール] > [Microsoft .NET Framework 2.0 構成] を選択し、 [アセンブリ キャッシュの管理] を選択して、表示することもできます。アプリケーション構成 ファイルが存在しない場合、このツールはアプリケーション構成ファイルの作成も行います。 下の図では、MapXtreme v6.7.1 以前のバージョンを使用して作成されたデスクトップ アプリケー ションに追加する必要のある 2 つのアセンブリが強調表示されています。 44 MapXtreme 2008 v7.0.0 第 2 章 : はじめに 発行者ポリシー ファイル リダイレクト設定を含む発行者ポリシー ファイルをアセンブリと一緒に GAC にインストールする ことは可能です。ただし、MapInfo ではこの構成はサポートされていません。 マシン構成ファイル Microsoft .NET Framework 2.0 構成ツールを使用して、Windows のインストール ディレクトリ内の \Microsoft.NET\Framework\v2.0.50727\Config にあるマシン構成ファイルをアップデートできます。 この方法でリダイレクト設定を指定すると、アセンブリを参照するすべてのアプリケーションが 新しいアセンブリ バージョンを使用するようになります。マシン構成ファイルの設定は、アプリ ケーション構成ファイルと発行者ポリシー ファイルの両方の設定より優先されるので、この方法 でリダイレクトを行う場合は注意が必要です。 Visual Studio でのアプリケーションの作成 MapXtreme では、アプリケーションにマップを簡単に追加できます。Visual Basic.NET および Visual C# のプロジェクト テンプレートを使用すれば、コードを記述しなくても、簡単なマップ ア プリケーションを作成できます。 デスクトップ アプリケーションと Web アプリケーションのサンプルも用意されており、これを参 照したり、試したり、独自の状況に適用させたりすることができます。これらのサンプル アプリ ケーションの使用手順については、「付録 B: 「MapXtreme アプリケーションを作成および展開す る方法」」を参照してください。 開発者ガイド 45 Visual Studio でのアプリケーションの作成 また、MapXtreme には、便利なマッピング機能を Web アプリケーションに追加する方法を理解す るのに役立つ、チュートリアル アプリケーションが付属しています。各チュートリアル アプリ ケーションには、アプリケーションの作成方法についての説明が記述されているマニュアルが付 属しています。マニュアルについては、ラーニング リソース ページを参照してください。チュー トリアル アプリケーションは、MapXtremeTutorials.sln という単一の Visual Studio ソリューション にまとめられています。このソリューションは、MapXtreme のインストール フォルダの \Tutorials フォルダ (デフォルトでは c:\Program Files\MapInfo\MapXtreme\7.x.x.\Tutorials で、7.x.x はバージョ ンを表します) にあります。 ここでは、簡単なデスクトップ マップ アプリケーションを作成する方法について説明します。 Web アプリケーションの作成手順については、「48 ページの「ASP.NET Web アプリケーショ ン」」を参照してください。 マップ アプリケーション 注意 これは Visual Basic.NET の例です。Visual C# マップ アプリケーションを作成する場合は、 以下の説明の Visual Basic を Visual C# に置き換えてください。 1. Visual Studio 2005 の [ファイル] メニューから [新しいプロジェクト] を選択します。[新しいプロ ジェクト] ダイアログ ボックスが表示されます。 2. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] フレームで、[Visual Basic] フォルダの [MapXtreme 7.x.x] をクリックします。 3. [新しいプロジェクト] ダイアログ ボックスの [テンプレート] フレームから [MapXtreme 7.x.x MapForm アプリケーション] を選択します。 4. 適切な名前を選択して、[OK] をクリックします。 MapXtreme によってアプリケーションが作 成されます。 ソリューション エクスプローラで [MapForm.vb] をダブルクリックすると、[MapForm.vb [デザイン ]] が表示されます。 46 MapXtreme 2008 v7.0.0 第 2 章 : はじめに 5. [表示] メニューの [コード] をクリックすると、アプリケーションを記述しているコードが表示 されます。 開発者ガイド 47 Visual Studio でのアプリケーションの作成 6. [デバッグ] メニューの [デバッグ開始] をクリックすると、アプリケーションが実行されます。 7. [テーブルを開く] アイコンをクリックして、データをロードします。デフォルトでは、Program Files\MapInfo\MapXtreme\7.x.x\Samples\Data にサンプル データが格納されています。 8. マップを操作するには、他の Pitney Bowes Business Insight マップ アプリケーションと同様、 ツールバーのコントロールを使用します。 ASP.NET Web アプリケーション ここでは、簡単な ASP.NET Web アプリケーションを作成する方法について説明します。Web アプ リケーションのプランニングの詳細については、「第 5 章: 「Web アプリケーション、コントロー ル、およびツール」」を参照してください。 これは Visual Basic.NET の例です。Visual C# ASP.NET マップ アプリケーションを作成する場合 は、以下の説明の Visual Basic を Visual C# に置き換えてください。 注意 48 Windows Vista、Windows 7、または Windows Server 2008 と IIS 7.0 を使用している場合は、 最初に IIS 7.0 のアプリケーション プールを "Classic .NET AppPool" に切り替える必要があり ます。38 ページの「IIS 7.0 (Windows Vista、Windows Server 2008、Windows 7)」を参照して ください。 MapXtreme 2008 v7.0.0 第 2 章 : はじめに 1. Visual Studio の [ファイル] メニューで [新しい Web サイト] をクリックします。[新しい Web サ イト] ダイアログ ボックスが表示されます。 2. [MapXtreme 7.x.x Web サイト] テンプレートを選択して、[OK] をクリックします。 MapXtreme によってアプリケーションが作成されます。 3. ソリューション エクスプローラで [MapForm.aspx] をダブルクリックすると、デザイン ビュー が表示されます。 4. MapForm.aspx の一番下の [ソース] をクリックすると、アプリケーションの HTML を確認でき ます。 開発者ガイド 49 Visual Studio でのアプリケーションの作成 5. [デバッグ] メニューの [デバッグ開始] をクリックすると、アプリケーションが実行されます。 6. マップを操作するには、他の Pitney Bowes Business Insight マップ アプリケーションと同様、 ツールバーのコントロールを使用します。 アプリケーションを実行できない場合は、システムで ASP.NET 状態サービスが実行されているこ とを確認してください ([コントロール パネル] > [管理ツール] > [サービス] > [ASP.NET 状態サービ ス])。 MapXtreme コントロール テンプレートを使って作成した基本的なアプリケーションは、ツール ボックス内の MapXtreme コ ントロールを使って拡張できます。Windows フォームを使用して作成した簡単なマップ アプリ ケーションでは、MapXtreme の Windows コントロールを使用することができます。Visual Studio ツール ボックスの [MapXtreme Windows コントロール] タブにあるすべてのコントロールをフォー ムに追加できます。 50 MapXtreme 2008 v7.0.0 第 2 章 : はじめに MapXtreme ASP.NET Web アプリケーションの場合は、MapXtreme の Web コントロールを使用する ことができます。ツール ボックスの [MapXtreme Web コントロール] タブにあるすべてのコント ロールをフォームに追加できます。詳細については、「第 5 章、81 ページの「MapXtreme Web コ ントロールとツール」 」を参照してください。 テンプレートがない場合の ASP.NET Web アプリケーションの構築 MapXtreme テンプレートを使わずに、ASP.NET マップ アプリケーションを作成することもできま す。たとえば、Visual Basic Web アプリケーションを作成するには、以下の操作を行います。 1. Visual Studio のメニューから、[ファイル] > [新規作成] > [Web サイト] を選択します。[新しい Web サイト] ダイアログ ボックスが表示されます。 2. [Visual Studio にインストールされたテンプレート] から一般的な ASP.NET Web サイト テンプ レートを選択し、[OK] をクリックします。 3. ツール ボックスの [MapXtreme Web コントロール] グループからコントロールを選択し、 フォームにドラッグします。この操作により、次の 4 種類の MapXtreme アセンブリが参照とし て 追 加 さ れ ま す。MapInfo.WebControls、 MapInfo.CoreEngine、MapInfo.CoreTypes、 MapInfo.CoreEngine.Wrapper。 これにより、Web.config ファイルが更新され、httpModules のアセンブリ情報や要素が追加され ます。 4. このとき、MapXtreme Web コントロールとツールのデザイナに、アイコンではなく赤色の X が 表示されます。アイコンを適切に表示するには、いずれかの MapXtreme サンプル アプリケー 開発者ガイド 51 アプリケーションの配布 ションから MapXtremeWebResources フォルダをコピーし、自分のプロジェクトの web.config お よび default.aspx ファイルが置かれている場所に貼り付けます。Web ページをいったん閉じて開 き直せば、アイコンが表示されます。 アプリケーションの配布 MapXtreme コンポーネントをサーバ マシン上にインストールするには、付属のランタイム インス トーラを使用するか、独自のインストーラを作成してマージ モジュール (MSM) を追加します。 NCP バージョンの MapXtreme SDK には、MXTRunNCP.exe ランタイム インストーラが付属してい ます。SCP バージョンの SDK には、MXTRunSCP.exe が付属しています。 ランタイム インストーラを使った配布 ランタイム インストーラ (MXTRunNCP.exe または MXTRunSCP.exe) は、カスタム インストールの 一環として使用します。ランタイム インストーラでは、MapXtreme アセンブリがインストールさ れ、必要なレジストリ エントリが作成されます。これには、必要な .NET Framework v2.0 も含まれ ます。また、Web アプリケーションおよびデスクトップ アプリケーション両方のランタイム アセ ンブリとファイルも含まれます。また、ランタイム ライセンス ファイルを Program Files\Common Files\MapInfo\MapXtreme\7.x.x にインストールする必要があります。このファイルは、Pitney Bowes Business Insight 社または販売店から入手できます。「34 ページの「展開用のランタイム ライセン ス」」を参照してください。 Web ベース アプリケーションの場合は、ランタイム インストーラを使用することをお勧めしま す。すべてのランタイム コンポーネントがデフォルト ディレクトリにインストールされます。 ユーザが設定することはできません。 一方で、アプリケーションによっては、不要なファイルがインストールされてしまうという欠点 もあります。また、MapXtreme 対応アプリケーションを複数インストールする場合、ランタイム インストーラ使用時には参照カウントの管理を行う必要があります。独自のインストーラで MSM を直接使用する場合には、参照は自動的に管理されます。 ランタイム インストーラを使ったアプリケーション配布の手順 インストーラを実行するには、管理者権限が必要です。また、Web サーバをインストールするに は、IIS 権限も必要です。 1. MapXtreme CD で、[インストール] を選択します。インストール オプション ページが表示され ます。 2. [展開インストール] を選択してから、[ランタイム環境のインストール] を選択します。インス トール ウィザードが開きます。 3. ウィザードの指示に従って、インストール作業を進めます。 4. 必要に応じた手段で Windows アプリケーションまたは Web アプリケーションを配布します。 たとえば、Visual Studio でデプロイメント プロジェクトを作成し、アプリケーションを追加し ます。 5. 64 ビット オペレーティング システムを使用している場合は、ランタイム ライセンス ファイル を Program Files または Program Files(x86) のパス \\Common Files\MapInfo\MapXtreme\7.x.x にイン ストールします。 52 MapXtreme 2008 v7.0.0 第 2 章 : はじめに コマンド ラインからランタイム インストーラを実行するには、次の手順に従います。ランタイム インストーラの実行可能ファイルは、CD の [CD ルート]:\Install\InstallRuntime フォルダにありま す。 • • 最小限の UI でランタイム インストーラを実行するには、次のコマンド ラインを使用します。 MXTRunNCP.exe /v"/qb" UI なしでランタイム インストーラを実行するには、次のコマンド ラインを使用します。 MXTRunNCP.exe /v"/qn" コピー プロテクトされている MapXtreme ソフトウェアを使用している場合、ランタイム インス トーラの実行可能ファイルは MXTRunSCP.exe です。 カスタム インストーラを使った配布 Windows インストーラ テクノロジ (MSI) を使用してカスタム インストーラを作成し、MapXtreme マージ モジュールを追加します。マージ モジュール (MSM ファイル) は、コンポーネントのイン ストールに必要なファイル、リソース、レジストリ エントリ、セットアップ ロジックを 1 つに格 納したパッケージです。マージ モジュールは、単独ではインストールできないので、MSI ファイ ルに組み込む必要があります。インストールするコンポーネントを細かく指定する場合、または MSI を使ったインストーラを独自に作成する場合にこの方法を使用します。 ただし、MSM を使うという方法には、Pitney Bowes Business Insight が製品を更新した場合に、 ユーザがパッチを作成するかインストーラを更新しなければならないという欠点があります。 一方、インストールするコンポーネントを制御でき、さらに、参照カウントが自動的に管理され るという利点があります。各バージョンのアセンブリは GAC (Global Assembly Cache) に一度だけ コピーされ、このアセンブリを使用するアプリケーションごとに参照カウントが管理されます。 アセンブリを使用するアプリケーションが 1 つ削除されると参照カウントの値は 1 だけ小さくな り、アセンブリは GAC 内に保持されます。このアセンブリを使うアプリケーションがすべて削除 されると、アセンブリ自体が削除されます。 MSI イ ン ス ト ー ラ の 作 成 す る ための開発ツールもいくつか用意されています。たとえば、 InstallShield Developer (Acresso Software Corporation) や Visual Studio (Microsoft) などです。Windows インストーラの詳細については、Microsoft の MSDN ライブラリを参照してください。 MapXtreme マージ モジュール MapXtreme 用のマージ モジュールを以下に示します。必要に応じて、インストーラ MSI で使用し てください。マージ モジュールの使用方法の詳細については、「付録 B、497 ページの「デスク トップ アプリケーションのパッケージ化」」を参照してください。 各 MSM ファイル名にある 7.x.x は、製品の現在のバージョンを表しています。MSM は、\Program Files\Common Files\Merge Modules に格納されています。 開発者ガイド 53 アプリケーションの配布 MapXtreme マージ モジュール マージ モジュールの名前 含まれるアセンブリ 必要とな る状況 なし。 カスタム シンボ ア プ リ ルが含まれま ケーショ ン で ス す。 ト ッ ク ビ ッ ト マップ シ ンボルを 使用する 場合に必 要です。 デスクトップ MapInfo.Windows MapInfoDesktop_7.x.x.msm MapInfo.Windows.Dialogs C# および VB の .NET デスクトッ プ アプリケー ションに使用す る .NET コント ロールのアセン ブリが含まれま す。 カスタム シンボル MapInfoCustSymb_7.x.x.msm MapInfo.Windows.Framework MapInfo.CommonDialogExt フォント MIFonts_7.x.x.msm 54 目的 なし。 ア プ リ ケーショ ンでデス クトップ ツールを 使用する 場合に必 要です。 MapInfo フォン ア プ リ ト (Symbols、 ケ ー シ ョ Cartographic、 ン で ス Real Estate、 ト ッ ク A r r o w s 、 TrueType? Miscellaneous、 フ ォ ン ト O i l & G a s 、 を使用す Transportation、 る 場 合 に Weather、お よ び 必 要 で Shields) が含まれ す。 ます。 MapXtreme 2008 v7.0.0 第 2 章 : はじめに MapXtreme マージ モジュール (続き) マージ モジュールの名前 マッピング MapInfoCoreEngine_7.x.x.msm MapinfoMXTConfig_7.x.x.msm MapInfoCoreEngineIntl.msm * MapInfoCoreResJPN_7.x.x.msm † MapInfoCoreResCHN_7.x.x.msm ‡ 含まれるアセンブリ 目的 必要とな る状況 MapInfo.CoreEngine 中核となるマッ 必 須 で ピ ン グ 機 能 を 提 す。 MapInfo.CoreEngine.Wrapper 供 し ま す。こ れ MapInfo.CoreTypes に よ っ て、こ れ らのアセンブリ MapInfo.WMS.Client 用の共通の構成 MapInfo.Windows.Printing とデフォルト参 MapInfo.Ellis.ExtensibleDataPr 照 を 含 む フ ァ イ ルもインストー ovider ルされます。 MapInfo.LinearReferencing MapInfo.Ogc MapInfo.WorkspaceManager.Ex tension Web コントロール MapInfo.Web MapInfoWeb_7.x.x.msm MapInfo.WebControls .NET アセンブリ MapInfo.Web、お よび Web ベース のアプリケー ションに使用す る各種 Web リ ソースをインス トールします。 ASPNetState サー ビ ス の 開 始、お よび (IIS がイン ストールされて いる場合は) Web リソース用の仮 想ディレクトリ の作成も行いま す。 Web サービス クライアント MapInfoServices_7.x.x.msm 開発者ガイド MapInfo.Services ジオコードおよ びルーティング 用のアセンブリ が含まれます。 ストック Web コン トロール を使用す るすべて のアプリ ケーショ ンで必要 です。 ア プ リ ケーショ ンでジオ コードお よびルー ティング を必要と する場合 に必要で す。 55 アプリケーションの配布 MapXtreme マージ モジュール (続き) マージ モジュールの名前 WFSwfs 含まれるアセンブリ 必要とな る状況 MapInfo.WFS.Server WFS に必要なア ア プ リ センブリが含ま ケ ー シ ョ ンで WFS れます。 ( W e b Feature Service) を 使 っ て データを 変換する 場合に必 要です。 MapInfo.WMS.Server WMS に必要なア ア プ リ センブリが含ま ケ ー シ ョ れます。 ンで WMS (Web Map Service) を 使ってデ ジタル イ メージを 取得する 場合に必 要です。 MapInfoWFS_7.x.x.msm WMS 目的 MapInfoWMS_7.x.x.msm * MapXtreme SCP で作成したアプリケーションを配布する場合に使用します。 † MapXtreme JPN で作成したアプリケーションを配布する場合に使用します。 ‡ MapXtreme CHN で作成したアプリケーションを配布する場合に使用します。 カスタム インストーラによるアプリケーションの配布 独自に作成したインストーラを使って MapXtreme の配布を行うには、次の手順を実行します。 1. 必要な MSM を追加します。 Visual Studio と InstallShield では、追加するマージ モジュールの参照先として、 C:\Program Files\Common Files\Merge Modules がデフォルトで指定されています。この参照 先を使用すれば、開発環境を再設定しなくても、すぐにインストーラを作成できます。 2. ランタイム ライセンス ファイルを追加します。 56 MapXtreme 2008 v7.0.0 第 2 章 : はじめに Web サイトの展開 Web サイトのデプロイメントを自分で作成する場合は、MSM を手動で追加する必要があります。 Web セットアップ プロジェクトは Web.config ファイル内で参照されるアセンブリを検出しませ ん。このため、アセンブリ (およびその MSM) が参照先として検出されません。MSM を手動で追 加するには、Web セットアップ プロジェクトを右クリックして [追加]、[マージ モジュール] をク リックします。MapInfoCoreEngine_7.x.x、MapInfoMXTConfig_7.x.x、MapInfoWeb_7.x.x、および必 要に応じてその他の MSM を選択します。 データにアクセスするアプリケーションの配布 データ アクセスを実行するすべての Visual Basic アプリケーションまたは Visual C# アプリケー ションで、MDAC (Microsoft Data Access Components) バージョン 2.7 以降が必要です。これらのア プリケーションを実行するには、アプリケーションをインストールする前に MDAC をインストー ルしておく必要があります。MDAC 2.8 は、MapXtreme 製品 CD に収録されています。 プロキシ サーバの背後に展開される MapXtreme Web アプリケーション Web アプリケーションをプロキシ サーバの背後に展開する場合は、MapXtreme サーバの URL をプ ロキシ サーバのバイパス キャッシュ リストに追加してください。こうすることにより、対象とな る各リクエストが MapXtreme によって動的にマッピングされます。 プロ キ シ サ ー バ に よ る 表 示 には、キャッシュされたイメージが使用されます。ただし、 MapXtreme のイメージは、リクエストのたびに生成されます。そのため、プロキシ サーバの背後 に置かれた Web アプリケーションの場合、イメージがキャッシュに送信されません。Web アプリ ケーションでは、マップ イメージが表示されずに赤色の X が表示されます。 配布する Web アプリケーションの一時ディレクトリへのアクセス権限 Web アプリケーションの配布では、統合セキュリティを使用する場合、サイトにアクセスするす べてのユーザに、一時ディレクトリおよびその他のリソースにアクセスする権限があるようにし ます。 MapXtreme は ASP.NET プロセス空間で実行され、このプロセスは、IIS プロセスから渡さ れるセキュリティ トークンを使って実行されます。ログインするユーザ全員にこのディレクトリ へ の ア ク セ ス 権 を 付 与 す る こ と が 必 要 で す。匿 名 ア ク セ ス を 使 用 す る 場 合、 IUSR_LocalMachineName システム アカウントに一時ディレクトリへのアクセス権を付与する必要 があります。 MapXtreme は、現在の TEMP 環境設定から一時ディレクトリを認識します。 アプリケーション データ ファイル アプリケーション データ ファイルは、アプリケーションが使用する実行可能でないファイルで す。 MapXtreme では、以下のアプリケーション データ ファイルがインストールおよび使用されま す。ファイルが格納される場所の変更については、「付録 C、522 ページの「アプリケーション データ ファイルの場所」」を参照してください。 開発者ガイド 57 アプリケーションの配布 ファイルの種類 ファイル名 略語ファイル MAPINFOW.ABB ペン ファイル MAPINFOW.PEN 投影法ファイル MapInfoCoordinateSystemSet.xml ベクトル シンボル ファイル MapInfow.fnt カスタム シンボル ディレクトリ CustSymb Nadcon のファイル *.las、*.los jgd2000 のファイル jgd2000.* MapXtreme のアプリケーションでは、デフォルトで以下のディレクトリにあるデータ ファイルが 検索されます。 • • Program Files\Common Files\MapInfo\MapXtreme\7.x.x - MapXtreme のインストーラによってこれ らのファイルが配置されるディレクトリです。 アプリケーションがあるディレクトリ - Windows アプリケーションの場合、.exe ファイルがあ るディレクトリです。Web アプリケーションの場合、Web.config ファイルがあるディレクトリ です。 展開インストールのトラブルシューティング 展開インストールのトラブルシューティングを行う際には、次の質問に対する答えを明らかにし ておく必要があります。 • • • • • • • 58 アプリケーションの展開に何を使用したか (ランタイム、SDK、Setup.exe、NCP/SCP など)。 ライセンス ファイルが C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x に格納されてい るか。 コンピュータ上に追加の .lic ファイルがあるか。ある場合は、削除します。 展開先コンピュータ上のユーザが管理者としてログオンしているか。 展開先コンピュータに 2.0 Framework SP2 および 3.5 SP1 がインストールされているか。 展開先コンピュータ上で CoreEngine が COM+ アプリケーションとして登録されているか。 コンピュータに Visual C++ 9.0 CRT (ランタイム) がインストールされているか。 MapXtreme 2008 v7.0.0 マッピングの概念 マッピングの基本的な概念を理解し、このような概念が MapXtreme でどのよ うに実装されているかを把握しておくと、マッピング アプリケーションを作 成する上で役立ちます。この章では、MapXtreme について学習する上で、共通 の概念について説明します。 開発者ガイドの最後には、マッピングやプログラミングに関する「付録 L: 「用語集」」が付属しているので、活用してください。 この章の構成: 「マッピングと MapXtreme」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 「MapXtreme でのジオコード化」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 「MapXtreme でのルーティング」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3 マッピングと MapXtreme マッピング アプリケーションの中心となる要素は、マップです。この章では、MapXtreme を使っ てアプリケーションを作成する際、よく使用される重要な用語を簡単に説明します。また、技術 的な情報をすぐに参照できるように、MapXtreme オブジェクト モデルの名前空間についても説明 します。この章のトピックを以下に示します。 • • • • • • • • • 「マップ」 「テーブル」 「レイヤ」 「フィーチャ」 「ラベルと凡例」 「主題図」 「ツール」 「ワークスペース」 「座標系と投影法」 マップ マップは、市町村、顧客の所在地、電源供給ラインなど、マップ フィーチャ間の空間関係を表示 します。マップは、このようなフィーチャの位置や説明を視覚的に示します。フィーチャの他に も、ラベル、タイトル、凡例、主題図などの要素をマップに追加できます。主題図は、マップ上 のフィーチャや情報に関する操作に基づいて作成されます。 マップは MapControl に含まれます。MapControl は、マップを表示するための標準的なツール (移 動、拡大、縮小、中心) も提供します。 マップはさまざまな方法で作成できます。 • • • マップ ワークスペースを作成および保存するには、MapXtreme ワークスペース マネージャを 使用します (「432 ページの「ワークスペース マネージャの機能」」を参照)。 MapXtreme テンプレートでは、Visual Studio フォームにドラッグ アンド ドロップできる MapControl を作成できます (デスクトップ アプリケーションの場合は「第 8 章: 「デスクトップ アプリケーション、コントロール、ダイアログ、ツール」」、Web アプリケーションの場合は 「第 5 章: 「MapXtreme Web コントロールとツール」」を参照)。 プログラムを使ってアプリケーションにマッピングを組み込むには、MapXtreme オブジェクト モデルを使用します (259 ページの「MapFactory」、および『開発者リファレンス』 (オンライ ン ヘルプ) の MapInfo.Mapping 名前空間を参照)。 テーブル テーブルには、マップ上に表示したいデータが格納されています。テーブルは、ジオメトリ、ス タイル、属性を含む、フィーチャ情報のレコードとフィールドを保持しています。 MapXtreme で は、MapInfo 標 準 の テ ー ブ ル (MapInfo .TAB)、リレーショナル データベース管理システム (RDBMS)、dBase、MS Access、ASCII ファイル、ESRI ShapeFiles など、さまざまなソースのテーブ ルがサポートされています。また、ラスタ、グリッド、シームレス、ビュー、WMS、ADO.NET な どの特殊なテーブルもあります。テーブルのタイプは、TableInfo クラスを通じて使用できます。 テーブルを開いたり閉じたりするには、MapInfo.Data 名前空間の Catalog を通じて行います。「第 10 章: 「データでの作業」」を参照してください。 60 MapXtreme 2008 v7.0.0 第 3 章 : マッピングの概念 レイヤ マップはレイヤで構成されます。レイヤには、郵便番号の境界、学区、番地などのマップ フィー チャが含まれます。レイヤの順番を理解することが重要です。一番下のレイヤが最初に描画さ れ、一番上のレイヤが最後に描画されます。レイヤ内に、他のレイヤのフィーチャに重なる フィーチャがある場合は、それぞれ、他のレイヤよりも下に配置する必要があります。たとえ ば、境界領域のレイヤはポイントのレイヤより下に配置する必要があります。 MapXtreme では、レイヤは、フィーチャだけなく、さらに多機能になっています。ラスタ イメー ジやグリッド イメージ、シームレス マップ (結合マップ) の表示や、ラベルやユーザ描画のフィー チャ、円グラフ主題図のようなオブジェクト主題図を含めることが可能です。レイヤをグループ 化すると、配置やフィーチャのアニメーションを簡単に実行できます。主なインターフェイスは IMapLayer です。詳細については「261 ページの「Layers」」を参照してください。 フィーチャ フィーチャは、ジオメトリ、スタイル、データ ソース、キー、および属性で記述されています。 通常、フィーチャはテーブル内の行です。サポートされているジオメトリには、指定した領域を 覆う閉じたオブジェクト (Polygons、MultiPolygons、Rings、Rectangle、RoundedRectangles、および Ellipses)、データの 1 つの位置を表すポイント オブジェクト (Points、MultiPoints)、および、指定し た距離を覆うライン オブジェクト (Curves、MultiCurves、および LegacyArcs) があります。 コンピュータ処理されたマップの主な用途の 1 つとして、フィーチャに関する情報を収集するとい うことがあります。MapXtreme では、スキーマを使って新規に作成する方法、選択ツールやメ ソッドを使って選択する方法、条件に基づいて Catalog を検索する方法など、いずれの方法でも フィーチャは FeatureCollections で返されます。 Feature クラスは、MapInfo.Data 名前空間に含まれています。 ラベルと凡例 マップは、表示内容についての説明がなければ、あまり役に立ちません。マップには、ラベルや 凡例といったテキストが必要です。ラベルは、LabelLayer という種類のレイヤに含まれます。この レイヤでは、表示と非表示、位置、スタイル、内容など、ラベルのあらゆる機能を制御できま 開発者ガイド 61 す。ラ ベル の 操 作 に つ い て、 MapXtreme で提供されているクラスには、LabelSources、 LabelProperties、LabelModifiers な ど が あ ります。「258 ページの「MapInfo.Mapping 名前空間と は」」を参照してください。 この他にも、マップの内容を正確に伝えるためのテキスト要素を使用できます。凡例は、記号を 使ってフィーチャを示す地図要素です。たとえば、学区などの境界、送電線などのライン、企業 の支店所在地などのポイントを示します。また、マップをまとめて表現するタイトルにも使用で きます。 MapXtreme では、凡例はマップ タイトルやスケール バーと一緒に Adornments クラスに含まれま す。Adornments は、MapInfo.Mapping 名前空間に含まれています。 主題図 コンピュータ処理したマップは、マップ フィーチャの空間的な関係を視覚的に表現するだけでな く、フィーチャに関連付けられたデータを分析することによって、更に詳細な情報をとらえるこ とができます。代表的な分析手法の 1 つとして、特定の基準に基づいてフィーチャ レイヤのデー タを順位付けし、これを元に主題図を作成する方法があります。たとえば、レンジ主題図は、同 じ条件を満たすフィーチャごとに、色分けしたブロックで示されます。サイズ可変シンボル主題 図は、人口の大きさによってシンボルのサイズを変更して人口の分散状況を示す場合などに便利 です。 主題図は、ラベル用に作成することもできます。たとえば、市の人口の大きさを相対的に示す場 合には、レンジ ラベル主題図を使用できます。ラベルのサイズが大きいほど、人口が多いことを 示します。 62 MapXtreme 2008 v7.0.0 第 3 章 : マッピングの概念 MapInfo.Mapping.Thematics 名前空間には、主題図を、フィーチャ レイヤに対するスタイル オー バーライドとしてインプリメントするクラス、およびオブジェクト主題図としてインプリメント するクラスが含まれています。修飾子主題図ではスタイルを変更し、オブジェクト主題図では新 しいレイヤを追加します。すべての主題図は ITheme インターフェイスをインプリメントします。 ツール ほとんどのマッピング アプリケーションにツールバー ボタン (ツール) が用意されています。これ らのツールは、一般的な描画タスク (マップ上にラインを描画するなど) および移動タスク (拡大な ど) を実行する際に役立ちます。また、 MapXtreme にはマッピング ツールが用意されているだけ でなく、ユーザが独自にツールを作成することもできます。 ツールは、デスクトップ ツールと Web ツールに分類され、対応する名前空間 (デスクトップの場 合は MapInfo.Tools 名前空間、Web ツールの場合は MapInfo.WebControls 名前空間) に含まれるツー ルごとに API があります。 MapXtreme のデスクトップ ツールの詳細については、「第 8 章、153 ページの「MapXtreme デス クトップ ツール API」 」を参照してください。Web ツールの詳細については、「第 5 章: 「Web ア プリケーション、コントロール、およびツール」」を参照してください。 ワークスペース ワークスペースは、厳密に言うとマッピングの概念には含まれませんが、ワークスペースを使用 することにより、マッピング要素の操作を簡易化できます。 MapXtreme は、MWS 拡張子を使った XML ベースのワークスペース形式をサポートしています。これには、マップの設定が含まれま す。ワークスペースの形式については、「付録 D: 「MapInfo ワークスペースについて」」を参照 してください。 MapXtreme では、ワークスペース マネージャというユーティリティが提供されて いるので、ワークスペースを作成して保存しておくことが可能です。「第 24 章: 「ワークスペース マネージャ」」を参照してください。 座標系と投影法 座標系と投影法の 2 つは、マッピングの重要な概念であり、基本的な内容を理解しておく必要があ ります。投影法とは、紙の地図やコンピュータの画面などの平面にマップを表示する方法です。 一方、座標系はマップ フィーチャを空間的に配置する方法です。アプリケーションの開発、特に 空間的な精度を重視する場合には、この 2 つを慎重に検討する必要があります。 投影法は、球状のオブジェクトを平面に表示したときに発生するひずみを少なくするための方法 です。面積を正しく表示する方法とフィーチャの形状を正しく表示する方法の 2 つがトレードオフ の関係にあるという点に注意が必要です。さまざまな種類の投影法がありますが、それぞれが特 定のひずみを低減することを目的に設計されています。たとえば、形状を正しく表示する投影法 や、面積、距離、方向などを正しく表示する投影法があります。 座標系とは、オブジェクトの位置座標を解釈する方法を示す一連のパラメータです。このパラ メータの 1 つが 投影法になります。座標系には、球面座標系と平面座標系の 2 種類があります。 球面座標は地球の曲面上の位置を示すのに対して、平面座標は平面上の位置を 2 次元で示します。 いずれの座標系も、x および y 座標で表現します。このような座標系には、道路や川など、地球上 での絶対的な位置を示すフィーチャについて、距離や面積の計算で誤差が出る方法 (球面座標) と、脳の構造やチェス盤など、相対的な位置の計算で誤差が出る方法 (平面座標) があります。 開発者ガイド 63 MapXtreme でのジオコード化 アプリケーションの開発では、マップでどのような座標系が使用されているかを理解することが 重要です。バッファ、ルーティング、クエリなどの距離および面積の計算を実行する分析処理で は、座標系や投影法を使って精度の高い結果を計算します。 座標系と投影法のクラスは、MapInfo.Geometry 名前空間に含まれます。詳細については「第 17 章: 「空間オブジェクトと座標系」」を参照してください。 MapXtreme でのジオコード化 これまで説明してきたマップで使用されるデータには、表示される内容よりも多くの情報が含ま れています。たとえば、店舗の所在地が含まれるテーブルには、店舗を正しい位置に配置するた めの地理的な座標系だけでなく、営業時間、顧客サービスの電話番号、責任者の氏名など、所在 地に関するデータも含まれていることがあります。このようなデータをアプリケーションで使用 すれば、強力な分析機能を発揮でき、テーブルの行や列からさまざまな情報を取り出すことがで きます。 一般的に、カスタム データで構成されるテーブルは、道路、市町村、水路など、実際の環境を示 すフィーチャである参照レイヤと一緒に、マップに含まれています。このような参照レイヤは、 通常の場合は市販されているので、マップ上ですぐ表示できます。 Pitney Bowes Business Insight は、世界中の位置情報を網羅した各種参照データを販売しています。また、MapXtreme では、400 MB を超える世界各国のサンプル データが提供されています。インストールするには、MapXtreme 製品の CD ブラウザで [サンプル データのインストール] を選択します カスタム インストール オプ ションを使用して、このデータ セットを必要な分だけインストールします。 ただし、ユーザが所有する店舗の所在地やコール センター地域などのカスタム データについて は、マップですぐ表示できない場合があります。テーブルには、地理的な座標系が必要であり、 これによって、マッピング エンジンはオブジェクトの描画位置を認識できます。座標系をデータ に割り当てる処理を、ジオコード化と呼びます。住所や郵便番号などの位置情報を含むテーブル は、ジオコード化が可能です。この処理では、カスタム テーブルを、ジオコード化済みの、同じ 位置情報を持つテーブルと照合します。住所が一致すると、ジオコード化されたテーブルの座標 系がカスタム データに割り当てられます。これで、カスタム データはマップに表示可能になりま す。 ジオコード化は、マップ作成作業の早い段階で実行されます。マッピング アプリケーションの開 発では、マップで表示するデータの種類やジオコード化の必要性を検討する必要があります。 MapXtreme フレームワークでは、ジオコード化を実行する Pitney Bowes Business Insight サーバ製品 へのアクセスが可能なジオコード化クライアントを使用するために、クラスが提供されています ( この機能は日本語版では利用できません)。ジオコード化の詳細については、「第 19 章: 「ジオ コード」」と、オンライン ヘルプ (Visual Studio でアクセス可能) の MapInfo.Geocoding 名前空間を 参照してください。 64 MapXtreme 2008 v7.0.0 第 3 章 : マッピングの概念 MapXtreme でのルーティング MapXtreme が提供している開発コンポーネントの 1 つに、ルーティングがあります。カーナビ ゲーション アプリケーションや、配送ルートおよびケーブル敷設ルートの計画を立てるアプリ ケーションでは、ルーティングを利用します。一般的には、距離や移動時間が最短になるルート を探すことを目的とします。 MapXtreme は、ポイントツーポイント ルーティング、マルチポイント ルーティング、マトリック ス ルーティング、および等値線ルーティングの 4 種類のルーティングを提供しています。それぞ れの種類に、ニーズに適したルーティング ネットワークを作成するための多くのオプションが用 意されています。 ジオコード化と同様に、MapXtreme にはあらかじめ設定されたルーティング クライアントがアプ リケーションに用意されています。これを使用して Pitney Bowes Business Insight 社のルーティング サーバ製品と対話します (この機能は日本語版では利用できません)。詳細については、「第 21 章: 「ルーティング」」と、MapXtreme オンライン ヘルプの MapInfo.Routing 名前空間を参照してくだ さい。 開発者ガイド 65 MapXtreme でのルーティング 66 MapXtreme 2008 v7.0.0 4 MapXtreme のアーキテク チャ この章では、ユーザが開発ニーズに応じて適切な方針を選択できるように、 MapXtreme のアーキテクチャについて説明します。この製品のアーキテクチャ を理解することは、この製品の特徴と機能を効率的に利用するアプリケーショ ンを作成する上で役立ちます。 この章の構成 「MapXtreme アーキテクチャ」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「オブジェクト モデルの概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「アプリケーションのアーキテクチャ」 . . . . . . . . . . . . . . . . . . . . . . . 「Web アプリケーションのアーキテクチャ」 . . . . . . . . . . . . . . . . . . . 「デスクトップ アプリケーションのアーキテクチャ」 . . . . . . . . . . . 68 69 72 73 75 MapXtreme アーキテクチャ MapXtreme は、Microsoft .NET Framework 上に構築されており、そのインフラストラクチャに含ま れる機能を利用しています。Pitney Bowes Business Insight イニシアチブ では、.NET Framework 上に おけるアプリケーション開発の優れた生産性と適応性を有効に活用できます。また、当社では、 当社の Windows 製品の強力な機能と使いやすさを 1 つにまとめた総合的なオブジェクト モデルを 提供するために大きな努力を払ってきました。オブジェクト モデルは、Pitney Bowes Business Insight のパートナーと顧客のみならず Pitney Bowes Business Insight 自身にとっても、近い将来に Windows ベースの製品を開発する基盤となるものです。 同様のコードを使用して、デスクトップまたは Web に導入可能なアプリケーションを開発できま す。アプリケーションをデスクトップ用として開発した場合は、そのコードに最小限の変更を加 えるだけで、そのアプリケーションを Web アプリケーションに作り替えることができます。 MapXtreme のアーキテクチャの概要を次の図に示します。MapInfo.CoreEngine.dll アセンブリと MapInfo.CoreTypes.dll アセンブリには、中核となるマッピング機能とデータ アクセス機能が含まれ ています。中核となるエンジンの最上部には、コントロール、ツール、および各導入環境に固有 の機能を含む MapInfo.Windows 名前空間と MapInfo.Web 名前空間があります。MapXtreme オブ ジェクト モデルから開発されるすべてのアプリケーションは、MapInfo.Windows 名前空間または MapInfo.Web 名前空間の上に構築されます。 MapXtreme アーキテクチャ 68 MapXtreme 2008 v7.0.0 第 4 章 : MapXtreme のアーキテクチャ オブジェクト モデルの概要 MapXtreme オブジェクト モデルは、多数の名前空間で構成されています。.NET 名前空間は、特定 のクラス、メソッド、およびプロパティを、同じ名前を持つ他のものから区別するための型分類 システムです。.NET 開発者は、名前空間を使用することにより、オブジェクト名の競合およびオ ブジェクト内のメソッド名やプロパティ名の競合を回避できます。 MapXtreme には、主要なインターフェイスおよびクラスの一覧と、名前空間によって分離された インターフェイスやクラス間の相互関係を示すフルカラーのポスターが同梱されています。この ポスターの PDF 版は、Windows の [スタート] メニューからアクセス可能なラーニング リソースの ページで表示できます。ラーニング リソースのページを表示するには、[スタート] > [すべてのプ ログラム] > [MapInfo] > [MapXtreme] > [ラーニング リソース] を選択してください。 以下に、MapXtreme オブジェクト モデルでインプリメントされている名前空間の一部を示しま す。各名前空間の全体的な概要については、以降のセクションで説明します。説明の中に、詳細 な説明と使用方法が記載された箇所を示す参照が記載されています。 • • • • • • • • • • • • • MapInfo.Data MapInfo.Data.Find MapInfo.Engine MapInfo.Geometry MapInfo.Mapping MapInfo.Persistence MapInfo.Raster MapInfo.Styles Mapinfo.Tools MapInfo.Windows.Controls MapInfo.WebControls MapInfo.Geocoding MapInfo.Routing Visual Studio に統合されている『MapXtreme 開発者リファレンス』では、オブジェクト モデルのす べての情報を名前空間ごとに整理された形で参照できます。 MapX または非 .NET バージョンの MapXtreme (Windows v3 対応の MapXtreme) を使用されていた ユーザの方は、付録 A: 「MapXtreme への移行」を参照して、新旧の製品のオブジェクト モデルの 相違点を確認してください。 MapInfo.Data 名前空間 MapInfo.Data 名前空間には、MapInfo データ プロバイダをインプリメントするクラスやインター フェイスが含まれています。オブジェクト モデルでは、データにアクセスするためのクラスとし て、複数の異なるクラスが用意されています。データにアクセスするには、そのデータの格納形 式に対応した特定のクラスを使用します。また、現在のオブジェクト モデルでは、対応するクラ スが用意されていない形式で格納されたデータのために、ADO.NET アクセスがインプリメントさ れています。MapInfo.Data 名前空間の詳細については、「第 10 章: 「データでの作業」」および 「第 12 章: 「DBMS のデータへのアクセス」」を参照してください。 開発者ガイド 69 オブジェクト モデルの概要 MapInfo.Data.Find 名前空間 MapInfo.Data.Find 名前空間には、データの検索に使用するクラスが含まれています。この名前空間 は、検索対象となるマップ作成可能なテーブルとフィールド (インデックス付き) を指定すること により、オブジェクトの検索を容易にします。MapInfo.Data.Find 名前空間の詳細については、「第 14 章: 「場所の検索」」を参照してください。 MapInfo.Engine 名前空間 MapInfo.Engine 名前空間には、MapXtreme ベースのすべてのアプリケーションの実行に必要な中核 機能に直接関係するクラスがすべて含まれています。この名前空間には、すべての MapXtreme ア プリケーション操作の開始点となる中核 Session クラスが含まれます。MapInfo.Engine 名前空間の 詳細については、「第 9 章: 「中核 MapXtreme クラスでの作業」」を参照してください。 MapInfo.Geometry 名前空間 MapInfo.Geometry 名前空間は、OGC (Open GIS Consortium) 標準、座標システム相互運用、および オブジェクト処理に基づく拡張可能な階層です。MapInfo.Geometry 名前空間には、Geometry オブ ジェクトを作成および編集するための、クラス、インターフェイス、列挙体が含まれます。 MapInfo.Geometry 名前空間の詳細については、第 17 章: 「空間オブジェクトと座標系」を参照して ください。 MapInfo.Mapping 名前空間 MapInfo.Mapping 名前空間には、マップ、レイヤ、修飾子、および、ラベルを作成、表示、エクス ポートするためのクラス、インターフェイス、および列挙体が含まれています。MapInfo.Mapping 名前空間の詳細については、「第 13 章: 「アプリケーションへのマッピング機能の追加」」を参照 してください。 MapInfo.Mapping.Legends 名前空間 MapInfo.Mapping.Legends 名前空間には、地図凡例および主題図凡例を作成および表示するための クラス、インターフェイス、および列挙体が含まれています。詳細については、「第 13 章、269 ページの「Legends」 」および「第 15 章: 「主題図と凡例の使用」」を参照してください。 MapInfo.Mapping.Thematics 名前空間 MapInfo.Mapping.Thematics 名前空間には、レイヤのスタイルおよびレイヤ自身として主題図をイン プリメントするクラスが含まれます。主題図を修飾子主題図に適用してスタイルを変更したり、 オブジェクト主題図で新しいレイヤを追加したりできます。すべての主題図は ITheme インター フェイスをインプリメントします。MapInfo.Mapping.Thematics 名前空間の詳細については、「第 15 章: 「主題図と凡例の使用」」を参照してください。 70 MapXtreme 2008 v7.0.0 第 4 章 : MapXtreme のアーキテクチャ MapInfo.Persistence 名前空間 MapInfo.Persistence 名前空間には、XML ベースのワークスペースの読み取りと書き込みをサポート するクラスが含まれ、マッピング ワークスペースの保存と取得が可能になります。「付録 D: 「MapInfo ワークスペースについて」」を参照してください。 MapInfo.Raster 名前空間 MapInfo.Raster 名前空間は、Pitney Bowes Business Insight の C/C++ Raster API と Grid API の全機能を 提供します。MapInfo.Raster.RasterRead を使用すると、ラスタ イメージをクエリの対象として開く ことができます。MapInfo.Raster.GridRead を使用すると、グリッド イメージをクエリの対象として 開くことができます。MapInfo.Raster.HillshadeWrite を使用すると、既存のグリッドに陰影処理を追 加で き ま す。MapInfo.Raster 名 前 空間には、この他に MapInfo.Raster.RasterInfo クラスおよび MapInfo.Raster.GridInfo クラスなどが含まれています。MapInfo.Raster 名前空間の詳細については、 第 18 章: 「ラスタとグリッドの操作」を参照してください。 MapInfo.Styles 名前空間 MapInfo.Styles 名前空間は、Styles オブジェクト モデルを強調表示します。Styles クラスは、すべて のスタイルのベース クラスです。MapInfo.Styles 名前空間の詳細については、第 16 章: 「マップの スタイル設定」を参照してください。 MapInfo.WebControls 名前空間 MapInfo.WebControls 名前空間は、MapXtreme ASP.NET アプリケーション用の Visual Studio テンプ レートを使用するためのサポートを提供しています。この名前空間から、MapControl および LayerControl の設計時拡張機能のほか、Web ツールを使用できます。MapInfo.WebControls 名前空間 の詳細については、「第 5 章: 「Web アプリケーション、コントロール、およびツール」」を参照 してください。 MapInfo.Windows 名前空間 MapInfo.Windows 名前空間には、Windows アプリケーションのフォームを開発する際に使用する各 種 Windows コントロールと必須コンポーネントをインプリメントするクラスが含まれています。 Windows.Dialogs 名前空間には、Windows アプリケーションで使用される各種ダイアログ ボックス およびダイアログ ボックス コンポーネントをインプリメントするクラスが含まれています。 MapInfo.Windows 名前空間の詳細については、「第 8 章: 「デスクトップ アプリケーション、コン トロール、ダイアログ、ツール」」を参照してください。 MapInfo.Tools 名前空間 MapInfo.Tools 名前空間には、デスクトップ マップ アプリケーションで使用される多くの種類の ツールを作成およびインプリメントするためのクラスが含まれています。MapInfo.Tools 名前空間 の詳細については、「第 8 章、151 ページの「MapInfo.Tools 名前空間の概要」 」を参照してくだ さい。 開発者ガイド 71 アプリケーションのアーキテクチャ MapInfo.Geocoding 名前空間 MapInfo.Geocoding 名前空間には、ジオコード化処理のための MapXtreme クライアントを定義する クラス、インターフェイス、および列挙体が含まれています。MapInfo ジオコード サーバまたは MapInfo Location Utility サービスを使用するジオコード化処理がサポートされています。ジオコー ド化処理を実行するには、稼働中のジオコード サーバまたは Location Utility サービスの URL を利 用できる必要があります。ジオコード サーバと Location Utility サービスは、どちらも、ジオコー ドのリクエスト、制約、レスポンス、結果コード、入力住所、および住所候補について同じクラ スを使用するので、両者のインターフェイスは類似しています。「第 19 章: 「ジオコード」」を参 照してください。 MapInfo.Routing 名前空間 MapInfo.Routing 名前空間には、ルーティング サービス用の .NET クライアントを構成するクラ ス、インターフェイス、および列挙体が含まれています。MapInfo.Routing 名前空間に含まれてい るクラスは、最短時間または最短距離に最適化された ポイントツーポイント、マルチポイント、 マトリックス、等値線の各ルーティングをサポートします。この名前空間のクラスは、その他の MapInfo ルーティング サーバ製品の機能を対話的に利用できます。特定のポイントを回避する機能 も利用できます。ルーティング結果には、段階順の指示や、マップに表示できるルート ジオメト リが含まれる場合があります。「第 21 章: 「ルーティング」」を参照してください。 アプリケーションのアーキテクチャ MapXtreme の名前空間の概要を理解したら、次の段階として、構築を計画しているアプリケー ションのアーキテクチャを検討します。 MapXtreme を使用すると、Web アプリケーションとデスクトップ アプリケーションの両方を構築 できます。以降の各セクションでは、Web アプリケーションおよびデスクトップ アプリケーショ ンで使用可能なアーキテクチャについて説明します。アプリケーションの設計は、MVC (ModelView-Controller) パラダイムに基づいています。これは、アプリケーションの データ モデル、ユー ザ インターフェイス、および制御ロジックを、別々の 3つのコンポーネントに分離するという考え 方です。この考え方に基づいて設計を行うと、1 つのコンポーネントに変更を加えた場合に、その 変更が他のコンポーネントに与える影響を最小限に抑えられます。MapXtreme アプリケーション を計画する際に考慮する必要のある主な設計要素および決定事項に関する重要な情報について は、「 第 5 章: 「Web アプリケーション、コントロール、およびツール」」および「第 8 章: 「デ スクトップ アプリケーション、コントロール、ダイアログ、ツール」」を参照してください。 72 MapXtreme 2008 v7.0.0 第 4 章 : MapXtreme のアーキテクチャ Web アプリケーションのアーキテクチャ アーキテクチャの説明 上の図に示した Web アプリケーションで利用されているコンポーネントおよび機能は次のとおり です。 • • • • MapXtreme Web アプリケーション Microsoft .NET インフラストラクチャ マップ作成ツール データ アクセス MapXtreme Web アプリケーション 一般的な MapXtreme Web アプリケーションは、ビュー (プレゼンテーション レイヤ)、モデル (デー タ ソースおよびアプリケーションの内部データ モデルとのデータのやり取りに使用するモデル)、 およびコントローラ (アプリケーションのフローを制御するビジネス ロジック) で構成されていま す。 開発者ガイド 73 Web アプリケーションのアーキテクチャ MapXtreme では、Microsoft Visual Studio に統合された Web テンプレートが提供されており、この テンプレートを利用して初期段階の Web アプリケーションを効率的に作成できます。Web アプリ ケーションの構築方法の詳細については、「付録 B: 「Web アプリケーションの作成」」のチュー トリアルを参照してください。 ビューを作成するには、ドラッグ アンド ドロップの操作によって、各種の MapXtreme Web コント ロールを Visual Studio の Web フォーム上に配置します。内部データ構造を構築して、外部データ ソース、ベース マップ、および動的コンテンツのデータの処理を実行するには、MapInfo.Engine および MapInfo.Data 名前空間のオブジェクトを使用します。そして、コントローラのコードを使 用して、ビューとデータを連携させることにより、ユーザがアプリケーションを効率的に使用で きる操作の流れを実現して、ユーザのビジネス上のニーズや問題を解決することを可能にしま す。 Microsoft .NET インフラストラクチャ MapXtreme は Microsoft .NET Framework 2.0 環境で動作します。MapXtreme を使用して構築された アプリケーションは、IIS のワーカー プロセスで実行される ASP.NET アプリケーションとして動 作します。 Microsoft ASP.NET フレームワークでは、高いパフォーマンスが要求されるエンタープライズ アプ リケーションの開発に適した COM+ オブジェクト プール機能が提供されており、ワークスペース などのオブジェクトを事前に読み込むことができます。MapXtreme のオブジェクト モデルは、こ のフレームワークの下で非常に効率的に動作します。また、このフレームワークでは、自動およ び手動による状態管理制御が可能であるだけでなく、StateServer および SQL Server などのアプリ ケーション状態管理ツールも提供されています。これらの機能に関する重要な情報については、 「 第 6 章: 「状態管理について」」で説明します。 マップ作成ツール アプリケーションのベース マップを作成するには、MapXtreme ワークスペース マネージャを使用 します。このツールでは、マップの各レイヤを管理し、そのマップのズーム レベル、ラベル、ス タイル、主題図、および修飾を制御することによって、アプリケーションに必要な表示を意図し たとおりに実現できます。作成したマップの情報は XML ベースのワークスペースに保存され、後 から必要に応じて容易に読み込むことができます。「第 24 章: 「ワークスペース マネージャ」」 を参照してください。 データ アクセス このアーキテクチャの重要な要素の 1 つは、動的データ内容にアクセスする機能です。このデータ アクセスは、MapInfo.Data 名前空間内のオブジェクトによって実現されます。このデータ アクセ ス機能では、WMS、WFS、リモートのデータベース管理システム、GPS からのライブ フィード、 MapInfo ルーティング サービスからの運転用指示など、さまざまなデータ ソースからのデータ内 容を利用できます。また、多様なデータを最大限に活用するために、複数の異なるデータ ソース からの情報を同時に使用することができます。「第 10 章: 「データでの作業」」を参照してくださ い。 74 MapXtreme 2008 v7.0.0 第 4 章 : MapXtreme のアーキテクチャ デスクトップ アプリケーションのアーキテクチャ デスクトップ アプリケーションのアーキテクチャは、MVC (Model-View-Controller) に基づく設計 である点において、Web アプリケーションのアーキテクチャに類似しています。 プレゼンテーション レイヤ、アプリケーション モデル、およびビジネス ロジックでは、それぞれ 別のコンポーネットが使用されます。必要なベース マップを作成するには、ワークスペース マ ネージャを使用します。アプリケーションでは、Windows のコントロールとダイアログ ボックス を使用して、豊かな使用感を実現することができます。また、さまざまなソースからの動的デー タ内容を同時に使用することや、アプリケーションのフローとロジックを制御することもできま す。 詳細については、「第 8 章: 「デスクトップ アプリケーション、コントロール、ダイアログ、ツー ル」」を参照してください。 開発者ガイド 75 デスクトップ アプリケーションのアーキテクチャ 76 MapXtreme 2008 v7.0.0 Web アプリケーション、 コントロール、およびツー ル この章では、MapXtreme に付属する Web コントロールや各種ツールを 使った ASP.NET Web アプリケーションの作成についてのさまざまな情報 を提供しています。 この章の構成 「Web アプリケーションのリクエスト/レスポンスのライフサイク ル」78 「MapXtreme Web アプリケーションのコンポーネント」 . . . . . . . . . 78 「MapXtreme Web コントロールとツール」 . . . . . . . . . . . . . . . . . . . . . 81 「Web コントロールのアーキテクチャ」 . . . . . . . . . . . . . . . . . . . . . . . 84 「MapXtreme Web コントロールの使用」 . . . . . . . . . . . . . . . . . . . . . . . 88 「Web コントロールの管理」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 「カスタム ツールの作成」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 「カスタム Web コントロールの使用と配布」 . . . . . . . . . . . . . . . . . . . 92 「Web アプリケーションへの InfoTool の追加」 . . . . . . . . . . . . . . . . . 93 「ASP.NET AJAX と MapXtreme Web アプリケーション」 . . . . . . . . . 94 「MapXtreme タイル ハンドラ」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 「HTML/XHTML 検証の問題」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 「ポスト バック Web コントロールから JavaScript Web コントロール への移行」100 「Web コントロールの特殊な使用法」 . . . . . . . . . . . . . . . . . . . . . . . . 102 5 MapXtreme Web アプリケーションのコンポーネント Web アプリケーションのリクエスト/レスポンスのライフサイクル 効率的な Web アプリケーションを計画および作成するためには、バックグラウンドで行われるク ライアント (ブラウザ) とサーバ (Web アプリケーション) 間の対話についての十分な理解が必要で す。最も単純な形態の Web アプリケーションは、Web ブラウザからインターネット接続またはイ ントラネット接続を介してアクセスするソフトウェア アプリケーションです。ユーザにはアプリ ケーションの機能が HTML ページとして提供されます。ユーザが Web ページ上の要素を対話的に 操作することで、HTTP リクエストが Web サーバに送信されて処理されます。Web サーバは、 ユーザのリクエストを満たしたレスポンスを送り返します。 一般に、MapXtreme Web アプリケーションは、マップのイメージや、そのマップを対話的に操作 するためのツールをユーザに提供します。単純な例で言えば、ユーザが拡大ツールをクリックし てから、同じマップの異なるビューが表示されるまでが単一のリクエスト/レスポンス サイクルで す。拡大リクエストはバックグラウンドでサーバに送信されています。サーバがリクエストを処 理し、更新されたマップのイメージを返すことによって、新しいビューが表示されます。 MapXtreme Web アプリケーションのアーキテクチャについては、第 4 章: 「MapXtreme のアーキテ クチャ」を参照してください。 MapXtreme アプリケーションの構築方法の詳細については、付録 B、487 ページの「MapXtreme ア プリケーションを作成および展開する方法」のチュートリアルを参照してください。 ASP.NET Web ア プ リ ケ ー シ ョ ン の 作 成については、Microsoft の MSDN のトピック「Creating ASP.NET Web Applications」ÇšéQèýǵǃǦÇæÇŠÇ¢ÅB MapXtreme Web アプリケーションのコンポーネント 以降のセクションでは、一般的な MapXtreme Web アプリケーションを構成する主なコンポーネン トについて説明します。具体的には次のコンポーネントについて取り上げています。 • • • • • 「MapXtreme セッション」 「バックグラウンド マップ」 「MapControl」 「マップ ツール」 「状態管理とプール機能」 MapXtreme セッション MapXtreme セッションは、すべての MapXtreme アプリケーション操作の開始点となります。これ により、MapXtreme アプリケーションに必要なリソースの初期化を管理します。また、Catalog、 MapFactory、CoordSysFactory、Selections などの重要なオブジェクトに対しても、MapXtreme セッ ションを通じてアクセスできます。 MapXtreme セッションにアクセスするには、MapInfo.Engine.Session.Current() メソッドを呼び出し ます。プロセスの 1 つのスレッドで使用できる MapXtreme セッション オブジェクトは 1 つです。 スレッドごとに 1 つの MapXtreme セッションが存在しており、このセッションを複数のスレッド で共有することはできません。第 9 章: 「ISession インターフェイス」を参照してください。 78 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール Web アプリケーションでは、1 ユーザにつき 1 つの MapXtreme セッション オブジェクトが割り当 てられる場合と、プールされた MapXtreme セッションを複数のユーザが共有する場合とがありま す。この 2 つの開発モデルについては、第 6 章: 「状態管理について」を参照してください。 バックグラウンド マップ イメージ形式であるバックグラウンド マップは、MapXtreme Web アプリケーションの中でも最も 視覚的なコンポーネントです。マップ フィーチャに関する情報をアプリケーション ユーザに提供 したり、他のマップ フィーチャとの関係を示したりする役割を持ちます。バックグラウンド マッ プは、行政区画、街路網、関心地点などの参照レイヤで構成されるのが一般的です。アプリケー ションに関連したカスタム データ (オフィス所在地、携帯電話のアンテナ、ATM を表すポイント など) は、追加のレイヤです。参照レイヤとカスタム レイヤについては、ユーザによるアプリケー ションの対話操作で変化することはありません。通常、変化するのはマップの表示です。ユーザ が特定の場所を拡大表示したり、Web リクエストとして送信された条件に基づいて、主題図の色 分けをマップに重ねたりすることが考えられます。 バックグラウンド マップは、初期状態のまま (つまり、クリーンな状態で) ユーザに表示されま す。プール型のアプリケーションを設計する場合、この状態は重要な考慮事項となります。ユー ザ状態の変化をアプリケーション側で処理する必要があるためです。 バックグラウンド マップは、XML ベースのワークスペース (.mws) からアプリケーションへと事前 に読み込まれます。ワークスペースは、アプリケーションの Web.config ファイルで指定されま す。第 6 章、109 ページの「初期マップの設定」 を参照してください。MapXtreme の Web テンプ レートおよびサンプル アプリケーションの Web.config ファイルでは、サンプル データへのパスが ハードコーディングされています。これらをひな形として Web アプリケーションを作成する場合 は、実際のデータに合わせてパスを変更してください。 バックグラウンド マップの作成を支援するデスクトップ アプリケーションの一つに、MapXtreme に付属のワークスペース マネージャ ユーティリティがあります。第 24 章、431 ページの「ワーク スペース マネージャ」 を参照してください。 MapControl MapControl は、Map オブジェクトのインスタンスを含む MapXtreme Web サーバです。MapControl は、MapXtreme アプリケーションの主要な Web コントロールです。バックグラウンド マップを表 示したり、マップ上で行われるツールの対話操作に応答したりする役割をつかさどります。Map オブジェクトは、バックグラウンドで MapControl の MapAlias プロパティを使用して MapFactory から取得されます。このマップがイメージとしてレンダリングおよびエクスポートされ、コント ロールの <img> タグとしてブラウザに返されます。 MapXtreme Web サイト テンプレートと同様、MapXtreme に付属するサンプル アプリケーションに は MapControl が組み込まれています。ただし、デザイン モードでは、マップはレンダリングされ ません。これは、Web MapControl からマップを取得するためには、動的に生成された javascript と 共に、マップ イメージを処理するための Web アプリケーションがサーバ上で動作している必要が あるためです。これは、実行時/デバッグ時のみ使用できます。 注意 Visual Studio Visual Basic または C# のテンプレートをひな形とする場合は、MapControl およ びツールを手動で Web フォームに追加しないと、MapXtreme のリソースがプロジェクトに 追加されません。 詳細については、81 ページの「MapXtreme Web コントロールとツール」を参照してください。 開発者ガイド 79 MapXtreme Web アプリケーションのコンポーネント 図 : MapXtreme Web アプリケーションの設計時画面 図 : MapXtreme Web アプリケーションの実行時画面 80 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール マップ ツール MapXtreme には、バックグラウンド マップをナビゲートしたり対話的に操作したりするための、 さまざまなマップ ツールが用意されています。これらのツールは、Visual Studio のツールボックス に存在します。これらのツールを Web フォームにドラッグ アンド ドロップして使用できます。 MapXtreme Web テンプレートおよびサンプル アプリケーションには、こうしたツールの多くが組 み込まれています。次に、その例をいくつか示します。 • • • 中心表示、移動、拡大、縮小のための標準的なツール ズーム レベル (500 ~ 12,500 マップ単位) があらかじめ設定された ZoomBarTool 45 度間隔で線を直接移動することのできる方位ツール (N、NE、E、SE、S、SW、W、NW) LegendControl、Distance ツール、および選択ツールは、Visual Studio ツールボックスの MapXtreme 領域に置かれています。 ツールについては、83 ページの「Web コントロールとツールについて」を参照してください。 ツールボックスには、あらゆる MapXtreme マップ ツールのベースとなる汎用的な WebTool も配置 されています。このツールは、ツールに独自の動作を追加したい場合に使用します。90 ページの 「カスタム ツールの作成」を参照してください。 状態管理とプール機能 MapXtreme Web アプリケーションの作成目標の一つは、高い安定性とスケーラビリティ、およ び、快適な操作感を実現することです。MapXtreme には、アプリケーションの状態を管理した り、ユーザ数の増加に合わせて拡張したりするための構成が用意されています。 MapXtreme Web サイトのテンプレートおよびサンプル アプリケーションは、状態を手動で管理す るように構成されています。つまり、ユーザがアプリケーションとの対話操作を通じて行った変 更だけが保存され、復元されます。独自のアプリケーションを作成する際は、実際のアプリケー ションおよび保存/復元の要件に合ったコードを作成することになります。 将来的なアプリケーション ユーザ数の増加に効率よく備えるためには、Microsoft COM+ プール サービスを使用するようにテンプレートおよびサンプル アプリケーションを構成します。そうす ることで、MapXtreme セッション オブジェクトを複数のリクエスト間で共有できます。 Web アプリケーションの計画時には、状態管理およびプールについて慎重に検討する必要があり ます。第 6 章: 「状態管理について」を参照してください。 MapXtreme Web コントロールとツール MapXtreme の Web コントロールおよびツールは、Web ページに埋め込まれます。Web コントロー ルは、Web ツールからの対話操作に反応します。ツールを使って取得した情報は、サーバ側で Web ページによって処理され、通常は新しいマップ イメージとしてクライアントに返されます。 MapXtreme には、3 つの Web コントロール (MapControl、LayerControl、LegendControl) と複数の マップ ツールが備わっています。Web コントロールに表示される内容としては、マップのほか、 マップ レイヤやラベル レイヤとそのプロパティのリスト、レイヤが表している情報を識別するた めの凡例などがあります。ツールは MapControl との対話を通じてマップのビューを変化させま 開発者ガイド 81 MapXtreme Web コントロールとツール す。さらに、その後の分析のためにマップ上のフィーチャを選択するなど、さまざまな目的で使 用されます。Web コントロールおよびツールの詳細については、83 ページの「Web コントロール とツールについて」を参照してください。 Web コントロールおよびツールは、Visual Studio 内のさまざまな場所から利用できます。 • • • Visual Studio ツールボックス: MapXtreme の見出し下にあります。マッピング機能をプロジェク トに追加するには、これらのコントロールを Web フォームにドラッグ アンド ドロップしま す。 Web サイト アプリケーション テンプレート: MapXtreme Web サイト テンプレート (Visual Studio の [ファイル] > [新規作成] > [Web サイト] メニュー) から作業を始めて、コードを一切記述する ことなく、マッピングのプロトタイプを作成できます。 サンプル アプリケーション: タスク指向のサンプルが \Samples\Visual Studio 200x\Web\Features フォルダに格納されています。ソース コードも提供されているため、独自にコードを作成する 際の手本にしたり、応用したりすることができます。 Web コントロールおよびツールの API は、MapInfo.WebControls 名前空間にあります。詳細につい ては、『開発者リファレンス』を参照してください。 JavaScript 対応によるページの部分更新 MapXtreme の Web コントロールおよびツールでは、Web ページに JavaScript を組み合わせることに よって、必要な処理を MapXtreme サーバに伝えます。それぞれのマップ ツールでは、発生させる アクション (クリック、長方形、線、ポリゴンの描画など) を定義する JavaScript ClientInteraction と、URL リクエストをサーバに送信して、コマンド (移動、拡大/縮小、オブジェクトの選択など) を処理する JavaScript ClientCommand を指定します。 これらの JavaScript 対応ツールでは、使用のたびにページ全体をポスト バックさせる必要がありま せん。通常、ツールが使用されると、その都度、マップのイメージだけが更新されます。この開 発モデルについては、85 ページの「マップ ツールのアーキテクチャ」を参照してください。イベ ント処理、エラー管理、および状態管理については、89 ページの「Web コントロールの管理」を 参照してください。 従来の (v6.5 リリースより前の) MapXtreme コントロールでは、ツールを使用するたびに Page_Load と Page_Unload を呼び出すポスト バックが必要でした。これらのツールは旧バージョンとの互換 性を確保するために提供されていますが、新たに開発するプロジェクトでの使用はお勧めしませ ん。100 ページの「ポスト バック Web コントロールから JavaScript Web コントロールへの移行」を 参照してください。 カスタマイズ可能 付属ツールの機能だけではニーズを満たすことができない場合は、カスタマイズすることを検討 してください。カスタマイズは、ビルトイン ツールのプロパティを変更するだけの単純な方法か ら、JavaScript やサーバ サイド クラスを独自に作成して機能を拡張するという複雑な方法まで幅広 く 対 応 し て い ま す。Web コントロールおよびツール のソース コードは Samples\MapXtremeWebControlsSourceCode フォルダに格納されています。90 ページの「カスタム ツールの作成」を参照してください。 MapXtreme に付属の ASP.NET AJAX サンプル アプリケーションでは、Microsoft の ASP.NET AJAX コントロールを MapXtreme の Web マッピング アプリケーションで実際に使用する方法を紹介して います。94 ページの「ASP.NET AJAX と MapXtreme Web アプリケーション」を参照してくださ い。 82 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール Web コントロールとツールについて 次の表は、利用可能な MapXtreme Web コントロールとツールをまとめたものです。 Web コントロール 概要 MapControl Map オブジェクトのインスタンスを表示できます。各 Map オブジェク トは MapAlias で参照されます (Map1 など)。 実行時には、マップの MapAlias プロパティを使って MapFactory から 取得されたマップが MapControl に表示されます。マップは、マップ イ メージにエクスポートし、このイメージを HTML <img> タグ内で参照 することによって描画されます。MapAlias プロパティが指定されな かったか無効であった場合、MapFactory の最初のマップが選択されま す。MapControl MapAlias プロパティは設計時に設定します。 LayerControl マップのフィーチャ レイヤとラベル レイヤをツリー ビュー構造で表 示します。このコントロールを使用すると、特定のレイヤの表示/非表 示を切り替えたり、読み取り専用の現在のズーム値を表示したりでき ます。表示/非表示の変更は、LayerControl を使用するアプリケーショ ンがアクティブになっている間だけ保持されます。 LegendControl LegendControl を使うと、特定の MapControl に凡例を表示できます。凡 例は、対話操作のできないイメージとして返されます。デフォルトの エクスポート フォーマットは .GIF です。 表示する凡例は、LegendAlias またはマップの凡例リスト内の対応する インデックスを使って設計時に指定できます。ページ上で JavaScript を 使用して設定することもできます。凡例の表示と非表示を、JavaScript を使って切り替えることもできます。凡例をスクロール可能にするこ ともできます。 LegendControl では、主題図凡例とシンボル凡例の両方がサポートされ ます。 Legend Control Web サンプル アプリケーションは、このコントロール をサポートしています。このサンプル アプリケーションでは、現在の Web コントロール アーキテクチャをベースとして、カスタマイズされ た LegendControl を作成して使用する方法や、JavaScript を使ってサー バに要求を送信することによって、ページ全体を更新する必要なく主 題図を作成したり、凡例を表示したりする方法を紹介しています。詳 細については、[すべてのプログラム] の [MapXtreme ラーニング リ ソース] か、または MapInfo Web サイトの 「Support & Training」を参照 してください。[ラーニング リソース] リンクを展開し、[サンプル ア プリケーション] をクリックします。 マップ ツール 概要 CenterTool マップ上でクリックすることでマップの中心を変更できます。 DistanceTool マップ上でクリックした 2 つ以上のポイントの間の距離を取得できま す。 開発者ガイド 83 Web コントロールのアーキテクチャ NavigationTools 固定方向 (北、南、東、西、北東、北西、南東、南西) にマップを移動 できます。 PanTool マップを任意の方向にドラッグすることでウィンドウ内の位置を変更 できます。 PointSelectionTool マップ上でクリックされた (ポイントに最も近い) フィーチャを選択で きます。 PolygonSelectionTool ポリゴン内に中心点が存在するすべてのフィーチャを選択できます。 選択領域は、マップ上でマウスをクリックしてポリゴンのノードを表 すポイントを作成することで描画されます。ダブル クリックするとポ リゴンが閉じられます。 RadiusSelectionTool 半径内に中心点が存在するすべてのフィーチャを選択できます。半径 は、マップ上でマウスをクリックして円の中心および境界を表すポイ ントを作成することで描画されます。選択半径は、クリックとドラッ グ操作でマップ上に描画されます。 RectangleSelectionTool 長方形内に中心点が存在するすべてのフィーチャを選択できます。長 方形の選択領域は、クリックとドラッグ操作でマップ上に描画されま す。 ZoomBarTool マップのズーム レベルを、あらかじめ設定された範囲内 (500 ~ 12,500 マップ単位) で変更できます。 ZoomInTool シングル クリックまたは長方形領域を選択することによってマップを 拡大表示できます。 ZoomOutTool マップ上で縮小表示するビューを表す長方形を描画できます。 InfoTool サ ン プ ル Web サンプル Web アプリケーションには、InfoTool のサンプルが含まれて アプリケーション います。MapXtreme Web コントロール アーキテクチャに基づいてカス タマイズしたマップ ツールを作成および使用する方法が紹介されてい ます。 Web コントロールのアーキテクチャ MapXtreme Web コントロール アーキテクチャでは、ASP.NET モデルに従って Web アプリケーショ ンを作成します。全体的なアーキテクチャには、MVC (Model-View-Controller) の設計パターンが採 用 さ れ て い ま す。Model を 表 す Web アプリケーション、View を表す Web ページ (HTML、 JavaScript)、および Controller を表す MapXtreme サーバ (情報要求に応答する) で構成されます。 ユーザと Web アプリケーション間の対話操作は、Web コントロールとツールを介して行われま す。Web コントロールとツールによってデータが収集され、必要な指示やコマンドがサーバに送 信されます。サーバでは、その情報を処理して返すことになります。 84 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール MapXtreme では、初期化時、Web ページがレンダリングされたときに、コントロールおよびツー ルがレンダリングされます。初期化が完了し、ツールが使用されるときは、マップ イメージだけ がレンダリングされます。これらの JavaScript 対応ツールは、ツール操作のたびにページ全体がポ スト バックされる v6.5 以前の Web コントロールにはない利点を備えていると言えます。 MapXtreme コントロールは、次の動作と機能を備えています。 • • • • • バックグラウンド マップは定義済みのワークスペースを介して読み込まれます。設計時は、 MapControl の MapAlias プロパティを、事前に読み込まれるワークスペースに定義されている マップのマップ エイリアスに設定します。対応するマップが実行時に MapControl に読み込ま れ、マップ ツールを対話操作する準備が整います。 ページが初めてレンダリングされるとき、Page_Load および Page_Unload が呼び出されます。 Page_Load では、アプリケーションの状態が、新しいセッションのデフォルトの状態に初期化 されるか、既存のセッションの場合は状態が復元されます。Page_Unload では、あらゆる変更 の状態が、別のリクエストに備えて保存されます。 StateManager は、アプリケーション内でクラスとしてインプリメントされ、そのクラスのイン スタンスが MapXtreme セッションに入力されます。SaveState メソッドと RestoreState メソッド は、このオブジェクトから呼び出されます。SaveState メソッドと RestoreState メソッドは、 ツールが使用されるたびに呼び出されます。状態管理に Manual モードが使用される場合 (Web.config フ ァ イ ル 内 で MapInfo.Engine.Session.State が Manual に設定されている場合)、 StateManager クラス インスタンスがセッションに含まれている必要があります。状態管理の詳 細については、89 ページの「状態管理」を参照してください。 エラー処理は、application_error イベント ハンドラの global_asax.cs/.vb ファイルで実行されま す。89 ページの「エラーの管理」を参照してください。 イベントは、リクエストをサーバに送信するクライアント サイド JavaScript コマンドを介して 処理されます。サーバ サイドの処理は、サーバ サイドのコマンド クラスによって処理されま す。89 ページの「イベント処理」を参照してください。 Visual Studio MapXtreme Web テンプレートに含まれる MapXtremeWebResources フォルダには、Web コントロールおよびマップ ツールに必要な依存ファイルが格納されています。アプリケーション を展開する際は、これらのファイルを忘れずに追加するようにしてください。 マップ ツールのアーキテクチャ MapXtreme のマップ ツールを使用すると、マップをさまざまな方法で対話的に操作できます (別の ビューに移動したり、マップの領域を選択してその後の分析に必要なデータを収集するなど)。 MapXtreme Web サイト テンプレートには、基本的な移動ツールがひととおり用意されています。 これらのツールは、マップ フィーチャを選択したり凡例を追加したりするための他のツールと一 緒に、Visual Studio のツールボックスに表示されます。 マップ ツールは、クライアント サイド コンポーネントとサーバ サイド コンポーネントで構成さ れます。クライアント サイド コンポーネントには、JavaScript 対話コンポーネントと JavaScript ク ライアント コマンド コンポーネントがあります。サーバ サイド コンポーネントには、サーバ コ マンド クラス コンポーネントがあります。 次に、マップ ツールのクライアント サイド コンポーネントの役割を示します。 • • • 描画とマウス操作 (ラバー バンド長方形、マウス クリックなど) マウス操作からのデータ収集 (拡大操作の画面座標を取得するなど) サーバへの URL リクエスト送信 次に、マップ ツールのサーバ サイド コンポーネントの役割を示します。 開発者ガイド 85 Web コントロールのアーキテクチャ • ツールのビジネス ロジックの実行 (2 点間の距離を計算するなど) クライアント サイドのマップ対話 マップ ツールのクライアント サイドの対話は、JavaScript のクラスを使ってインプリメントされま す。これらは、任意のユーザ インターフェイスで使用して、任意の HTML 要素での対話操作を実 行することができる汎用的なクラスです。Interaction.js に定義されている基本クラス (Interaction) を 拡張することで、ClickInteraction や RectInteraction など、特定の目的に特化したさまざまな対話操 作を作成できます。以下は、Interaction クラスのコンストラクタを示しています。 Interaction(elementID, onComplete) elementID はマップの IMG タグを、onComplete は対話操作の完了時に呼び出される関数を 表します。 たとえば、Interaction クラスを使用すると、マップ上にラバー バンド長方形を描画し、その範囲内 に含まれるすべてのポイント フィーチャを収集できます。 クライアント サイドのコマンド実行 マップ ツールは、特定のタスクを実行するためのクライアント サイド JavaScript コマンド オブ ジェクトを持ちます。Command.js に定義されている基本クラス (Command) を拡張することで、 PanCommand や ZoomCommand など、特定の目的に特化したさまざまなコマンドを作成できます。 マップ ツールの対話操作が完了すると、ツールによりクライアント コマンドが実行されます。以 下は、Command クラスのコンストラクタを示しています。 Command(name, interaction) name はサーバ サイドの Command クラス名を、interaction はクライアントの対話操作中に 収集されたデータを表します。 クライアント コマンドでは、URL リクエストが生成されます。このリクエストがサーバに送信さ れ、レスポンスが処理されて、新しいマップが表示されます。 対話オブジェクトは null に設定できます。これは、コマンドを自動的に起動する、移動、ズー ム、ポイント選択などのクライアント 側の対話操作がないことを意味します。コマンドを起動す ることはできますが、プログラムから指定する必要があります。 サーバ サイドのコマンド アーキテクチャ ク ラ イ アン ト か ら 送 信 さ れ た URL リクエストは、サーバ側の MapInfo.WebControls.MapControlModel クラスによって処理されます。このクラスには、基本的な マップ移動コマンド (移動やズームなど) を実行するためのメソッドのほか、長方形や選択半径内 のポイント、ポリゴン、フィーチャを選択するためのセレクション コマンドが用意されていま す。InvokeCommand メソッドを使用すると、特定のツール コマンドを探し、その Execute メソッ ドを呼び出すことができます。Execute は、RestoreState、Process、および SaveState を順に呼び出し ます。 こ の ク ラ ス に イ ン プ リ メ ン ト さ れ て い る 以 外 の コ マ ン ド を 実 行 す る に は、 WebControls.MapBaseCommand クラスを継承する Command クラスを独自に作成する必要がありま す。 86 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール マップ ツールの動作 次の図は、Web マップ ツール (ここでは拡大ツール) の一般的なリクエスト/レスポンスのサイクル を示しています。これと同じアーキテクチャを使ったカスタム マップ ツールを作成できます。90 ページの「カスタム ツールの作成」を参照してください。 図中の番号は、以降で説明する各処理段階と対応しています。 1. ユーザが、拡大ツールを使用して、MapControl に表示された欧州全体の領域を囲むように長方 形を描画します。 2. ツールの ClientInteraction プロパティ (RectInteraction) により、この長方形を定義する画面座標 が収集されます。RectInteraction は Interaction.js で定義されます。 3. ツールの ClientCommand プロパティ (MapCommand) によって URL リクエストが作成され、そ れが MapControl の image.src プロパティに割り当てられます。ClientCommand は Command.js で 定義されます。以下は実際の URL リクエストの例です。 MapController.ashx?Command=Zoom&Width=300&Height=300&ZoomLevel=1200&Po ints=1,50,100&MapAlias=Map1 4. URL リクエストがサーバに送信されます。 5. MapController がリクエストを受け取り、MapControlModel を呼び出します。MapController は System.Web.IHttpHandler から派生します。 6. MapControlModel が URL リクエストを解析して、ZoomInCommand クラスを呼び出します。 7. ZoomInCommand が MapFactory からマップを受け取り、そのマップ上で拡大操作を実行しま す。新しいビューを反映するようにマップ イメージが更新されます。 8. マップ イメージがイメージにエクスポートされ、ストリームとして HTTP レスポンスに書き込 まれてクライアントに返されます。 開発者ガイド 87 MapXtreme Web コントロールの使用 MapXtreme Web コントロールの使用 Web アプリケーション内で MapXtreme Web コントロールを使用するには 1. 次のいずれかの操作を実行します。 a. Visual Studio の [ファイル] > [新規作成] > [Web サイト] を選択し、MapXtreme Web サイト テ ンプレートを選択することによって MapXtreme Web アプリケーションを作成します。テン プレートには、MapControl、LayerControl、およびマップ移動ツールが組み込まれていま す。 b. いずれかのサンプル Web アプリケーションを開き、必要に応じて変更します。 c. Visual Studio の MapXtreme Web 7.x.x ツールボックスから必要な項目をドラッグ アンド ド ロップします。 d. Visual Studio の [ファイル] > [新規作成] > [Web サイト] を選択し、汎用 ASP.NET Web サイト テンプレートを選択することによって MapXtreme Web アプリケーションを作成します。1 2. .NET Framework のバージョン 3.0/3.5 を使用している場合は、メッセージ ボックスで [はい] を 選択して、Web サイトを該当の .NET Framework にアップグレードします。 3. アプリケーションの Web.config ファイルで、MapControl に事前読み込みされるマップ レイヤを 含んだワークスペースのパスと名前を指定します。この作業は、手順 1 で選んだ選択肢に関係 なく必要です。 テンプレートおよびサンプルの Web.config ファイルには、次のように、インストールされてい るサンプル データのデフォルト ディレクトリへのパスが指定されています。 <configuration> <appSettings> <add key="MapInfo.Engine.Session.Workspace" value="c:\Program Files\MapInfo\MapXtreme\7.x.x\Samples\Data\World.mws" /> </appSettings> </configuration> アプリケーションで複数のマップが必要になる場合は、それぞれ一意の MapAlias プロパティを 持つ 1 つまたは複数のワークスペースにマップを配置できます。複数のワークスペースを事前 に読み込むように Web.config ファイルで設定するには、それぞれのワークスペースのフル パス をセミコロンで区切ります。 4. MapControl の MapAlias プロパティが設定されていることを確認します。テンプレートの MapControl のデフォルト MapAlias は Map1 です。このプロパティを設定しなかった場合、期待 したマップがレンダリングされない場合があります。その場合は、セッションから取得された 最初のマップがレンダリングされます。 MapAlias を調べるには、.mws ファイルをテキスト エディタで開き、MapDefinition 要素を探し ます。MapAlias は alias 属性として格納されています。 ワークスペース マネージャから MapAlias を検索することもできます。マウス ポインタをマッ プ ノード (レイヤ リストの最上位のノード) に重ねると、エイリアスがツールチップで表示さ れます。 5. すべてのマップ ツール、LayerControl、LegendControl、およびカスタム コントロール (存在す る場合) の MapControlID プロパティを設定し、適切な MapControl が参照されるようにします。 1. 88 この場合、MapXtreme Web コントロールとツールのデザイナに、アイコンではなく赤色の X が表示 されます。アイコンを適切に表示するには、いずれかの MapXtreme サンプル アプリケーションから MapXtremeWebResources フ ォ ルダ を コピ ー し、自 分 のプ ロ ジェ ク トの Web.config お よ び default.aspx ファイルが置かれている場所に貼り付けます。Web ページをいったん閉じて開き直せば、アイコン が表示されます。この手動での手順を避けるには、 "a" の選択肢を選んでください。 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール Web コントロールの管理 Web コントロールを使用する場合はそれらを効率的に管理することが大切です。このセクション では、次の点について具体的な方法を説明します。 • • • 「イベント処理」 「エラーの管理」 「状態管理」 イベント処理 従来、v6.5 より前の MapXtreme ポスト バック コントロールでは、イベント ハンドラが Page クラ スに記述されていました。ツールの使用後は、ポスト バックによってイベント ハンドラ内のコー ドが実行されていました。 現行の JavaScript 対応マップ ツールでは、使用のたびにポスト バックを実行する必要がありませ ん。マップ ツールのイベントは、リクエストをサーバに送信するクライアント サイド JavaScript コマンドを介して処理されます。ツールの処理は、MapBaseCommand から派生したコマンド クラ スによってサーバ側で実行されます。 多くのコマンドの場合、サーバ サイドの処理の結果がクライアントに送り返されます。これは、 MapControl の場合はイメージで、LayerControl の場合は XML です。このとき、クライアント サイ ドの JavaScript を介して、コマンドの結果により Web ページの一部のみが更新されます (たとえ ば、移動後に新しいマップ イメージが表示されます)。 エラーの管理 Web コントロールにおけるエラー処理の方法はいろいろあり、アプリケーションごとに異なりま す。したがって、ここでは、複数あるエラー処理方法の 1 つを取り上げて説明します。クライアン ト サイドで期待されるレスポンスはイメージなので、詳細メッセージを使用して例外を捕捉し、 イメージとエラー メッセージの両方を含むレスポンスを返すやり方が考えられます。こうするこ とで、MapControl にエラー メッセージが含まれるようになります。 サンプル アプリケーションに付属する Global.asax ファイルには、アプリケーション エラーを処理 する具体的な例が紹介されています。マップ イメージのリクエストを処理しているときにアプリ ケーションでエラーが発生した場合は、エラー メッセージを含んだイメージが Application_Error メソッドによって作成され、そのイメージがクライアントに返されます。 エラー管理の詳細については、ASP.NET でのエラー処理に関する MSDN サイトを参照してくださ い。 状態管理 MapInfo.WebControls.StateManager は、SaveState メソッドと RestoreState メソッドを含んだ抽象クラ スです。MapXtreme のマップ ツールは、RestoreState および SaveState をそれぞれ処理の前後で呼び 出します。状態管理はアプリケーションに固有の処理なので、これらのメソッドをアプリケー ションの具象クラスにインプリメントするのは開発者の責任です。つまり、開発者は、復元操作 および保存操作の対象やその方法を制御できます。 状態管理の詳細については、第 6 章: 「状態管理について」を参照してください。 開発者ガイド 89 カスタム ツールの作成 カスタム ツールの作成 カスタム ツールは、ビルトイン ツールに修正を加えたり、動作を追加したりすることによって作 成できるほか、独自のカスタム コマンドやカスタム ツールを作成することもできます。 たとえば、1 回のクリックで拡大とフィーチャ選択の両方ができるように拡大ツールを修正するこ とも可能です。このツールには、拡大と選択操作を実行するコードを含んだサーバ コマンド クラ スが必要です。すべてのサーバ コマンド クラスにはソース コードが付属しているため、単に ZoomIn コマンド クラスを変更し、選択操作のためのコードを追加すれば目的の機能を実現できま す。 付属のソース コードを使ってカスタマイズすることができない場合は、独自のコマンドおよび ツール クラスを作成する必要があります。ソース コードは、MapXtreme インストール フォルダの \Samples\MapXtremeWebControlsSourceCode に格納されています。 カスタマイズの計画を立てる際は、MapXtreme ツール アーキテクチャを念頭に置いてください。 MapXtreme マップ ツールは次の要素で構成されます。 • • • MapInfo.WebControls.WebTool を継承するクライアント サイド ツール クラス。 ツール クラスのプロパティ。次の要素によってツールの動作が制御されます。 • ツールと MapControl 間の対話 (クリック、長方形の描画など) を定義する JavaScript。 • ツールの URL リクエストを作成する JavaScript。 MapInfo.WebControls.MapBaseCommand から派生し、ツールの目的の動作を実行するサーバ サ イド コマンド クラス。 ツールのプロパティは、クラス内に定義することも、Web ページ上で定義することもできます。 Web ページ上では、カスタム ツールがツール クラス名で参照されます。 次の手順で使用されているコードは、Samples フォルダの \Web\Features\CustomTools\CustomToolsCS に格納されています。 カスタム ツールを作成するには 1. MapXtreme ツールボックスから Web フォームに汎用 WebTool をドラッグします。既にあるいず れかのマップ ツールを使用し、既存の動作を拡張することもできます。 2. WebTool のプロパティ ページで、MapControlID、InActive/ActiveImageUrl、CursorImageUrl の各 プロパティを設定します。 3. 適切な ClientInteraction プロパティをドロップダウン リストから選択して設定します。 クリックやドラッグ、線、ポリゴン、長方形、半径の描画といったマウス操作があらかじめ定 義されており、ほとんどの Web アプリケーションのニーズは、こうした組み込みの対話機能だ け で 満 た す こ と が で き ま す。プ ロジェクトの MapXtremeWebResources フォルダにある Interaction.js を参照してください。 4. 適切な ClientCommand プロパティをドロップダウン リストから選択して設定します。 マッピング、移動、ズームなどの組み込みのクライアント コマンドによって、サーバに送信す る URL リクエストが作成されます。これらのコマンドの説明については、プロジェクトの MapXtremeWebResources フォルダにある Command.js を参照してください。 組み込みのコマンドだけではニーズを満たすことができない場合は、既存の Command.js に修 正を加えるか、独自に作成します。カスタム コマンドは、手順 3 で選択した対話操作の名前を 入力として受け取ります。1 回のクリックで複数のレスポンスをサーバから受け取る具体的な 方 法 に つ い て は、CustomToolsCS または CustomToolsVB のサンプルに含まれる CustomCommand.js を参照してください。 90 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール 5. JavaScript を手動で .aspx ページに登録します。次の行を Web ページ本体に挿入します。 <script language="javascript" src="CustomCommand.js" type="text/javascript"></script> 6. MapInfo.WebControls.MapBaseCommand から派生した新しいサーバ コマンド クラスを作成しま す。クライアント コマンドによって要求された動作を実行するコードを追加してください。代 わりに、既存のサーバ コマンド クラスを拡張することもできます。 7. サーバ コマンド クラスのコンストラクタで、サーバ コマンドの名前を割り当てます。 namespace ToolsSample { public class AddPinPointCommand : MapInfo.WebControls.MapBaseCommand { /// <summary> /// Constructor for this command, sets the name of the command /// </summary> /// <remarks>None</remarks> public AddPinPointCommand() { Name = "AddPinPointCommand"; } 8. サーバ コマンド クラスの Process() メソッドをオーバーライドし、目的のコマンドのビジネス ロジックを実行するコードを追加します。 public override void Process() { // Your code here..... } 9. webform1.aspx の Page_Load メソッドで、MapControlModel のコマンドのコレクションに必要な サーバ コマンドを追加します。 MapInfo.WebControls.MapControlModel controlModel = MapControlModel.SetDefaultModelInSession(); controlModel.Commands.Add(new AddPinPointCommand()); 10. 新しいアセンブリを作成して、このツールを Visual Studio ツールボックスに追加します。92 ページの「カスタム Web コントロールの使用と配布」を参照してください。 11. カスタム ツールを Web フォームにドラッグ アンド ドロップし、そのプロパティに ClientCommand と ClientInteraction の名前を設定します。手順 3 と手順 4 で触れた JavaScript を 参考にしてください。 12. 手順 6 で定義したサーバ コマンドのプロパティを設定します。 13. Web フォームでこのコントロールが存在するアセンブリおよび名前空間を指定するタグ接頭辞 を登録します。 <%@ Register TagPrefix="cc1" Namespace="MapInfo.WebControls" Assembly="MapInfo.WebControls, Version=4.0.0.476, Culture=neutral, PublicKeyToken=0a9556cc66c0af57" %> <%@ Page language="c#" Inherits="ToolsSample.WebForm1" CodeFile="WebForm1.aspx.cs" %> <%@ Register TagPrefix="cc2" Namespace="CustomizedWebTools" %> WebTool の既存の動作がニーズを満たさない場合は、クライアント サイドのコマンドおよび対話 操作を処理する独自のサーバ Command クラスおよび Javascript を作成できます。この例について は、93 ページの「Web アプリケーションへの InfoTool の追加」を参照してください。 開発者ガイド 91 カスタム Web コントロールの使用と配布 カスタム Web コントロールの使用と配布 作成したカスタム Web ツールを Visual Studio ツールボックスから利用できるようにしたり、他の ユーザに配布したりするには、それをアセンブリに追加する必要があります。 MapXtreme は Web コントロールのソース コードを提供しており、必要に応じてそれを参照、変 更、および配布できます。Web コントロールのソース コードは、\Samples\WebControlsSourceCode フォルダにインストールされます。変更した Web コントロールを使用および配布するためには、 新しいアセンブリを作成し、それを Visual Studio に登録する必要があります。 以 下 は、MapXtreme Web コ ン ト ロ ー ル アセンブリに関する重要な事柄を示しています。 MapXtreme のソース コードに修正を加えるか、独自のツール クラスを一から作成するかにかかわ らず、これらの点を考慮するようにしてください。 • • • • • アセンブリは、MapInfo.WebControls.dll という名前で、グローバル アセンブリ キャッシュにイ ンストールされます。このアセンブリは、テンプレートおよびサンプル アプリケーションで使 用される特定のバージョン番号を持ちます。 アセンブリ内のコントロールは、Visual Studio のツールボックスにインストールされます。 ア セ ン ブ リ は、MapInfo.CoreEngine.dll、MapInfo.CoreEngine.Wrapper.dll、お よ び MapInfo.CoreTypes.dll を参照します。 イメージやスクリプトなどのリソースは、C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x\MapXtremeWebResources フォルダにインストールされます。 Web コントロールによって次のファイルが使用されます。 • ツールのアクションを表す *.GIF イメージ (DistanceToolControlActive、 DistanceToolControlInactive など) • ツールのアイコンを表す *.BMP イメージ (ラベル、選択矢印など) • ツールの対話操作や動作を定義する JavaScript (Interaction.js、Command.js、LayerControl.js、 LegendControl.js、Tool.js) • マウス使用時にイメージを表示する *.CUR (cursor) ファイル Web アセンブリの作成 カスタム Web コントロール アセンブリを作成するには 1. カスタマイズした Web コントロールのソース ファイルを別のディレクトリにコピーしてオリ ジナルを保管します。 2. グローバル アセンブリ キャッシュおよび Visual Studio ツールボックスから、元のアセンブリを 削除します ([スタート] > [ファイル名を指定して実行] > Assembly)。 3. sn - k MapInfo.WebControls.snk を使用して、厳密名キー ファイル (.snk) を作成し、こ のキー ファイルをメイン プロジェクト フォルダ (プロジェクト ファイルと同じレベル) にコ ピーします。 4. AssemblyInfo.cs ファイルまたは AssemblyInfo.vb ファイルのバージョン番号を Web アセンブリ に合わせて変更します。 5. Visual Studio でプロジェクトを開き、必要な変更を加えてプロジェクトをビルドします。新し いアセンブリが Bin\Release ディレクトリに作成されます。アセンブリのリリース バージョン を配布できます。 92 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール 6. 次の構文を参考にして、新しいアセンブリをグローバル アセンブリ キャッシュおよび Visual Studio ツールボックスに登録します。詳細については、「Global Assembly Cache Tool」を参照 してください。 gacutil /i MapInfo.WebControls.dll 7. 新しいアセンブリを使用してアプリケーションを作成します。Visual Studio ツールボックスか ら、新しいコントロールをフォームにドラッグ アンド ドロップします。 8. Web アプリケーションのインストーラで、新しいアセンブリがグローバル アセンブリ キャッ シュにインストールされるようにします。Web アプリケーションがこのバージョンのアセンブ リを指し示す限り、新しいコントロールが使用されます。 次のシナリオを検討してください。 • • Web コントロール プロジェクトおよびリソースを Web アプリケーション ソリューションに直 接挿入できます。その場合は、リソース (スクリプトおよびイメージ) の URL をプロジェクト ルートから始まるように変更します。これにより、仮想ディレクトリを作成する必要がなくな ります。 グローバル アセンブリ キャッシュおよび厳密名アセンブリを使用する必要はありません。ア センブリの Copy プロパティを true に設定し、アセンブリをアプリケーションの Bin フォルダ に格納します。 Web アプリケーションへの InfoTool の追加 MapXtreme には、Web アプリケーションで適用および使用できる InfoTool のサンプル アプリケー ションが用意されています。このツールを使用すると、ユーザがマップ上でクリックしたポイン トの情報を取得したり、Web アプリケーションから返された情報を取得できます。 InfoTool サンプルを変更するには 1. Samples フォルダ内の InfoToolCS または InfoToolVB Web サイトを見つけます (デフォルトの場 所は C:\Program Files\MapInfo\MapXtreme\7.x.x\Samples\VisualStudio2005\Web\Features\InfoTool\InfoToolVB です)。 2. 以下のファイルをプロジェクト フォルダにコピーし、それをプロジェクトに追加します。 • InfoTool フォルダのルートにある CustomCommand.js • \App_Code フォルダにある CustomizedCommands.cs または CustomizedCommands.vb • InfoTool フォルダのルートにある stylesheet.css 3. PointSelect ツールを Web Form に追加し、以下のコードをフォームの Page_Load メソッドに追加 します。 MapInfo.WebControls.MapControlModel controlModel = MapControlModel.SetDefaultModelInSession(); controlModel.Commands.Add(new CustomWebTools.Info()); 4. PointSelect ツールのプロパティを、サンプル アプリケーションの InfoTool のプロパティに一致 させます。これらは、ツールの [プロパティ] ウィンドウで設定します。 ClientCommand、ClientInteraction、Command、CursorImageURL、InactiveImageURL、 MapControlID が、目的のプロパティです。 および 5. フォームを HTML 表示に切り替えて、以下の行を <form> タグの後に追加します。 <script language="javascript" src="CustomCommand.js" type="text/javascript"></script> 開発者ガイド 93 ASP.NET AJAX と MapXtreme Web アプリケーション 6. サンプル アプリケーションの場合と同様に <div> を追加して、ツールが取得した情報を保持し ます。 <div id="Info" class="infoDiv"> Div element to display selected feature information in html table.</div> 7. Web サイトをビルドします。 ASP.NET AJAX と MapXtreme Web アプリケーション MapXtreme の Web コントロールおよびツールには、Web アプリケーションに効率的なリクエスト/ レスポンス サイクルを提供する JavaScript が使用されています。マップ ツールを使用するたび に、JavaScript の対話機能とコマンドによって、クライアントにページ全体をポスト バックするこ となく操作が実行されます。通常、更新されるのはマップ イメージだけです。 Microsoft の ASP.NET AJAX テクノロジは、スクリプティング ライブラリと ASP.NET 2.0 Framework を統合することによって、この動作をさらに発展させたものです。その中心となるコントロール は、UpdatePanel (頻繁に更新されるサーバ コントロールのコンテナ) と ScriptManager (Web ページ のスクリプト アクティビティを管理する) です。 MapXtreme に付属のサンプル アプリケーションでは、Microsoft の ASP.NET AJAX コントロールを MapXtreme の Web マッピング アプリケーションで実際に使用する方法を紹介しています。サンプ ルは、..\MapInfo\MapXtreme\7.x.x\Samples\VisualStudio2005\Web\Features に格納されています。 注意 AJAXDemo サンプルを実行するには、Microsoft ASP.NET 2.0 AJAX Extensions 1.0 がシステ ムにインストールされている必要があります。これらは MapXtreme の製品 CD に収録され ています。 次のセクションでは、AJAX コントロールを MapXtreme アプリケーションに追加する手順を説明 します。 AJAX Extensions には、"ASP.NET AJAX-Enabled Web Site" というテンプレートが付属しています。 AJAX の概念を理解するためにも、まず、このテンプレートを使って Web アプリケーションを作 成してみることをお勧めします。このテンプレートの Web.config ファイルを見ると、アプリケー ションにコピーする必要のある設定が httpHandlers セクションや httpModules セクションに含まれ ていることがわかります。 また、AJAXDemo サンプル Web アプリケーションも参考にしてください。以降の手順では、この サンプルから抜粋した JavaScript コードおよび Web.config 設定が引用されています。 ASP.NET AJAX コントロールを MapXtreme Web アプリケーションに追加す る方法 ASP.NET AJAX コントロールを既存の MapXtreme Web アプリケーションに追加するには 1. Web フォームを Visual Studio のデザイン モードで開きます。 2. Visual Studio ツールボックスの "AJAX Extensions" セクションにある ScriptManager コントロー ルをフォームにドラッグします。(ScriptManager は実行時には見えないため、配置する位置を 気にする必要はありません。) 3. AJAX UpdatePanel コントロールをフォームにドラッグします。 94 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール 4. ページ全体が更新されてしまうのを防ぐため、Button コントロールなどの標準コントロールは UpdatePanel 内に移動します。 注意 MapControl や LayerControl などの MapXtreme コントロールは UpdatePanel の外に配置し ます。詳しい例については、AJAXDemo サンプル アプリケーションを参照してくださ い。 5. アプリケーションの Web.config ファイルを開き、httpHandlers セクションを探します。Web ア プリケーションの内容にもよりますが、httpHandlers セクションに、1 ~ 2 個のエントリしか存 在しない場合もあります。1 つは MapController.ashx のエントリで、もう 1 つは (アプリケー ションに LayerControl が含まれる場合) LayerController.ashx のエントリです。 <httpHandlers> <add verb="*" path="MapController.ashx" ... <add verb="*" path="LayerController.ashx" ... </httpHandlers> 6. AJAXDemo サンプル アプリケーションの Web.config ファイルを開き、ASP.NET AJAX に必要 な追加のエントリを含んだ httpHandlers セクションを探します。 <httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" ... <add verb="*" path="*_AppService.axd" ... <add verb="GET,HEAD" path="ScriptResource.axd" ... <add verb="*" path="MapController.ashx" ... <add verb="*" path="LayerController.ashx" ... </httpHandlers> 上から 4 つのいずれかの httpHandlers エントリが、対象のアプリケーションの Web.config ファ イルに存在しない場合は、欠落しているエントリを AJAXDemo Web.config ファイルからコピー し、Web.config ファイルに貼り付けます。(LayerController.ashx エントリをコピーする必要はあ りません。デザイナ モードで LayerControl をページに配置すると、LayerController.ashx エント リが自動的に生成されます。) 7. Web.config ファイルの httpModules セクションを探します。httpModules セクションにはおそら く、MapInfo.Engine.WebSessionActivator のエントリが 1 つ存在します。ここで、モジュール セ クションに対し、次のように AJAXDemo Web.config ファイルの "ScriptModule" エントリをコ ピーします。 <httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule... <add type="MapInfo.Engine.WebSessionActivator... </httpModules> UpdatePanel 内のコントロールがマップに何らかの形で影響を与える場合は、マップ イメージが強 制的に更新されるように、ページに JavaScript を追加する必要があります。特定の UpdatePanel で ページ更新が発生したときに、常にマップ イメージを更新する方法については、AJAXDemo サン プル アプリケーションに含まれる JavaScript を参考にしてください。 8. AJAXDemo アプリケーションの MapForm.aspx ページをソース モードで開きます。<script> ブ ロックをコピーして aspx ページに貼り付けます。スクリプトでは ScriptManager によって提供 されるオブジェクトが使用されるため、<script> ブロックは ScriptManager タグの後に貼り付け てください。 9. 開発者ガイド <script> ブロックから、DisplayEventInfo 関数と、それを呼び出すコードをすべて削除します。 DisplayEventInfo 関数は、AJAXDemo アプリケーションのデバッグ ツールです。他のアプリ ケーションでは必要ありません。 95 MapXtreme タイル ハンドラ 10. UpdatePanel の名前を変更した場合は、新しい名前に合わせて <script> ブロックを編集します。 UpdatePanel の名前は、第 2 パラメータとして TargetPanelWasUpdated 関数に渡されます。デ フォルトの名前は "UpdatePanel1" です。 11. アプリケーションに複数の UpdatePanel を使用するとき、その中の一部の UpdatePanel だけが マップに影響するようにするには、各 UpdatePanel の UpdateMode プロパティを Conditional に設 定する必要があります。詳細については、AJAXDemo サンプル アプリケーションに付属の ReadMe ファイルを参照してください。 ASP.NET AJAX Extensions で必要となる Web.config 設定の詳細については、Microsoft の ASP.NET AJAX に関するドキュメントを参照してください。 MapXtreme タイル ハンドラ MapXtreme には、マップ タイルおよびマップ情報をリクエストする際に使用される、REST ベース のタイル ハンドラとパブリック URL があります。REST ベースのハンドラを使用すると、マップ リクエストのすべての引数を 1 つの URL に埋め込むことができます。 マップ タイルは、事前にレンダリングおよび格納してユーザからのリクエストを待機できるた め、現代の Web マッピングにおいて必須となりつつあります。ユーザ セッションの際に更新する 必要がないため、ベース マップを静的イメージとして格納するタイル サーバーを設計できます。 クエリから返される情報など、ユーザを限定した情報を含む動的に変化するデータの場合、これ らのマップは要求時に生成されます。これらはタイルされているため、(タイル サイズ、マップ ウィンドウ サイズ、およびズーム レベルに基づき) マップ ウィンドウに表示可能なタイルのみが 返されます。 MapXtreme タイル ハンドラを利用する Web アプリケーションの例については、MapInfo 開発者向 けのコード変換のフォーラムにある、MapXtreme タイル ハンドラの例を参照してください。 MapXtreme は、以下の操作をサポートしています。 • • • • マップ内の行と列の位置によるタイルのリクエスト 利用可能なマップのリストのリクエスト マップの説明のリクエスト タイル パフォーマンスを向上するキャッシュ手順の指定 MapXtreme タイル ハンドラ API は、MapInfo.WebControls.Tiling 名前空間に含まれています。詳細 については、『開発者リファレンス』を参照してください。タイル ハンドラのソース コードは \Samples\WebControlsSourceCode フォルダに格納されています。 MapXtreme タイル ハンドラの使用 最も単純な形式で MapXtreme タイル ハンドラにアクセスし、タイル サーバからマップ タイルおよ びマップ情報をリクエストするには 1. web.config ファイルを以下のように変更して、ハンドラを指し示します。 <httpHandlers> <add verb="*" path="TileServer/*" type="MapInfo.WebControls.Tiling.TileHandler" /> <add verb="*" path="TileServer/*/*" type="MapInfo.WebControls.Tiling.TileHandler" /> <add verb="*" path="TileServer/*/*/*" type="MapInfo.WebControls.Tiling.TileHandler" /> <add verb="*" path="TileServer/*/*/*/*" type="MapInfo.WebControls.Tiling.TileHandler" /> </httpHandlers> 96 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール 2. 複数のマップを含むワークスペース (.MWS) を提供します。 たとえば、ユーザの場所が対応範囲 (携帯電話ネットワーク、商圏、学区など) の内側か外側か を知ることができる対応範囲のロケータ アプリケーションの場合は、以下のものを含みます。 • • バックグランド マップおよび参照マップとしての役割を果たすベース マップ レイヤ。 ポイント位置や道路ネットワークなど、参照ポイントおよび参照線を含むオーバーレイ マップ。 • 対応範囲を含む対応範囲レイヤ。 3. 以下の形式の URL を使用して、使用可能なマップのリストをリクエストします。. http://server/TileServer/maplist.{ext} ext は、返される情報の形式を表す拡張子です (現在サポートされているのは JSON のみです )。 このクエリは、以下の形式で JSON (JavaScript Object Notation) オブジェクトを返します。 { [ "Map1Alias", "Map2Alias", "Map3Alias" ] } 4. 手順 3 のリストされているマップ名を使用して、以下の URL 形式で、マップに関する詳細情 報をリクエストします。 http://server/TileServer/{mapname}/description.{ext} mapname は、メタデータを取得する、タイル サーバ上のマップの名前です。値の大文字と小 文字は区別されません。 ext は、返される情報の形式を表す拡張子です (現在サポートされているのは JSON のみです )。 指定したマップのメタデータが返されます。 { "numberOfLevels": 20, "coordSys": "epsg:41001", "description": "Map of the World", "name": "World", "tileWidth": 256, "tileHeight": 256, "bounds": { "minX": -3.756380109844111E7, "minY": -4.497601034176671E7, "maxX": 3.773376466605809E7, "maxY": 4.49763662218225E7 } "outputTypes": [ "png" ] } 開発者ガイド 97 MapXtreme タイル ハンドラ 5. 手順 3 および手順 4 で収集した情報を使用して、必要なすべての引数を URL に指定してマップ をリクエストします (以下で説明します)。 http://server/webapp/TileServer/{mapname}/{level}/{x;y}/tile.{ext} たとえば、次のようになります。 http://<server>/<mywebapp>/TileServer/WorldOverlay/3/0;0/tile.png これは、64 タイルで構成される WorldOverlay マップの左上のタイルをリクエストします。 次の表は各引数の説明です。 引数 説明 server Web サーバ。 webapp サーバ上で動作している Web アプリケーションの 名前。 TileServer MapTiling ハンドラのインスタンスへのパス。 こ れは、web.config の "httpHandlers" セクションにあ る "path" エントリの先頭に一致している必要があ ります。 上記を参照してください。 mapname タイル サーバ上のマップの名前。 level リクエストされたタイルのレベル。ゼロを基点と します。 x;y リクエストされたタイルの x 座標と y 座標 (ゼロを 基点とします)。 たとえば、レベル 3 の場合、マップは 8 行、8 列の 64 タイルで構成されます。左上のタイルの x 引数 と y 引数は 0;0 です。左下のタイルの場合は 0;7 で す。 ext タイルの形式を表す拡張子 (gif、png など)。サ ポートされている形式に一致している必要があり ます。 キャッシュ MapXtreme のタイル ハンドラは、アプリケーションのパフォーマンスが低下しないように、頻繁 に使用されるタイルのキャッシュをサポートしています。キャッシュの指定は、Microsoft .NET Framework の「HttpCacheability」に従って、web.config ファイルに記述されます。 98 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール 5 種類のキャッシュがサポートされています (これに加えて、キャッシュしないというオプション もあります)。次の列挙値を使用して、Cache-Control HTTP ヘッダーを設定します。 NoCache Cache-Control: no-cache ヘッダーを設定します。フィールド名が指定 されていない場合、ディレクティブはリクエスト全体に適用され、 共有 (プロキシ サーバ) キャッシュは、リクエストを処理する前に 元の Web サーバによる再検証を実行する必要があります。フィー ルド名が指定されている場合、ディレクティブは指定されたフィー ルドのみに適用されます。レスポンスの残りは、共有キャッシュか ら提供される可能性があります。 Private デフォルト値。Cache-Control: private を設定すると、レスポンスは クライアントでのみキャッシュ可能となり、共有 (プロキシ サーバ) キャッシュではキャッシュできません。 Public Cache-Control: public を設定すると、レスポンスはクライアントと共 有 (プロキシ) キャッシュでキャッシュ可能となります。 Server レスポンスが元のサーバでのみキャッシュされることを指定しま す。これは NoCache オプションに似ています。クライアントは Cache-Control: no-cache ディレクティブを受け取りますが、ドキュメ ン ト は 元 の サ ー バ で キ ャ ッ シ ュ さ れ ま す。こ れ は ServerAndNoCache に相当します。 ServerAndNoCache Server と NoCache の両方の設定を適用して、コンテンツはサーバで キャッシュされ、それ以外はレスポンスをキャッシュする機能が明 示的に拒否されることを指定します。 ServerAndPrivate レスポンスはサーバとクライアントでキャッシュされ、それ以外で はキャッシュされないことを指定します。プロキシ サーバはレスポ ンスをキャッシュできません。 キ ャ ッ シ ュ オ プ シ ョ ン を 指 定するには、web.config MapInfo.Engine.Session.Cacheability キーを指し示します。 ファイルを以下のように変更して、 <appSettings> <add key="MapInfo.Engine.Session.Cacheability" value="private"></add> </appSettings> キャッシュの有効期限 キャッシュされたタイルの有効期限を設定することもできます。タイル内のデータを更新する必 要がある場合は、有効期限を設定します。タイルの有効期限を設定することにより、アプリケー ションのユーザには、最新情報のみが表示されます。 開発者ガイド 99 HTML/XHTML 検証の問題 キャッシュの有効期限を設定するには、以下のように web.config ファイルにキーを追加します。 <appSettings> <add key="MapInfo.Engine.Session.CacheExpires" value="4/1/2010"></add> </appSettings> value には、Microsoft の DateTime.Parse(String) メソッドで解析できる任意の文字列を指定できま す。 Microsoft は有効期限を 1 年に制限しているので注意してください。1 年を超える日付は有効ではあ りません。 HTML/XHTML 検証の問題 MapXtreme Web アプリケーションを作成し、検証サービスを使って結果の HTML を実行した場 合、使用している DOCTYPE タグのバージョンによっては、次のような検証エラーが表示される 場合があります。 "ID" の属性の値が無効である。名前の先頭を "_" にすることはできない この検証エラーは、次の属性を持つ隠しフィールドに関連したものです。 id="__VIEWSTATE" こ の 検 証 エ ラ ー を 引 き 起 こ す id 属 性 は、MapXtreme から出力されたものではありません。 ASP.NET によって出力された属性です。 この検証エラーを解決するには、.aspx ページ上の DOCTYPE タグを置き換える必要があります。 具体的には、DOCTYPE タグを XHTML DOCTYPE タグに更新すると、上記の id 属性があったとし ても、結果のページは正しく検証されます (ASP.NET によって、問題となるタグが DIV タグでラッ プされ、それらすべてが XHTML DOCTYPE と照らして検証されます)。たとえば、Visual Studio の ASP.NET テンプレートから新しい Web サイトを作成したときに自動的に生成されるものと同じ DOCTYPE タグを使用することもできます。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ポスト バック Web コントロールから JavaScript Web コントロール への移行 v6.5 より前の Web コントロール 1 をバージョン 6.6 以降の MapXtreme Web コントロールに移行す るプロセスは、自動的には実行されません。すべてのアプリケーションは古い Web コントロール の機能や設計との結合の度合いがそれぞれ異なり、それに応じて移行プロセスも異なります。 推奨される移行プロセスは、多層のアプローチを使用することです。場合によっては、コードの 再構成を行う必要があります。Web コントロールを移行する場合は、次の各プロセスを考慮する 必要があります。 100 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール • • • データの読み込み コントロールの置き換え 状態およびイベントの管理 データの読み込み MapXtreme Web コントロールでデータを読み込む唯一の方法は、事前に読み込まれるワークス ペースを使用する方法です。MapControl は、マップを読み込むのではなく、ワークスペース内の MapAlias を参照してマップを表示します。事前に読み込まれるワークスペースは、Web.config ファイル内で指定します。第 6 章、109 ページの「初期マップの設定」 を参照してください。 MapControl を使用して複数のマップ イメージを表示する場合は、すべてのマップが 1 つの場所に 格納されるようにデータを設定し、MapControl の MapAlias を変更してマップを選択します。 コントロールの置き換え コントロールを置き換える方法はいくつかあります。1 つは、フォームから古い Web コントロール を削除した後で、新しい Web コントロールをフォームにドラッグ アンド ドロップする方法です。 また、新しい Web フォームを作成し、新しいコントロールをフォームにドラッグ アンド ドロップ した後で、古いフォームから新しいフォームに機能を追加する方法もあります。このとき、 MapControl に適切な MapAlias を設定し、すべての依存コントロールおよび LayerControl に適切な MapControlID を設定してください。 状態およびイベントの管理 ほとんどの場合、状態管理を行うための古いやり方は、Page_Load に状態を復元し、Page_Unload に状態を保存するという方法です。このコードを、StateManager から派生した新しいクラスの RestoreState メソッドおよび SaveState メソッドに移動する必要があります。 ただし、状態を手動で操作する場合は、StateManager をインプリメントし、ASP.NET セッションに 入力する必要があります。MapXtreme では、必要な情報だけを復元できるように状態を手動で管 理することをお勧めします。第 6 章: 「状態管理について」を参照してください。 Web ページ内で Server.Transfer または Response.Redirect が使用されている場合、このセッションは もはや新しいものではありません。StateManager があらかじめ存在していない場合は、これを ASP.NET セッションに入力する必要があります。 従来のズーム ツールや移動ツールなど、v6.5 より前の Web コントロールに対してイベント ハンド ラを作成した場合は、カスタム コマンドを作成し、その処理を Process メソッドに移動する必要が あります。90 ページの「カスタム ツールの作成」を参照してください。 1. 開発者ガイド バージョン v6.5 より前の MapXtreme リリースでは、ツールを使用するたびに Page_Load と Page_Unload を呼び出すポスト バック ページが必要でした。これらのコントロールは、より効率的な、JavaScript 対応 の部分ページ更新型のコントロールに置き換えられました。ポスト バック コントロールは、旧バージョ ンとの互換性を確保するために提供されていますが、廃止される予定です。これらのコントロールの情報 は、MapInfo.Web.UI.WebControls 名前空間に存在します。JavaScript コントロールの API については、 MapInfo.WebControls 名前空間を参照してください。 101 Web コントロールの特殊な使用法 Web コントロールの特殊な使用法 以降のセクションでは、MapXtreme Web コントロールの特殊な使用法について説明します。 • • • 「フレーム内での Web コントロールの使用」 「テーブル セル内での MapControl の使用」 「Web コントロールのローカライズ」 フレーム内での Web コントロールの使用 MapXtreme Web コントロールは、フレーム内でも動作します。フレームやフレームセットを作成 したり、ページをフレームに割り当てたりする方法については、Visual Studio のマニュアルを参照 してください。 フレーム内で Web コントロールを使用する場合は、フレームが Web ページを指し示し、フレーム セットに 1 つまたは複数のフレームが含まれていることを確認します。MapControl を含むページ と、MapControl に依存するツールまたは LayerControl を含むその他のページがあるとします。これ らのすべてのページでフレームセットが構成されます。 上記のシナリオに対して、次のルールが適用されます。 • 依存コントロールのプロパティに MapControlID を手動で入力する必要があります。同じ ID を 持つ依存コントロールと同じページに MapControl がある場合は、ツールおよび LayerControl に よってそのコントロールが選択されます。 • フレーム ページは特定の順序で描画されるため、MapXtreme セッションは、最初のフレームの 後に描画されるフレームにとって、新しいセッションではありません。StateManager を配置す る に は、次 の コ ー ド を イ ン プ リ メ ン ト し ま す。読 み 込 ま れ る ペ ー ジ に か か わ ら ず、 StateManager クラスが登録されていることを確認します。次のコードは、RestoreState が呼び出 される前に実行されます。 ' If the StateManager doesn't exist in the session put it in, else get it. If StateManager.GetStateManagerFromSession() Is Nothing Then StateManager.PutStateManagerInSession(New AppStateManager()) End If テーブル セル内での MapControl の使用 HTML の動作により、ある要素に含まれている要素をドラッグして元の要素の外に移動すると、 そのサイズは基本サイズ (通常は 0) に変更されます。MapControl をテーブル セル内に配置した場 合、要素に HTML での絶対幅および高さが設定されていないと、問題が発生します。要素をド ラッグしてセルの外に移動すると、セル サイズは 0 になります。 この問題を解決するには、MapControl の高さと幅を明示的に設定します。HTML でサイズを設定 する方法を次のサンプルに示します。 102 MapXtreme 2008 v7.0.0 第 5 章 : Web アプリケーション、コントロール、およびツール <TR bordercolor="#ff3366"> <TD bordercolor="#0066ff"> <cc1:mapcontrol id="Mapcontrol2" runat="server" Width="300px" Height="300px"></cc1:mapcontrol> </TD> </TR> <TR> <TD> <cc1:pantool id="Pantool2" runat="server" MapControlID="MapControl2"></cc1:pantool> <cc1:zoomintool id="ZoomInTool1" runat="server" MapControlID="Mapcontrol2"></cc1:zoomintool> <cc1:zoomouttool id="ZoomOutTool1" runat="server" MapControlID="Mapcontrol2"></cc1:zoomouttool> </TD> </TR> </table> Web コントロールのローカライズ MapXtreme には、Web コントロールに関連するテキスト文字列を翻訳する必要がある開発者用 に、Visual Studio 2008 ソリューションが用意されています。この "ローカライゼーション キット" には、 MapXtreme のすべての実行時コンポーネントのリソース プロジェクトが含まれています。 設計時リソースは含まれていません。 各プロジェクトには、翻訳用の英語リソース文字列と厳密名キー (.snk) ファイルが含まれていま す。これは、MapXtreme アプリケーションに統合できるアセンブリにコンパイルされます。 MapXtreme Web コントロールは、MapInfo.WebControls.resources というプロジェクトに含まれてい ます。 ローカライズされた Web コントロール リソースからサテライト アセンブリをビルドする手順につ いては、付録 K、637 ページの「ローカライゼーション キット」を参照してください。 開発者ガイド 103 Web コントロールの特殊な使用法 104 MapXtreme 2008 v7.0.0 状態管理について この章では、Web アプリケーションを作成するときに非常に重要な問題となる 状態管理の概念とベスト プラクティスについて説明します。 この章の構成 「用語集」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 「状態管理とは」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 「InProc 開発モデル」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 「プール オブジェクトの状態管理」 . . . . . . . . . . . . . . . . . . . . . . . . . . 113 「手動状態管理の詳細」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 「MapXtreme Session の詳細」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6 用語集 概要 状態管理は、MapXtreme Web アプリケーションを設計および構築する際に考慮すべき重要事項で す。ユーザの使い心地を高め、スケーラブルかつ高性能なアプリケーションを構築するために は、Web サイトの訪問者が Web アプリケーションを操作するときにどのような方法で変更を加え るのかが重要になります。 この問題について掘り下げる前に、この章で扱うテーマに関する必読の内容を次のセクションに 示します。MapXtreme Session と HTTP Session、ユーザの状態とアプリケーションの状態、クリー ンな MapXtreme Session オブジェクトとダーティな MapXtreme Session オブジェクトについて、そ れぞれの相違を理解すれば、Web アプリケーションを開発当初から適切に計画し、構築すること ができるでしょう。 用語集 MapXtreme Session - Catalog、MapFactory、CoordSysFactory を保持する MapInfo.Engine.Session オブ ジェクト。ユーザは MapXtreme Session オブジェクトのインスタンスを操作します。 HTTP Session - リクエスト間にユーザの変更が保存される System.Web.HttpSessionState オブジェク ト。これらの変更は、各リクエストごとに保存され、復元されます。ユーザによる変更はユーザ の状態と呼ばれます。 ブラウザ Session - 特定のユーザが Web アプリケーションを操作している時間。これは、ASP.NET セッションとも呼ばれます。 InProc 開発モデル - Web アプリケーション開発モデル。ここでは、各ユーザに個別の MapXtreme Session オブジェクト インスタンスが与えられます。ブラウザ セッション中にユーザが加えた変更 が別のユーザに影響することはありません。MapXtreme Web アプリケーションは、現在のアプリ ケーション状態を含めて全体がメモリに格納され、個々のユーザに関連付けられます。このモデ ルは、部門別イントラネットなど、ユーザ数が決まっている環境における小規模で単純な Web ア プリケーションに適しています。これとは対照的に、Pooled 開発モデルではユーザが MapXtreme Session とシステム リソースを共有するため、スケーラビリティが高くなっています。111 ページ の「InProc 開発モデル」を参照してください。 Pooled 開発モデル - このモデルでは、Web アプリケーションに関連付けられた COM+ プールから 複数の MapXtreme Session インスタンスを使用でき、これらのインスタンスをアクティブ化して Web リクエストを処理します。プールされた MapXtreme Session オブジェクトを使用して、複数の Web ユーザからのリクエストを処理します。アプリケーションで各ユーザの MapXtreme Session の 状態を管理する必要があるため、このモデルは InProc モデルよりも複雑です。一方で、このモデ ルではシステム リソースをより効率的に使用できます。スケーラブルなアプリケーションを作成 する場合は、このモデルを使用します。113 ページの「プール オブジェクトの状態管理」を参照し てください。 状態管理 - ブラウザ セッションで得られた情報の保存と復元に関する、Web アプリケーション開 発の一般用語です。 バックグラウンド マップ - Web.config ファイルの設定に従って、Web アプリケーションに事前読み 込みされる初期マップです。このマップには、道路ネットワークや郵便番号境界などの参照レイ ヤだけでなく、販売店の場所や携帯電話基地局などのアプリケーション固有データも含まれてい 106 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について ます。この基本ワークスペースは MapXtreme Session インスタンスに事前読み込みされます。ユー ザによる基本マップの変更がアプリケーションで許可されていない限り、これを利用できます。 109 ページの「初期マップの設定」を参照してください。 アプリケーション状態 - Web アプリケーションの全ユーザおよび全セッションに適用される、メモ リに状態情報を格納するための ASP.NET 定義メカニズム。「ASP.NET Application State Overview」 を参照してください。また、124 ページの「初期リクエストの処理」も参照してください。 ユーザ状態 - ユーザのリクエスト間で保存される、MapXtreme Session およびアプリケーションの 状態。ユーザが MapXtreme Session やアプリケーションに加えた変更は、必ず HTTP Session に保存 されます。マップの再センタリングなどの単純な変更もあれば、主題図マップを作成するクエリ など複雑な変更もあります。 開始状態 - プールされた MapXtreme Session インスタンスにユーザがアクセスしたときの状態。開 始状態には次の 4 種類があります。 • • • • サイトの新規ユーザ、プール内の使用可能な MapXtreme インスタンスはクリーン、バック グラウンド マップは初期状態。 サイトの新規ユーザ、プール内の使用可能な MapXtreme インスタンスはダーティ (マップ に他のユーザによる変更が加えられている)。 再訪問ユーザ、プール内の使用可能な MapXtreme インスタンスはクリーン。 再訪問ユーザ、プール内の使用可能な MapXtreme インスタンスはダーティ (マップにこの ユーザまたは他のユーザによる変更が加えられている)。 MapInfo.Engine.Session.State - MapXtreme Session の状態が自動的に保存されるか手動で保存するか を指定する、MapXtreme 定義メカニズム。自動セッション状態の場合、MapXtreme Session 全体が HTTP Session に保存されます。自動セッション状態は、アプリケーションの Web.config ファイル の次のキーで設定します。 <add key="MapInfo.Engine.Session.State" value="HttpSessionState" /> 手動セッション状態の場合、ユーザごとに異なる状態を保存するコードを開発者が作成する必要 があります。スケーラブルな、プールされるアプリケーションを作成する際に使用するメカニズ ムです。 手動セッション状態は、アプリケーションの Web.config ファイルの次のキーで設定します。 <add key="MapInfo.Engine.Session.State" value="Manual" /> StateManager - プールされた Web アプリケーションにユーザ状態を保存し、復元するために役立つ メ ソ ッ ド と プ ロ パ テ ィ を 備 え た、MapXtreme クラス。Web.config ファイルで MapInfo.Engine.Session.State が Manual に設定されている場合、アプリケーションでは SaveState メ ソッドと RestoreState メソッドをインプリメントする StateManager クラスを用意する必要がありま す。121 ページの「StateManager のインプリメント」を参照してください。 sessionState - ユーザ状態の保存に使用する格納メカニズムを設定する、標準の ASP.NET Web.config 要素。次の 3 種類があります。 • • • 開発者ガイド InProc - ASP.NET セッションの有効期間の間、ユーザ状態がメモリに格納されます。 StateServer - ユーザの変更を後で取得できるように、ユーザ状態がサーバに保存されます。 SQLServer - 後でアクセスできるように、ユーザの状態が SQL Server データベースに保存さ れます。 107 状態管理とは 状態管理とは 状態管理、つまり各ユーザのセッションの状態に関する情報の保存と復元を行う処理は、さまざ まな種類の Web アプリケーションで実行する必要があります。たとえば、小売り Web アプリケー ションでショッピング カートを提供する場合、各ユーザのショッピング カートに関する情報をア プリケーションで保存しておく必要があります。 Web マッピング アプリケーションで、アプリケーション内でユーザがマップをクリックして拡大 できる場合、ヨーロッパを拡大しているユーザとオーストラリアを拡大しているユーザを別々に 記憶しておく必要があります。各ユーザのマップの状態を記録するコードを状態管理コードとし て参照します。 状態管理の選択肢 MapXtreme における状態管理の方法には、次の選択肢があります。 • • • InProc 状態管理を使用する場合、コード作成は簡単です。ただし、サーバ リソースに大きな負 担がかかるため、すべてのアプリケーションに適しているわけではありません。 Pooled アーキテクチャでは自動状態管理を使用できます。このモデルの場合、簡単にコード作 成できますが、要件によっては完成したアプリケーションの速度が不十分になることがありま す。 Pooled アーキテクチャでは手動状態管理を使用できます。このモデルの場合、多くのコードを 自分で作成する必要があります。ユーザの状態を構成する適切な MapXtreme Session オブジェ クトを保存し、復元するコードを作成する必要があります。ただし、このモデルを使用すると 最もスケーラブルなアプリケーションを作成できるため、ユーザ数の多いアプリケーションに は最適です。 つまり、それぞれの選択肢にトレードオフがあります。MapXtreme を使って Web アプリケーショ ンを設計する際には、さまざまな要素を考慮する必要があります。こうした検討事項として、 MapXtreme の設計に関する意思決定と、Microsoft テクノロジの設計パターンがあります。この章 では、どのような意思決定が必要になるか、また、作成するアプリケーションの種類について、 適切な選択をするためにはどうすればよいかという点について説明します。 Web アプリケーションを作成する前に、状態管理について検討することを強くお勧めします。選 択した状態管理の種類によって、アプリケーションの作成方法は変わります。Web アプリケー ションを作成した後で、状態管理の種類を決定した場合、アプリケーションの重要な部分を作成 し直す必要が生じることがあります。 アプリケーションを作成する前の検討事項 単純な MapXtreme Web アプリケーションを作成する場合には、とても簡単に手早く作成すること ができます。MapXtreme に付属の Visual Studio テンプレート ("MapXtreme 7.0.0 Web Application") を 使用して、新規 Web サイト アプリケーションを作成するだけです。 ただし、複雑な Web アプリケーションを作成する場合には、Web アプリケーションのビジネス ロ ジックのコードを作成するために膨大な時間と労力を費やす前に、いくつかの検討事項について 考慮してください。その答えが、適切な状態管理の種類を決定するために役立ちます。 108 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について アプリケーションにアクセスするユーザ数 最も重要な検討事項は、このサイトにアクセスするユーザの数です。 Web アプリケーションのユーザ数を把握する時期が早ければ早いほど、スムーズに作業を開始で きます。アプリケーションを開発し、非常に少ないユーザ数でテストした場合 (パイロット プロ ジェクトなど)、ユーザ数が多くなると、アプリケーションが適切に動作していないことが後で判 明する場合があります。このような状況では、アプリケーションのアーキテクチャを変更する必 要に迫られ、場合によってはアプリケーションを作成し直す必要があります。適切な状態管理 アーキテクチャを最初から使用できるように、事前に計画を立ててユーザ負荷を前もって予測し ておく方がはるかに良いでしょう。 ユーザ数がわかっている場合 使用する可能性のあるユーザが明確に限定されているイントラネット サイトを作成することもあ るでしょう。たとえば、組織の特定の部門で使用される Web サイトを作成する場合などです。場 合によっては、サイトにアクセスする全員の名前がわかっていることもあるでしょう。 同時にアクセスするユーザが明確に限定されている場合、プールを使用しない InProc 開発モデル の使用を検討できます。これはコード作成が最も容易なモデルですが、Web サーバ リソースへの 負荷が大きいため、アプリケーションによっては適切な選択とは言えません。このモデルでは、 同時にアクセスする各ユーザに対して 1 つの MapXtreme Session インスタンスを作成します。ただ し、ユーザのプールが明確に限定されている場合、このようなサーバ要件は問題にならないで しょう。 ユーザ数が不明な場合 もう 1 つの開発モデルは、サイトにアクセスするユーザの数が不明な場合です。時間の経過ととも に、Web サイトを訪れるユーザ数が増えていくことを想定することもあるでしょう。この場合、 プールを使用しない InProc 開発モデルは適切ではありません。各ユーザの状態を手動で取得する Pooled 開発モデルの使用を検討する必要があります。Pooled 開発モデルでは、限られた数の MapXtreme Session を作成し、プール内のオブジェクトの 1 つを再利用することで各ユーザ リクエ ストを処理します。 Pooled アーキテクチャを使用することで、スケーラビリティの高いアプリケーションを開発でき ます。負荷の増大に対処するために、後でサーバを増やす必要に迫られる可能性があります。そ のため、アプリケーションには、ユーザの状態を常に把握し、次にサーバにリクエストが来たと きに、その状態をいつ、どのように適用するかを管理できることが求められます。この管理は、 同じサーバが行う場合もあれば、サーバ ファーム内の別のサーバが行う場合もあります。高いス ケーラビリティにより、システムにおける状態の保存方法、データへのアクセス方法、複数のリ クエストに対する応答の方法に関して、さまざまな選択肢が生じることになります。そのため、 アプリケーションの計画を十分に練り、分散アプリケーションをサポートする堅牢なアーキテク チャを構築することが重要です。 初期マップの設定 アプリケーションの開発時には、すべてのユーザで共通する情報を決めておく必要があります。 たとえば、マップ レイヤ、ラベル、タイトル、カラー コード、その他の主題図色分けなどです。 これをバックグラウンド マップといいます。 開発者ガイド 109 状態管理とは バックグラウンド マップを設定するには、MapXtreme ワークスペース マネージャ (MapXtreme で インストールされるデスクトップ アプリケーション) を実行し、マップをワークスペース ファイ ル (.mws ファイル) として保存します。第 24 章: 「ワークスペース マネージャ」を参照してくださ い。 .mws ファイルを作成した後で、Web アプリケーションの Web.config ファイルを編集して .mws ファイルへの参照を指定します。Web.config における構文は次のようになります。 <configuration> <appSettings> <add key="MapInfo.Engine.Session.Workspace" value="C:\MIDATA\EvalData\WorldDetail\World_Detail.mws" /> </appSettings> </configuration> このタグにより、新しい MapXtreme Session インスタンスが作成されたときにワークスペースが読 み込まれます。 ユーザによるマップの変更の許可 ほとんどの Web アプリケーションでは、クリックやドラッグなど、何らかの方法でマップを変更 する操作をユーザに許可します。次の操作をアプリケーションで許可するかどうかを検討しま す。 ユーザに許可する操作: • • • • • マップの拡大、縮小、再センタリング マップ上のフィーチャの選択 (マップ上で直接クリックして選択する場合も) マップ要素の表示と非表示 (チェック ボックスをオフにして道路を非表示にするなど) 主題図色分けの作成と変更 (マップでデータを表示するためのカラー コードなど) シンボル マーカなどのマップ注釈のマップ上への配置 この操作はすべてマップ アプリケーションでサポートできます。ただし、Pooled モデルを使用し て Web アプリケーションをインプリメントする場合は、ユーザがマップに加えたすべての変更を 確実に保存し、復元するコードをアプリケーションに含めるようにしてください。 たとえば、Web アプリケーションでユーザにマップへの注釈の配置を許可する場合、各ユーザの カスタム注釈を保存するコードと、以降のリクエストのたびにユーザのカスタム注釈を復元する コードを作成する必要があります。 アプリケーションで手動の状態管理を行う Pooled モデルを使用する場合、ユーザにマップの変更 を許可するための機能を追加すればするほど、状態管理コードは複雑になります。ユーザがマッ プをさまざまな方法で変更できるような機能を検討している場合、状態管理コードの開発とテス トにかかる時間を確保することも忘れないでください。 110 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について InProc 開発モデル InProc 開発モデルを使用する場合、デスクトップ アプリケーションのコード作成に非常に近い方 法でアプリケーションのコードを作成します。InProc モデルの場合、各ユーザに対して 1 つの MapXtreme Session オブジェクトが存在します。つまり、それぞれ独自のプロセス空間を持つユー ザ ご と に オ ー バ ー ヘ ッ ド が 発 生 し、リ ソ ー ス が 共 有 さ れ ま せ ん。(Catalog、MapFactory、 CoorsSysFactory といった MapXtreme オブジェクトは、MapXtreme Session によって保持されます。 ) 開発上、InProc モデルは単純なモデルです。各ユーザが独自に MapXtreme Session を持つため、そ の Session 内で変更を適用でき、他のユーザの Session に悪影響を及ぼすことがありません。 たとえば、ユーザがマップをクリックしてマップを拡大する場合、アプリケーション コードでは 単純にマップ オブジェクトの Zoom プロパティを変更するだけで済み、ズーム レベルの変更に よって他のユーザが悪影響を受けることを考慮する必要はありません。そのため、InProc Web アプ リケーションのコード作成は容易です。 Web アプリケーションをレストランにたとえて考えるとわかりやすいかもしれません。ウェイ ターが複数のテーブルからの注文を受ける必要があるのと同様に、Web アプリケーションは複数 のユーザからのリクエストを同時に処理する必要があります。 InProc モデルは、1 つのテーブルにつき 1 人のウェイターを雇っているレストランにたとえられま す。レストランにとって、1 つのテーブルにつき 1 人のウェイターを雇うと高額な費用がかかりま す。しかし、1 つのテーブルにつき 1 人のウェイターを雇う余裕があるレストランであれば、確実 にすべてのテーブルで優れたサービスを提供できるでしょう。また、各ウェイターの仕事も簡単 になります。各ウェイターは 1 つのテーブルに給仕するため、どの注文がどのテーブルのものであ るかを覚えておくために余計な時間と労力をかける必要がなくなります。 InProc 開発モデルの長所と短所 InProc モデルを選択すると、各ユーザの状態を保存し、以降のリクエストのたびに復元するための 複雑なコードを用意する必要がなくなるため、Web アプリケーションの作成が容易になります。 ただし、InProc モデルでは同時にアクセスする各ユーザに対して専用の MapXtreme Session が必要 なため、スケーラビリティがありません。数千人のユーザが同時にサイトを使用すると、アプリ ケーションでは数千の MapXtreme Session をサーバ側で維持する必要があるため、サーバのリソー スに負担を強いることになります。多数の同時アクセス ユーザが予想される場合、InProc モデル はアプリケーションに適した選択肢ではありません。 InProc 管理: 解説 ここでは、アプリケーションで InProc モデルを使用する場合に MapXtreme Session がどのような方 法で作成して使用されるかについて、例を挙げて説明します。以降に、順を追って簡単に説明し ます。 1. ユーザがブラウザを起動し、マップ アプリケーション Web サイトにアクセスします。 2. サーバ上に新しい MapXtreme Session が作成されます。この ASP.NET セッションでは、この MapXtreme Session を使用して、このユーザからのすべてのリクエストを処理します。 3. Web.config ファイルで指定されたワークスペース ファイルが読み込まれます。その結果、 MapXtreme Session の MapFactory に 1 つ以上の Map オブジェクトが収められます。この例で 開発者ガイド 111 InProc 開発モデル は、ワークスペースに 1 つのマップが含まれていると想定します。最初に世界全体が表示され るとします。 4. Web ページの HTML がレンダリングされ、クライアントのブラウザに返されます。ページには HTML img タグが含まれます。これにより、サーバにマップのイメージがリクエストされま す。サーバ側で、このユーザの MapXtreme Session のオブジェクト (特に Map オブジェクト) を 使用してマップ イメージがレンダリングされ、ユーザのブラウザに返されます。 5. ユーザが拡大ツールを選択し、オーストラリアの周囲に長方形ボックスを作成して、オースト ラリアを拡大します。 6. サーバ側のアプリケーションにより、オーストラリアが拡大されるように Map オブジェクトの Zoom プロパティが変更されます。新しいマップ イメージがレンダリングされ、イメージがク ライアント ブラウザにストリーミングされます。 これで、Map オブジェクトは最初と異なる状態になりました。世界全体ではなくオーストラリ アを表示するために、Center プロパティと Zoom プロパティが変更されました。 7. ユーザが Select ツールをクリックし、マップの中でオーストラリアが表示されている部分をク リックします。 8. サーバ側で、アプリケーションにより選択が実行され、オーストラリア地域が選択されます。 新しい選択部分を表示するために、新しいマップ イメージがレンダリングされます。 これで、マップの状態が元の状態から 2 種類の方法で変更されました。1 つは Center プロパ ティと Zoom プロパティを変更する方法 (ステップ 6)、もう 1 つは、今ここで行った Selection を追加する方法です。 9. 別の場所で、もう 1 人のユーザがブラウザを起動し、マップ アプリケーション Web サイトに アクセスします。このユーザ向けに、サーバ上で新しい MapXtreme Session が作成されます。 このセッションには、世界全体を表示するマップが含まれています。この Map オブジェクト は、最初のユーザの Map オブジェクトとは別のものです。 2 人目のユーザには、オーストラリアを拡大したマップではなく、世界全体のマップが表示される ことに注意してください。オーストラリアが拡大されているのは、1 人目のユーザのマップだけで す。2 つ目の MapXtreme Session (独自のマップを持つ) は、2 人目のユーザからのリクエストを処理 するために作成されています。したがって、2 人目のユーザには 1 人目のユーザと同じマップは表 示されません。 InProc 開発モデルを使用するアプリケーションの設定 Web アプリケーションの Web.config ファイルには、アプリケーション モデルを制御する設定が保 存されます。InProc モデルの Web.config ファイルには、次のような設定が記述されています。 <!--Use this setting to turn Session pooling on/off (true/false)--> <add key="MapInfo.Engine.Session.Pooled" value="false" /> <!--Use this setting to save Session state automatically (HttpSessionState) or manually (Manual)--> <add key="MapInfo.Engine.Session.State" value="HttpSessionState" /> <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;userid=sa;password=" cookieless="false" timeout="20" /> この設定の場合、MapInfo.Engine.Session オブジェクトはプールされず、MapXtreme Session オブ ジェクトの状態は自動的にユーザの HTTP セッション (キー値 = HttpSessionState) に保存されます。 112 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について sessionState 要素では、mode 属性を InProc に設定し、プロセス中にすべてが保存されるように指定 しています。sessionState が指定されなかった場合、InProc がデフォルトのモードになります。 MapXtreme Session インスタンスの有効期間は、Session 状態の設定によって異なります。サーバ ベースの Session 状態を使用し、Web.config ファイルの ASP.NET sessionState 要素を InProc に設定し た場合、MapXtreme Session インスタンスは ASP.NET セッションの有効期間中、メモリにキャッ シュされます。 その他の種類の Session 状態設定を使用した場合 (クライアントベースまたはサーバベースで sessionState 要素を StateServer または SQLServer に設定した場合など)、MapXtreme Session インスタ ンスは ASP.NET リクエストごとに作成および破棄されます。ただし、この場合にはパフォーマン スに影響が及ぶため、開発モデルとしては避ける必要があります。InProc モデルを採用する場合、 sessionState を InProc に設定する必要があります。 InProc セッションの使用を選択した場合、Web サイトにアクセスするすべてのユーザに MapXtreme Session オブジェクト (および、そこに保持されているすべての情報) が割り当てられます。当然、 ユーザ数が増えれば、メモリ消費量も増えます。 また、MapXtreme Session が作成されるたびに、アプリケーションでは Web.config で指定された ワークスペースも読み込まれます。InProc モデルの場合、ユーザが初めてサイトにアクセスしたと きに新しい MapXtreme Session が作成され、ワークスペースが読み込まれます。 InProc 開発モデルを使用する MapXtreme テンプレートの使用 "MapXtreme 7.0.0 Web Site" テンプレートを使用して Web サイトを作成した場合、このテンプレー トが InProc モデルに従っていないことに注意してください。 InProc を使用するテンプレートでアプリケーションを作成するには、次の手順に従います。 1. 112 ページの「InProc 開発モデルを使用するアプリケーションの設定」で説明したように、 Web.config ファイルを変更します。 2. MapForm1.aspx.vb または MapForm1.aspx.cs で、アプリケーションの Page_Load メソッドと Page_Unload メソッドを削除します。または、MapXtreme Web Site テンプレートによって自動 的に記述された手動状態管理コードをコメント アウトします。 プール オブジェクトの状態管理 Pooled アプリケーションの状態管理は、アプリケーションをスケーラブルにするために設計され た開発モデルです。アプリケーションのユーザ数が多い、または増加し続けると予想される場 合、InProc モデルよりも Pooled モデルの方が適切な選択です。 プールとは Pooled モデルでは、アプリケーションによってサーバ上に限られた数の MapXtreme Session オブ ジェクトが作成されます。次に、それぞれのオブジェクト インスタンスがアプリケーション内で 共有され、再利用されます。次の図に示すように、各 MapXtreme Session で複数のユーザからのリ クエストが処理されます。 開発者ガイド 113 プール オブジェクトの状態管理 この図では、2 つの MapXtreme Session オブジェクトからなる COM+ プールを備えたアプリケー ションが、3 人のユーザ (Web クライアント) によってアクセスされています。クライアントがリク エストを送信するたびに、2 つのうちどちらかの MapXtreme Session オブジェクトがリクエストを 処理します。 このモデルの場合、専用の MapXtreme Session を持つクライアントは存在しません。その代わり に、MapXtreme Session オブジェクトが共有され、再利用されます。次のような処理が考えられま す。 1. クライアント 1 がアフリカを中心にマップを拡大するリクエストを送信するとします。このリ クエストが SessionObj1 を使用して処理されます。 2. クライアント 3 がオーストラリアを中心にマップを拡大するリクエストを送信するとします。 このリクエストも SessionObj1 を使用して処理されます。つまり、1 つのセッションによって複 数のクライアントからのリクエストが処理されます。MapXtreme Session を "所有" するクライ アントはありません。すべての MapXtreme Session が共有されます。 3. Client1 がマップをパンしてヨーロッパを表示するリクエストを送信するとします。このリクエ ストが SessionObj2 を使用して処理されます。つまり、特定のクライアントが送信したリクエ ストがすべて同じ MapXtreme Session (または同じ Map オブジェクト) によって処理されるとは 限りません。 プールの長所と短所 Pooled 型のモデルでは、同時に使用される MapXtreme Session インスタンス数を抑えることができ るため、オブジェクトを新しく作成することによるオーバーヘッドを減らすことができます。オ ブジェクトが必要なときは、プールから取り出されます。オブジェクトが不用になると、プール に戻され、次のリクエスト待ちの状態になります。MapXtreme のプール機能を利用することで、 Web リクエストが受信されたときには既に複数の MapXtreme Session オブジェクトが作成され、 バックグラウンド マップに読み込まれており、使用することができます。 114 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について プールを使用することで、サーバのリソースを最適化できます。具体的な利点は次のとおりで す。 • • • 複数の ASP.NET リクエストを同時に処理することによって Web アプリケーション全体として の応答時間を短縮できる。 同時使用される MapXtreme インスタンス数を抑えることでリソースを節約できる。 同時実行されるリクエスト数 (およびスレッドのコンテキスト切り替え) を減らすことで CPU の使用効率を最適化できる。CPU に対する負荷が大きいリクエストの場合 (マップ イメージの エクスポートなど)、プールは特に有用です。プールのサイズは CPU あたり 1 ~ 2 セッション にすることをお勧めします。 ただし、Pooled アプリケーションは複雑になる場合があります。MapXtreme Session (およびその マップ) は共有され、再利用されます。そのため、アプリケーションでクライアント リクエストを 処理するたびに、各マップが適切な状態に再設定されているかどうかを確認する手順が必要にな ります。 たとえば、クライアントがドイツの地図を表示するリクエストを送信したとします。単純にプー ルから MapXtreme Session をフェッチして、そのセッションのマップを使用してイメージをレンダ リングすることはできません。そのマップでドイツが拡大されているとは限らないからです。そ のリクエストを処理するマップを適切な既知の状態に設定する必要があります。オブジェクトを 使用して現在のリクエストを処理する前に、そのオブジェクトが適切な状態であることを確認す るために、アプリケーション開発者はオブジェクトの状態を管理する必要があります。 Pooled アプリケーションの状態の保存 Pooled 開発モデルでは、プール オブジェクトの状態を 2 つの方法で管理できます。MapXtreme に 現在のユーザ状態を管理させる方法 (自動状態管理) と、ユーザごとに保存/復元すべき状態の変化 を開発者が管理する方法 (手動状態管理) です。 自動状態管理 この方法では、Web.config (StateServer または SQLServer) に定義されたセッション メカニズムに、 MapXtreme Session オブジェクトの状態を自動的に保存するように指定します。アプリケーション 開発者がプログラムによって、現在のユーザの状態情報 (レイヤ、主題図、開いているテーブル、 現在のズームなど) を保存する必要はありません。MapXtreme Session オブジェクトのすべての状態 が保存されます。 この設定では、すべてのユーザがプールされた MapXtreme Session オブジェクトを共有し、ユーザ ごとに MapXtreme Session を割り当てる必要がないため、InProc 型のモデルと比べるとシステム リ ソースを節約できるというメリットがあります。欠点は、MapXtreme Session 全体が現在定義され ている状態メカニズムにシリアライズされる点です。通常、MapXtreme Session オブジェクトは、 ファクトリ内のすべてのオブジェクトを取得し、それを状態メカニズムとしてシリアライズしま す。たとえば、マップと、そこに含まれているレイヤ、開いているテーブルの定義、読み込まれ た投影法がすべてシリアライズされます。アプリケーションで自動状態管理が使用されている場 合、MapXtreme Session オブジェクトでは個々のユーザの状態を判別せず、使用可能なすべての情 報を保存します。たとえば、ユーザ間で変化しないレイヤ (バックグラウンド マップ) などです。 これは時間のかかる処理であり、この種のアプリケーションの実行速度が InProc 型のモデルと比 べて遅くなる原因です。シリアライゼーションの詳細については、第 9 章、169 ページの「シリア ライゼーション」 を参照してください。 開発者ガイド 115 プール オブジェクトの状態管理 手動状態管理 この設定では、MapXtreme Session インスタンスによってインスタンス データが自動的に保存され ることはありません。アプリケーション開発者が、各ユーザの状態を保存、復元するコードをア プリケーションに組み込む必要があります。MapXtreme Session オブジェクトによって、状態が現 在定義されている状態メカニズムに保存されることはありません。 これは、パフォーマンスとスケーラビリティの点で最も優れた構成です。状態を保存しない、 プールされる MapXtreme Session インスタンスを使用している場合、このプール オブジェクトが COM+ プール "ダーティ" に返されます。つまり、プール オブジェクトは、現在のユーザによって マップに何らかの変更がなされているため、アプリケーションによってその状態をクリーンアッ プし、次にそれを使うユーザのために適切に設定する必要があります。クリーンアップを Web ア プリケーション リクエストの開始時に行うか、終了時に行うかも、開発者が指定できます。 121 ページの「StateManager のインプリメント」を参照してください。 プールされた MapXtreme Session を使用し、ユーザの状態を手動で管理する場合、開発モデルは複 雑になります。特定のリクエストで使用される MapXtreme Session は予測できません。同時に、そ のユーザ専用の MapXtreme Session を使用してユーザ リクエストを処理する必要があります。その ため、アプリケーションではプールされた MapXtreme Session の開始状態を把握しておく必要があ ります。 アプリケーションで処理する必要がある開始状態は、4 種類あります。各状態は、ユーザの状態と MapXtreme Session の状態の組み合わせです。 ユーザの状態 プール内の MapXtreme Session の状態 初めてサイトにアクセスした クリーン * 初めてサイトにアクセスした ダーティ† サイトに再びアクセスした クリーン * サイトに再びアクセスした ダーティ† * † MapXtreme Session およびバックグラウンド マップが最初の状態です。 MapXtreme Session またはバックグラウンド マップ、あるいはその両方に、別の ユーザによる変更が加えられています。 手動状態管理: 解説 こ こ で は、ア プ リ ケ ー シ ョ ン で 手 動 の 状 態 管 理 モ デ ル を 使 用 す る 場 合 に、プ ー ル さ れ た MapXtreme Session をどのような方法で管理するかについて、例を挙げて説明します。以降に、順 を追って簡単に説明します。 1. ユーザがブラウザを起動し、マップ アプリケーション Web サイトにアクセスします。 2. アプリケーションでプールを使用するため、プールから MapXtreme Session インスタンスが取 得されます。 116 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について 3. Page_Load から RestoreState メソッドが呼び出されます。 MapXtreme Session にユーザによる変更が加えられ、"ダーティ" になっている場合、マップは適 切な開始状態に戻されます。AppStateManager クラスの RestoreDefaultState メソッドを参照して ください。 この例では、開始状態で世界全体のマップが表示されるとします。 4. Web ページの HTML がレンダリングされ、クライアントのブラウザに返されます。ページには HTML img タグが含まれます。これにより、サーバにマップのイメージがリクエストされま す。サーバ側で、このユーザのブラウザ セッションのオブジェクト (特に Map オブジェクト) を使用してマップ イメージがレンダリングされ、ユーザのブラウザに返されます。 5. Page_Unload メソッドで、AppStateManager.SaveState メソッドを呼び出すことでユーザの状態を 保存します。 6. ユーザが拡大ツールを選択し、オーストラリアの周囲に長方形ボックスを作成します。拡大 ツールに組み込まれている Javascript により、オーストラリアを拡大するリクエストがサーバ に送信されます。 7. MapXtreme サーバ側では、プールから再び MapXtreme Session オブジェクトをフェッチする必 要があります。プールから返された MapXtreme Session が、前回のリクエストの処理に使用さ れたオブジェクトと異なる場合があることに注意してください。このオブジェクトはクリーン である可能性もあれば、ダーティである可能性もあります。 8. サーバ上のアプリケーションで AppStateManager.RestoreState メソッドを呼び出し、手順 5 で保 存したユーザ状態を復元します。これにより、そのユーザに適した既知の状態に MapXtreme Session が復元されます。 9. アプリケーションにより、オーストラリアが拡大されるように Map オブジェクトの Zoom プロ パティが変更されます。新しいマップ イメージがレンダリングされ、イメージがクライアント ブラウザにストリーミングされます。リクエストの最後で、ユーザの状態が再び保存されま す。 10. ユーザが Select ツールをクリックし、マップの中でオーストラリアが表示されている領域をク リックして、オーストラリアを選択します。 11. アプリケーションではプールから再び MapXtreme Session をフェッチし、再度 RestoreState を呼 び出して、プール オブジェクトを既知の状態に設定します。 12. サーバ側のアプリケーションで、オーストラリアを選択する処理が実行されます。新しい選択 部分を表示するために、新しいマップ イメージがレンダリングされます。 13. サ ー バ 側 の ア プ リ ケ ー シ ョ ン で、ユ ー ザ の 状 態 を 保 存 す る た め に 再 び AppStateManager.SaveState が呼び出されます。この例ではユーザが選択を実行できるため、 AppStateManager の SaveState メソッドと RestoreState メソッドに Selection の保存と復元を行う コードを含める必要があります。 レイヤ、主題図、クエリ、マップ ビューなどの変更をユーザに許可する MapXtreme Session の 各部分は、各項目の保存と復元を行うコードで処理する必要があります。 手動でユーザ状態をプールして管理する方法は、効率を高め、アプリケーションのスケーラビリ ティを高めるという利点があります。ただし、このモデルでは、各リクエストの最後でユーザ状 態を保存し、そのユーザの次回のリクエストで最初に状態を復元するという手順が必要になりま す。 開発者ガイド 117 プール オブジェクトの状態管理 Pooled アプリケーションにおける手動状態管理の使用 手動状態管理を使用した Pooled アプリケーションの例については、MapXtreme に付属するサンプ ル Web アプリケーションを参照してください。次に、このようなアプリケーションの設定の要点 を示します。 プール オブジェクトを Web.Config ファイルで設定する場合、次のような設定を使用します。 <!--Use this setting to turn Session pooling on/off (true/false)--> <add key="MapInfo.Engine.Session.Pooled" value="true" /> <!--Use this setting to save Session state automatically (HttpSessionState) or manually (Manual)--> <add key="MapInfo.Engine.Session.State" value="Manual" /> <sessionState mode="StateServer" stateConnectionString= "tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20" /> この 2 つの設定を組み合わせて、次の設定を指定できます。 • • プール オブジェクトと自動状態管理を有効にするには、Pooled を true に、State を HttpSessionState に設定します。 プール オブジェクトと手動状態管理を有効にするには、Pooled を true に、State を Manual に設 定します。 ユ ー ザ の 現 在 の 状 態 を Page_Load メソッドに渡すロジックを記述します。121 「StateManager のインプリメント」を参照してください。 ページの ユーザ状態 アプリケーションでは、ユーザの現在の状態と、プールから取得したときの MapXtreme Session オ ブジェクトの状態を考慮する必要があります。このとき、開発者は次のどちらかの処理を選択す る必要があります。 • • SaveState メソッドで、クリーン アップしたプール オブジェクトをプールに返す。 RestoreState メソッドで、プール オブジェクトを解放した後、状態を復元する。 必ずしも、適切な処理を明確に判断できるわけではありません。ユーザ別の状態の違いを示す変 数が多数あると、Session オブジェクトをダーティのまま解放し、プールに戻す必要がある場合が あ り ま す。別 の ア プ リ ケ ー シ ョ ン に よって、Page_Load によるクリーンアップを待つか、 Page_Load でセッションのクリーンアップが必要かどうかをチェックするのを待つことで、時間を 節約することもできます。 116 ページの「手動状態管理: 解説」に示す例では、2 つ目の選択肢を採用しています。つまり、 プール オブジェクトを RestoreState メソッドでクリーン アップします。 次のセクションでは、状態の保存と復元について詳しく説明します。 118 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について 手動状態管理の詳細 ここでは、Pooled アプリケーションで手動状態管理を実行する例について詳しく説明します。 MapXtreme に付属する主題図サンプル Web アプリケーションのコード内で、これに相当する部分 を見ていきましょう。まだ主題図サンプルを実行していない場合には、このセクションを読む前 に主題図サンプルを実行して、内容を把握してください。 次の場所にあるソリューションに含まれるプロジェクトの 1 つが、この主題図サンプルです。 C:\Program Files\MapInfo\MapXtreme\7.x.x\Samples\VisualStudio2005\Web\Features 次のトピックで構成されます。 • • • • • • • 「主題図サンプルの概要」 「アプリケーションの設定」 「StateManager のインプリメント」 「適切な順序での MapXtreme オブジェクトのシリアル化」 「MapXtreme オブジェクトの自動デシリアライズ」 「初期リクエストの処理」 「以降のリクエストの処理」 主題図サンプルの概要 このアプリケーションでは、World.mws (MapXtreme に付属するサンプル データの 1 つ) から読み込 まれた世界地図が表示されます。 Web フォームのオプションを使って、ユーザはマップ上でさまざまな種類の主題図色分けを作成 できます。この主題図色分けによって、world.tab テーブル内の地域 (国を表す範囲) の表示が変更 されます。主題図の属性データは、eworld.mdb という Microsoft Access データベースに格納されて います (このファイルは Visual Studio プロジェクトに含まれています)。 開発者ガイド 119 手動状態管理の詳細 この例では、MapXtreme Session の作成時にワークスペース ファイル world.mws が事前読み込みさ れます。ただし、eworld から取得されるフィールドは、クライアントがアプリケーションにアク セスしたときに追加されます。 注意 パフォーマンスを高めるには、属性フィールド情報をワークスペース ファイルに配置しま す。これによって、MapInfo Session の作成時に、必要なすべてのデータが事前に読み込ま れます。 アプリケーションの設定 まず、Web.config ファイル内でア プリケーションの設定が含まれる部分を見てみましょう。 Web.config ファイルの冒頭部分に、次のような設定が記述されています。 <configuration> <appSettings> <!--Use this setting to turn Session pooling on/off (true/false)--> <add key="MapInfo.Engine.Session.Pooled" value="true" /> <!--Use this setting to save Session state automatically (HttpSessionState) or manually (Manual)--> <add key="MapInfo.Engine.Session.State" value="Manual" /> <!--Use this setting to preload a workspace on Session creation--> <add key="MapInfo.Engine.Session.Workspace" value="c:\Program Files\MapInfo\MapXtreme\7.0.0\Samples\Data\World.mws" /> 次に、この設定について説明します。 • • • MapInfo.Engine.Session.Pooled: このキーの値が "true" であるため、MapXtreme Session オブジェ クトが COM+ サービスによりプールされます。新しいクライアント リクエストで新しい MapXtreme Session が取得されたとき、その Session は "クリーン" オブジェクト (作成されたば かりの新規オブジェクト) または "ダーティ" オブジェクト (前のリクエストを処理するために既 に使用されているオブジェクト) です。このオブジェクトの状態は判別できないため、このア プリケーションでは各リクエスト内で MapXtreme Session オブジェクトを使用前の既知の状態 に復元する処理を実行します。 MapInfo.Engine.Session.State: このキーの値が "Manual" であるため、アプリケーションで Session 状態を明示的に保存し、復元する必要があります。どのオブジェクトを保存し復元するのかに ついて、アプリケーションの StateManager クラスで適切に指定されているため、この "Manual" 設定はパフォーマンスの向上に貢献します。StateManager により、必要最小限のオブジェクト のみが選択的に保存され、復元されます。そのため、これは最も効率の高い状態管理オプショ ンです。(121 ページの「StateManager のインプリメント」を参照)。 MapInfo.Engine.Session.Workspace: この設定で、.mws ワークスペース ファイルをセミコロン区 切りのリストとして指定できます。MapXtreme Session の作成時に、このワークスペース ファ イルが事前読み込みされます。複数のワークスペースを指定するには、ファイル名をセミコロ ンで区切って指定します。 Web.config ファイルのもっと後方には、次の設定があります。 <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20" /> 120 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について こ こ で は、状 態 の 保 存 方 法 が 指 定 さ れ ま す。こ の 例 で は、情 報 を 後 で 取 得 で き る よ う に、 StateServer に保存するように指定しています。これを SQLServer に設定すると、状態がデータベー スに保存されます。 StateManager のインプリメント この 主 題 図 サ ン プ ル ア プ リ ケ ーションでは、手動状態管理を使用しています。そのため、 MapXtreme Session の適切な変更を保存し、復元するために、StateManager クラスをインプリメン トする必要があります。 このクラスは抽象ベース クラス MapInfo.WebControls.StateManager を継承します。次のメソッドを インプリメントする必要があります。 Public Overrides Sub RestoreState() Public Overrides Sub SaveState() 注意 "MapXtreme 7.0.0 Web Site" テンプレートを使用して Visual Studio で新しい Web サイトを作 成 す る と、作 成 さ れ た プ ロジェクトには AppStateManager が含まれます。これは、 StateManager のインプリメントです。 AppStateManager クラスの詳細な内容は、アプリケーションによって異なります。ユーザがマップ をカスタマイズできるように、アプリケーションで提供されるオプションを増やせば増やすほ ど、そのカスタマイズの保存と復元のために AppStateManager に追加するコードが増えていきま す。そ の た め、主 題 図 サ ン プ ル アプリケーションで使用されている AppStateManager には、 MapXtreme Web Site テ ン プ レ ートから新しいプロジェクトを作成したときに生成される AppStateManager よりも多くのコードが含まれています。 たとえば、この主題図サンプルは主題図レイヤ、主題図テーブル、属性テーブル、グループ レイ ヤのカスタマイズに対応します。一方、Web テンプレートにはレイヤと選択のカスタマイズを処 理するコードが含まれています。 次に、RestoreState メソッドと SaveState メソッドの使用方法を説明します。 1. クライアントがリクエストを送信するたびに、Page_Load メソッドにより RestoreState が呼び出 されます。さらに、クライアントでマップ ツールが使用されるたびに、RestoreState が呼び出 されます。プールから取得され、状態が不明な ("ダーティ" の可能性もある) MapXtreme Session オブジェクトは、RestoreState メソッドによって既知の状態、つまりユーザの状態 (存在する場 合) または Application 状態のデフォルト状態に確実に復元されます。 たとえば、ユーザが前回マップをリクエストしたときにユーザのマップでフランスが拡大され ていた場合、RestoreState メソッドによって、プールから取得されたマップが確実に "フランス を拡大" 状態に戻されます。このようにして、ユーザのセッションを前回中断された状態から 継続できます。 次に示す VB コードの例は、主題図サンプル アプリケーションの WebForm1.aspx.vb の一部で す。 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load ' The first time in If Session.IsNewSession Then '//************************************************************ '// You need to follow below lines in your own application. '//***************************************************************** 開発者ガイド 121 手動状態管理の詳細 Dim stateManager As New AppStateManager ' tell the state manager which map alias you want to use. ' You could also add your own key/value pairs, the value should be ' serializable. stateManager.ParamsDictionary.Item(AppStateManager.ActiveMapAliasKey)_ = Me.MapControl1.MapAlias ' Put state manager into HttpSession, so we could get it later on from ' different class and requests. MapInfo.WebControls.StateManager.PutStateManagerInSession_ (stateManager) Me.InitState() End If MapInfo.WebControls.StateManager.GetStateManagerFromSession.RestoreState() PrepareData() End Sub 2. Page_Load メソッドの後で、クライアント リクエストの内容に応じて、適切なビジネス ロジッ クがすべて適用されます。 たとえば、ユーザが拡大ツールをクリックすることでリクエストが生成された場合、ビジネス ロジックによりマップの中心とズーム レベルが修正されます。 3. リクエスト処理サイクルの最後に、Page_Unload メソッドにより SaveState が呼び出されます。 さらに、クライアントでマップ ツールが使用された後で、SaveState が呼び出されます。 以後にユーザがリクエストを送信したとき、そのリクエストで再び RestoreState を呼び出せる ように、SaveState メソッドによりマップの最新の状態が保存されます。このような SaveState 呼び出しは、次回にリクエストが受信され、RestoreState が呼び出されるときに備えて実行され ます。 Private Sub Page_UnLoad(ByVal sender As Object, ByVal e As _ EventArgs) Handles MyBase.Unload MapInfo.WebControls.StateManager.GetStateManagerFromSession()_ .SaveState() End Sub 適切な順序での MapXtreme オブジェクトのシリアル化 主 題 図 サン プ ル で 使 用 さ れ て い る AppStateManager クラスでは、SaveState メソッドから ManualSerializer.SaveMapXtremeObjectIntoHttpSession メソッドが数回呼び出されます。オブジェク トは次の順序で保存 (シリアル化) されます。 ManualSerializer.SaveMapXtremeObjectIntoHttpSession(MapInfo.Engine.Sessio n.Current.Catalog(SampleConstants.EWorldAlias), "mdb_table") ManualSerializer.SaveMapXtremeObjectIntoHttpSession(MapInfo.Engine.Sessio n.Current.Catalog(SampleConstants.ThemeTableAlias), "theme_table") ManualSerializer.SaveMapXtremeObjectIntoHttpSession(map.Layers(SampleCons tants.ThemeLayerAlias), "theme_layer") 122 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について ManualSerializer.SaveMapXtremeObjectIntoHttpSession(map.Layers(SampleCons tants.GroupLayerAlias), "group_layer") 一 部 の オ ブ ジ ェ ク ト は 他 の オ ブ ジ ェ ク ト に 依 存 し て い る た め、こ の SaveMapXtremeObjectIntoHttpSession 呼び出しは正しい順序で実行されることが重要です。 この例では、まずテーブルを保存します (これは Catalog を利用して参照されます)。次に、レイヤ を保存します (これはマップの Layers コレクションを利用して参照されます)。ほとんどの種類の レイヤがテーブルに依存しているため、これが適切な順序となります。 たとえば、FeatureLayer はそれぞれ 1 つのテーブルに関連付けられています。テーブルを使用する FeatureLayer をインスタンス化 (つまりデシリアライズ) するには、そのテーブルを先に開いておく 必要があります。そのため、この AppStateManager クラスではテーブルを先に保存し、次にレイヤ を保存します。 同様に、RestoreState メソッドでは、最初にデータ オブジェクトを復元し、次にレイヤを復元しま す。 ManualSerializer.RestoreMapXtremeObjectFromHttpSession("mdb_table") ManualSerializer.RestoreMapXtremeObjectFromHttpSession("theme_table") ManualSerializer.RestoreMapXtremeObjectFromHttpSession("theme_layer") ManualSerializer.RestoreMapXtremeObjectFromHttpSession("group_layer") MapXtreme オブジェクトの自動デシリアライズ SaveState メソッドでは、マップ内の特定のレイヤなど、特定の参照を使用して保存するオブジェ クトを指定します。 ManualSerializer.SaveMapXtremeObjectIntoHttpSession(map.Layers(SampleCons tants.ThemeLayerAlias), "theme_layer") ただし、RestoreState メソッドでは、Catalog や map.Layers コレクションを参照することはありませ ん。RestoreState メソッドでは ManualSerializer クラスのメソッドを呼び出しますが、その呼び出し の 結果 に 対し て 処理 は 行わ ず、map.Layers コレクションへの参照はありません。これらは、 Catalog コレクションや Layers コレクションなど、必要な場所に自動的にデシリアライズされま す。 ManualSerializer.RestoreMapXtremeObjectFromHttpSession("theme_layer") 注意 ManualSerializer を使用して、オブジェクトの保存と復元を実行します。次のような構文を 使用して、MapXtreme オブジェクトを直接 HttpSessionState に格納しないでください。 HttpContext.Current.Session.Item("myTable") = _ MapInfo.Engine.Session.Current.Catalog("myTable") 開発者ガイド 123 手動状態管理の詳細 初期リクエストの処理 アプリケーション状態は、すべてのユーザ セッションで共通する、またはグローバルな情報を保 存するために使用されるサーバ サイド情報管理メカニズムです。Session.IsNewSession が true の場 合、アプリケーション状態が初期化されます。アプリケーション状態は、初期リクエストを処理 する際に重要な要素です。 MapXtreme の場合、すべてのユーザの初期リクエストでデフォルト状態のマップを受け取られる ように、アプリケーション状態によってバックグラウンド マップの初期状態が保持されます。 MapXtreme 主題図サンプルで、初期リクエストを処理する手順を示します。 アプリケーションで処理する必要がある "最初の" リクエストには、2 つの種類があります。1 つ は、その Web アプリケーションに最初にアクセスしたユーザによる最初のリクエスト、もう 1 つ は、それ以降のユーザによる最初のリクエストです。 どのユーザでも、最初にアプリケーションを使用する際には、プールからクリーンな MapXtreme Session が取得されます。バックグラウンド マップは初期状態になります。この初期状態がアプリ ケーション状態に保存され、テンプレートのように使用されます。この処理は SaveDefaultState メ ソッドで実行されます。 以降のすべてのユーザによる最初のリクエストでは、RestoreDefaultState が呼び出されます。これ により、アプリケーション状態からマップの初期状態が取得されます。 次に、初期リクエストに関連する手順を示します。 1. Page_Load メソッドでは、現在のセッションが新規かどうかをチェックします。現在のセッ ションが新規の場合、StateManager をインスタンス化し、StateManager の ParamsDictionary プロ パティに MapAlias を追加します。手動状態管理を使用する場合、この操作は必須です。 2. 次に、これは新しいセッションであるため、Page_Load メソッドで InitState メソッドを呼び出 してアプリケーション データを初期化します。InitState メソッドで、マップの初期状態を設定 します。 3. 次に、Page_Load メソッドで RestoreState を呼び出して、これがこのアプリケーションに対する 最初のリクエストかどうかをチェックします。 これがこのアプリケーションに対する最初のリクエストである場合、SaveDefaultState メソッド を呼び出してマップ上のさまざまなプロパティを初期状態に設定し、ManualSerializer メソッド を呼び出してこの初期マップ状態を HttpApplicationState にバイト配列として保存します。 逆に、これがユーザの最初のリクエストであっても、アプリケーションに対する最初のリクエ ストではない場合、RestoreDefaultState を呼び出してプロパティを初期状態にリセットします。 以降のリクエストの処理 ユーザの最初のリクエストが処理された後で、マップをクリックして拡大するなどのリクエスト を 送 信す る 場 合が あ る でし ょ う。こ の場合、Page_Load メソッド、またはマップ ツールから RestoreState が呼び出されると、初期リクエスト ロジックがスキップされます。その代わりに、 ユーザの状態を復元するコードが実行されます。 124 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について ユーザのセッションの終了時、またはマップ ツールの使用後に、SaveState メソッドが呼び出され てセッションの状態が保存されます。 注意 endResponse フラグを true にして Server.Transfer または Response.Redirect を使用する場合、 この Page_Unload メソッドは呼び出されません。これらのメソッドがこのイベント ハンド ラを無視するためです。この問題に対処するには、endResponse フラグを true にして Server.Transfer または Response.Redirect を処理する前に、 MapInfo.WebControls.StateManager.GetStateManagerFromSession().SaveState() を明示的に起動 します。 MapXtreme Session の詳細 MapXtreme Session は、すべての MapXtreme アプリケーション操作の開始点となります。これによ り、MapXtreme アプリケーションに必要なリソースの初期化を管理します。MapXtreme Session を 通じて、Data.Catalog、MapFactory、CoordSysFactory、Selections など、他の重要なオブジェクトに もアクセスできます。 MapXtreme Session にアクセスするには、MapInfo.Engine.Session.Current() メソッドを呼び出しま す。プロセスの 1 つのスレッドで使用できる MapXtreme Session オブジェクトは 1 つです。スレッ ドごとに 1 つの MapXtreme Session が存在しており、このセッションを複数のスレッドで共有する ことはできません。 Web アプリケーションでは、1 ユーザにつき 1 つの MapXtreme Session オブジェクトが割り当てら れる場合と、プールされた MapXtreme Session を複数のユーザが共有する場合とがあります。次の セクションでは、COM+ プール オプションについて詳しく説明します。 Web アプリケーションのパフォーマンスの詳細については、第 7 章: 「Web アプリケーションのパ フォーマンス」を参照してください。 Microsoft COM+ オブジェクト プールの設定 MapXtreme Session オブジェクトは、システム上の COM+ サービスに登録されます。このシステム によって、すべての登録済みプール オブジェクトの構成とアクティブ化が行われます。ランタイ ム インストーラは、MapInfo Session オブジェクトを登録し、デフォルト設定を作成するロジック を備えています。MapXtreme Session オブジェクトには、デフォルトで 2 つのプール オブジェクト と 60 秒のタイムアウトが設定されます。 プール サイズの構成 システム構成メソッドを使用して、MapXtreme Session の適切なセクションを設定できます。この 設定は、コントロール パネルのシステム ダイアログ ボックスでも、アプリケーションの .NET 構 成ファイルでも実行できます。プールされた MapXtreme Session を使用する場合、Web アプリケー ションで、これらの設定を管理する必要があります。 重要な設定の 1 つが、実行中のアプリケーションでの処理のために COM+ システムによって作成 されるプール オブジェクトの数です。この設定には、[コントロール パネル] > [管理ツール] > [コ ンポーネント サービス] でアクセスできます。[コンポーネント サービス] > [コンピュータ] > [マイ 開発者ガイド 125 MapXtreme Session の詳細 コンピュータ] > [COM+ アプリケーション] [MapInfo.CoreEngine] > [コンポーネント] を順に展開し てください。ここで、MapInfo.Engine.Session+PooledSession オブジェクトを探し、 そのアイコンを 右クリックして、[プロパティ] を選択します。 [プロパティ] ダイアログで、アプリケーションごとのプール オブジェクトの数や、セッション作 成時におけるアクティブ化のタイムアウトなど、各種のプロパティを設定できます。プール オブ ジェクトの数を適切に設定することが、アプリケーションのパフォーマンス向上につながりま す。プール オブジェクトの数を正しく設定するには、アプリケーションと、そのデータ アクセス 方法を十分に理解していることが必要です。 バックグラウンド マップによるパフォーマンスへの影響 アプリケーションのパフォーマンスに直接影響するもう 1 つのセッション設定が、アプリケーショ ンの Web.config ファイルで定義されるスタートアップ ワークスペースです。このワークスペース は、Session オブジェクトの作成時に読み込まれるマップ、レイヤ、およびテーブルを定義するも のです。この処理は、COM+ プール スレッドおよび Web アプリケーション空間外で行われます。 アプリケーションの起動時、アプリケーション プールに対して、MapXtreme Session オブジェクト を要求するリクエストが送られます。その後、コントロール パネルの [コンポーネント サービス] ダイアログ ボックスで指定された数のプール オブジェクトが、COM+ プールによって作成されま す。この MapXtreme Session オブジェクトによって Web.config ファイルが読み取られ、指定された ワークスペースが読み込まれた後で、アプリケーションによりプールからインスタンスが取得さ れます。したがって、ワークスペースの読み込みがタイムアウトした場合 (つまり、[コンポーネン ト サービス] ダイアログで指定された時間を超えた場合)、COM+ のアクティブ化例外が発生しま す。そのため、このワークスペースに何を読み込むか、完全に読み込むまでにどの程度の時間が かかるかを把握しておく必要があります。 最小プール サイズに 2 を指定した場合、COM+ プールは、プール オブジェクトを要求する最初の リクエストで 2 つの MapXtreme Session インスタンスを作成します。COM+ プールで、プール オブ ジェクトを待ち受けている間にタイムアウトになった場合、最大数の設定に到達するまで追加の オブジェクトが作成されます。ワークスペースが非常に複雑で読み込みに時間がかかる場合、以 降のオブジェクトのアクティブ化が開始されると、アプリケーションがアクティブなときにタイ ムアウト エラーが発生します。Web アプリケーション プールには、Pooled アプリケーションの再 126 MapXtreme 2008 v7.0.0 第 6 章 : 状態管理について アクティブ化を制御するための設定 (プールされたクラスのリサイクルに関する設定など) があり ます。そのため、いつかの時点でアプリケーションやプール オブジェクトがリサイクルされる と、別のワークスペースが読み込まれます。 アプリケーションのバックグラウンドに必要なマップ、テーブル、レイヤを決定し、それを Web.config ファイルでワークスペースを使用して読み込む必要があります。ただし、ワークスペー スの規模が大きいと読み込みに時間がかかることがあるため、注意してください。読み込みにか かる時間をテストするには、単純にサーバ マシン上のワークスペース マネージャでワークスペー スを読み込んで実際の読み込み時間を調べます。それに応じてタイムアウト設定を調整します。 初期ワークスペースは、全ユーザで共通のマップ、レイヤ、テーブルなどを読み込むときに非常 に有効ですが、複雑なワークスペースを読み込む場合の影響について注意する必要があります。 参考資料 MapXtreme Session は柔軟な設定が可能であるほか、Microsoft COM+ や Web テクノロジとの親和性 を考慮して設計されています。その活用方法について理解するには、Microsoft の Web 配信アーキ テクチャを理解する必要があります。これまでに述べたトピックについては、さまざまな情報が 提供されています。Web アーキテクチャについて、参考になると思われるサイトを次に示しま す。 IIS 6.0 Internet Information Services and Internet Communication IIS 7.0iis7.0 IIS 7.0: Managing Web Applications in IIS 7.0 COM+ プール COM+ Object Pooling Concepts IIS セッション状態 Selecting the Method for Maintaining and Storing ASP.NET Session State (IIS 6.0) 開発者ガイド 127 MapXtreme Session の詳細 128 MapXtreme 2008 v7.0.0 Web アプリケーションの パフォーマンス この章では、Web アプリケーションのパフォーマンス チューニングについて 重点的に説明します。前章で取り上げた状態管理やプールについての情報を発 展させた内容となっています。 この章の構成 「Web アプリケーションのパフォーマンス」 . . . . . . . . . . . . . . . . . . 130 「パフォーマンス チューニング」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 「IIS サーバの設定」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 7 パフォーマンス チューニング Web アプリケーションのパフォーマンス パフォーマンスをあらかじめ予測することは、どのようなアプリケーション開発においても最も 難しい問題です。すべてのアプリケーションは、わずかな違いで全体的なパフォーマンスを左右 する固有の側面を持ち合わせています。このセクションでは、いくつかのサーバ設定がパフォー マンスにどのように影響するか、およびこれらの設定を各種の Web ベース アプリケーションに適 用する方法について説明します。 以降のセクションのテスト シナリオで触れている Internet Information Services (IIS) 6.0 は、Windows Server 2003 ベースのシステムで動作します。最も高いパフォーマンスが期待できる選択肢です。 ユーザ数について CPU およびメモリは、サーバのパフォーマンスを決める最も重要な要素であり、いずれもパ フォーマンスに直接的に影響します。しかし、ハードウェアのセットアップには制約が伴うのが 一般的です。十分な経験則に基づいて、最も重要なハードウェア ニーズを見極める必要がありま す。 できれば、システムの設計時にアプリケーションのユーザ数と処理能力要件を調査しておき、購 入する必要のあるハードウェアを決めることが理想的です。ユーザ数と Web アプリケーションの スケーラビリティの関係については、108 ページの「アプリケーションを作成する前の検討事項」 を参照してください。 パフォーマンス チューニング アプリケーションにプール型の開発モデルを使用するか、非プール型の開発モデルを使用するか で、パフォーマンスに大きな違いが生じます。プールされたオブジェクトは、アプリケーション が使用することのできる共有リソースと考えてください。そのように考えれば、アプリケーショ ンのメモリ要件も明らかになってきます。 以降のセクションでは、メモリ使用量、CPU 使用率、データ アクセス、レンダリング操作の観点 から、プール型と非プール型の両方のアプリケーションをテストした結果をまとめています。 プールと状態管理の詳細については、第 6 章、105 ページの「状態管理について」 を参照してくだ さい。 メモリ 同時ユーザ数や開発モデル (プール型と非プール型) によって、MapXtreme Web アプリケーション のメモリ消費量は大きく変わります。たとえば、バックグラウンド マップを含む MapXtreme Session オブジェクトが 50 MB のメモリを占有し、さらに、1 MB のメモリを占有する 1 ~ 2 個の可 変レイヤがアプリケーションによって作成されるとします。非プール型の開発モデルを使用した 場合、同時ユーザ数が 100 人と仮定すると、このアプリケーションには 5100 MB のメモリが必要 となります。 130 MapXtreme 2008 v7.0.0 第 7 章 : Web アプリケーションのパフォーマンス * ユーザ数 100 * = セッション メモリ 51 MB = 必要なメモリの合 計 5,100 MB 今度は、プールされた 2 つの MapXtreme Session オブジェクトを共有するプール型のアプリケー ションを考えてみます。状態管理を手動に設定した場合、HttpSessionState にはユーザごとの可変 レイヤが保存されます。このシナリオで同時ユーザ数を 100 人とした場合の合計メモリ消費量は 200 MB です。 プールのメモ リ 100 MB + + 100 ユーザの レイヤ 100 MB = = 必要なメモリの合 計 200 MB 1 つ目のシナリオでは、各ユーザの MapXtreme セッションは固定的です。しかし、2 つ目のシナリ オでは、各ユーザに必要な情報だけを保存することができます。このため、ユーザ数が増えて も、システム リソースの管理は容易です。ユーザ数が 10 人を超えないことが最初からわかってい れば、状態情報を管理する必要はありません。しかし、後で、このアプリケーションをもっと多 くユーザに公開することになった場合は、状態を管理できるようにアプリケーションを書き換え なければならなくなる可能性があります。 アプリケーションでプールするオブジェクトの数を適切に設定するためには、アプリケーション の性質とデータへのアクセス方法を理解する必要があります。当社が推奨している、1 CPU あたり 2 つのプール オブジェクトという設定は、ネイティブの TAB ファイルからローカル データにアク セスすることを前提としています。 CPU 使用率 推奨されるプール オブジェクト数は、個々のアプリケーションによって異なります。ここでは、3 種類のシナリオをテストした結果を基に推奨事項を記載しています。このセクションに記載され ている推奨事項は、あくまで目安としてお使いください。実際のアプリケーションで最適なパ フォーマンスを引き出すためには、独自の判断が必要となります。 プール サイズを決定する要因の一つに、CPU のコンテキスト切り替えがあります。プール サイズ が大きくなると、多くのプロセスが CPU サイクルを奪い合う状況が生じ、その結果、CPU のコン テキストの切り替え頻度が高くなってしまうことがあります。コンテキストの切り替えから生じ るオーバーヘッドが、パフォーマンスの低下を招くこともあります。 1 つ目のテストは、ローカル TAB ファイルのデータにアクセスする Web アプリケーションのシナ リオです。このデータ取得方法はプロセッサに大きな負荷がかかります。プールするオブジェク トの数が増えるにつれて、コンテキストの切り替え頻度が高くなります。このシナリオでは、 プールするオブジェクト数を CPU あたり 2 つにすることで最適な結果が得られました。 2 つ目のテストは、リモート サーバのデータにアクセスするというシナリオです。このデータ取得 方法では、プロセスが待ち状態になる時間が多いため、プロセッサの負荷は低くなります。この 場合は、CPU 使用率を監視しながら、プール サイズを徐々に増やしてゆくことが理想的です。設 開発者ガイド 131 IIS サーバの設定 定を変更した場合は、中間層とサービス層の両方のサーバを監視して最適な設定を決める必要が あります。このシナリオでは、データベース サーバが複数の連続するリクエストを、パフォーマ ンスを低下させることなく処理できるかどうかを見極めることも大切です。 3 つ目のテスト シナリオには、WMS サーバへのアクセスが含まれます。すべてのデータ アクセス およびレンダリングが IIS システムの別々のサーバによって実行されます。このシナリオでは、大 半の処理を WMS サーバが実行するため、Web アプリケーションの CPU 使用率はきわめて低くな ります。Web アプリケーションのプロセスは、ほとんどの時間を待ち状態で過ごします。さら に、この例の場合、WMS サーバは、連続する 2 つのリクエストしか同時に処理できません。ここ でプール サイズを増やせば、パフォーマンスを向上させることができます。これは確かに効果的 ですが、この Web アプリケーションの全体的なパフォーマンスは WMS サーバに依存します。 プールするオブジェクト数を調整するうえで、1 つのサイズですべてのオブジェクト数に対応する のは困難です。最適な結果を得るためには、アプリケーションとそのデータ アクセス方法につい て十分に理解し、CPU 使用率を測定する必要があります。 IIS サーバの設定 IIS には、アプリケーションの動作を微調整することのできるさまざまな設定が存在します。IIS アーキテクチャの詳細については、次の MSDN 記事が参考になります。 IIS の設定 IIS 6.0 Documentation (IIS 6.0) 特に「IIS 6.0 Deployment Guide」および「Appendix A」を参照してください。さまざまな設定が詳 しく解説されています。 IIS 7.0: Managing Web Applications in IIS 7.0 パフォーマンス強化の方法 Performance Tuning (IIS 6.0) 上記以外にも、IIS 6.0 および IIS 7.0 に関するオンライン リソースが豊富に存在します。次のセク ションでは、MapXtreme アプリケーションのパフォーマンスを大きく左右する IIS 設定について説 明します。 アプリケーション プール Microsoft の定義によれば、アプリケーション プールとは、"ワーカー プロセスで処理される 1 つま たは複数の URL のグループ" のことです。IIS 6 ではアプリケーション プールによって次のことが 可能になります。 • • • 132 あるアプリケーションが他のアプリケーションに悪影響を及ぼさないように、個々の Web アプ リケーションを分離できる。 同じ ID トークンで実行される URL をグループ化できる。 パフォーマンスと稼働状況をグループ単位で管理できる。 MapXtreme 2008 v7.0.0 第 7 章 : Web アプリケーションのパフォーマンス アプリケーション プールは IIS マネージャを使って作成します。アプリケーション プールを作成 した後で、特定のプールに仮想ディレクトリを割り当て、これらを特定のアプリケーションに対 して構成できます。プールの全般的な設定は、次のようなカテゴリで構成されています。 • • • • リサイクル: ワーカー プロセスのリサイクルを管理します。ワーカー プロセス分離モードで は、ワーカー プロセスをアプリケーション プール単位で定期的に再起動させることができる ため、障害の起こりやすいワーカー プロセスを厳密に管理できます。こうすることで、アプリ ケーション プールに所属するアプリケーションを常に正常な状態で運用でき、システム リ ソースの回復を図ることができます。 パフォーマンス: アイドル状態のワーカー プロセスのシャットダウン方法、待機リクエスト 数、CPU の監視、Web ガーデンに含まれるプロセス数などを構成します。 状態: ワーカー プロセスの稼働状況をどのようにして監視するかを構成します。ワーカー プロ セスとの通信に制限を設定したり、いくつものプロセスで立て続けに障害が発生した場合の対 処方法を指定したりできるほか、起動/シャットダウンの時間を設定することもできます。 識別: アプリケーション プールのワーカー プロセスの実行に使用されるアカウント名 (アプリ ケーション プール ID) を設定します。 管理者は、[リサイクル] タブで、プールのワーカー プロセスをリサイクルする各種の条件を設定 できます。プロセスをリサイクルするための条件には、通常、経過時間 (分)、リクエスト数、時 刻、メモリの使用状況などが使用されます。これらの設定は、プロセスごとに行うことができる ほか、1 つのプロセスに複数の条件を割り当てることもできます。 当社のテストでは、ほとんどの場合、リサイクルはサイト トラフィックやシステムの稼働状況に 基づいて実行されていることが判明しています。リサイクルはサービスの中断を意味するもので はありません。プロセスが終了され、新しいプロセスが起動されるのは、あくまで現在のユーザ に対する処理が終わった後です。リサイクルは、システムの状態や使用状況を監視しながら設定 するのが理想的です。トラフィックが停滞したときや、(メモリを大量に使用するアプリケーショ ンの場合は) メモリの使用量に基づいてリサイクルを行うことが必要になる場合もあります。長時 間実行されるプロセスでは、プロセスのリサイクルが必要になります。これを容易に実現する手 段がアプリケーション プールです。 [パフォーマンス] タブでは、アイドル状態のプロセスの解放、キューに格納するリクエスト数の制 限、CPU 使用率の監視と異常時の対処など、各種オプションを設定したり、単一のプールに対し て多数のワーカー プロセスを作成したりできます。これらの各設定が、実行中のシステムにそれ ぞれ異なる影響を及ぼします。 当社の実施したテストの結果、デフォルトの設定では、WMS リクエストを処理するとき、WMS サーバの応答を待機することが原因で、スレッド プールが飽和することが判明しています。シス テムに負荷がかかっていると、応答時間が長くなり、サーバの CPU が十分に利用されていないこ とがわかります。負荷テストを実施したところ、CPU の使用率は 35% でした。これは、CPU がほ ぼ常に待機状態になっていることを意味します。 プール オブジェクトの数を増やすと、こうしたリクエストの処理により多くのスレッドを使用で きます。これにより、数値上のパフォーマンスは向上しましたが、体感的なパフォーマンスは低 下しました。つまり、Web ブラウザを開いて同じページを表示するまでに時間が長くかかりま す。このシナリオでは、リクエストが 1 つのワーカー プロセスおよびそのスレッドのキューに追 加されています。それが、この遅れの原因になっています。ワーカー プロセスの数を増やすと、 数値上のパフォーマンスはわずかに低下しましたが、体感的なパフォーマンスは大きく向上しま した。個々の Web リクエストは長時間待機する必要がなく、次々と処理されます。これにより、 レスポンスは高速になりますが、パフォーマンス上のわずかなトレードオフが生じます。ワー カー プロセスでコンテキスト切り替えが発生するためです。 開発者ガイド 133 IIS サーバの設定 [状態] タブには、システムに自己診断をさせるための設定が含まれています。これらの設定を使っ て、実行中のプロセスがアクティブであるかどうかをチェックできます。また、エラーの発生回 数をチェックし、あらかじめ定義しておいた上限を超えた場合にリサイクルを行うことも可能で す。さらに、起動とシャットダウンにかかる時間の上限を設定することもできます。 [識別] タブでは、アプリケーション プールの実行に使用するユーザ ID トークンを設定できます。 たとえば、一部のアプリケーションに、他とは異なる資格情報を割り当てる必要がある場合に使 用します。 134 MapXtreme 2008 v7.0.0 デスクトップ アプリケー ション、コントロール、ダ イアログ、ツール この章では、デスクトップ アプリケーションの計画に関する情報のほか、 MapXtreme で利用できる数々のデスクトップ コントロール、ダイアログ、 ツールについて概説しています。 この章の構成 「デスクトップ アプリケーションの計画」 . . . . . . . . . . . . . . . . . . . . 136 「MapInfo.Windows.Controls 名前空間」. . . . . . . . . . . . . . . . . . . . . . . . 138 「デスクトップ アプリケーションで使用可能な主要コントロール」 139 「MapInfo.Windows.Dialogs 名前空間」 . . . . . . . . . . . . . . . . . . . . . . . . 145 「コントロールとダイアログ ボックスのカスタマイズ」 . . . . . . . . 151 「MapInfo.Tools 名前空間の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 「MapXtreme デスクトップ ツール API」 . . . . . . . . . . . . . . . . . . . . . . 153 「ツールのカスタマイズ」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 「ツール イベント」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 「選択 (Select) ツールを使用した FeatureGeometry の編集」 . . . . . . 160 8 デスクトップ アプリケーションの計画 MapXtreme は、.NET を使ったあらゆる開発環境向けに、マッピング機能を公開する .NET ベース のオブジェクト モデルです。.NET Framework を使ったアプリケーション開発に応用できるさまざ まなテクノロジが日々生まれています。 デスクトップ アプリケーションは、豊富な対話操作を特徴としています。Web アプリケーション は日々進化し、より洗練されている感がありますが、デスクトップ向けに設計されたアプリケー ションにも依然として利点はあります。たとえば、デスクトップ アプリケーションには "スナップ モード" があり、この機能を使用することで、ポイント フィーチャを特定の交差点に対して正確に 配置することができます。また、デスクトップ アプリケーションでは、マウス ポインタを重ねた ときに表示される情報チップを活用することもできます。 WinForm または他の .NET ベースのアプリケーション フレームワークが既に存在する場合は、単に MapXtreme のクラスをアプリケーションに統合するだけで済みます。MapXtreme のオブジェクト モデルは、.NET オブジェクト モデルとの完全な互換性があるため、.NET Framework が備える強力 な機能とフルに連携させることが可能です。単に既存のアプリケーション フレームワークの中で アプリケーションを開発し、MapXtreme オブジェクトを参照するだけです。 デスクトップ アプリケーションのベスト プラクティス MapXtreme マップ アプリケーション テンプレートは、単に MapXtreme アセンブリを参照する、プ ロトタイプのみをすばやく作成するためのテンプレートです。このテンプレートは、概念をざっ と理解するための糸口として使用してください。 マルチ ドキュメント インターフェイス (MDI) ベースおよび シングル ドキュメント インターフェ イス (SDI) ベースのアプリケーションに対する WinForm および .NET Framework のサポートはきわ めて基本的なものです。WinForm には、MFC (Microsoft Foundation Classes) に匹敵するほどのアプ リケーション フレームワークは備わっていません。ドキュメント ビューやデータ交換など、MFC ベースのユーザ インターフェイスが持つ概念が不足しています。 し か し、Microsoft で は、同 社 が 推 奨する手法や慣例を普及させる 目的の一環として CAB (Composite UI Application Block) を 提 供しています。Composite UI Application Block は .NET 2.0 Framework 以上でのみ利用できます。詳細については、Microsoft Developer Network Web サイト (msdn2.microsoft.com/en-us/library/aa480450.aspx) を参照してください。 .NET 開発モデルの大きな特長の一つに、ビジネス ロジックとプレゼンテーション (UI) が分離され ていることが挙げられます。MapXtreme のコントロールも同様です。ユーザは、変更対象となる オブジェクトのコピーを使ってダイアログを開くことができます。実行中のオブジェクトが直接 編集されなくて済むため、別のプロセスまたは別のコンピュータで新しいオブジェクトを作成 し、それをシリアライズして、元のコンピュータに返すようなことも可能です。 MapXtreme と COM .NET は、COM の終焉を意味するものではありません。さまざまな開発メーカーが、多大な労力を COM オブジェクト モデルに費やしており、そのための計り知れない投資を簡単に投げ捨てること はできません。では、COM オブジェクトを備えたアプリケーションを開発するための最良の方法 とは何でしょうか? 136 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール 新しい .NET コードに既存の COM コードとの相互運用性を持たせる方が、その逆のケースよりも 多いことと思いますので、ここでは、前者のシナリオについて取り上げることにします。.NET ク ライアントは、RCW (Runtime Callable Wrapper) を通じて COM サーバにアクセスします。RCW が COM オブジェクトをラップし、COM と .NET 共通言語ランタイム (CLR) 環境との仲介役を果たす ため、.NET クライアントからは、COM オブジェクトがあたかもネイティブの .NET オブジェクト のように見え、逆に、COM オブジェクトからは、.NET クライアントが標準の COM クライアント であるかのように見えます。 たとえば、これらの COM オブジェクトを、Visual Studio から直接参照することもできます。.NET クラスを扱う場合と何ら変わりなく、COM オブジェクトを操作することが可能です。そのため、 従来の COM オブジェクトと連携するような .NET アプリケーションを構築し、処理の結果を MapXtreme .NET オブジェクトに渡すことができます。これから開発する .NET アプリケーション は、従来のアプリケーション フレームワークと一体となって目的の機能を果たす部品と考えてく ださい。.NET Framework が備える最新のテクノロジを利用しながら、従来のライブラリに費やし てきた既存の投資を保護することができます。COM オブジェクトからのデータはすべて .NET 環 境に合わせて変換されるため、受け取ったデータをさらに他のマネージド クラスに渡すことがで き、ドメインの問題も生じません。 サンプル アプリケーションおよびプロジェクト テンプレート MapXtreme は、各種のサンプル アプリケーションおよびプロジェクト テンプレートと共に Visual Studio に統合されます。サンプル アプリケーションでは、.NET Framework や Windows フォーム ア プリケーションにおけるオブジェクト モデルの使用方法を、さまざまな側面から紹介していま す。これらのテンプレートが、アプリケーション開発の最初の一歩を提供します。 Visual Studio に組み込まれるプロジェクト テンプレートを使用することで、スタート プロジェク トを作成したり、一般的なアプリケーション フレームワークを体験したりすることができます。 新しいプロジェクトを作成するには、Visual Studio からマップ アプリケーション テンプレートを 選択します。これにより、基本的なシングル ドキュメント インターフェイス (SDI) アプリケー ションが作成されます。サンプル デスクトップ アプリケーションには、基本的なマルチ ドキュメ ント インターフェイス (MDI) アプリケーションの例のほか、このモデルに MapXtreme を統合する 最適な方法が紹介されています。 .NET の Windows フォーム開発プラットフォームは、基本的なアプローチと機能を提供するもので す。より高度な UI 開発プラットフォームを備えたサード パーティ ツールの使用をお勧めします。 MapXtreme に付属するデスクトップ アプリケーションのサンプルは、デスクトップ アプリケー ションに固有の作業を紹介することを目的に設計され、必要最小限の機能しか実装されていませ ん。実際の業務で運用するようなアプリケーションを開発するためのひな形として設計されてい るわけではありません。サンプルはあくまで学習目的のツールとしてお使いください。 この章の後半部分では、デスクトップ アプリケーションを作成するためのさまざまなコントロー ル、ダイアログ、およびツールについて取り上げます。 開発者ガイド 137 MapInfo.Windows.Controls 名前空間 MapInfo.Windows.Controls 名前空間には、デスクトップ アプリケーションのコントロールをインプ リメントするクラスが含まれています。Windows コントロールの使用は非常に簡単です。必要な コントロールをフォームにドロップし、仕様に合わせてさまざまなプロパティを設定するだけで 使用できます。この名前空間に含まれているコントロールは、MapInfo.WebControls 名前空間のコ ントロールと似ています。ただし、これらの名前空間のコントロールを互いに代用することはで きません。この名前空間のコントロールはデスクトップ アプリケーションでのみ使用するよう設 計されています。Web ベース アプリケーションのコントロールの詳細については、「第 5 章: 「Web アプリケーション、コントロール、およびツール」」を参照してください。 注意 コントロールの中には設計時に表示されないものがあります。それらをフォームにドラッ グ アンド ドロップすると、長方形として表示されます。ただし、実行時には正常に表示さ れます。 MapXtreme に用意されているデスクトップ コントロールは、標準のコントロールとマップ固有の コントロールに分類されます。標準のコントロールには、ボタン、表示ツール、ラベル ツール、 さまざまな種類のボックスなどがあります。これらのコントロールは、System.Windows.Forms 名 前空間のクラスとよく似ています (多くの場合、これらのクラスから継承されています)。 マップ固有のコントロールは、Pitney Bowes Business Insight のマッピングのインプリメントでのみ 使用します。マップ固有のコントロールには、オブジェクトのスタイル、ラベル、レイヤ、座標 系、主題図、その他の関連する機能を設定または変更するコントロールがあります。 使用可能な MapXtreme コントロールが一覧表示された Visual Studio のツールボックス とデザイナ 138 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール 最も複雑なコントロールは Layer Control です。Layer Control は、モーダル ダイアログ ボックスと して使用できるほか、フォーム上に直接表示させることもできます。Layer Control には、さまざま なカスタマイズを可能にする API が用意されています。詳細については、LayerControlDemo サン プル アプリケーションを参照してください。 デスクトップ アプリケーションで使用可能な主要コントロール MapXtreme に含まれているコントロールはすべて有用なものですが、コントロールの中には、ほ とんどのマッピング アプリケーションに不可欠な特に重要なものがいくつかあります。ここで は、これらのコントロールについて説明します。これらのコントロールを使用するには、適切な 参照がプロジェクトに含まれている必要があります (Visual Studio で、MapXtreme マッピング テン プレートからプロジェクトを作成した場合、必要な参照は自動的に組み込まれています)。 注意 用意されているテンプレートを使用せずにプロジェクトを作成する場合は、適切なコン ポーネント (MapInfo.CoreEngine、MapInfo.Windows、MapInfo.Windows.Dialogs、 MapInfo.Windows.Framework など) への参照を必ず追加してください。また、「第 2 章、53 ページの「MapXtreme マージ モジュール」 」も参照してください。 MapControl MapControl は、マップを表示するすべてのアプリケーションに必要です。MapControl をフォーム に追加するには、Visual Studio のツールボックスからフォームにドラッグします。MapControl を フォームに配置したら、ユーザにとってより便利なマップにするためのさまざまな操作を実行で きます。 MapControl に変更を加えるには、フォーム上で MapControl を選択した上で、[プロパティ] ウィン ドウを使用してプロパティを変更します。デザイン モードのときに MapControl を右クリックする と、コンテキスト メニューが表示されます。このメニューでは、[マップの読み込み]、[マップの クリア]、[レイヤ管理]、および [主題図の作成] のメニュー項目を選択できます。[マップの読み込 み] を選択すると、標準のファイル選択ダイアログが表示され、MapControl に事前に読み込むマッ プを指定できるようになります。[マップのクリア] は、MapControl をフォームに追加するとき、 または設計プロセスの途中で、コントロール内に既にあるマップを消去します。[レイヤの管理] は、マップをカスタマイズするための [レイヤの管理] ダイアログ ボックスを開きます (「144 ペー ジの「レイヤの管理」」を参照)。[主題図の作成] を選択すると、主題図の作成ウィザード (「146 ページの「CreateThemeWizard」」を参照) が起動して、マップ上の主題図を作成できるようになり ます。 開発者ガイド 139 デスクトップ アプリケーションで使用可能な主要コントロール MapControl、Layer Control、および MapToolBar が表示されたフォーム MapControl には、読み込まれるマップに関連して事前に設定できる複数のプロパティもありま す。プロパティを事前に設定すると、実行時に表示されるマップを特定の用途に合わせてさらに カスタマイズできます。変更可能なプロパティには、ズーム レベル、座標系、マップの中心、実 行時の 3 つのマウス ボタンの設定などがあります。マウス ボタンは、ズーム、移動、描画の各ジ オメトリ、または選択などのマップ ツールに設定できます。「151 ページの「MapInfo.Tools 名前 空間の概要」」を参照してください。 Visual Studio で作業しているときにマップを操作するための設計時ツールを設定することもできま す。設計時の機能には、ズームイン、ズームアウト、選択、移動、中心表示、デフォルトの矢印 などがあります。コンテキスト メニュー の [マップのクリア] は、MapControl のマップからすべて のレイヤを削除し、対応するテーブルを閉じます (別の MapControl で使用されていない場合)。 MapToolStripButtons MapXtreme には、Windows Form テンプレートおよび Visual Studio デザイナ ツールボックスに、す ぐに使用できるマップ ツールが用意されています。.NET の ToolStrip に ToolStripButton を 追加する ことで、ツールがフォームに追加されます。 各ツールのプロパティはこのボタンで設定されます。現在のツールの管理に使用されていた MapToolBar は、不要になりました。MapToolBar は、後方互換性を確保するため、また将来必要に 応じて使用する場合のために、保持されています。Visual Studio のツールボックスから引き続き使 用できます。 22 個の ToolStripButton には、移動、選択、フィーチャの追加、ラベル付け、テーブルのオープ ン、レイヤ コントロールの表示など、これまで常に MapToolBar に用意されていたのと同じマッピ ング機能が含まれています。 140 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール 2 つを除いてすべての ToolStripButton が、ToolStrip または StatusStrip に追加できます。ズーム レベ ルおよび現在のマップ ビューの縮尺を表示するツールは、StatusStrip のみに追加できます。 新しい ToolStripButton を追加するには、Visual Studio で、[メニューとツールバー] のツールボック スから [ToolStrip] を選択します。フォームに、分割ボタンと小さな下矢印が表示されます。矢印を クリックすると、サポートされている ToolStripButton のリストが表示されるので、必要なものを選 択します。ツールが MapControl に追加されると、すぐにその MapControl に関連付けられます。 ToolStripButton の API は、MapInfo.Windows.Controls 名前空間に含まれています。ToolStripButton が 派生する抽象ベース クラスは、MapInfo.Windows.Controls.MapToolStripButtonBase です。このクラ スは、.Net の System.Windows.Controls.ToolsStripButton クラスから継承しています。 ToolStripButton をプログラムで使用する方法については、MapForm テンプレートのコードを表示 し、『開発者リファレンス』を参照してください。各ツールの動作については、MapInfo.Tools 名 前空間の各 MapTool クラスを参照するか、または『開発者ガイド』の第 8 章: 「デスクトップ アプ リケーション、コントロール、ダイアログ、ツール」を参照してください。 開発者ガイド 141 デスクトップ アプリケーションで使用可能な主要コントロール MapToolBar バージョン 7.0 以降、MapToolBar は MapForm テンプレート内で ToolStrip に置き換えられました。 「「MapToolStripButtons」」を参照してください。MapToolBar は、Visual Studio のツールボックス から引き続き使用できます。このセクションでは、MapForm に MapToolBar を追加する方法の概要 を示します。 MapToolBar は、複数のマップ ツール コントロール (ズームイン、テーブルを開くなど) を 1 つのコ ントロールにまとめます。デフォルトで含まれているツールには、OpenTable、LayerControl、 Select、ZoomIn、ZoomOut、Pan、および Center があります。 MapToolBar を MapForm に追加するには、Visual Studio のツールボックスからドラッグします。(現 在、MapToolBar は MapForm テンプレートには含まれていません。) MapToolBar にツール ボタンを追加するには、次のようにします。 1. [プロパティ] ウィンドウの Buttons プロパティの横にある省略記号 (...) をクリックして、 ToolBarButton コレクション エディタを開きます。 ToolBarButton コレクション エディタが表示されます。 2. [追加] ボタンをクリックします。 これによって、リスト内の一番下に新しい MapToolBarButton が作成されます。 注意 カスタマイズされたツールを追加する場合は、[追加] ボタンの横にある矢印をクリック して ToolBarButton を選択する必要があります。新しいボタン用にカスタマイズされた ハンドラを作成する必要があります。 3. 新しいボタンに名前を付けます。 4. 右側のプルダウン メニューから ButtonType を選択します。 たとえば、Select ツール ボタンを追加する場合は、リストから [Select] を選択します。 142 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール 5. [OK] をクリックします。 MapToolBarButton が作成され、ボタン バーに追加されます。新しく追加したツールはデフォル トの動作をします。 MapToolBar のカスタム ボタンの追加 MapToolBar にカスタム ボタンを追加するには、事前にカスタム ツールを作成して、そのツールを MapControl.Tools コレクションに追加しておく必要があります。カスタム ボタンを追加する作業で は、追加するボタンの ToolId をカスタム ツールの名前に割り当て、カスタム ビットマップを MapToolBar の ImageList に追加します。 カスタム デスクトップ ツールを作成する方法の詳細については、「158 ページの「ツールのカス タマイズ」」を参照してください。 MapXtreme に付属のカスタム ビットマップ シンボルの詳細については、「595 ページの「カスタ ム シンボル」」を参照してください。 MapToolBar にカスタム ボタンを追加するには、次のようにします。 1. MapToolBar をフォームに追加します。 2. Visual Studio の [プロパティ] ウィンドウで、Buttons プロパティを強調表示して [...] ボタンをク リックし、[ToolBarButton コレクション エディタ] ダイアログ ボックスを開きます。 3. [追加] ボタンをクリックして、新しい MapToolBarButton を追加します。 4. ボタンの ButtonType プロパティを、(ドロップダウン リストの最後の項目として表示される) [CustomTool] に設定します。このボタンにはまだイメージを関連付けていないので、この段階 では、ボタンは空白として表示されます。 5. ボタンの ToolId プロパティの値として、MapControl の Tools コレクションに追加したカスタム ツールの名前を指定します。ToolId の値がコレクション内のツール名に一致していない場合 は、ユーザがボタンをクリックした時点で実行時例外がスローされます。 6. [OK] をクリックして、[ToolBarButton コレクション エディタ] ダイアログ ボックスを閉じま す。 7. MapToolBar の ImageList にカスタム ビットマップを追加するコードを、フォームのコンストラ クタ内の InitializeComponent の呼び出しの後の位置に記述します。カスタム ビットマップをど 開発者ガイド 143 デスクトップ アプリケーションで使用可能な主要コントロール のような方法でアプリケーションに関連付けるかは、プログラマの判断にまかされています。 1 つの選択肢は、設計時に ImageList をフォームに追加して、その ImageList にカスタム イメー ジを格納しておき、実行時にそのイメージを MapToolBar の ImageList に追加することです。こ の処理のコードは次のようになります。 // Add custom tool button's bitmap to toolbar's image list foreach (Image image in this.imageList1.Images) { this.mapToolBar1.ImageList.Images.Add(image); } // Associate the bitmap with the custom tool's button (last image in the list) this.mapToolBarButtonBlueSelect.ImageIndex = this.mapToolBar1.ImageList.Images.Count-1; レイヤの管理 [レイヤ管理] ダイアログ ボックスには、現在のマップを構成するすべてのレイヤと、それらのレ イヤの属性のステータスが表示されます。レイヤ属性には、表示/非表示、編集可能、選択可能、 およびラベルの自動作成があります。各チェック ボックス フィールドの上に表示されるアイコン は属性の種類を表します。これらの属性アイコンの上にポインタを置くとツールチップが表示さ れ、各アイコンの内容を把握できます。チェック ボックスを使用して、1 つまたは複数のレイヤの 属性を簡単に変更できます。 [レイヤ管理] には、表示およびラベルの設定の変更、作成した主題図の変更、レイヤの並べ替え、 追加、または削除に利用可能なオプションも用意されています。 LayerControl に表示されるレイヤを再配置するには、[レイヤ管理] の レイヤ リスト内のレイヤをド ラッグ アンド ドロップによって並べ替えます。 注意 レイヤをラベル レイヤにドロップすると、そのラベル レイヤに新しいラベル セットが追加 されます。これは、偶発的に発生することがあります。たとえば、ラベル レイヤのすぐ上 にレイヤを移動しようとした場合に発生することがあります。 ヒント: レイヤをラベル レイヤの外側にドロップするには、Shift キーを押しながらレイヤ をドロップします。Shift キーを押したり離したりするたびにポインタが変化し、レイヤが ターゲット レイヤの上にドロップされるのか、内側にドロップされるのかが示されます。 LayerControl は、[レイヤ管理] ダイアログ ボックスのすべての機能をフォーム上に配置します。 LayerControl を MapControl のマップにリンクするには、Form_Load() メソッド内に次の 1 行のコー ドを記述する必要があります。 layerControl1.Map = mapControl1.Map; LayerControl の複雑な機能に対する理解を深めるには、MapXtreme のユーティリティであるワーク スペース マネージャを実行してください。このツールには、実際に操作して機能を確認できる LayerControl の実例が用意されています。「第 24 章: 「ワークスペース マネージャ」」を参照して く だ さ い。ワ ー ク ス ペ ー ス マ ネ ー ジャは、Windows の [ すべてのプロ グラム] の [MapInfo] > [MapXtreme 7.x.x] から起動できます。 144 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール コンテキスト メニューのカスタマイズ LayerControl では、レイヤ ツリーのノードを右クリックしたときに表示されるカスタムのメニュー 項目を作成できます。ContextMenuTargetObject プロパティを使用して、ユーザが右クリックしたオ ブジェクトを返すように設定します。 LayerControlEnhancer クラスを定義して、LayerControl のコンテキスト メニューにカスタム項目を 追加することを可能にする方法については、提供されているサンプル コードを参照してくださ い。このサンプル コードは、..\MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features\LayerControl ディ レクトリ内の LayerControl サンプル アプリケーションに含まれています。 プログラムによるキーボード ショートカットの設定 LayerControl では、ツールバーの各ボタンの機能を実行するキーボード ショートカットを作成でき ます。プログラム内では、PerformDown、PerformUp、および PerformRemove の各メソッドを使用 することによって、[下へ]、[上へ]、および [削除] の各ボタンにアクセスできます。 また、プログラム内で AddMenuMnemonic プロパティを使用すると、[追加] メニューの表示に関連 付けられているキーにアクセスすることができます。AddMenuMnemonic プロパティを使用するた めの構文は次のようになります。 public System.Windows.Forms.Keys AddMenuMnemonic {get; set;} MapInfo.Windows.Dialogs 名前空間 MapInfo.Windows.Dialogs 名前空間には、特定の機能を備えたダイアログ ボックスを作成するため のクラスが含まれています。ダイアログ ボックスは、コントロールとは対照的に、設計時には表 示されず、コードでのみ作成および設定できます。MapInfo.Windows.Dialogs 名前空間のクラスを 使用すると、カスタマイズされたダイアログ ボックスを作成できます。作成したダイアログ ボッ クスを利用するには、System.Windows.Forms.Form.ShowDialog() メソッドを呼び出します。 ストック ダイアログは、MapXtreme オブジェクト モデルのパブリック API から作成されていま す。フィールドはすべて公開され、プライベートに設定されているものはありません。これらの ダイアログをそのまま使用することもできますが、目的に合わせてカスタマイズしたり、独自の ダイアログを一から作成することもできます。ストック ダイアログ上のコントロールを減らすこ とでユーザの操作を制限することもできます。 アプ リ ケ ー シ ョ ン で 特 定 の ダ イアログ ボックスを使用するには、次のように、 MapInfo.Windows.Dialogs 名前空間をコードに追加します。 using MapInfo.Windows.Dialogs private void DoLayerControl() { LayerControlDlg layerControl = new LayerControlDlg(); layerControl1.Map = mapControl1.Map; layerControl.ShowDialog(this); } 上記のコードでは、DoLayerControl() メソッドが呼び出された時点で [レイヤ管理] ダイアログ ボッ クスが表示されます。 開発者ガイド 145 MapInfo.Windows.Dialogs 名前空間 ストック ダイアログ MapXtreme には、MapXtreme オブジェクトを操作するさまざまなタスクを扱うためのストック ダ イアログおよびコントロールが多数用意されています。ワークスペース マネージャで使用される すべてのダイアログおよびコントロールは、アプリケーションで利用できます。ストック ダイア ログは、低レベルのコントロールのためのコンテナです。これらのコントロールは、各種の MapXtreme オブジェクトを操作する目的に特化して設計されています。 MapXtreme に付属のコントロールは、ストック ダイアログが、基本的な UI コンポーネントを作成 するために使用されます。個々の UI コンポーネントは、ダイアログ内にコントロールを配置する 方法で作成されています。同様に、開発者が、基本コントロールを基に独自のダイアログを設計 することもできます。独自のダイアログを作成する方法は簡単です。単にダイアログ クラスを作 成し、コントロールをデザイン画面にドラッグするだけです。 ストック ダイアログは、ビジュアル継承によってカスタマイズすることもできます。組み込みの ダイアログからクラスを派生し、メソッドやプロパティをオーバーライドすることで、そのクラ スが持っている動作を変えることができます。[レイヤ管理] ダイアログなど、その他のダイアログ もカスタマイズできるので、デフォルトの動作を変更して、ユーザによるアクセスが不要なコン トロールを非表示にすることができます。また、アイコンの表示を変更することや、タブを削除 することもできます。 基本的に、MapXtreme に付属するすべての UI コンポーネントは開発者が制御できます。そのた め、カスタム インターフェイスを独自に作成することが可能です。ここで説明したいずれかの方 法を使用すれば、MapXtreme で定義されているすべての要素をアプリケーションでそのまま表示 する代わりに、開発者が必要と判断した要素だけが表示されるようにカスタマイズされたデスク トップ アプリケーションを作成することができます。 CreateThemeWizard CreateThemeWizard クラスは、開発の利便性のために用意されているクラスで、アプリケーション に追加して使用できます。このクラスを使用すると、ユーザが新しい主題図を作成する手順をガ イドに従って進められるように、ウィザード (ダイアログ ボックスのセット) を起動することがで きます。主題図を作成するために必要な基本手順は、1) 主題図の種類を選択する、2) 主題図で使 用するテーブルとフィールドを選択する、3) 主題図の属性 (スタイル、レンジの数など) を変更す る、の 3 つです。ウィザードを使用すると、設定が必要なすべての項目が一連のダイアログ ボッ クスに順に表示されるので、MapXtreme アプリケーションのエンド ユーザは、主題図の作成を非 常に簡単に実行できるようになります。 CreateThemeWizard の使用 CreateThemeWizard は、ユーザによって行われる選択に応じて、複数の異なるダイアログ ボックス を表示します。最初のダイアログ ボックスでは、主題図の種類を選択できます。 146 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール [ 主題図の作成 : 手順 1/3] ダイアログ ボックス 可変値が単一の主題図 ([レンジ]、[ドット密度]、[個別値]、または [サイズ可変シンボル]) をユー ザが選択した場合、2 番目のダイアログ ボックスでは、テーブルとフィールドを 1 つずつ選択でき ます。 [ 主題図の作成 : 手順 2/3] ダイアログ ボックス ( 単一フィールド ) 可変値が複数の主題図 (円グラフまたは棒グラフ) をユーザが選択した場合、2 番目に表示されるダ イアログ ボックスでは、主題図を作成するための複数のデータ フィールドを選択できます。 [ 主題図の作成 : 手順 2/3] ダイアログ ボックス ( 複数フィールド ) その次に表示されるダイアログ ボックスは、手順 1 で選択された主題図の種類によって異なりま す。レンジ主題図に固有の [主題図の作成 : 手順 3/3] ダイアログ ボックスを次の図に示します。 開発者ガイド 147 MapInfo.Windows.Dialogs 名前空間 [ 主題図の作成 : 手順 3/3] ダイアログ ボックス ( レンジ主題図 ) ダイアログ ボックスには、デフォルトの主題図配分方法である EqualRangeSize が表示されます。 ウィザードのユーザ インターフェイスに表示される、これに対応する配分方法の名前は [レンジ幅 均等] です。 レンジの数を変更するなど、[設定] タブにユーザが変更を加えると、[主題図を再計算] ボタンがア クティブになります。ユーザは [主題図を再計算]、[適用]、[OK] ボタンのいずれか、または別のタ ブをクリックして、再計算を実行する必要があります。再計算は自動的には実行されません。レ ンジの数を変更した場合の手順 3 のダイアログ ボックスを次の図に示します。この図では、[主題 図を再計算] ボタンが使用できるようになっています。 148 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール 設定を変更した後の [ 主題図の作成 : 手順 3/3] ダイアログ ボックス ( レンジ主題図 ) プログラムでは、次の操作の後で、[設定] タブの値が変更されたかどうか、および主題図 Bin の再 計算が必要かどうかが確認されます。 • • • [スタイル] タブまたは [凡例] タブへの移動 [適用] ボタンのクリック [OK] ボタンのクリック CreateThemeWizard は、アプリケーション内のコントロールに応じて、設計時および実行時にさま ざまな場所からアクセスできます。設計時に CreateThemeWizard にアクセスするには、MapControl の [プロパティ] ウィンドウの下部にあるメニューを使用するか、LayerControl でレイヤを右クリッ クし、[主題図の追加] を選択します。 CreateThemeWizard を使用した開発 CreateThemeWizard の追加をプログラムで行うには、次のサンプル コードのようにコードを記述し ます。 using MapInfo.Windows.Dialogs; CreateThemeWizard themeWizard = new CreateThemeWizard(mapcontrol1.Map, this); 開発者ガイド 149 MapInfo.Windows.Dialogs 名前空間 メソッド CreateThemeWizard を作成したら、CreateThematicWizard クラスの CreateTheme() メソッドを呼び出 して主題図を作成します。オプションの文字列パラメータを追加して、主題図のエイリアスを設 定できます。エイリアスを使用すると、ObjectTheme (Bar、Pie、GraduatedSymbol) の場合は Layers コ レ ク ショ ン か ら、FeatureStyleModifier (Ranged、RangedLabel、IndividualValue、 IndividualValueLabel、Dot Density) の場合は Modifiers コレクションから主題図にアクセスできま す。主題図にアクセスするのは、それを変更または削除することが目的です。 ITheme theme = themeWizard.CreateTheme("theme1"); 主題図を作成するテーブルまたはラベル主題図で使用するラベル ソースがわかっている場合は、 CreateFeatureTheme() メソッド (テーブルの場合) または CreateLabelTheme() メソッド (ラベルの場合 ) を使用できます。 プロパティ 主題図の作成に関する情報を取得するときに便利なプロパティがいくつかあります。WizardResult には列挙型の WizardStepResult が含まれます。これを使用すると、ユーザがウィザードを終了した 方法を確認できます。WizardResult の値は、WizardStepResult.Done または WizardStepResult.Cancel のどちらかになります。これらは、アプリケーション内のコントロールやメニューを適切に更新 するために役立ちます。 このプロパティの使用例を、次のサンプル コードに示します。 if (createTheme.WizardResult == WizardStepresult.Done { // Update the menus mnuRemoveTheme.Enabled = true; mnuModifyTheme.Enabled = true; } CreateThemeWizard クラスの SelectedLabelSource、SelectedLayer、および SelectedThemeType プロパ ティを使用すると、主題図が適用されたレイヤまたはラベル ソースを特定できます。これらのプ ロパティは、主題図を変更する機能を提供するために、そのオブジェクトにアクセスする必要が あるときに使用すると便利です。 主題図を変更できるようにするには、主題図の種類を特定してから、その種類に適した変更用ダ イアログ ボックスを表示します。主題図を変更するために使用できるダイアログ ボックス クラス は、ModifyBarThemeDlg、ModifyDotDensityTh emeDlg、ModifyGradSymbolThemeDlg、 ModifyIndValueThemeDlg、ModifyPieThemeDlg、および ModifyRangedThemeDlg です。 MapXtreme には、ThemeDialogs サンプル アプリケーションが用意されています。このアプリケー ションは、主題図の変更に使用されるダイアログ ボックスのインプリメントを理解するために役 立ち、そのインプリメントを必要に応じてカスタマイズして使用することもできます。このサン プル アプリケーションは、 MapXtreme がインストールされているディレクトリの下の ..\MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features\ThemeDialogs にあります。 150 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール コントロールとダイアログ ボックスのカスタマイズ MapXtreme の MapInfo.Windows.Dialogs 名前空間には、さまざまなダイアログ ボックス クラスが含 まれています。名前空間に含まれる各ダイアログ ボックスには、それぞれに固有のカスタマイズ 方法があります。特定のダイアログ ボックスを変更するには、各ダイアログ ボックスに固有のさ まざまなプロパティに値を割り当てます。カスタマイズの数は膨大であるため、ここですべてを 提示することはできません。各ダイアログ ボックスの詳細については、オンライン リファレンス を参照してください。 ダイアログ ボックスのカスタマイズの一例を紹介します。LineStyleDlg クラスは、[ライン スタイ ル] ダイアログ ボックスを作成します。このダイアログ ボックスは、スパース スタイル モード ( 開いたときに何も選択されていない) または選択肢は表示されているが無効になっている (グレー 表示) モードで作成できます。 プロパティの値を設定することによって提供されるカスタマイズは、変更中の特定のダイアログ オブジェクトに限定されます。既に確立されたダイアログ ボックスのデザインに基づいて新しい ダイアログ ボックスを作成するには、設計時にコントロールを新しいフォームに追加します。た とえば、変更された [ライン スタイル] ダイアログ ボックスを作成するには、LineStyle コントロー ルを新しいフォームにドロップし、その他のコントロールをそのフォームに追加します。これに より、実質的に変更された [ライン スタイル] ダイアログ ボックスが作成されます。 Pitney Bowes Business Insight Knowledgebase では、デスクトップ コントロールのさまざまなカスタ マ イ ズ 例 が 提 供 さ れ て い ま す。たとえば、カスタム LayerControl の作成例については、 「MapXtreme 2004/2005」 > 「Selections」のトピックを参照してください。 MapInfo.Tools 名前空間の概要 MapTool オブジェクト モデル MapTools は、マップとの対話を実現するオブジェクトです。これらのツールには、マップの基本 的な動作が実装されています。ビュー ベースのズームおよび移動ツール、特定のレイヤにジオメ トリを作成するためのツールのほか、マップの領域に基づいたセレクションを生成するための ツールがあります。これらのツールは、処理前後のイベントを取得するイベントを使用してカス タマイズできます。 ツールに関連付けられたメソッドのプロパティは、レイヤではなく、ツールに対して割り当てら れます。たとえば、レイヤが選択可能かどうかを示すプロパティは、レイヤではなく、ツールで 指定されます。そのため、あるツールを使用して、特定のレイヤのオブジェクトを選択し、さら に別のツールを使って、さきほどとは別のレイヤからオブジェクトを選択することができます。 これにより、ツールに柔軟性を持たせることができるだけでなく、レイヤ上のプロパティをエ ミュレートすることが可能となります。レイヤ コントロールは、そのプロパティ (選択可能かどう かのプロパティなど) が UI を通じて変更されると、マップのツール コレクション全体に作用しま す。 この設計により、特定のレイヤへの挿入を行うツールを作成できます。たとえば、都市計画の設 計で、水層図に対してだけマンホールを挿入し、植生図には木々を挿入するといったこともでき ます。ツールを選択すると特定のシンボルやジオメトリだけが、適切なレイヤに挿入されるよう なカスタム ツールの作成も可能です。これは、ストック ツールでも同様です。ポリゴンは常に特 開発者ガイド 151 MapInfo.Tools 名前空間の概要 定のレイヤに対して描画されます。前述のように、ストック レイヤ コントロールは、ツールのコ レクションを操作することにより、単一レイヤに対してツールが挿入されているかのような視覚 効果を出しています。 MapInfo.Tools 名前空間には、自分の MapXtreme アプリケーション用の、基本的でカスタマイズ可 能なツールをユーザが作成できるようにするクラスがすべて格納されています。 イベント コードを使用してこれらのストック ツールの新しいインスタンスをカスタマイズした り、ストック ツールから派生して特定のメソッドをオーバーライドする独自のツール クラスを作 成したりできます。「158 ページの「ツールのカスタマイズ」」を参照してください。 ツールは特定のマウス ボタン (左、右、中央) に割り当てることができます。該当するマウス ボタ ン の プ ロ パ テ ィ に ツ ー ル 名 の 文 字 列 文 字 列 を 使 用 し ま す。使 用 す る 文 字 列 は、"Arrow"、 "ZoomIn"、"ZoomOut"、"Center"、"Pan"、"SelectPoint"、"SelectRect"、"SelectRadius"、 "SelectPolygon"、"SelectRegion"、"AddPoint"、"AddLine"、"AddPolyline"、"AddPolygon"、 "AddRectangle"、"AddCircle"、"AddEllipse"、"AddText"、"Label" です。 たとえば、次のコードは、マウスの左ボタンを ZoomIn ツールに設定します。 mapControl1.Tools.LeftButtonTool = "ZoomIn" デスクトップ ツールをプログラムによって使用する例については、MapXtreme のインストール先 の ..\MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features\DesktopTools に格納されているサンプル ア プリケーションを参照してください。 152 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール MapXtreme デスクトップ ツール API UML で表現した MapTool クラスを次の図に示します。 ツールの最終的な派生元は MapTool クラスです。選択 (Select) ツールおよび追加 (Add) ツールは、 それぞれ SelectMapTool クラスおよび AddMapTool クラスから派生しています。 この名前空間に含まれているツールは、表示 (View) ツール、選択 (Select) ツール、追加 (Add) ツー ル、およびカスタム (Custom) ツールの 4 つのカテゴリに分けることができます。 追加 (Add)、カスタム (Custom)、および選択 (Select) のツール カテゴリには、楕円 (Ellipse)、弧 (Arc)、円 (Circle)、長方形 (Rectangle)、ポリゴン (Polygon)、ポイント (Point)、ライン (Line)、およ び折れ線 (Polyline) などのジオメトリ オブジェクトを描画または選択するためのツールが含まれて います。 すべてのツールは、3 つのインターフェイス (IMapToolProperties、ISelectMapToolProperties、および IAddMapToolProperties) をインプリメントするプロパティを持ちます。 開発者ガイド 153 MapXtreme デスクトップ ツール API 表示 (View) ツール 表示 (View) ツール (ZoomMapTool、CenterMapTool、および PanMapTool) は、マップのビューを変 更します。変更の種類は使用するツールによって異なります。これらのツールは、デフォルトの ツール コレクションの一部です。MapXtreme テンプレートを使用してデスクトップ アプリケー ションの構築を開始すると、デフォルトのツールバーにこれらのツールが表示されます。 LabelMapTool を使用すると、マップ上のフィーチャにラベルを設定できます。このツールは、 MapForm テンプレートのデフォルトのツール コレクションに含まれていません。MapControl に追 加する場合は、最初に Visual Studio のツールボックスから ToolStrip を追加し、コンテキスト メ ニュー項目 [LabelToolStripButton] を右クリックします。 このツールを追加するには、 MapToolBar の Buttons プロパティで [コレクション] の横にある [...] ボタンをクリックします。 選択 (Select) ツール 選択 (Select) ツール (SelectMapTool、SelectPointMapTool、SelectPolygonMapTool、 SelectRadiusMapTool、SelectRectMapTool、および SelectRegionMapTool) は、ジオメトリ オブジェク ト内にあるポイントおよびリージョンを選択します。選択の形状は使用するツールによって異な ります。たとえば、SelectRectMapTool は、長方形内のオブジェクトを選択します。SelectMapTool は、他の選択ツールの派生元となる抽象ベース クラスです。 注意 MapXtreme ではオブジェクトと折れ線との交差がサポートされないので、折れ線選択ツー ルはありません。 SelectPointMapTool を使用すると、オブジェクトを回転できます。 ノード選択 (SelectNode) モードにすると、個々のポイントをオブジェクトに対して移動、追加、削 除できるようになります。この例については、「160 ページの「選択 (Select) ツールを使用した FeatureGeometry の編集」」を参照してください。 動 的 選 択モ ー ド (Dynamic Selection) では、SelectRectMapTool、SelectRadiusMapTool、および SelectPolygonMapTool を使用しているとき、マウスを移動するとセレクションに含めることのでき るオブジェクトが示されます。 154 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール マップ選択ツールには、選択可能なレイヤを指定するオプションなど、各種のオプションを設定 する た め の プ ロ パ テ ィ が 用 意 されています。これらのデフォルトのツール プロパティは、 MapInfo.Windows.Controls.MapControl.Tools にある MapTools コレクションに対して設定できます。 それぞれのツールでは、オプションでオーバーライド プロパティを独自に設定したり、MapTools コレクションのデフォルト値または自分で用意したオーバーライド値を使用することを指定した りできます。 選 択 可 能 な レ イ ヤ の デ フ ォ ル ト の リ ス ト を 設 定 す る に は、選 択 可 能 な レ イ ヤ を 指 定 す る IMapLayerFilter を作成します。次に、SelectableLayerFilter の MapTools でデフォルトのプロパティ を設定します。 たとえば、すべてのベクトル レイヤで動作する選択可能なレイヤのデフォルトのリストを設定す るには、次のように指定します。 // select from all vector layers IMapLayerFilter selectableLayerFilter = MapLayerFilterFactory.FilterAnd(MapLayerFilterFactory.FilterVisibleLayers (true), MapLayerFilterFactory.FilterByLayerType(LayerType.Normal)); mapControl1.Tools.SelectMapToolProperties.SelectableLayerFilter = selectableLayerFilter; 選択 (Select) ツールのプロパティの詳細については、『MapXtreme 開発者リファレンス』にある MapInfo.Tools.MapTool.ISelectMapToolProperties の説明を参照してください。 追加 (Add) ツール 追加 (Add) ツ ー ル (AddArcMapTool、AddCircleMapTool、AddEllipseMapTool、AddLineMapTool、 AddPointMapTool、AddPolygonMapTool、AddPolylineMapTool、および AddRectangleMapTool) はす べて、AddMapTool クラスに基づいています。追加 (Add) ツールを使用すると、特定のジオメトリ オブジェクトをマップに描画できます。マップにオブジェクトを追加するには、作成されたオブ ジェクトが配置されるアクティブな挿入レイヤがマップに存在している必要があります。個々の オブジェクトのサイズと形状は、使用するツールによって異なります。また、ツールの使用時に 修飾キー (Shift および Ctrl) を併用することによって特定のサイズや形状にすることができます。 追加 (Add) ツールのプロパティの詳細については、『MapXtreme 開発者リファレンス ヘルプ』に ある MapInfo.Tools.MapTool.IAddMapToolProperties の説明を参照してください。 カスタム (Custom) ツール カス タ ム (Custom) ツ ー ル (CustomArcMapTool、CustomCircleMapTool、CustomEllipseMapTool、 CustomLineMapTool、CustomPointMapTool、CustomPolygonMapTool、CustomPolylineMapTool、お よ び CustomRectangleMapTool) は、イベントを発生させるだけの非常に標準的なツールです。これら のクラスを使用して、特定のツールに独自の動作を設計します。たとえば、CustomEllipseMapTool を使用して、このツールを使用するたびに赤い縁取りの付いた緑色の Ellipses を描画させることが できます。さまざまなツールのイベントを使用して (「159 ページの「ツール イベント」」を参照 )、ツールによって生成される特定のイベントへのレスポンスを特定の動作に指定することができ ます。 開発者ガイド 155 MapXtreme デスクトップ ツール API カスタム (Custom) ツールは、デフォルトのツール コレクションに含まれていません。カスタム ツールをマウス ボタンに割り当てる場合は、ツールを識別するための文字列を指定します。 ツールのカスタマイズの詳細については、「158 ページの「ツールのカスタマイズ」」を参照して ください。 図形作成 (Shape) ツール MapXtreme には、マップ上にジオメトリ フィーチャを描画するためのツール グループが用意され ています。これらのツールを使用するには、オブジェクトをクリックしてドラッグします。オブ ジェクトをクリックしてマップ上の他の場所にドラッグすると、描画中のオブジェクトの現在の サイズと形状がラバーバンド イメージによって表示されます。それぞれのツールの現在の操作を キャンセルするには、Esc キーを押します (該当する場合)。 MapXtreme でサポートされる図形作成ツールを次に示します。 ライン (Line) ツール このグループに含まれているツールには、AddLineMapTool および CustomLineMapTool がありま す。これらのツールは Line を描画します。このツールをアクティブにするには、開始点をクリッ クして終了点までドラッグします。マウス ボタンを離すと、Line が作成されます。Shift キーを押 しながらドラッグすると、Line が作成される角度は 45 度の倍数になります。Ctrl キーを押しなが らドラッグすると、ラインの長さと高さは 2 倍になります。マウスを離す前に Esc キーを押すと、 操作がキャンセルされます。 折れ線 (Polyline) ツール このグループに含まれているツールには、AddPolylineMapTool および CustomPolylineMapTool があ ります。折れ線 (Polyline) ツールは、複数のセグメントのある Line を描画します。このツールをア クティブにするには、ポイントをクリックし、続けて別のポイントをクリックします。ポイント のクリックが終了したら、最後のポイントをもう一度クリックします。すると、Polyline が描画さ れます。Shift キーを押しながらドラッグすると、Line が作成される角度は 45 度の倍数になりま す。このツールの場合、Ctrl キーを押しても動作は変わりません。ラインを描画する前に Esc キー を押すと、操作がキャンセルされます。 楕円 (Ellipse) ツールと 弧 (Arc) ツール こ の グ ル ー プ に 含 ま れ て い る ツ ー ル に は、AddEllipseMapTool、CustomEllipseMapTool、お よ び CustomArcMapTool があります。楕円 (Ellipse) ツールは Ellipse を描画します。CustomArcMapTool は弧を描画するだけで、弧をレイヤに挿入することはしません。 楕円 (Ellipse) ツールをアクティブにするには、円周の片側となるポイントをクリックし、もう片方 となるポイントまでドラッグします。マウス ボタンを離すと、Ellipse が作成されます。Shift キー を押しながらドラッグすると、Ellipse は半径が一定の円の内部に作成されます。Ctrl キーを押しな がらドラッグすると、Ellipse は中心にある開始点を使用して描画されます。マウスを離す前に Esc キーを押すと、操作がキャンセルされます。Ellipse の軸は常に座標系に整列されます。 MapXtreme は、マップ上に Rreference Arc を描画する軽量の CustomArcMapTool を提供しますが、 LegacyArc FeatureGeometry をレイヤに提供または挿入することはしません。このような動作を持つ 弧 ツ ー ル を 作 成 す る に は、独 自 の イ ン プ リ メ ン ト を 作 成 す る 必 要 が あ り ま す。た と え ば、 156 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール AddMapTool と同じ動作を CustomArcMapTool に持たせるには、CustomArcMapTool から派生した新 しい弧ツール クラスを作成し、IAddMapToolProperties インターフェイスをインプリメントしま す。 この例の C# と VB のサンプル コードについては、Pitney Bowes Business Insight Knowledgebase を参 照してください。Knowledgebase へは、[すべてのプログラム] メニューの MapXtreme ラーニング リ ソース ページ、または MapInfo Web サイトの「Support」からアクセスできます。 円 (Circle) ツール このグループに含まれているツールには、AddCircleMapTool および CustomCircleMapTool がありま す。円 (Circle) ツールは Circle を描画します。これは、Shift キーを押しながら楕円 (Ellipse) ツール を使用するのと同じことです。円ツールをアクティブにするには、Circle の中心となるポイントを クリックし、円周となるポイントまでドラッグします。ドラッグすると、Circle のサイズが中心点 の周りに広がっていきます。マウス ボタンを離すと、Circle が作成されます。Ctrl キーを押しなが らドラッグすると、Circle は円周となるポイントから円周となるポイントまで描画されます。マウ スを離す前に Esc キーを押すと、操作がキャンセルされます。 長方形 (Rectangle) ツール このグループに含まれているツールには、AddRectangleMapTool および CustomRectangleMapTool が あります。長方形 (Rectangle) ツールは Rectangle を描画します。このツールをアクティブにするに は、一方の隅をクリックして反対側の隅までドラッグします。マウス ボタンを離すと、Rectangle が作成されます。描画オブジェクトは、常に軸整列されます。Shift キーを押しながらドラッグす ると、Rectangle は四角形の内部に作成されます。Ctrl キーを押しながらドラッグすると、Rectangle は中心にある開始点を使用して描画されます。マウスを離す前に Esc キーを押すと、操作がキャン セルされます。 情報チップの使用 情報チップは、マウスをマップ フィーチャの上に置いたときに表示できる小さなテキスト ボック スです。マップには、マップで使用できるすべてのツール (MapInfo.Tools.MapTool のインスタンス) が含まれている MapInfo.Tools.MapTools のインスタンスが関連付けられています。 MapInfo.Tools.MapTools クラスには、情報チップの外観を制御する 3 つのプロパティがあります。 これらのプロパティを以下に示します。 • • • InfoTipsEnabled – マウスがアイドル状態であるときに情報チップを表示するかどうかを取得/設 定します。 InfoTipTimerDelay – 情報チップを表示するまでの待機時間 (ミリ秒単位) を取得/設定します。デ フォルトは 500 です。 InfoTipDisplayDelay – 情報チップの表示時間 (ミリ秒単位) を取得/設定します。デフォルトは 0 です。この場合、情報チップはマウスが移動するまで表示されます。 マウスが移動している限り、情報チップは表示されません。情報チップは、ラベルが付けられた フィーチャの上にマウスが置かれたときにのみ表示され、少なくとも InfoTipTimerDelay で指定さ れる期間にわたってアイドル状態になります。マウスが移動すると、情報チップは消えます。あ るいは、InfoTipDisplayDelay にゼロより大きい値が指定されている場合は、この値より長い時間に わたってマウスがアイドル状態になると消えます。 次のように記述すると、情報チップはまったく表示されません。 開発者ガイド 157 ツールのカスタマイズ mapControl1.Tools.InfoTipsEnabled = false; 次のように記述すると、1 秒遅れで情報チップが表示されるように設定できます。 mapControl1.Tools.InfoTipTimerDelay = 1000; 次のように記述すると、マウスがアイドル状態であっても、2.5 秒間にわたって情報チップが表示 されるように設定できます。 mapControl1.Tools.InfoTipDisplayDelay = 2500; API で 情 報 チ ッ プ を 使 用 す る 方 法 の 詳細については、『MapXtreme 開発者リファレンス』の MapInfo.Tools.MapTools クラスを参照してください。 ツールのカスタマイズ デスクトップ アプリケーション向けのツールは 2 つの方法でカスタマイズできます。既存のツー ルのサブクラスを作成する方法と、カスタム ツール (Custom Tools) グループのいずれかのツールを 使用する方法です。MapXtreme で用意されている Tool クラスはいずれも、希望する特定の Tool ク ラスから派生するサブクラスを作成することによって作成できます。たとえば、AddLineTool クラ スから新しいツール クラスを派生します。ツールは、特定の動作 (ラインが描画されると常にビー プ音が鳴るなど)、特定の外観 (ラインを常に赤で描画するなど)、または特定の機能 (ラインの描画 間隔を常に 90 度にするなど) に変更できます。 ま た、同 じ ツ ー ル に 基 づ い て 2 つの異なるツールを作成する例もあります。たとえば、 AddPointTool をサブクラス化して、マップ上の 2 種類のポイントを異なるシンボルで表す 2 つの異 なるツールを作成できます。一方のツールをマウスの左ボタンに割り当て、もう一方のツールを マウスの右ボタンに割り当てます。 次の例では、AddPolygonTool をカスタマイズする方法を示します。 VB の例: Dim Dim Dim Dim insertionlayerfilter As IMapLayerFilter style As MapInfo.Styles.CompositeStyle addmaptoolproperties As MapInfo.Tools.AddMapToolProperties maptool As MapInfo.Tools.MapTool insertionlayerfilter = _ MapLayerFilterFactory.FilterByLayerType(LayerType.Normal) style = New MapInfo.Styles.CompositeStyle addmaptoolproperties = New _ MapInfo.Tools.AddMapToolProperties(MapLayerFilterFactory.Filter_ ForTools(MapControl1.Map, insertionlayerfilter, _ MapLayerFilterFactory.FilterVisibleLayers(True), _ "CustomPolygonAddMapToolProperties", Nothing), style) maptool = New MapInfo.Tools.AddMapTool(MapControl1.Viewer, _ MapControl1.Handle.ToInt32(), MapControl1.Tools, New _ MapInfo.Tools.MouseToolProperties(Cursors.Default, _ 158 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール Cursors.Default Cursors.Default),_ MapControl1.Tools.MapToolProperties, addmaptoolproperties) Pitney Bowes Business Insight KnowledgeBase には、デスクトップ ツールをカスタマイズするための いろいろなコード例が紹介されています。 さらに、MapXtreme には、デスクトップ ツールのサンプル アプリケーションが付属しているの で、このインプリメントを分析し、必要に応じてカスタマイズすることができます。MapXtreme のインストール先の ..\MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features\DesktopTools\cs を参照して ください。 ツール イベント MapInfo.Tools 名前空間は、ツール操作をキャンセルするための情報と機能によって、ツール イベ ントをサポートしています。ツール選択 (Select Tools) イベントは、選択または選択解除されている 項目をリストします。イベントは特定ツールの使用時のあらゆる段階で発生させることができま す。ツールの使用期間中の特定の瞬間をトラップするコードを記述できます。特定のイベントに コードを追加することにより、マッピング アプリケーション内の各ツールの使用を柔軟にカスタ マイズできます。 名前空間内のイベントを以下に示します。 開発者ガイド FeatureAddingEventArgs 追加ツールがオブジェクトを描画しようとしている ときに発生します。 FeatureAddedEventArgs 追加ツールがオブジェクトをテーブルまたはマップ に追加したときに発生します。 FeatureSelectingEventArgs 選択ツールによって選択が変更されるときに発生し ます。 FeatureSelectedEventArgs 選択ツールによって選択が変更されたときに発生し ます。 FeatureChangingEventArgs 選択ツールによってフィーチャが変更されるときに 発生します。このイベントを使用して、行われる変 更が有効であるかどうかを確認します。 FeatureChangedEventArgs 選択ツールによってフィーチャが変更された後に発 生します。 NodeChangedEventArgs 選択ツールによって選択内のノードが変更されたと きに発生します。 NodeChangingEventArgs 選択されたフィーチャのノードが選択ツールによっ て変更されるときに発生します。このイベントを使 用して、行われる変更が有効であるかどうかを確認 します。 159 選択 (Select) ツールを使用した FeatureGeometry の編集 ToolActivatedEventArgs マウス ツールがアクティブ化されたときに発生し ます。 ToolActivatingEventArgs マウス ツールがアクティブ化されるときに発生し ます。 ToolEndingEventArgs マウス ツールが終了されるときに発生します。こ のイベントは、新しいアクションの開始点として最 適です。 ToolUsedEventArgs マウス ツールが使用されているときに発生しま す。このイベントを使用して、一連のマウス ク リックの開始点、中間点、および終了点のフラグを 設定します。 選択 (Select) ツールを使用した FeatureGeometry の編集 次のセクションでは、FeatureGeometry の形状変更やノードの追加を行ってフィーチャを編集する 方法を説明します。MapControl、LayerControl、および選択 (Select) ツールの具体的な使用例が紹介 されています。「139 ページの「MapControl」」および「144 ページの「レイヤの管理」」も参照 してください。 フィーチャの形状変更 1. MapControl にマップを読み込み、変更するフィーチャを拡大します。 2. LayerControl でオブジェクトのレイヤを選択します。 160 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール 3. LayerControl の [表示/非表示] タブで、[表示] チェック ボックスをオンにします。 4. [オプション] タブで、[選択可能] チェック ボックスと [編集可能] チェック ボックスをオンにし ます。 5. レイヤ管理ツリー ビューでマップのルート ノードを選択します。 6. [編集] タブで、[編集モード] コンボ ボックスから [ノード編集可能] を選択します。 開発者ガイド 161 選択 (Select) ツールを使用した FeatureGeometry の編集 7. [OK] をクリックして、変更内容を確定します。マップ表示が変更され、オブジェクトのノード が表示されます。 8. 項目の選択 (Select Item) ツールを使用して、変更するポリゴンを選択します。次に、位置を変 更するノードをクリックしてドラッグします。Shift キーを使用すると、特定範囲のノードを選 択できます。また、Ctrl キーを使用すると、ノードの選択状態を切り替えることができます。 ノードの追加 Feature Geometry にノードを追加するには、次の手順を実行します。 1. 再び LayerControl を開き、マップのルート ノードを選択します。 2. [編集] タブで、[編集モード] コンボ ボックスから [ノード追加可能] を選択します。 162 MapXtreme 2008 v7.0.0 第 8 章 デスクトップ アプリケーション、コントロール、ダイアログ、ツール 3. [OK] をクリックして、変更内容を確定します。 4. マップで、変更するポリゴンを選択します。 5. 項目の選択 (Select Item) ツールを使用して、Ctrl キーを押しながら、ノードを追加するポリゴン の辺上でクリックします。新しいノードが表示されます。 プログラムによる形状変更とノードの追加 このセクションでは、プログラムによって形状変更やノードの追加を行う方法を説明します。C# と VB のコードが用意されています。 1. Visual Studio デザイナで、"btnEditNodeTool" という名前のボタンをメイン フォームに追加しま す。 2. ボタンをダブルクリックして、コード サンプルを追加します。 ページにボタンのハンドラを開きます。適切なコード VB の例: Private Sub btnEditNodeTool_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) MapControl1.Tools.LeftButtonTool = "Select" MapControl1.Tools.SelectMapToolProperties.EditMode = MapInfo.Tools.EditMode.Nodes End Sub 3. アプリケーションを実行します。 4. LayerControl でオブジェクトのレイヤを選択します。 5. LayerControl の [表示/非表示] タブで、[表示] チェック ボックスをオンにします。 開発者ガイド 163 選択 (Select) ツールを使用した FeatureGeometry の編集 6. [オプション] タブで、[選択可能] チェック ボックスと [編集可能] チェック ボックスをオンにし ます。 7. [OK] をクリックして、変更内容を確定します。 8. フォームに追加した新しいボタンをクリックします。カーソルの形が Select 矢印に変化しま す。 9. 次に、(前の例の手順 8と同様に) ノードをクリックし、ドラッグします。 164 MapXtreme 2008 v7.0.0 9 中核 MapXtreme クラスで の作業 MapInfo.Engine 名前空間には、MapXtreme アプリケーションを実行する際に必 要となる機能に直接関連するインターフェイスとクラスが含まれています。た とえば、すべての MapXtreme アプリケーション操作の開始点となる ISession インターフェイスがあります。この名前空間のクラスとしては、Session と Selections、お よ び SearchPath が あ り ま す。この名前空間にはこれ以外に、 Collections、Resources、および CustomProperties をサポートしているクラス、 デリゲート、構造体、および列挙体が含まれます。 この章の構成 「ISession インターフェイス」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「シリアライゼーションと永続化」 . . . . . . . . . . . . . . . . . . . . . . . . . . 「Selection (選択) クラス」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「Selection のコード例」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「イベントの引数」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「例外」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 169 171 173 174 175 ISession インターフェイス ISession インターフェイスは、すべての MapXtreme ベース アプリケーション操作の開始点となり ます。このオブジェクトは、MapXtreme アプリケーションに必要なリソースの初期化を管理しま す。 ISession のインスタンスは、DataAccess エンジン、MapFactory、CoordSysFactory など、デスクトッ プまたは Web アプリケーションの動作に必要な MapXtreme オブジェクト モデルのコンポーネント を保持します。ISession インターフェイスを実装するクラスを次の図に示します。 ASP.NET アプリケーションの場合は、クライアント リクエストごとにそれぞれの ISession インス タンスがあります。このインスタンスは呼び出し元のコンテキストに存在し、クライアント リク エストが有効である間ずっと使用できます。 シングル スレッドのデスクトップ アプリケーションの場合は、インスタンスが 1 つしか存在しま せん。マルチ スレッドのデスクトップ アプリケーションの場合は、1 つのスレッドごとにインス タンスが 1 つ存在します。 MapInfo.Engine.Session クラスは、ISession オブジェクトへのアクセスを可能にします。現在の ISession インスタンスを取得するには、MapInfo.Engine.Session.Current プロパティを使用します。 セッションの管理 セッション管理については、アプリケーションの設計時に理解しておくことが重要です。デスク トップ アプリケーションのセッション管理は単純ですが (ユーザごとに独自の ISession インスタン スがあります)、Web アプリケーションの場合は、何人のユーザがそのアプリケーションを使用す るかわからないという点を考慮する必要があります。各ユーザの状態を処理する方法を把握し て、正しいユーザに正しい情報とビジュアル表示を返すことが必要になります。 166 MapXtreme 2008 v7.0.0 第 9 章 : 中核 MapXtreme クラスでの作業 MapXtreme では、状態を適切に管理するのに役立つ Web アプリケーション作成用テンプレートが 用意されています。詳細については、「第 6 章: 「状態管理について」」を参照してください。状 態の管理、プール、パフォーマンス、およびデータ アクセスに関する重要な判断が提示され、 コーディング開始前のプロジェクト設計段階において十分な情報に基づく判断を行うのに役立ち ます。 Session.Dispose メソッドの使用方法 MapInfo.Engine.Session クラスには、オーバーロードされた 2 つの Dispose メソッドがあります。ど ちらを使用するかは、作成するアプリケーションの種類によって異なります。 Session.Dispose() Session.Dispose() は、Session.Current プロパティからアクセスできる ISession のインスタンスを破棄 します。このメソッドは、マルチスレッド デスクトップ アプリケーションでのみ使用します。 Web アプリケーションおよびシングルスレッド デスクトップ アプリケーションでは使用しないで ください。Web アプリケーションの場合、ISession は WebSessionActivator によって管理されます。 シングルスレッド デスクトップ アプリケーションの場合、Dispose は、アプリケーションのシャッ トダウン時または MapXtreme を使用する AppDomain がアンロードされるときに自動的に呼び出さ れます。 Session.Dispose(HttpSessionState) Session.Dispose(HttpSessionState) は、デフォルトのセッション状態設定を使用する Web アプリケー ションで使用します。デフォルト設定では、ISession はメモリ内に格納されます。これ以外の構成 では ISession はメモリ内に格納されないので、このメソッドを呼び出さないでください。 状態設定は、アプリケーション プロジェクトの Web.config ファイル内に以下のキーで示されま す。 <add key="MapInfo.Engine.Session.State" value="HttpSessionState" /> <sessionState mode="InProc" /> 1 番目の設定はアプリケーション固有の設定であり、MapInfo.Engine.ISession インスタンスの状態 を 保 存 お よ び 復 元 す る た め の メ カ ニ ズ ム を 制 御 し ま す。こ の イ ン ス タ ン ス に は、 MapInfo.Engine.Session.Current プロパティからアクセスできます。HttpSessionState 設定は、セッ ションが ASP.NET セッション状態を通して保存および復元されることを示します。この状態は、 現在の HttpContext によって公開され、HttpSessionState という型で表されます。 2 番目の設定は ASP.NET 設定で、HttpSessionState の保存および復元の方法を制御します。InProc は、ASP.NET セッションの状態がメモリ内に格納され、ASP.NET ISession インスタンスごとに固有 になることを示しています。これはデフォルトの設定です。 これらの設定を使用すると、ASP.NET セッションごとに 1 つの ISession インスタンスが生成され、 その ASP.NET セッションの有効期間の間、HttpSessionState に格納されます。セッションがタイム アウトになったり終了したりしたときに ISession インスタンスが適切に破棄されるようにするに は、Global.asax ソース コード ファイルで Session_End メソッドに次のステートメントを追加する 必要があります。 開発者ガイド 167 VB の例: MapInfo.Engine.Session.Dispose(this.Session); Protected Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) MapInfo.Engine.Session.Dispose(this.Session); End Sub この呼び出しを行うことで、ISession インスタンスが適切に破棄され、メモリがクリアされます。 ISessionEventHandler MapXtreme に は、MapXtreme の機能を拡張するカスタム DLL を読み込むための MapInfo.Engine.ISessionEventHandler インターフェイスが用意されています。このインターフェイス を使用して、拡張可能なデータ プロバイダ、永続化プロバイダ、デフォルトのワークスペースで 使用するスタイルなど、アプリケーションに必要な任意の拡張 DLL を自動的に読み込むことがで きます。MapXtreme は、起動時にこれらのアセンブリを初期化し、必要な手順を実行します。 たとえば、MapXtreme には SpatiaLite サンプル インプリメントが用意されています。これは、コン パイルされると、SpatiaLite データ プロバイダをサポートし、MapXtreme セッションの初期化時に このデータ プロバイダを読み込むためのコードを含んだ、アセンブリを生成します。 SessionEventHandler ア セ ン ブリが起動時に初期化されるようにするには、\Common Files\MapInfo\MapXtreme\7.x.x\SessionEventHandlers フォルダに格納しておく必要があります。実際 には、このフォルダ内で .SessionEventHandler.DLL というファイル接尾辞を持つアセンブリが読み 込まれます。 ISessionEventHandler インターフェイスには、アプリケーションで必要な任意の拡張コードを読み 込み、追加の初期化機能を提供するために呼び出すことができる、2 つのメソッドがあります。 void BeforeWorkspaceLoad(ISession session) このメソッドは、デフォルトのワークスペースが読み込まれる前に呼び出されます。このメ ソッドを使用して、拡張可能なデータ プロバイダ、edp コールバック、edp 永続化プロバイ ダ、名前付き接続を設定したり、スタイルを読み込んだり作成したり、デフォルトのワークス ペースで使用される可能性のあるテーブルやデータベース接続などを開いたりできます。 void AfterWorkspaceLoad(ISession session) このメソッドは、デフォルトのワークスペース (app.config または web.config で指定) が読み込 まれた後で呼び出されます。このメソッドは、アプリケーションで必要となる最終的なセッ ションの初期化を行うのに便利です。 MapXtreme では、アセンブリ内に ISessionEventHandler インターフェイスをインプリメントするク ラスを検出すると、そのクラスのインスタンスを構築し、それを内部のコレクションに追加しま す。新しい MapXtreme Session インスタンスが作成されると (デスクトップ アプリケーションに対 しては 1 回、Web アプリケーションの場合は複数セッションが可能)、初期化されるセッションの インスタンスについてすべてのセッション ハンドラが呼び出されます。 複数の SessionEvent ハンドラが読み込まれる可能性があり、それらの呼び出し順序は不定であるた め、ハンドラを記述する場合には、セッションに何が既に含まれているか (マップ、テーブルなど) について仮定することは避けてください。 168 MapXtreme 2008 v7.0.0 第 9 章 : 中核 MapXtreme クラスでの作業 この機能の使用には注意が必要です。コンピュータ上で作成されたすべての MapXtreme セッショ ンが、これらのセッション イベント ハンドラを読み込みます。ダイアログ ウィンドウや他のユー ザ インターフェイスを表示するハンドラを追加すると、これらのダイアログがサーバ上で表示さ れるため、Web アプリケーションがハングする可能性があります。 シリアライゼーションと永続化 Map は ISession オブジェクトにバインドされます。ある ISession オブジェクトから Map オブジェ クトを取り出して別の ISession オブジェクトで使用することはできません。ISession オブジェクト 全体を複製する場合は、シリアライゼーションと永続化という 2 つの方法のうちいずれかを行いま す。 シリアライゼーション シリアライゼーションとは、オブジェクトをデータ ストリームに変換してサーバ上に保持するプ ロセスです。このプロセスは、MapXtreme の Web アプリケーションでオブジェクトを維持するう えで不可欠です。オブジェクトが維持されなかった場合、サーバは Web リクエストごとにオブ ジェクト (マップなど) を再作成する必要があります。オブジェクトに対するリクエストがある と、オブジェクトはデシリアライズされ (データ ストリームから復元すること)、変更が加えられ ます。このアルゴリズムではオブジェクトのコピーは作成されません (シリアライゼーションの他 のアルゴリズムでは作成される)。したがって、デシリアライズされるオブジェクトは 1 回しか作 成されません。 シリアライゼーションは、Microsoft.NET Framework に組み込まれているフォーマッタによって実 行されます。Framework には、バイナリ オブジェクト用の BinaryFormatter、SOAP オブジェクト用 の SOAPFormatter の 2 つの異なるフォーマッタがあります (SOAP は、Web などの分散化された環 境で構造化情報を交換するための簡易プロトコルです)。SOAPFormatter は BinaryFormatter より処 理 が 高 速 で す。SOAPFormatter は一部の基本データ型 (Int、Byte、Decimal など) に使用され、 BinaryFormatter は オ ブ ジ ェ クトの複合体に対 して呼び出されます。SOAPFormatter と BinaryFormatter の詳細については、Microsoft MSDN のドキュメントを参照してください。 オブジェクトをこれらのうちいずれかのフォーマッタに渡すには、GetObjectData() メソッドを使用 します。オブジェクトをデシリアライズする (ストリームからオブジェクトを復元する) には、 SetObjectData() メソッドを使用します。 ISerializable インターフェイスをサポートしているオブジェクトの復元、デシリアライズは自動的 に行われます。ASP.NET フレームワークは、HttpApplication.BeginRequest の後に context.Session[] 配列 を 自 動 的 に デ シ リ ア ラ イ ズします。HttpApplication.BeginRequest ハンドラで MapInfo.Engine.Session が設定され、オブジェクトは MapInfo.Engine.Session にデシリアライズされ ます。 Session オブジェクトのシリアライズ/デシリアライズ Session オブジェクトのシリアライズとデシリアライズの例を次に示します。 // Create a MemoryStream to serialize into MemoryStream stream = new MemoryStream(); // Serialize the MapXtreme Session object BinaryFormatter formatter = new BinaryFormatter(); 開発者ガイド 169 シリアライゼーションと永続化 formatter.Serialize(stream, Session.Current); stream.Position = 0; // Make changes to the Session object to make sure the // deserialization works correctly ... // Recreate the MapXtreme Session object from the stream // Note: this will replace the current MapXtreme Session object with the // contents of the stream formatter = new BinaryFormatter(); formatter.Deserialize(stream); formatter.Serialize メソッドに渡す stream パラメータは、System.IO.Stream から派生した任意のスト リームです。 このシリアライゼーション機能は、MapXtreme の状態管理機能で使用するために設計されまし た。この情報をディスクに保持し、将来 (製品の別のバージョンで) 再読み込みしようとしても、 その動作は保証されません。 シリアライゼーションおよび状態管理の詳細については、「第 6 章、121 ページの「StateManager のインプリメント」 」を参照してください。 永続化 MapXtreme における永続化とは、アプリケーション オブジェクトを XML 形式の MapInfo ワークス ペース (.MWS) ファイルに格納するプロセスです。ISession オブジェクトの永続化と永続化解除 は、WorkSpacePersistence クラスと WorkSpaceLoader クラスを使用して行います。これら 2 つのク ラスは、.MWS ファイルの書き出しおよび読み込みを行います。アプリケーションはワークスペー ス (Session のコピー) を書き出し、ワークスペース ファイルの内容を新しい Session オブジェクト に適用することによって、Session の複製を作成できます。 VB の例: Public Shared Sub MapInfo_Persistence_WorkSpacePersistenceSave() ' Create a named connection point to "D:\data\version2" Dim info As NamedConnectionInfo = New NamedConnectionInfo("file",_ ConnectionMethod.FilePath, "D:\data\version2") Session.Current.Catalog.NamedConnections.Add("MyDataFolder",_ info) ' Create a map Dim map As Map = Session.Current.MapFactory.CreateEmptyMap("MyMap",_ "MyMapAlias", New Size(400, 400)) Dim table As Table = Session.Current.Catalog.OpenTable("MyDataFolder", _ "myTableAlias", "Seamless\Lines - NYALBA\SeamCapDist.TAB") map.Layers.Add(New FeatureLayer(table)) ' Save the Session to a workspace file Dim w As WorkSpacePersistence = New WorkSpacePersistence w.Save("c:\workspace\mySeamless.mws") End Sub 170 MapXtreme 2008 v7.0.0 第 9 章 : 中核 MapXtreme クラスでの作業 (WorkSpaceLoader クラスを使用して) ワークスペースを追加するプロセスは、累積的であることに 注意してください。Mapxtreme Session に新しいワークスペース ファイルの内容のみが含まれるよ うにするには、先に ISession オブジェクトに対して Reload() メソッドを呼び出す必要があります。 このメソッドはセッションの状態をクリアし、アプリケーションの Web.config ファイルで事前定 義されているワークスペースを再読み込みします。 永続化および XML スキーマの詳細については、「付録 D: 「MapInfo ワークスペースについて」」 を参照してください。 Selection (選択) クラス Selection は、フィーチャのリストを格納する IResultSetFeatureCollection オブジェクトのコレクショ ンです。フィーチャは、テーブル内の行のサブセットです。たとえば、所有地の境界、番地、携 帯電話のアンテナの場所、川などの地物がフィーチャとなります。これらは通常、Map に表示す ると 特 別 に 強 調 表 示 さ れ て 描 画されます。Selection 内には、指定したテーブルの IResultSetFeatureCollection は 1 つしか存在できません。 ISession には、複数の Selection を含めることができます。Selections コレクションは、アプリケー ションのすべての Selection を格納しています。DefaultSelection という名前のセレクションが必ず 少なくとも 1 つあります。 Selection には名前と一意のエイリアスが必要です。デフォルトでは、Selection はマップ選択ツール で変更します。各ツールは、任意の Selection を使用するように設定できます。 MapXtreme 内 の セ レ ク シ ョ ンはコピーではなく、Selection 内で指定されたテーブルの IResultSetFeatureCollection への参照です。作業中のテーブルを閉じた後 Selection を変更しようとす ると、IResultSetFeatureCollection が無効となり例外が発生します。 フィーチャは、ツールまたは検索メソッドを使用して選択します。Windows フォーム アプリケー ションの作成で使用できる選択ツールについては、「第 8 章: 「デスクトップ アプリケーション、 コントロール、ダイアログ、ツール」」を参照してください。選択用の Web コントロールと選択 ツールの詳細については、「第 5 章: 「Web アプリケーション、コントロール、およびツール」」 を参照してください。 フィーチャは、IResultSetFeatureCollection コレクションを返す MapInfo.Data.Catalog クラスの検索メ ソッドでも選択できます。検索で Selection オブジェクトを渡して、Selection の作成や変更に使用 することができます。 フィーチャは、Data.MICommand クラスの ExecuteFeatureCollection メソッドを使用して選択できま す。この場合、MapInfo データ プロバイダに対して SQL コマンドを実行します。 フィーチャ、テーブル、Catalog、および MICommand の詳細については、「第 10 章: 「データでの 作業」」を参照してください。 Selection プロパティの使用方法 Selection クラスのプロパティは、(必須の) 名前とエイリアスの設定、Selection が可視または編集可 能かどうかの設定、Selection のスタイルの取得に使用します。Selection が選択されていることまた は編集可能であることを強調表示で示すかどうかは、それぞれ Visible プロパティと Editable プロ パティを使用して指定されます。 開発者ガイド 171 Selection ( 選択 ) クラス Editable プロパティが true に設定されている場合は、作業中のテーブルも編集可能であることが必 要です。 Style プロパティは Selection のスタイルを示し、Selection の複合スタイルへの参照を返します。 Style プロパティを変更すると、Selection オブジェクトに変更が通知されます。変更内容は、次 回、Selection オブジェクトを描画するときに反映されます。スタイルについては、「第 16 章: 「マップのスタイル設定」」を参照してください。 Selection の強調表示とエクスポート Selections は、マップ上では一般に特殊な強調表示で描画され、周囲の選択されていないフィー チャと区別されます。強調表示は、Mapping.FeatureViewer.DrawSelections プロパティで制御しま す。このプロパティを true にすると、選択レイヤが可視レイヤにある場合は、その選択は強調表 示で描画されます。 同様に、MapExport.ExportSelection プロパティは、エクスポートされたイメージに選択を描画する かどうかを制御します。 SelectionChangedEvent この選択が変更されたことを伝える通知を受け取るには、SelectionChangedEvent にデリゲート メ ソッドをアタッチします。たとえば、レコードが追加されると、SelectionChangedEvent が発生しま す。 Selection クラスと Selections クラスの ISerializable インターフェイス ISerializable インターフェイスは Selection クラスと Selections クラスでインプリメントされていま す。Selections オブジェクトをシリアライズまたはデシリアライズする方法を示すコード例を次に 示します。 // Create a MemoryStream to serialize into MemoryStream stream = new MemoryStream(); // Serialize the Selections object BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, Session.Current.Selections); stream.Position = 0; // Make changes to the Session's Selections object to make sure the // deserialization works correctly. ... // Recreate the Selections object from the stream. // Note: this replaces the current Session's Selections object with // the contents of the stream formatter = new BinaryFormatter(); formatter.Deserialize(stream); 172 MapXtreme 2008 v7.0.0 第 9 章 : 中核 MapXtreme クラスでの作業 Selection のコード例 一般的な選択操作のコード例を以下に示します。これらの例およびその他の例は、Pitney Bowes Business Insight Knowledgebase (「MapXtreme 2004」 > 「Selections」) にあります。Knowledgebase は、[すべてのプログラム] メニューの MapXtreme ラーニング リソース ページまたは MapInfo Web サイトの 「Support & Training」 から参照できます。これ以外にも、『MapXtreme 開発者リファレ ンス』の多くのトピックにコード例が含まれています。 別のフィーチャ内のフィーチャの選択 MapXtreme を使用した一般的な検索手法として、別のフィーチャ内のフィーチャの検索がありま す。このような検索は、特定の郵便番号境界内のすべての顧客、特定区域内の工事中の高速道路 などを検索する場合に行います。例を次に示します。パラメータ f は MapInfo.Data.Feature です。 VB の例: Dim si As MapInfo.Data.SearchInfo = _ MapInfo.Data.SearchInfoFactory.SearchWithinFeature(f, _ MapInfo.Data.ContainsType.Centroid) Dim irfc As MapInfo.Data.IResultSetFeatureCollection = _ MapInfo.Engine.Session.Current.Catalog.Search("USCty_8k", si) MapInfo.Engine.Session.Current.Selections.DefaultSelection.Clear() MapInfo.Engine.Session.Current.Selections.DefaultSelection.Add(irfc) irfc.Close() テーブル内の選択範囲を調べる 次のコード例は、テーブル内の Selection の数を取得する方法を示します。 VB の例: Public Shared Sub MapInfo_Engine_Selection2() Dim session As ISession = MapInfo.Engine.Session.Current Dim tableUsa As Table = session.Catalog("usa") ' Get fc for selection on usa. Dim fc As IResultSetFeatureCollection = _ session.Selections.DefaultSelection(tableUsa) Dim nCount As Integer = 0 If Not fc Is Nothing Then nCount = fc.Count End If End Sub Selection の処理は、MapInfo SQL クエリおよび ADO.NET データ プロバイダを使用して行うことも できます。「第 10 章: 「データでの作業」」を参照してください。 開発者ガイド 173 イベントの引数 テーブルのすべてのフィールドの取得 次の例は、Selection からすべてのフィールドを返す方法を示します。 VB の例: Dim Connection As MIConnection = New MIConnection Connection.Open() Dim lyr As FeatureLayer = MapControl1.Map.Layers("usa") Dim ti As MapInfo.Data.Table = _ MapInfo.Engine.Session.Current.Catalog.GetTable("usa") Dim si As MapInfo.Data.SearchInfo = _ MapInfo.Data.SearchInfoFactory.SearchAll() si.QueryDefinition.SetColumns("*") Dim irfc As MapInfo.Data.IResultSetFeatureCollection = _ MapInfo.Engine.Session.Current.Catalog.Search(ti.Alias, si) Dim l As MapInfo.Data.Feature For Each l In irfc Dim column As MapInfo.Data.Column For Each column In l.Columns MessageBox.Show(column.ToString()) Next Next Selection に合わせたマップ ビューの変更 次の例は、Selection 内のすべてのフィーチャが表示されるようにズームを変更する方法を示しま す。 VB の例: Me.MapControl1.Map.Bounds = _ MapInfo.Engine.Session.Current.Selections.DefaultSelection.Envelope.Bounds イベントの引数 MapInfo.Engine 名前空間には、イベント用のデータを提供する各種のイベント引数クラスが含まれ ます。詳細については、オンライン ヘルプを参照してください。イベント引数クラスには、次の ものがあります。 • • • • 174 CollectionCancelableEventArgs - キャンセルできるコレクション イベントのデータを提供しま す。 CollectionEventArgs - コレクション イベントのデータを提供します。 NodeSelectionChangedEventArgs - ノードの選択が変更されたときに、これらのイベントの引数 を発生させます。 SelectionChangedEventArgs - 他のオブジェクトは、デリゲートをこのイベントにアタッチして、 選択が変更されたことを通知します。 MapXtreme 2008 v7.0.0 第 9 章 : 中核 MapXtreme クラスでの作業 例外 Engine 名前空間には、さまざまな例外クラスが含まれます。詳細については、オンライン ヘルプ を参照してください。例外クラスには、次のものがあります。 • • • 開発者ガイド ResourceNotFoundException - リクエストされたオブジェクトが Resource テーブル内に見つから なかった場合に、この例外がスローされます。 ResourceTypeMismatchException - Resource から読み込んだオブジェクトが予想された型と異 なっていた場合に、この例外がスローされます。 TimeoutException - プールされた ISession が使用できるようになるのを待機している間に Current タイムアウトが発生すると、この例外がスローされます。 175 例外 176 MapXtreme 2008 v7.0.0 10 データでの作業 MapInfo.Data 名前空間には、MapXtreme アプリケーションから複数の方法で データにアクセスできるようにするクラスやインターフェイスが含まれていま す。 この章の構成 「MapInfo.Data 名前空間の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「Catalog とテーブル」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「サポートされているテーブルの種類」 . . . . . . . . . . . . . . . . . . . . . . 「カタログとテーブルの操作」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「テーブル メタデータ (TableInfo)」 . . . . . . . . . . . . . . . . . . . . . . . . . . 「MapInfo ADO.NET データ プロバイダ」 . . . . . . . . . . . . . . . . . . . . . 「Feature と Feature コレクション」 . . . . . . . . . . . . . . . . . . . . . . . . . . . 「Feature の検索」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「データの分析」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「データ アクセス パフォーマンスの強化」 . . . . . . . . . . . . . . . . . . . 178 179 185 188 191 208 212 213 219 222 MapInfo.Data 名前空間の概要 MapInfo.Data 名前空間には、MapXtreme アプリケーションから複数の方法でデータにアクセスでき る よ う に す る ク ラ ス や イ ン タ ー フ ェ イ スが含まれています。この名前空間内には MapInfo ADO.NET データ プロバイダがあります。このデータ プロバイダは、MapInfo SQL 言語を使用して データベースとテーブルに対して標準のクエリを実行します。Feature オブジェクト モデルを使用 することで、SQL ではなくオブジェクトを使用してデータにアクセスすることも可能です。 Catalog はデータ アクセスの開始点であり、テーブルを管理する (開く、閉じる、作成する) メソッ ド、およびデータを検索するメソッドが含まれています。 MapInfo.Data Namespace Road Map カタログ と テーブル テーブル メタデータ Catalog CloseAll CreateTable OpenTable Search SearchForFeature SearchReader Alias TableType ITableFilter SearchInfo QueryDefinition Column Table DbmsConnectionCollection TableInfoAdoNet TableInfoAscii TableInfodBase TableInfoGrid TableInfoNative TableInfoMemTable TableInfoMSAccess TableInfoRaster TableInfoResultSet TableInfoSeamless TableInfoServer TableInfoShapefile TableInfoView TableInfoWms Close AddColumns InsertFeature UpdateFeature DeleteFeature Pack ISearchResultProcessor TableSessionInfo IQueryFilter Metadata SpatialSchema Alias Add Remove MIConnection Feature MIDataReader Catalog Key Geometry Style A MICommand MIScrollableReader CommandText IDynamicFeatureCollection ITableFeatureCollection IResultSetFeatureCollection B Columns Read GetValue Close Open Close Columns MultiResultSetFeatureCollection FeatureCollection CoordSys Bounds DefaultView SpatialSchemaPointRef MapInfo ADO.NET データ プロバイダ IFeatureCollection MIGmlFeatureCollection GeometryColumn SpatialSchemaXY Current Features と Feature コレクション GmlFeatureCollection Alias MIDbType CacheParameters Table MultiFeatureCollection A Columns TableInfo B ITableEnumerator Cancel Dispose ExecuteReader ExecuteScrollableReader ExecuteNonQuery ExecuteFeatureCollection Prepare ReadPrevious Rewind Unwind Parameters MIParameter ParameterName Value このクラスはイベントを公開します - 特定のイベントおよび引数についてはオンライン ヘルプを参照してください。 このクラスには、新しいインスタンスを作成するための関連ファクトリがあります。 この章は、上記の MapXtreme のデータ アクセス モデル図に基づき、次のトピックで構成されてい ます。 • • • • 「Catalog とテーブル」 「テーブル メタデータ (TableInfo)」 「MapInfo ADO.NET データ プロバイダ」 「Feature と Feature コレクション」 データ アクセスは、すべての MapXtreme アプリケーションの中核となる処理であるため、取り上 げるトピックも多方面にわたっています。上記のトピックには、データ アクセス以外にも重要な 情報が記載されています。 178 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 この章の後には、データ アクセスに関連した情報として、 第 11 章: 「式の作成」と第 12 章: 「DBMS のデータへのアクセス」の 2 つの章が補足されています。 Catalog とテーブル Catalog は、MapXtreme のデータ アクセス モデルを管理します。テーブルは、MapXtreme の基礎を 成す単位です。テーブルには、アプリケーションで表示したり分析したりするためのデータが格 納されます。データ アクセス モデルを管理する Catalog には、現在セッションで開いているテー ブルのリストが含まれます。テーブルは、Catalog から開いたり、作成したり、閉じたりすること ができます。 MapXtreme のほぼすべてのデータ アクセス操作には、Catalog とテーブルが関係しています。 テーブル Table クラスは、すべてのデータ アクセスの基本単位です。MapInfo Table から、Table、Column、 およびすべての TAB ファイル メタデータ情報にアクセスできます。Table は、マップ作成可能 (FeatureGeometry 型のフィールドを持つ) にも、またマップ作成不可にもすることができます。ま た、マップを表示せずに開いたり、アクセスしたりできます。 テーブルのエイリアス テーブルが開いているときに、テーブルの名前 (またはエイリアス) を割り当てると、テーブルが 開いている間にそのテーブルを参照することができます。たとえば、テーブルは、SQL ステート メント内のエイリアスによって参照されます。TAB ファイルから開いたテーブルにエイリアスが 割り当てられていない場合、このテーブルにはデフォルトのエイリアスが割り当てられます。デ フォルトのエイリアスは、TAB ファイルの名前に基づいたものなります。このプロパティは null に設定することもできます。テーブルにはエイリアスを割り当てることをお勧めします。 開発者ガイド 179 Catalog とテーブル Column (フィールド) Column オブジェクトは、テーブル、フィーチャ、またはフィーチャ コレクション内のフィールド のプロパティを識別し、フィールドの名前 (エイリアス)、データ型、幅 (文字列フィールドと数値 フィールド) など、フィールドのプロパティを指定します。 サポートされているデータ型には、次のものがあります。 データ型 180 説明 Int 32 ビット符号付き整数型の値を提供します。.NET Framework のデータ型 Int32 にマッピングします。 SmallInt 16 ビット符号付き整数型の値を提供します。.NET Framework のデータ型 Int16 にマッピングします。 Double -1.79E +308 ~ 1.79E +308 の浮動小数点数。倍精度浮動小数点数型にマッピ ングします。 dBaseDecimal 浮動小数点数を提供します。この値は内部的には倍精度浮動小数点数型の値 として処理されます。テーブル内で保持されている場合は有効桁数と小数点 部桁数が固定です。その名前が示すとおり、dBase ファイル形式から派生し たデータ型です。倍精度浮動小数点数型にマッピングします。 Boolean ブール型の値を提供します。ブール型にマッピングします。 String 可変長の、null で終了する UNICODE 文字列値を提供します。文字列型に マッピングします。 Date * † 日付値を提供します。MapXtreme v 6.8 以降、Date 型は、MapInfo.Data 名前 空 間 の 構 造 体 と し て イ ン プ リ メ ン ト さ れ て い ま す。そ れ ま で は、 System.DateTime にマップされていました。 DateTime *‡ 日付値および時刻値を提供します。DateTime 型は System.DateTime にマッピ ングされます。 Time 時刻値を提供します。MapInfo Professional テーブル (TAB ファイル) の 9.0 以 降 の バ ー ジ ョ ン では、Time 型がサポートされます。Time 型は、 MapInfo.Data 名前空間の構造体としてインプリメントされます。 FeatureGeometry FeatureGeometry を提供します。 Binary バイナリ データの配列を提供します。Byte 値の配列にマッピングします。 Key テーブルのキーを提供します。Table の Key 擬似フィールドのデータ型で す。 CoordSys 座標系を提供します。座標系オブジェクトを MICommand にバインドする目 的のためだけに存在します。座標系の指定が必要な関数で使用します。 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 データ型 説明 Style Style クラスのインスタンスを提供します。MapInfo.Styles.Style を参照してく ださい。Table のスタイル フィールドに格納される Style オブジェクトの データ型です。 Raster テーブルのラスタ フィールドの RasterInfo を提供します。これは Table のラ スタ フィールドに格納される RasterInfo オブジェクトのデータ型です。 Grid テーブルのグリッド フィールドの GridInfo。Table のグリッド フィールドに 格納される GridInfo オブジェクトのデータ型です。 Wms テ ー ブ ル の Wms フィールドの WmsClient を提供します。Table の Wms フィールドに格納される WmsClient オブジェクトのデータ型です。 * † ‡ 旧バージョンの MapXtreme との互換性を維持するために、MapInfo.Data.MIDataReader.GetDateTime メソッドは、DateTime および Date の両方のデータ型に対して使用できます。どちらの場合にも、 System.DateTime 値が返されます。ただし、MapInfo.Data.Column.DataType は、実際のデータ型であ る Date または DateTime のどちらかを反映します。 Time 型および DateTime 型は、MapInfo SQL 関数ではサポートされていません。ただし、DateTime 型を呼び出す、または使用する MapInfo SQL 関数では、DateTime 値の日付部分が返されます。詳 細については、「MapInfo SQL リファレンス」を参照してください。 Time 型および DateTime 型は、MapInfo SQL 関数ではサポートされていません。ただし、DateTime 型を呼び出す、または使用する MapInfo SQL 関数では、DateTime 値の日付部分が返されます。詳 細については、「MapInfo SQL リファレンス」を参照してください。 Time および DateTime のデータ ソース サポート MapXtreme では、サポートされているデータ ソースおよびデータ プロバイダで Date、DateTime、 および Time の各データを読み取る (および適用された場合は保存する) ことができます。データ ソースが異なると日付/時刻の型定義が異なる場合があり、MapXtreme の型と完全に一致しないこ とがあります。 新しいデータ型は、次のデータ ソースでサポートされています。 • • • Mem テーブル ネイティブ テーブル (TAB ファイル) ADO.NET • • OCI 経由の Oracle ODBC 経由の MS SQL Server ASCII、dBase、および Microsoft Access の各データ ソースはサポートされていません。 リモート データベースでの Date および DateTime のサポート MapXtreme がサポートしているすべてのデータ型を、リモート データベースがサポートしてると は限りません。次の表は、ネイティブ TAB ファイルおよびサポートされている各データベースで サポートされている日付および時刻ベースの型を示しています。 開発者ガイド 181 Catalog とテーブル MapXtreme ネイティブ TAB ファイ ル Date Date Time Time DateTime DateTime ADO.NET Oracle (OCI) MS SQL Server Date DateTime DateTime DateTime リモート データベースのフィールドの戻り型および戻り値の変更 新しいデータ型が追加されたため、リモート データベースのフィールドの戻り型および戻り値に いくつかの変更が発生しました。次の表は、各リモート データベースでサポートされている型に 対応する、MapXtreme 6.7.x および MapXtreme 6.8 のフィールドの戻り型および戻り値を示してい ます。 サーバ / データ型 MapXtreme 6.7.x フィールドの戻り型 / 戻り値 MapXtreme 6.8.0 * フィールドの戻り型 / 戻り値 SQL Server/DateTime† Date/System.DateTime DateTime/System.DateTime Oracle/TimeStamp Date/System.DateTime DateTime/System.DateTime Oracle/Date Date/System.DateTime Date/MapInfo.Data.Date * † v 6.8.0 以降に適用。 SQL Server 2005 以前の場合。 以降の各セクションでは、MI_Key、MI_Geometry、および MI_Style フィールド情報について説明 します。 MI_Key すべてのテーブルに MI_Key という名前の擬似フィールドがあります。このフィールドは Key のイ ンスタンスを返します。MI_Key 擬似フィールドは、MapInfo Professional および MapBasic の rowid 擬似フィールドと根本的にはよく似ています。rowid とは異なり、このフィールドは数値フィール ドではありません。Key インスタンスは、文字列リテラルと相互に変換することもできます。 MI_Geometry テーブル、フィーチャ、またはフィーチャ コレクション内の Geometry フィールド オブジェクトに は FeatureGeometry オブジェクトが含まれており、フィールドの座標系、Geometry フィールドに含 まれる全ジオメトリの境界全体などのプロパティを指定します。 ほとんどの種類のテーブルについて、ジオメトリ フィールドには "Obj" という名前が付いていま す。旧バージョンの MapX と MapInfo Professional との互換性を保つため、エイリアス "Obj" はテー ブル内の最初の GeometryColumn に解決されます。また、エイリアス "MI_Geometry" はどのテーブ ルでも使用でき、"Obj" が参照するフィールドと同じフィールドを参照します。 182 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 MI_Style Geometry フィールドを持つテーブルは、"MI_Style" という名前のフィールドも持っています。こ のフィールドが見つからない場合は、MIDbType.Style 型の最初のフィールドに設定されます。この フィールドは、Geometry オブジェクトのスタイル情報の格納に使用されます。スタイル情報に は、ポリゴンのライン幅、ポイントのシンボル サイズなどがあります。このフィールドを単独で 更新することはできません。Style フィールドと Geometry フィールドは、同時に更新する必要があ ります。 MI_Style フィールドは、MapInfo のネイティブ形式 (.TAB) のテーブルを開くときに自動的に作成さ れます。それ以外の種類のテーブルの場合は、このフィールドを明示的に作成する必要がありま す。MapInfo.Data.ColumnFactory.CreateStyleColumn を使用すると、"MI_Style"という名前 (エイリア ス) で MIDbType.Style データ型のフィールドが作成されます。 MISQL を使用してテーブルに行を挿入する場合は、insert ステートメントに必ず MI_Style フィール ドを含めてください。次のコード例を参照してください。 Table tab = MapInfo.Engine.Session.Current.Catalog.GetTable("MapViewer"); TableInfo ti = TableInfoFactory.CreateTemp("Test", ((MapInfo.Data.GeometryColumn)tab.TableInfo.Columns["Obj"]).CoordSys); Table tabTemp = MapInfo.Engine.Session.Current.Catalog.CreateTable(ti); MIConnection conn = new MIConnection(); conn.Open(); MICommand comm = conn.CreateCommand(); comm.CommandText = "Insert Into " + tabTemp.Alias + " (Obj, MI_Style) SELECT MI_Point(MI_X(Obj), MI_Y(Obj), '" + ((MapInfo.Data.GeometryColumn)tab.TableInfo.Columns["Obj"]).Coord Sys.SrsString + "'), MI_Style" + " FROM " + tab.Alias + " WHERE msaname = 'Minneapolis-St.Paul, MN-WI' AND Not Obj = Null"; MessageBox.Show(comm.CommandText); int numChanged = comm.ExecuteNonQuery(); mapControl1.Map.Layers.Add(new FeatureLayer(tabTemp)); mapControl1.Map.SetView(mapControl1.Map.Layers["Test"] as FeatureLayer); Catalog (カタログ) Catalog は、実質的 に MapXtreme のデータ アクセス モデルを管理します。Catalog には、現在 MapXtreme セッションで開いているテーブルのリストが含まれます。テーブルは、Catalog から開 いたり、作成したり、閉じたりすることができます。Catalog は、その実際のデータ ソースとは無 関係に、開いているテーブルをすべて格納した単一のデータベースと考えることができます。 各 MapXtreme Session は、1 つの Catalog を管理します。 Catalog には、最初はテーブルが一切含まれていません。テーブルを開いたときに、エイリアス (名 前) がそのテーブルに割り当てられられるか、または呼び出し側によって提供されます。エイリア スは、クエリなどの操作でテーブルを識別する際に使用します。 テーブルには、マップ作成可能で空間成分を持つテーブルと、マップ作成不可でデータ フィール ドだけを持つテーブルとがあります。MapXtreme Catalog は、両方のタイプのテーブルを開くこと ができ、開いたテーブルをクエリや結合で使用できます。 開発者ガイド 183 Catalog とテーブル また、Catalog には、新しいテーブル定義を作成したり、現在開いているテーブルを列挙したりす るための機能も用意されています。さらに、Catalog には、開いているテーブル内のデータへのア クセスに使用する検索メソッドが入っています。 Catalog には、テーブルやそこに格納されているデータの選択、挿入、更新、削除を可能にする SQL エンジンが備わっています。この SQL エンジンにより、カタログに定義されているテーブル の結合が可能となります (Native から SQLServer、または SQLServer から Oracle など)。各種ソース からの統合は Catalog によって自動的に処理されるため、ユーザが処理する必要はありません。こ れは、各種のデータ ソースから必要なデータを取り出して再編成するような場合に、きわめて強 力な手段です。 MapXtreme Catalog は、MapInfo ADO.NET データ プロバイダを介して公開されます。テーブルおよ び結果セットへのアクセスは、このインターフェイスを介して制御されます。「208 ページの 「MapInfo ADO.NET データ プロバイダ」」を参照してください。 コード サンプル 次の例では、MapXtreme Session オブジェクトから Catalog にアクセスする方法、テーブルを開く方 法、Catalog 内のすべてのテーブルの列挙および Catalog 内の編集可能なテーブルのみの列挙を行う 方法を示します。 VB の例: Public Shared Sub MapInfo_Data_Catalog() ' Catalog is accessible off the Session object Dim catalog As Catalog = Session.Current.Catalog ' Open a bunch of tables Dim table As Table = catalog.OpenTable("States.tab") table.SessionInfo.ReadOnly = True ' Make states ReadOnly table = catalog.OpenTable("world.tab") table = catalog.OpenTable("worldcap.tab", "World Capitals") ' Enumerate the catalog directly - includes All tables Dim t As Table For Each t In catalog Console.Out.WriteLine("Table : {0}", t.Alias) Next Console.Out.WriteLine() ' Now enumerate through only tables that are editable (not ReadOnly) Dim tEnum As ITableEnumerator = _ catalog.EnumerateTables(TableFilterFactory.FilterEditableTables()) While tEnum.MoveNext() Console.Out.WriteLine("Table: {0}", tEnum.Current.Alias) End While Session.Current.Catalog.CloseAll() End Sub 184 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 サポートされているテーブルの種類 MapXtreme の持つ優れた特徴の 1 つは、アクセスできるデータの豊富さです。つまり、多彩な データ形式を扱うことができるという点です。MapXtreme でサポートされているテーブルの種類 を次に示します。 MapInfo .TAB 形式 MapInfo ネイティブ テーブル形式。 このファイル ベースのテーブルには、FeatureGeometry 情報と Style 情報を 含む .MAP ファイルが関連付けられている場合があります。非空間データ は .DAT ファイルに格納されます。TAB は、キャッシュ用のストレージ形 式として利用できます。192 ページの「新しいテーブルの作成」を参照し てください。 dBase dBase ファイルに格納されたデータ。 テーブルには、FeatureGeometry 情報と Style 情報を含む MAP ファイルが 関連付けられている場合があります。非空間データは .DBF ファイルに格 納されます。関連する .IND ファイルには、非空間属性値 (文字列、数 値、および日付) の B ツリー インデックスが 1 つ以上含まれています。 ASCII デリミタ付き .CSV ファイルまたはテキスト ファイルに格納されたデー タ。文字列の最大長は 255 文字 (最大 2 つの二重引用符を含む)。ASCII テーブルでは、Insert のみ行うことができます。 テーブルには、FeatureGeometry 情報と Style 情報を含む MAP ファイルが 関連付けられている場合があります。非空間データは .CSV ファイルまた は .TXT ファイルに格納されます。 MS Access Microsoft Access データベース テーブル。 Microsoft Access .MDB データベース内に存在するファイル ベースのテー ブルで、FeatureGeometry 情報と Style 情報を含む .MAP ファイルが関連付 けられている場合があります。非空間データは Access ファイルに格納さ れます。 Shapefile ESRI Shapefile テーブル。 読み取り専用のテーブルで、3 次元ジオメトリ (X, Y, Z, M) をサポートし ま す。非 空間属性データは .DBF ファイル形式で保 存されます。 FeatureGeometry の値は、ESRI .shp ファイル形式で格 納されます。 MapXtreme は空間インデックスにはアクセスできません。キャッシュは .MAP ファイルとしてサポートされ、一時的または永続的です。永続的な キ ャ ッ シ ュは、MapInfo Professional と共有でき ます。これは TableInfoShapefile クラスの PersistentCache プロパティで制御されます。 開発者ガイド 185 サポートされているテーブルの種類 MemTable 非空間属性データのインメモリ ストレージ。 FeatureGeometry データおよびインデックスはディスクに格納されます。 これらは一時テーブルであるため、テーブルを閉じるとすべてのデータ が破棄されます。MemTable はシリアライズ可能です。データをワークス ペース内に永続化することもできます (データのみ可能。キーは再読み込 み時に変更される場合があります)。この種類のテーブルは、キャッシュ 用のストレージ形式として利用できます。MemTable に相当する .TAB ファイルはありません。「194 ページの「一時 MemTable の作成」」を参 照してください。 RDBMS サーバ リモート データベース管理システム (SQL Server や Oracle) に格納される 空間テーブル。 テーブルの定義は、ネイティブ SQL SELECT ステートメントで行いま す。クエリの解析や修正は MapXtreme によって実行されます。デフォル トではキャッシュが有効になります。サポートされているプロトコル ( ツ ー ル キ ッ ト) としては、OCI (Oracle Spatial) や ODBC (SQL Server、 SpatialWare、 XY) があります。「第 12 章、231 ページの「DBMS のデー タへのアクセス」 」を参照してください。 サポートされている RDBMS のリストについては、第 2 章: 「はじめに」 を参照してください。 ADO.NET ADO.NET DataTable または IDbCommand に基づいた非空間データのテー ブル。 この種類のテーブルは、プロバイダ固有の実装を持った、さまざまな データ プロバイダをサポートしています。固有のデータ プロバイダがサ ポートされていない場合は、より汎用的な ADO.NET を選択することにな ります。ADO.NET は接続型 (IDBCommand) と非接続型 (DataTable) の両方 の ADO.NET モデルをサポートするように設計されています。IDBTable は読み取り専用です。キャッシュが強制的に適用される場合があります ( 暗黙的なキー)。DataTable は編集することができ、実行時のシリアライ ゼーションがサポートされています。「198 ページの「ADO.NET データ プロバイダの使用」」を参照してください。 ラスタ ラスタ イメージを含むテーブル。 一般に、他の空間型テーブルのベース マップを提供します。テーブルに は、単 一 の レ コードと固定フィールド スキーマのみが存 在します (RasterInfo、MI_Geometry、MI_Style)。こ れ ら の テ ー ブ ル は、空 間 述 語 ("within" など) を使用して、ベクトル テーブルと結合できます。「第 18 章、337 ページの「ラスタとグリッドの操作」 」を参照してください。 186 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 グリッド グリッド イメージを含むテーブル。 他の空間型テーブルのベース マップを提供します。テーブルには、単一 の レ コ ー ド と固定フィールド スキーマのみが存在します (GridInfo、 MI_Geometry、MI_Style)。これらのテーブルは、空間述語 ("within" など) を使用して、ベクトル テーブルと結合できます。GridRead クラスを使用 す る こ と で、グリッド セルの値にアクセ スできます。 MapInfo.Raster.GridCreatorFromFeatures クラスは、補間機能を使用してグ リッドを作成します。「第 18 章、337 ページの「ラスタとグリッドの操 作」 」を参照してください。 WMS WMS (Web Map Service) からのイメージを含むテーブル。 他の空間型テーブルのベース マップを提供します。テーブルには、単一 の レ コ ー ドと固定フィールド スキーマのみが存在します (GridInfo、 MI_Geometry、MI_Style)。これらのテーブルは、空間述語 ("within" など) を使用して、ベクトル テーブルと結合できます。WMS テーブルは、 MapInfo.Wms.WmsClient を使用することで動的ラスタのようにアクセスで きます。「第 20 章、371 ページの「Web Map Service」 」を参照してくだ さい。 シームレス 複数のベース テーブルを連続する地形と組み合わせたテーブル。単一の マップ レイヤとして表示されます。 シームレス テーブルは、空間クエリ専用に調整されています。たとえ ば、マップの描画時には、シームレス テーブルを使用することで、最適 なコンポーネント テーブルを検索できます。通常、シームレス テーブル を構成するコンポーネント テーブルは、ベクトルまたはラスタになりま す。これらのコンポーネント テーブルはすべて同じスキーマを共有して いることが必要であり、 読み取り専用です。基本となるコンポーネント テーブルを直接変更することはできません。ソート操作や集計操作で は、すべてのコンポーネント テーブルのすべてのレコードが調査されま す (ベクトル テーブルを使用した場合、著しくパフォーマンスが低下する 可能性があります)。 ビュー (サーバ テーブルがサポートするネイティブ SQL ではなく) MapInfo SQL Select ステートメントをベースとするビュー。「204 ページの「ビュー テーブル」」を参照してください。 ResultSet 検索の結果を含んだテーブル。ResultSet は IResultSetFeatureCollections で のみ使用されます。「204 ページの「結果セット」」を参照してくださ い。 開発者ガイド 187 カタログとテーブルの操作 カタログとテーブルの操作 このセクションでは、以下のような基本的なテーブル操作について説明します。 • • • • 「開いているテーブルの検索」 「テーブルを閉じる」 「テーブルを圧縮する」 「テーブル イベントとカタログ イベントのリッスン」 『MapXtreme 開発者リファレンス』の「MapInfo.Data.Table クラス」も参照してください。 開いているテーブルの検索 開いているテーブルを検索するには、カタログを列挙する必要があります。カタログを列挙する には、以下のセクションのメソッドを使用します。 Catalog.GetTable MapInfo.Data.Catalog.GetTable メソッドは、TableAlias パラメータによって参照される Table オブ ジェクトを返します。これは既に開いているテーブルである必要があります。開いているテーブ ルが見つからなかった場合 (またはその後テーブルが閉じられた場合) は、このメソッドは null を 返します。 Catalog.Item (インデクサ) MapInfo.Data.Catalog.Item プロパティは、Alias によって Table を検索するためのインデクサとして 使用できます。これは、機能的には Catalog.GetTable メソッドを使用するのと同じですが、さらに 読みやすいコードが生成されます。Alias には、既に開いているテーブルを指定する必要がありま す。 VB の例: Public Shared Sub MapInfo_Data_Catalog2() Dim tbl As Table For Each tbl In Session.Current.Catalog System.Console.WriteLine("Table: " + tbl.Alias) Next End Sub TableEnumerator オーバーロードされたさまざまな EnumerateTables メソッドを使用してテーブルの列挙子を取得で きます。フィルタを使ってテーブルの列挙子を作成する場合もあります。列挙子は列挙体のメカ ニズムを提供しているにすぎませんが、フィルタは実際にどのテーブルが列挙体に含まれている かを判断します。ユーザ独自のテーブル フィルタを作成して、TableEnumerator で使用することも できます。ITableEnumerator インターフェイスをインプリメントして、ユーザ独自のテーブル列挙 子を作成することもできます。 188 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 VB の例: Public Shared Sub MapInfo_Data_Catalog3(ByVal catalog As Catalog) Dim te As ITableEnumerator = _ catalog.EnumerateTables(TableFilterFactory.FilterEditableTables()) While te.MoveNext() Dim tbl As Table = te.Current End While End Sub テーブルを閉じる テーブルを閉じるためには、3 つのメソッドを使用できます。MapInfo.Data.Catalog.CloseAll は開い ているすべてのテーブルを閉じ、Catalog.CloseTable は開いているテーブルを 1 つ閉じます。Close メソッドは Table クラスにも存在します。 テーブルを圧縮する MapInfo.Data.Table.Pack メソッドは、削除対象として指定されているレコードをテーブルから取り 除きます。テーブルが圧縮されるときに、テーブルの TablePacked イベントが発生します。このイ ベントの引数は、圧縮の結果、テーブルのキーが変更されたかどうかを示します (削除されたレ コ ー ド が 取 り 除 か れ た 場 合 に 発生します)。キーが変更されるのは、PackType に RemoveDeletedRecords が含まれる場合、および削除されたレコードがテーブルの途中にある場合に 限ります。削除されたレコードがテーブルの最後にある場合、キーは変更されません。キーの変 更がイベントによって通知されることもありません。 注意 ResultSet テーブルはキーのコレクションを保持しているため、元のテーブルが圧縮された 場合には注意が必要です。キーが変更された場合、ResultSet の無効になります。 PackType Enumeration には、以下のオプションがあります。 • • • 開発者ガイド PackGeometry - ジオメトリ オブジェクトが圧縮されることを示します。オブジェクトを圧縮す ると、未使用領域が可能な限り削除されます。RTree (ジオメトリ オブジェクトへの空間的なア クセスで使用する空間インデックス) を完全に圧縮すると、不必要な読み取りが数多く行われ るため、パフォーマンスが低下する可能性があります。ディスク空き領域と処理速度のバラン スを取るため、ジオメトリ オブジェクトの圧縮では、一部の未使用領域が RTree に残される場 合があります。また、RTree を圧縮すると、挿入および更新の操作によってわずかなパフォー マンス ペナルティが発生します。これらの操作では、RTree を解凍する必要性が高くなるため です。 RebuildGeometry - ジオメトリ オブジェクトを再構築すると、一連の挿入、更新、または削除の 操作によって生じた未使用領域が削除されます。ジオメトリ オブジェクトの圧縮とは異なり、 このオプションでは、RTree インデックス内に未使用領域を意図的に残すことによって、将来 の挿入および更新の操作のパフォーマンスを向上させます。 PackIndex - 非空間インデックスは B* ツリーとして維持されます。このツリー構造に、値が格 納された内部ノードまたはリーフ ノードが常にあるとは限りません。これは、インデックスの 大幅な再構成を行わなくても挿入および更新の操作を行えるようにするためのデフォルトの処 置です。未使用領域は、挿入、更新、または削除の操作によって必要以上に消費される場合が あります。インデックスを完全に圧縮すると、すべての内部ノードおよびリーフ ノード (最後 のノードを除く) が圧縮されます。このオプションによって、インデックスによって使用され 189 カタログとテーブルの操作 • • • • るディスク空き領域が最小限に抑えられ、インデックスの読み取りパフォーマンスも向上しま す。完全に圧縮されたインデックスに対して挿入および更新の操作を行うと、パフォーマンス ペナルティが発生します。 RebuildIndex - インデックスの再構築では、PackIndex オプションのような内部ノードとリーフ ノードの完全圧縮は行いません。その代わりに、インデックス用に確保した未使用領域を使用 してインデックスを作成し直すことによって、ディスク空き領域、読み取りパフォーマンス、 および変更パフォーマンスのバランスを取ります。変更操作を複数回行った後では、インデッ クスにかなりの未使用領域が含まれる場合があります。このオプションによって、その未使用 領域が再取得されます。 RemoveDeletedRecords - MapInfo Native および dBase を含む一部のデータ ソースでは、削除され たレコードが物理的に取り除かれることはありません。削除されたレコードを物理的に取り除 くには、このオプションを指定してテーブルを圧縮する必要があります。一般に、レコード番 号は、これらのデータ ソースの種類のレコード キーとして使用されます。削除されたレコー ドをテーブルから取り除くと、キーが無効になる場合があります。これは、圧縮の結果、キー が変更される場合があるからです。 CompactDb - テーブルのデータ ソースが Microsoft Access (Access の TableType) の場合、テーブ ルのデータを含む MDB ファイルは、Pack メソッドでこのオプションを指定して圧縮すること もできます。 All - これは、PackGeometry | PackIndex | RemoveDeletedRecords に相当する便利なオプションで す。 テーブル イベントとカタログ イベントのリッスン テーブルは、アプリケーションがサブスクライブできるイベントをいくつか公開しています。デ フォルト設定を以下に示します。 • • • • • • • RowInsertedEvent - テーブルに新しい行が追加されたときに発生します。 RowUpdatedEvent - テーブル内の既存の行が更新されたときに発生します。 RowDeletedEvent - テーブル内の行が削除されたときに発生します。 TablePackedEvent - テーブルが圧縮されたときに発生します。 TableCloseRequestEvent - テーブルを閉じるよう求められたときに発生します。 TableIsClosingEvent - テーブルが閉じられるときに発生します。 TableClosedEvent - テーブルが閉じられたときに発生します。 また、カタログは以下のイベントを公開しています。 • • • 190 TableOpenedEvent - テーブルが開かれたときに発生します。 TableCreatedEvent - 新しいテーブルが作成されたときに発生します。 TableIsClosingEvent - テーブルが閉じられるときに発生します。 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 テーブル メタデータ (TableInfo) MapInfo.Data 名前空間の TableInfo クラスは、以下のような、既存のテーブルに関する情報または メタデータを含んだ抽象ベース クラスです。 • • • フィールド - 番号、名前、データ型など テーブルのエイリアス、および、データ ソースの説明とパス名 クライアント メタデータ (TAB ファイル内の begin_metadata/end_metadata タグ間の情報) TableInfo は、テーブルを開いたり、新しいテーブルを作成したりするときに使用します。また、 開いているテーブルに関する情報を取得するときにも使用できます。 TableInfo から派生したクラスには、プロバイダ固有のメタデータが含まれています。MapXtreme がサポートしているすべての種類のテーブルには、TableInfo がインプリメントされています。 「196 ページの「データ ソース」」を参照してください。 TableInfo のインスタンスは手動で作成できるほか、次のように .TAB ファイル定義から (テーブル を開かずに) 作成することもできます。 TableInfo.CreateFromFile(Åc) TableInfo には、テーブル サービスを有効にするためのプロパティがあります (キャッシュ機能を使 用したり、空間スキーマを介してテーブルをマップ作成可能にしたりするなど)。「第 12 章、244 ページの「キャッシュの設定」 」および「205 ページの「テーブルをマップ作成可能にする」」を 参照してください。 Table Metadata Columns TableInfo Alias TableType TableInfoAdoNet TableInfoAscii TableInfodBase TableInfoGrid TableInfoNative TableInfoMemTable TableInfoMSAccess TableInfoRaster TableInfoResultSet TableInfoSeamless TableInfoServer TableInfoShapefile TableInfoView TableInfoWms Column Metadata CacheParameters SpatialSchema SpatialSchemaXY SpatialSchemaPointRef Alias MIDbType GeometryColumn CoordSys Bounds DefaultView MapXtreme では、M 値と Z 値のテーブル フィールド メタデータをサポートしています。あるデー タ プロバイダのジオメトリが 3D および測定値をサポートできるかどうかを、個々のジオメトリを 評価せずに知りたい場合に、この機能は役立ちます。 テーブルのメタデータには、テーブルの TableInfo プロパティからアクセスできます。そのテーブ ル メタデータから GeometryColumn にアクセスし、テーブルが M 値や Z 値をサポートするかどう か、および、範囲がわかっている場合はそのテーブルの値の範囲を調べることができます。M 値 と Z 値のサポートの詳細については、第 17 章、322 ページの「M 値と Z 値のサポート」 を参照し てください。 開発者ガイド 191 テーブル メタデータ (TableInfo) TAB ファイル メタデータの検証 TAB ファイル メタデータは、アクセスしたり編集したりできます。テーブル構造に関する情報を 取得するには、Table から TableInfo クラスを取得します。 次のコードは、開いているテーブルのメタデータを取得する方法を示しています。また、ジオメ トリ フィールドを使用して座標系とテーブルの境界を調べる方法も示しています。M 値と Z 値を 返すコード例については、『開発者リファレンス』の MapInfo.Data.TableInfo を参照してくださ い。 VB の例: Public Shared Sub MapInfo_Data_TableInfo2() ' Get the metadata for an open table Dim ti As TableInfo = Session.Current.Catalog("states").TableInfo ' Print out some information to the console Console.Out.WriteLine("Table Alias={0}, Datasource={1}, _ Description={2}, Type={3}", _ ti.Alias, ti.DataSourceName, ti.Description, ti.TableType) ' Print out some information about each column Dim col As Column For Each col In ti.Columns Console.Out.WriteLine("Column {0} Type={1} Width={2}", _ col.Alias, col.DataType, col.Width) ' If the column is a geometry column, print csys and bounds. If col.DataType = MIDbType.FeatureGeometry Then Dim geocol As GeometryColumn = col Dim csys As MapInfo.GeomeTry.CoordSys = geocol.CoordSys Console.Out.WriteLine("CSys : {0}", csys.MapBasicString) Dim dr As MapInfo.GeomeTry.DRect = geocol.Bounds Console.Out.WriteLine("Bounds=({0},{1}),({2},{3})", dr.x1, _ dr.y1, dr.x2, dr.y2) End If Next End Sub 新しいテーブルの作成 以 下 の セク シ ョ ン で は、永 久 ネ イ テ ィブ テーブル、一時ネイティブ テーブル、および一時 MemTable の作成方法について説明します。 新しい永久ネイティブ テーブルの作成 MapInfo ネイティブ テーブルの MapInfo.Data.Table.TableInfo プロパティは、TableInfoNative のイン スタンスを返します。ネイティブ テーブルは、MapInfo .TAB ファイルです。このクラスを使用し て、ネイティブ テーブルに固有のプロパティにアクセスできます。このクラスの新しいインスタ ンスを作成し、これを使用して新しいテーブルを作成できます。また、「196 ページの「データ ソース」」も参照してください。 192 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 ColumnFactory クラスの使用方法に注意してください。このクラスを使用すると、データ型ごとに 必要な引数を確認することができます。たとえば、ジオメトリ フィールドには座標系が必要で す。 VB の例: Public Shared Sub MapInfo_Data_TableInfoNative() Dim ti As TableInfoNative = New TableInfoNative("NewTable") ti.TablePath = "c:\data\Capitals.TAB" ti.Columns.Add(ColumnFactory.CreateIndexedStringColumn("Capital",_ 25)) ti.Columns.Add(ColumnFactory.CreateStringColumn("Country", 30)) ti.Columns.Add(ColumnFactory.CreateDoubleColumn("Pop_Grw_Rt")) ' Make the table mappable ti.Columns.Add(ColumnFactory.CreateStyleColumn()) Dim Robinson As CoordSys = _ Session.Current.CoordSysFactory.CreateFromPrjString("12, _ 62, 7, 0") ti.Columns.Add(ColumnFactory.CreateFeatureGeometryColumn(Robinson)) ' Note we do not need to (nor should we) add a column of type Key. ' Every table automatically contains a column named "MI_Key". Dim table As Table = Session.Current.Catalog.CreateTable(ti) End Sub 一時ネイティブ テーブルの作成 VB の例: Public Shared Sub MapInfo_Data_TableInfo3(ByVal conn As MIConnection) Dim ti As TableInfoNative = New TableInfoNative("NewTable") ti.Temporary = True Dim col As Column col = New Column col.Alias = "FString30" col.DataType = MIDbType.String col.Indexed = True col.Width = 30 ti.Columns.Add(col) col = New Column col.Alias = "FInt32" col.DataType = MIDbType.Int col.Indexed = True ti.Columns.Add(col) col = New Column col.Alias = "FInt16" col.DataType = MIDbType.SmallInt col.Indexed = True ti.Columns.Add(col) 開発者ガイド 193 テーブル メタデータ (TableInfo) col = New Column col.Alias = "FDouble" col.DataType = MIDbType.Double ti.Columns.Add(col) col = New Column col.Alias = "FDateTime" col.DataType = MIDbType.Date ti.Columns.Add(col) col = New Column col.Alias = "FBoolean" col.DataType = MIDbType.Boolean ti.Columns.Add(col) ' Note we do not need to (nor should we) add a column of type Key. ' Every table automatically contains a column named "MI_Key". Dim miTable As Table = conn.Catalog.CreateTable(ti) End Sub 一時 MemTable の作成 MapInfo.Data.Table.TableInfo プロパティは、TableInfoMemTable のインスタンスを返します。このク ラスを使用して、メモリ テーブルに固有のプロパティにアクセスできます。このクラスの新しい インスタンスを作成し、これを使用して新しいテーブルを作成できます。 Web サービスから返された XML や GML などの形式のデータは、この方法で Catalog に格納して使 用できます。MapXtreme API を介して、MultiPolygon、LineString、Point などのジオメトリに変換 することが可能です。このジオメトリは、MapXtreme によって FeatureCollection に変換され、さら に、memTable やネイティブの TAB 形式として保存されます。 このアプローチは、マップ表示には不要なデータを MapXtreme で利用できるようにしたい場合に も適しています。 MapXtreme は、MemTable へ の Z 値 と M 値の読み取りと書き込みをサポートしています。 MultiCurve で M 値を使用すると、線形参照操作と動的セグメント化を実行できます。第 22 章: 「線形リファレンス」を参照してください。 VB の例: Public Shared Sub MapInfo_Data_TableInfoMemTable() Dim ti As TableInfoMemTable = New TableInfoMemTable("NewTable") ' Note: The TablePath property does not apply - it can be set but it _ ' is meaningless. ti.Columns.Add(ColumnFactory.CreateIndexedStringColumn("Capital",_ 25)) ti.Columns.Add(ColumnFactory.CreateStringColumn("Country", 30)) ti.Columns.Add(ColumnFactory.CreateDoubleColumn("Pop_Grw_Rt")) ' Make the table mappable ti.Columns.Add(ColumnFactory.CreateStyleColumn()) Dim Robinson As CoordSys = _ Session.Current.CoordSysFactory.CreateFromPrjString("12, 62, _ 194 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 7, 0") ti.Columns.Add(ColumnFactory.CreateFeatureGeometryColumn(Robinson)) ' Note we do not need to (nor should we) add a column of type Key. ' Every table automatically contains a column named "MI_Key". Dim table As Table = Session.Current.Catalog.CreateTable(ti) End Sub テーブルへの式フィールドの追加 テーブルに式フィールドを追加するには、MapInfo.Data.Table.AddColumns メソッドを使用します。 この形式の AddColumns は、1 つの Columns オブジェクトを引数とし、関数、演算子、リテラル 値、およびテーブル内の他のフィールドから構成される式に基づいて一時的なフィールドを作成 します。columns 引数の Column のインスタンスすべてに文字列式が指定されている必要がありま す。 注意 Table.AddColumns は、Server、View、Seamless、AdoNet、ResultSet、および Drilldown の テーブルではサポートされていません。 MapXtreme によってテーブルの種類が検査され、 これらのいずれかの種類である場合には、例外がスローされます。 VB の例: Public Shared Sub MapInfo_Data_TableAddColumns(ByVal miTable As Table) Dim NewCols As Columns = New Columns NewCols.Add(New Column("PopDensity1990", "Pop_1990 / _ MI_Area(Obj, 'sq mi', 'Spherical')")) NewCols.Add(New Column("PopDensity2000", "Pop_2000 / _ MI_Area(Obj, 'sq mi', 'Spherical')")) miTable.AddColumns(NewCols) End Sub 文字列式 "Pop_1990 / MI_Area(Obj, 'sq mi', 'Spherical')" は、一時フィールドに格 納される派生情報を表しています。このコードは、「各レコードについて、平方マイルごとの領 域に人口を分割して、人口密度を作成する」ことを示しています。式内の SQL 関数 MI_Area() は、レコードのジオメトリから領域を派生させます。 結合が一回で済むような (ビューの場合のように、後続の各アクセスで結合を実行するのではない) デスクトップ アプリケーションでは、AddColumns メソッドを使用することでパフォーマンスが向 上する場合があります。 詳細およびコード例については、開発者リファレンス ヘルプで MapInfo.Data.Table.AddColumns ク ラスを参照してください。 式の作成の詳細については、「第 11 章: 「式の作成」」を参照してください。 開発者ガイド 195 テーブル メタデータ (TableInfo) データ ソース MapXtreme でサポートされているデータ ソースのリストを以下の表に示します。データ ソースに は、その種類に応じて特定のデータ プロバイダ (MapInfo.Data.TableInfo から派生した TableInfo ク ラス) を使ってアクセスします。各データ型の概要については、185 ページの「サポートされてい るテーブルの種類」を参照してください。 データ ソース クラス ネイティブ (MapInfo.TAB) TableInfoNative dBase TableInfodBase MS Access TableInfoMSAccess ASCII TableInfoAscii RSBMS サーバ TableInfoServer ESRI Shapefile TableInfoShapefile シームレス TableInfoSeamless ラスタ TableInfoRaster グリッド TableInfoGrid WMS TableInfoWMS ADONET TableInfoAdoNet MemTable TableInfoMemTable ビュー TableInfoView ResultSet TableInfoResultSet 正しいデータ ソースの選択 適切なデータ ソースを選択するかどうかで、アプリケーションのパフォーマンスに違いが現れま す。ネイティブの MapInfo ファイル (.TAB) など、他の選択肢がない場合もあれば、複数の選択肢 がある場合もあります。通常は、そのデータ ソースに対してサポートされたデータ プロバイダを 使用することになりますが、 そのいずれを使ってもデータにアクセスできない場合は、MapInfo ADO.NET データ プロバイダを使用することができます。これは、Catalog がデータを取得すると きに使用するデータ プロバイダでもあります。 これらのデータ ソースは、それぞれ異なるパフォーマンス特性を備えています。アクセス時間と マップの描画時間に最も優れているのは、ネイティブ テーブルです。データがシステムのローカ ルに保存されるため、高速なレスポンスが求められる操作に向いています。その他のファイル ベースのテーブルは、現在のハードウェアおよびファイル サイズによっては優れたパフォーマン スを提供します。 196 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 データへのアクセス方法 MapXtreme には、データを Catalog に取り込むための方法がいくつか用意されています。 • • • データ ソースへの直接アクセス ADO.NET データ プロバイダ (TableInfoAdoNet) を介したアクセス サード パーティの Web サービスから取得したデータ (XML/GML) を使用 デー タ に ア ク セ ス す る た め の 最 適な方法は、使用するデータ ソースに固有の、いずれかの TableInfo クラスを使用して直接データを開くことです。 内部的にサポートされていないデータでも、ADO.NET プロバイダが定義されていれば、2 つ目の 方法 (TableInfoAdoNet) を使用してアクセスできます。 3 つ目の方法では、XML または GML を返す HTTP サービスからのデータを Catalog に取り込むこ とができます。 データ ソースへの直接アクセス MapXtreme では、ファイル ベースのテーブル形式や RDBMS サーバ (SQL Server や Oracle など) に 格納されたデータに直接アクセスできます。ファイルベースのアクセスでは、適切な TableInfo イ ンスタンス (TableInfoNative、TableInfodBase、TableInfoMSAssess、TableInfoAscii) にパスとファイル 名を指定します。 RDBMS サーバに格納されたデータに直接アクセスする場合は、TableInfoServer クラスを使用し て、リ モ ー ト テ ー ブ ル に 対 す る 接続文字列および SQL ステートメントを定義できます。 MapXtreme は、内部的に ODBC または OCI を使用して、リモート データベースにアクセスしま す。 TableInfoServer により、サーバとの接続が確立され、テーブルのメタデータが照会されて、リモー ト サーバで定義された空間的特性に基づく適切なテーブル定義が作成されます。リモート データ を扱う場合、一般には、この方法で最も高いパフォーマンスを得ることができます。内部的に は、MapXtreme は 現 在 の 操 作 に必要なデータにしかアクセスしません。マップの描画時、 MapXtreme は、データ フィールドは取得せずに、ジオメトリ フィールドだけを取得するクエリを 作成します。これにより、ネットワーク トラフィックを最小限に抑えることができます。キャッ シュを有効にした場合、トラフィックが問題になるのは、初回アクセスだけで、それ以降のすべ てのリクエストは、キャッシュから取得されます。「第 12 章、231 ページの「DBMS のデータへ のアクセス」 」を参照してください。 ADO.NET データ プロバイダを介したアクセス データにアクセスする 2 つ目の方法として、ADO.NET データ プロバイダを使用した方法がありま す。この方法では、データを取得するための ADO.NET のクラスが定義されている必要がありま す。AdoNet テーブルとして使用できるのは、マップ作成不可のテーブルだけです。マップ作成不 可のテーブルとは、データに関するジオメトリ情報を持たないテーブルのことです。ただし、 ADO.NET プロバイダから取得したテーブルでも、SpatialSchema をテーブル定義に適用することに より、マップ作成可能にできます。この方法では、ユーザからデータが要求されるたびに、 MapXtreme DataAccess エンジンが ADO.NET データ プロバイダを呼び出します。そのため、デー タへのアクセスが遅くなる傾向があります。ただし、キャッシュと組み合わせて使用することに より、パフォーマンスを高めることが可能です。「198 ページの「ADO.NET データ プロバイダの 使用」」を参照してください。 開発者ガイド 197 テーブル メタデータ (TableInfo) サード パーティの Web サービスから取得したデータ MapXtreme では、Web サービスの出力 (XML または GML) を Catalog に追加して、MapXtreme のデ スクトップ アプリケーションまたは Web アプリケーションで使用できます。データを Catalog に 取り込み、MapXtreme API を介して、MultiPolygon、LineString、Point などのジオメトリに変換す ることが可能です。このジオメトリは、MapXtreme によって FeatureCollection に変換され、さら に、memTable やネイティブの TAB 形式として保存されます。 このアプローチは、マップ表示には不要なデータを MapXtreme で利用できるようにしたい場合に も適しています。 データ リーダー、MemTable、結果セット データにアクセスするメソッドでは、データ リーダーまたは結果セットが返されます。データ リーダーを使用することで、データに対してシーケンシャルにアクセスできます。データのコ ピーは保存されません。データはデータ ソースから取り出されます (データ ソースがキャッシュ されている場合を除く)。結果セットは、キーのコレクションです。これらのキーを使用すること で、元のテーブルにアクセスでき、データのコピーは作成されません。 MemTable では、各種のソースから取得したデータを、1 つのテーブルに保存することができま す。このタイプのテーブルでは、メモリ アレイと一時的なディスク ストレージを併用することに よってデータが保存されます。データが追加されると、MemTable は、元のテーブルを指し示す キーやポインタを保持するのではなく、データのコピーを作成します。マップの一時レイヤを保 存する場合や、処理で返された値 (ジオコード結果やルーティング結果) のコンテナとして使用す ることができます。MemTable におけるアクセス性能とマップのレンダリング パフォーマンスは、 ネイティブのテーブルと匹敵します。 結果セットは、定義された一連の行にアクセスしたり、データ ソースから特定のデータを取得し たりする必要がある場合の強力な手段となります。データ ソースが同時アクセスをサポートして いれば、取り出し元のデータがセッション中に変更された可能性がある場合、この方法を用いる ことで、結果を確認できます。MemTable はデータのコピーであるため、取得されたデータ行は不 変です。元のデータ ソースに対して行われた変更は反映されません。 ADO.NET データ プロバイダの使用 特定の TableInfo データ ソースで直接アクセスできないデータの場合、TableInfoAdoNet を使用でき ます。ADO.NET テーブルの形式は、DataTable (メモリ内に維持される単一テーブルの行の集合。 読み取りおよび書き込みアクセスが可能) または IDbCommand (データ ソースで実行される SQL ス テートメント。読み取り専用の動的データを生成する) のいずれかになります。 DataTable のデータへのアクセス DataTable の使用時、Catalog は、Catalog.OpenTable の呼び出し (TableInfoAdoNet クラスを使用) で指 定する DataTable への参照を保持します。DataTable は、Insert、Update、または Delete の各コマン ドを実行すると、MapInfo ADO.NET データ プロバイダを使用して編集できます。アプリケーショ ンでも DataTable に直接アクセスできます。ただし、Catalog がテーブルへの参照を保持している間 は、その構造を変更しないでください。また、MapInfo データ プロバイダの外部にあるデータに対 して変更を行っても (MICommand を使用せずに Insert、Update、または Delete の各コマンドを実行 する場合など)、テーブルの挿入、更新、または削除のテーブル イベントは発生しません。 198 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 DataTable には、Catalog がテーブルを定義するための十分な情報が含まれています。ただし、文字 列フィールドの場合、Catalog ではこのフィールドに対して長さを割り当てる必要があります。長 さは、データ集約用の一時インデックスや一時テーブルを作成するときに必要です。このような 操作では、文字列の長さを正しく指定することが重要です。DataColumn には MaxLength プロパ ティがあります。このプロパティを設定して、フィールドが保持できる文字列の最大長を指定す る必要があります。最大長を設定しなかった場合、この値はデフォルトで -1 に設定され、実際に は 254 の値が使用されます。Catalog は MaxLength プロパティを確認する前に、DataColumn のプロ パティが "StringWidth" という名前で ExtendedProperties コレクションに定義されているかどうかを 確認します。定義されている場合は、このプロパティの値がフィールドの幅として使用されま す。 次の例では、データが DataTable に格納される MapInfo テーブルの作成方法を示します。 VB の例: Public Shared Sub MapInfo_Data_TableInfoAdoNet(ByVal connection As _ MIConnection) ' Create a new DataTable. Dim dt As DataTable = New DataTable("CityData") Dim dc As DataColumn dc = dt.Columns.Add("City", Type.GetType("string")) dc.MaxLength = 30 dc = dt.Columns.Add("Country", Type.GetType("string")) dc.MaxLength = 30 dc = dt.Columns.Add("Continent", Type.GetType("string")) dc.MaxLength = 30 dc = dt.Columns.Add("Population", Type.GetType("string")) ' Populate the DataTable... dt.Rows.Add(New Object() {"Madrid", "Spain", "Europe", 1500000}) dt.Rows.Add(New Object() {"Stockholm", "Sweden", "Europe".985000}) ' Now open a MapInfo Table which accesses this DataTable Dim ti As TableInfoAdoNet = New TableInfoAdoNet("Cities") ti.ReadOnly = False ti.DataTable = dt Dim table As Table = connection.Catalog.OpenTable(ti) End Sub ADO.NET オブジェクトの保存と復元 ここでは、MapXtreme で ADO.NET テーブルを保存したり復元したりするための手順を紹介してい ます。基本となる System.Data.DataTable の復元に伴う制約上、ADO.NET テーブルの明示的なシリ アライゼーション/デシリアライゼーションはサポートされません。ADO.NET テーブルは、 MapInfo.Data.TableInfoAdoNettable オブジェクトを使って作成された Catalog 内のテーブルです。 ADO.NET ベースの MapInfo テーブルをシリアライズ/デシリアライズするには、SaveState メソッド を使用します。まず、ADO.NET テーブルを参照するすべてのテーブル (ViewTables や結合など) を シ リ ア ラ イ ズ し た 後、ADO.NET テーブルを閉じます。RestoreState メソッドでは、ADO.NET MapInfo テーブルを同じ名前で再作成した後、そのテーブルに依存するすべての MapInfo テーブル をデシリアライズします。この順番に注意してください。まず、ADO.NET テーブルを作成した後 で、それ以外のテーブルを復元する必要があります。 開発者ガイド 199 テーブル メタデータ (TableInfo) MapXtreme Web アプリケーションで手動による状態管理を行う場合、クライアント リクエスト間 で ADO.NET テーブルを保存したり復元したりするには、以下の手順に従います。 注意 以下に示した手順は、DataTable から作成された ADO.NET テーブルを想定しています。 1. MapInfo.WebControls.StateManager.SaveState メソッドで次の処理を行います。 a. ADO.NET の DataTable または DataSet を HTTPSession インスタンスに格納します。 b. ADO.NET テーブルに依存する MapInfo.Data.TableInfoView テーブルまたは MapInfo.Data.TableInfoResultSet テーブルを、 ManualSerializer.SaveMapXtremeObjectIntoHttpSession を使って保存します。 c. Catalog 内の ADO.NET テーブルを閉じます。 2. MapInfo.WebControls.StateManager.RestoreState メソッドで次の処理を行います。 a. HTTPSession インスタンスから取得した DataTable を基に新しい TableInfoAdoNet オブジェク トを作成します。 b. カタログ内の新しい ADO.NET テーブル (元のオブジェクトと同じ名前の TableInfoAdoNet オブジェクト) を開きます。 c. この ADO.NET テーブルに依存する MapInfo.Data.TableInfoView テーブルまたは MapInfo.Data.TableInfoResultSet テーブルを、 ManualSerializer.RestoreMapXtremeObjectFromHttpSession を使用して復元します。 テーブルとその依存関係をすべて適切に作成するためには、保存と復元の順序がきわめて重要で す。シリアライゼーションの詳細については、「第 6 章、105 ページの「状態管理について」 」を 参照してください。 IDbCommand を使用したデータへのアクセス ADO.NET テーブルの第 2 の形式は、ADO.NET の接続オブジェクト タイプである Connection、 Command、および DataReader に基づいています。この方法で作成された MapInfo テーブルは読み 取り専用です。これらのテーブルは、Catalog に IDbCommand オブジェクトを渡すことによって作 成されます。このオブジェクトは、テーブルを構成するすべてのデータが返されるように構成さ れています。テーブルを初めて作成するときは (Catalog.OpenTable を呼び出して)、IDbCommand に 対して ExecuteReader が呼び出されます。生成されるデータ リーダーを使用して、フィールドとそ のデータ型が判断されます。それ以降のすべてのカーソル リクエストでも (キー フェッチと呼ば れる、特定のレコードを取得するカーソル以外のカーソル)、ExecuteReader を呼び出してカーソル の条件を満たすデータをフェッチします。この方法は非効率的な場合があります。可能な場合 は、他の種類のテーブルを使用してデータにアクセスしてください。 コマンドベース形式の ADO.NET テーブルは、一般的なインターフェイスを使用し、インターフェ イスの特定のインプリメントに関する具体的な知識がなくても使用できるように設計されている ので、テーブルは IDbCommand.CommandText が標準 SQL の形式であると見なしません。実際には SQL ではない場合もあります。この種類のテーブルは、CommandText に対してアクセス、解析、 または変更を行いません。つまり、この種類のテーブルには、結果内のどのフィールドが一意 の、null でないキー値を構成しているかを判断するメカニズムがありません。この種類のテーブル では、どのフィールドがキーを構成しているかを明示する必要があります。明示するには、 KeyType を Explicit として指定し、KeyColumns プロパティを設定します。 MapInfo データ プロバイダの内部には、キーを使用して特定のレコードを取得する必要のある操作 (キー フェッチとも呼ぶ) が数多くあります。簡単な例では、MI_Key = '5' の形式の where 句を含む Select ステートメントがあります。ここでは、MI_Key フィールドを文字列リテラル "5" で表すこ とのできるレコードを取得する必要があります。キーの取得は、マッピングの選択、ラベル付 け、および MIScrollableReader でのスクロール (この場合、リーダーはキー値のリストをスクロー 200 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 ルします) で頻繁に行われます。MapInfo テーブルは、キー値を使用してレコードを効率的に フェッチする機能に依存しています。コマンド ベース形式の ADO.NET テーブルが、テーブルを 定義する IDbCommand オブジェクトの CommandText の読み取り、解析、または変更を行わないの と同様に ("シーケンシャルな" IDbCommand)、MapInfo テーブルも IDbCommand オブジェクトを変 更して特定のレコードをフェッチする機能はありません。したがって、この目的のために、2 つ目 の IDbCommand オブジェクトを指定する必要があります。"FetchByKey" IDbCommand オブジェク トは、以下の要件を満たす必要があります。 • このコマンド オブジェクトに対して ExecuteReader を呼び出したとき、それに続くコマンド オ ブジェクトと同じフィールドを同じ順番で持つデータ リーダーが生成される必要があります。 FetchByKeyCommand には Parameters コレクションと、キーのメンバごとに 1 つのパラメータが 含まれている必要があります。たとえば、TableInfo.KeyColumns で "city" フィールドと "state" フィールドで構成されるキーを指定した場合、FetchByKeyCommand には 2 つのパラメータ オ ブ ジ ェ ク ト が 含 ま れ て い る 必要があります。1 つ目のパラメータ オブジェクトには TableInfo.KeyColumns コレクションで指定した 1 番目のフィールドを表す値 ("city" の値など) が 割り当てられ、2 つ目のパラメータ オブジェクトには TableInfo.KeyColumns コレクションで指 定 し た 2 番 目 の フ ィ ー ルドを表す値 ("state" の値など) が割り当てられます。 FetchByKeyCommand に対して ExecuteReader を呼び出したとき、リーダーは指定されたキーを 表すレコードを返す必要があります。 • 次の例では、ADO.NET に接続されたコマンド オブジェクトを通じてデータにアクセスする MapInfo テーブルの作成方法を示します。 VB の例: Public Shared Sub MapInfo_Data_TableInfoAdoNet2(ByVal connection _ As MIConnection) Dim ti As TableInfoAdoNet = New TableInfoAdoNet("EuropeanCities") Dim _conn As OleDbConnection = New _ OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data _ Source=C:\Data\EuropeCities.mdb") Dim selectQuery As String = "SELECT City, Country, Continent, _ Pop_1994 FROM EuropeCities" Dim _OleDbCommand As OleDbCommand = New OleDbCommand(selectQuery) _OleDbCommand.Connection = _conn selectQuery = selectQuery + " where City = @City AND _ Country = @Country" Dim _OleDbKeyCommand As OleDbCommand = New _ OleDbCommand(selectQuery) _OleDbKeyCommand.Parameters.Add("@City", OleDbType.Char) _OleDbKeyCommand.Parameters.Add("@Country", OleDbType.Char) _OleDbKeyCommand.Connection = _conn ' ' ' ' The MapInfo Table will Open/Close the connection as necessary. If this is expensive the application could open the connection before opening the table and closing the connection after the table is closed. ti.SequentialCommand = _OleDbCommand ti.FetchByKeyCommand = _OleDbKeyCommand ' Tell the table which column(s) constitute a key - for this table ' it is acompound key consisting of values from the City and County 開発者ガイド 201 テーブル メタデータ (TableInfo) ' columns. Dim sc As StringCollection = New StringCollection sc.Add("City") sc.Add("Country") ti.KeyColumns = sc ti.KeyType = KeyType.Explicit ' Ask the Catalog to open the table. Dim tbl As Table = connection.Catalog.OpenTable(ti) ' Now the MICommand object may be used to select data from the table ' (by the name EuropeanCities since that is the alias we assigned to ' it).The data in thistable may be joined with any other table and ' it may be used as source data in a call to AddColumns to populate ' temporary columns with data from this table. End Sub データ バインド データ バインドとは、データをデータ ソースから MapXtreme に格納する処理のことをいいます。 外部データ (ADO.NET やその他のレガシー ソース) の MapInfo.Data.Table へのデータバインドは、 TableInfoAdoNet を使用して ADO.NET DataTable を Table として開くことによって実現します。 テーブルは別のテーブルと結合したり、そのテーブル自体と結合したり、Table.AddColumns を使 用してフィールドを別のテーブルにバインドしたりできます。 テーブルをそのテーブル自体と結合するには、次の例のように指定します。 Select ... From T as A, T as B Where A.X = B.Y DataTable に格納されているデータまたは ADO.NET データ プロバイダを通じてアクセスできる データがアプリケーションに含まれる場合は、Catalog からそれらのデータにアクセスし、MapInfo テーブルとして扱うことができます。この方法は、その他の種類のテーブルからデータにアクセ スできない場合に使用すると特に便利です。 たとえば、データが dBase ファイルや Microsoft Access テーブルに格納されている場合、または ODBC インターフェイスや Oracle の OCI インターフェイスからアクセスできる場合は、これらの TableInfo タイプを使用してデータにアクセスすることをお勧めします。これらの種類のテーブル か ら ア ク セ ス で き な い デ ー タ で も、DataTable に読み込んだり、Command、Parameter、および DataReader の各オブジェクト タイプをインプリメントしている一部の ADO.NET データ プロバイ ダを通じてアクセスしたりできる場合は、Catalog からアクセスできます。 アプリケーションでは、クエリを実行してデータをその他の MapInfo テーブル データと結合でき るようにするため、データを MapInfo ネイティブ テーブルとして使用できるようにすることが必 要な場合があります。また、Table.AddColumns の呼び出しでソース データとして使用できるよう にするために、Catalog からアクセス可能にすることが必要な場合もあります。 202 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 コード例: Oracle テーブルのデータを結合する方法 public Shared Sub MapInfo_Data_TableAddColumns5(ByVal map As Map) Dim Connection As MapInfo.Data.MIConnection = New _ MapInfo.Data.MIConnection Connection.Open() 'Add the USA table to the map map.Load(New _ MapInfo.Mapping.MapTableLoader("C:\\maps\\usa.TAB")) Dim lyr As MapInfo.Mapping.FeatureLayer = map.Layers("usa") ' Open the table from Oracle Dim ti As TableInfoServer = New TableInfoServer("StateCapXY",_ "SRVR=tempest;UID=tn;PWD=tn", "Select * from usa_caps", _ MapInfo.Data.ServerToolkit.Oci) Dim StateCapXY As Table = Connection.Catalog.OpenTable(ti) ' Add the Oracle columns to the USA table Dim states As Table = Connection.Catalog.GetTable("usa") states.AddColumns(Nothing, MapInfo.Data.BindType.Static, _ StateCapXY, "state", MapInfo.Data.Operator.Equal, "state") 'Create a ranged theme on the USA layer using a field 'from the Oracle table Dim thm As MapInfo.Mapping.Thematics.RangedTheme = New _ MapInfo.Mapping.Thematics.RangedTheme(lyr, _ "pop_1990", "popusa", 4, _ MapInfo.Mapping.Thematics.DistributionMethod.EqualCount_ PerRange) lyr.Modifiers.Insert(0, thm) 'Create a legend to appear on the map Dim legend As MapInfo.Mapping.Legends.Legend = _ map.Legends.CreateLegend(New Size(5, 5)) legend.Border = True Dim frame As MapInfo.Mapping.Legends.ThemeLegendFrame = _ MapInfo.Mapping.Legends.LegendFrameFactory.CreateTheme_ LegendFrame(_"Pop", "pop", thm) legend.Frames.Append(frame) frame.Title = "pop" map.Adornments.Append(legend) End Sub 開発者ガイド 203 テーブル メタデータ (TableInfo) ビュー テーブル ビューを使ってテーブルを関連付ける方法もあります。名前付きの Select ステートメントに基づい て 1 つまたは複数のテーブルから情報を取り出すことができます。Catalog では、任意のテーブル 定義に基づいてビューを作成できます。ビュー テーブルは、次のような特徴を持ちます。 • • • • • • • データはコピーされません。 ビューにアクセスすると、実際にはベース テーブルが参照されます。 ビューとは、名前 (エイリアス) 付きの MapInfo SQL Select ステートメントです。 通常は結合クエリが使用されます (複合キーが形成される)。 ビューの構成内容は絶えず変化します。 データを集約してキャッシュするビューは例外です。データの変化を示すイベントによって再 計算がトリガされます。 シリアライズしてワークスペースに永続化できます。 詳細およびコード例については、開発者リファレンス ヘルプで MapInfo.Data.TableInfoView クラス を参照してください。 結果セット ResultSet とビュー テーブルは、いずれも MapInfo SQL Select ステートメントを使って定義される 点、および、名前 (エイリアス) が関連付けられるという点で似ています。しかし、ResultSet は、 その作成時に指定された where 句 (指定された場合) の評価に基づいてレコードの構成内容が固定 されます。ResultSet 内のデータに対するアクセスは、常に元のテーブルのデータに反映されま す。ただし、取り出し元のデータを変更しても、元の where 句が再評価されて、ResultSet にレコー ドが追加されたり、ResultSet からレコードが削除されたりすることはありません。ResultSet では 一連のキーが内部的に管理されます。 一般に、ResultSet は軽量かつ一時的であるという特性を備えています。結果セットの特徴として は、次のようなことが挙げられます。 • • • • • • • データはコピーされません。 ResultSet にアクセスすると、実際にはベース テーブルが参照されます。 ResultSet は、キーを並べ替えたリスト、一連のフィールド定義、および名前から成ります。 ResultSet の構成内容は不変です。 データを集約してキャッシュする ResultSet は例外です。データの変化を示すイベントによって 再計算がトリガされます。 シリアライズすることはできますが、ワークスペースに永続化することはできません。 削除操作や圧縮操作に弱いという欠点があります。 詳細については、開発者リファレンス ヘルプで MapInfo.Data.TableInfoResultSet クラスを参照して ください。 ソース行 ソース行は、Table.AddColumns に関連するテーブル レコード間の一致を表します。一時フィール ドをテーブルに追加するときに、データ ソースの複数のレコードがまとめて集計され、追加先の テーブル (バインド テ ー ブ ル とも呼ばれます) の各レコードの値を計算します。 MapInfo.Data.SourceRows クラスは SourceRows のコレクションであり、集計されたレコードを、 データ ソースから識別します。 204 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 SourceRows は、BindType プロパティが DynamicCopy (ソース データに対する変更が一時フィール ドに自動的に反映される) の場合にのみ存在します。 注意 Table.AddColumns は、Server、View、Seamless、AdoNet、ResultSet、および Drilldown の テーブルではサポートされていません。 また、「195 ページの「テーブルへの式フィールドの追加」」も参照してください。 GeoDictionary GeoDictionary は、マップ エンティティと情報の対応付けに関する情報が格納されています。 GeoDictionaries ク ラ ス は、GeoDictionary オブジェクトのコレクションです。 MapInfo.Data.GeoDictionary 名前空間は、GeoDictionary ファイルをプログラムで記述することによ り、データの自動バインドをサポートします。GeoDictionary ファイルには、テーブルに関する情 報が入っています (TAB ファイルのみ)。GeoDictionary を使用して、テーブルをどのアプリケー シ ョ ン デ ー タ に バ イ ン ド す るか、自動的に判断します。GeoDictionary はファイル ( 通常 GeoDict.DCT) に永続化され、GeoDictionary マネージャ ユーティリティ アプリケーションを使用し て保持されます (「第 25 章: 「GeoDictionary マネージャの使用」」を参照)。 GeoDictionary を使用する自動比較処理 Data.GeoDictionary 名前空間の MatchResolver.AutoMatch メソッドが自動比較処理を開始します。こ のメソッドは AddColumns を呼び出しません。つまり、バインドは行いません。BindColumn の以 降の呼び出しでは、自動バインドまたは AutoMatchAndBind の直接呼び出しを実行する必要があり ます。 自動比較処理中に、あいまいな状況に対処しなければならないことがあります。このような状況 には、以下のような場合があります: • • • ユーザ データで複数のソース フィールドが検出されている。 ソース フィールドに一致する複数のテーブル/レイヤが検出されている。 一致したテーブル/レイヤで複数の Geoset/ワークスペースが利用できる。 比較処理中 GeoDictionary と通信する MatchResolver は、こうした状況を解決に導きます。このクラ スは一致アルゴリズムを提供します。基本クラスが、最初の一致、つまり一致率が一番高いもの を選択します。このクラスはシールド クラスではありません。クライアント アプリケーション は、このクラスから独自の派生クラスを作成して、その動作をオーバーライドします。 テーブルをマップ作成可能にする テーブルには、マップ作成可能 (GeometryColumn を含む) テーブルとマップ作成不可 (空間属性 デ ー タ な し) テ ー ブ ル が あ り ま す。マップ作成可能テーブルは、マップ内のレイヤとして MapXtreme アプリケーションに追加できます。顧客データのようなマップ作成不可テーブルも、 GeometryColumn を 作 成 す る と マップ作成可能にすることができます。これを行うために、 MapXtreme では空間スキーマが用意されています。 空間スキーマとは、テーブルの空間機能を拡張することができるサービスです。空間スキーマに は XY と PointRef の 2 種類があります。X 値および Y 値を表す属性フィールド (緯度と経度など) を持つマップ作成不可テーブルでは SpatialSchemaXY が使用され、マップ作成可能テーブルのレ コードの参照に使用できる属性フィールドを持つテーブルでは SpatialSchemaPointRef が使用されま す。 開発者ガイド 205 テーブル メタデータ (TableInfo) SpatialSchemaXY SpatialSchemaXY は、テーブル内の各レコードの X 値と Y 値を使用してポイント オブジェクトを 構築し、それらを MI_Geometry という一時フィールドに格納します。この空間スキーマは、シー ムレス、ビュー、および ResultSet を除く任意のデータ ソースのテーブルに適用できます。 GeometryColumn を持たせることにより、テーブルをマップ内のレイヤとして表示し、空間分析に 使用することができます。 SpatialSchemaXY は、次のような特徴を持ちます。 • • • • ジオメトリ フィールドは編集可能です。 ジオメトリを編集すると、X 値と Y 値が自動的に更新されます。 テーブル内の各ポイントにスタイルを定義できます。 空間情報は TAB ファイルとして保存し、他のテーブルと同じように開くことができます。 この空間スキーマは、従来のサーバの XY データに MapCatalog なしで使用できます (MapCatalog を使用した場合、より多くの処理をサーバ側で実行できるため、RDBMS のパフォーマンスが向上 します。「第 12 章、246 ページの「MapInfo_MapCatalog」 」を参照してください)。 TableInfo.WriteToTab メソッドを使って TAB ファイルに明示的に出力しない限り、MI_Geometry は 一時フィールドになります。テーブルを開くとスキーマが自動的に生成されます。 VB の例: Public Shared Sub MapInfo_Data_SpatialSchemaXY() Dim ti As TableInfo = _ TableInfo.CreateFromFile("c:\data\customers.TAB") ' a non-mappable table Dim xy As SpatialSchemaXY = New SpatialSchemaXY xy.XColumn = "Xcoord" xy.YColumn = "Ycoord" xy.NullPoint = "0.0, 0.0" ' Any customer at 0,0 means we don't know their location. xy.StyleType = StyleType.None xy.CoordSys = _ Session.Current.CoordSysFactory.CreateLongLat(DatumID.WGS84) ti.SpatialSchema = xy ' Now set the spatial schema information before ' opening the table. Dim table As Table = Session.Current.Catalog.OpenTable(ti) End Sub Public Shared Sub MapInfo_Data_TableInfoNative2(ByVal ti As _ TableInfoNative) ti.WriteTabFile() End Sub SpatialSchemaPointRef この空間スキーマは、テーブル データの値をマップ作成可能テーブル内の対応する値と比較する ことによって、Point ジオメトリ オブジェクトを作成します。 たとえば、顧客テーブルに郵便番号付きの住所が格納されている場合、その顧客レコードを、郵 便番号参照テーブル内の空間ポイントに関連付けることができます。 206 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 SpatialSchemaPointRef では、実際には 2 つのテーブル (データの格納されているテーブルと結合 フィールド/オブジェクト フィールドが格納されているテーブル) が結合されます。この結合 フィールドには、マップ作成不可テーブル内のデータ フィールドと同じ値が格納されます (郵便番 号など)。SpatialSchemaPointRef を適用した結果のテーブルには、以前の非空間レコードに対する 空間ジオメトリ フィールドが存在することになります。このジオメトリ フィールドは、次のよう な特徴を持ちます。 • データ テーブルが、ジオメトリ テーブルの複数のレコードと一致する場合があります。その 場合、類似する行が MultiPoint ジオメトリに集約されます。 このフィールドに格納されるジオメトリは、他のテーブルから得られたジオメトリの中心点に なります。 • SpatialSchemaPointRef は、次のような特徴を持ちます。 • • 一時ジオメトリ フィールドは読み取り専用です。 参照テーブル内の値に変更を加えると、データ テーブルのジオメトリ値が自動的に更新されま す。 SpatialSchemaPointRef は、シームレス、ビュー、および ResultSet を除く任意のデータ ソースに 適用できます。 テーブル内の各ポイントにスタイルを定義できます。 テーブル情報は TAB ファイルとして保存し、他のテーブルと同じように開くことができます。 • • • 詳細およびコード例については、開発者リファレンス ヘルプで MapInfo.Data.SpatialSchemaPointRef クラスを参照してください。 VB の例: Public Shared Sub MapInfo_Data_SpatialSchemaPointRef(ByVal _ map As _Map) ' a non-mappable table Dim ti As TableInfo = _ TableInfo.CreateFromFile("c:\data\customers.TAB") Dim pr As SpatialSchemaPointRef = New SpatialSchemaPointRef pr.CoordSys = map.GetDisplayCoordSys() pr.StyleType = StyleType.None pr.RefTable = "us_zips" ' the column in RefTable which will match the MatchColumn in my data pr.RefColumn = "zipcode" ' a column in the Customer table pr.MatchColumn = "zip" pr.RefTableLocation = "c:\data\us_zips.tab" ' Now set the spatial schema information before opening the table. ti.SpatialSchema = pr Dim table As Table = Session.Current.Catalog.OpenTable(ti) End Sub 開発者ガイド 207 MapInfo ADO.NET データ プロバイダ MapInfo ADO.NET データ プロバイダ MapXtreme は、ADO.NET を使用して、テーブルからレコード セットを返す SQL コマンドを発行 するメカニズムを備えています。MapInfo ADO.NET データ プロバイダは、このような方法で .NET アプリケーションのデータにアクセスするメカニズムの 1 つです。Catalog に対して Feature クラス と SearchInfo メソッドを使用する方法もあります。詳細については、「212 ページの「Feature と Feature コレクション」」を参照してください。 MapInfo ADO.NET データ プロバイダ MIConnection MIDataReader Catalog Read GetValue Close Open Close MICommand MIScrollableReader CommandText Cancel Dispose ExecuteReader ExecuteScrollableReader ExecuteNonQuery ExecuteFeatureCollection Prepare Columns ReadPrevious Rewind Unwind Parameters MIParameter ParameterName Value 以下の各セクションでは、MapInfo ADO.NET データ プロバイダを通してデータにアクセスするた めの主要なインターフェイスとクラスについて説明します。 • • • • 「MIConnection」 「MICommand」 「MIDataReader」 「MapInfo SQL」 MIConnection MIConnection は、Catalog への接続を表します。接続は、SQL コマンドを実行し結果を取得するた めの開始点を提供します。ほとんどの場合、データ プロバイダの接続で、ユーザは既存のテーブ ル (スキーマ オブジェクト) に対して直ちにクエリなどのコマンドを実行できますが、MapInfo ADO.NET データ プロバイダには、最初の段階ではテーブルが含まれていません。テーブルへのア クセス時に、テーブルを開くか作成する必要があります。テーブルを開くときに、クエリ エンジ ンで識別子を解決するときに使用するテーブルに、名前 (エイリアス) を関連付けることができま す。 MapInfo データ プロバイダでは接続がプールされません。また、新しい接続の作成に必要とされる 接続文字列はありません。 MapInfo.Engine.Session ク ラ ス が、Session.Current.Catalog プロパティを使用してアクセスする Catalog を 作 成 お よ び 初 期 化 し ま す。この Catalog への参照を MIConnection.Open メソッドが Session.Current.Catalog プロパティを使用して取得します。MIConnection.Close メソッドは Catalog への内部参照を null に設定します。 VB の例: Public Shared Sub MapInfo_Data_MIConnection() Dim connection As MIConnection = New MIConnection Dim command As MICommand = connection.CreateCommand() command.CommandText = "Select * From States Where Pop > 1000000" 208 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 connection.Open() Dim reader As MIDataReader = command.ExecuteReader() Dim i As Integer, n As Integer = reader.FieldCount For i = 0 To n - 1 Step i + 1 Console.Out.Write("{0}\t", reader.GetName(i)) Next Console.Out.WriteLine() While reader.Read() For i = 0 To n - 1 Step i + 1 Dim o As Object = reader.GetValue(i) If o Is DBNull.Value Then Console.Write("null\t") Else Console.Write("{0}\t", o.ToString()) End If Next Console.Out.WriteLine() End While reader.Close() command.Dispose() connection.Close() End Sub MICommand MICommand には、MapInfo データ プロバイダに対して SQL コマンドを実行するために必要なイン ターフェイスが用意されています。MICommand は、ExecuteReader メソッドでデータを取得するた めに MIDataReader インスタンスを、ExecuteScrollableReader メソッドでデータを取得するために MIScrollableReader インスタンスを作成します。 サポートされているコマンド MICommand コマンドによって解釈されるコマンドを以下に示します。 Select SELECT < select_list > FROM { < table_source > } [ ,...n ] [ WHERE < search_condition > ] [ GROUP BY expression [ ,...n ] ] [ ORDER BY {expression | column_position [ ASC | DESC ] } [ ,...n ]] < select_list > ::= { * | { table_name | table_alias }.* | { expression } [ [ AS ] column_alias ] } [ ,...n ] < table_source > ::= table_name [ [ AS ] table_alias ] 開発者ガイド 209 MapInfo ADO.NET データ プロバイダ Insert INSERT [INTO] { table_name } [ ( column_list ) ] { VALUES ({expression | NULL}[, ...n]) | query_specification Update UPDATE { table_name } SET {{ column_name } = { expression | NULL }} [, ...n] [WHERE < search_condition > ] Delete DELETE [FROM] { table_name } [ WHERE < search_condition > ] < search_condition > ::= { [ NOT ] < predicate > | ( < search_condition > ) } [ { AND | OR } [ NOT ] { < predicate > | ( < search_condition > ) } [ ,...n ] ] < predicate > ::= { expression [ { = | < > | != | > | >= | < | <= } expression ] | string_expression [ NOT ] LIKE string_expression [ ESCAPE 'escape_character' ] | expression [ NOT ] BETWEEN expression AND expression | expression IS [ NOT ] NULL } expression フィールド名、擬似フィールド、フィールド エイリアス、定数、関数のいずれか、または、演算 子 (複数可) で結ばれたフィールド名、フィールド エイリアス、定数、および関数の組み合わせ。 フィールド名および擬似フィールドの先頭には、テーブル名またはテーブル エイリアスに続いて ドット (".") 文字が付きます。 group_by_expression 選択リストの中のフィールドへの参照です。選択リストの式、エイリアス、フィールドの位置を 示す数値 (1 を基準にしたもの)、または COLn (n はフィールドを表す数値) のいずれかとまったく 同じものになります。 order_by_expression 選択リストの中のフィールドへの参照です。選択リストの式、エイリアス、フィールドの位置を 示す数値 (1 を基準にしたもの)、または COLn (n はフィールドを表す数値) のいずれかとまったく 同じものになります。 使用されている位置や作成方法など、式の作成の詳細については、「212 ページの「Feature と Feature コレクション」」を参照してください。 ExecuteFeatureCollectionexecutefeaturecollection MICommand クラス内の ExecuteFeatureCollection メソッドは、MapInfo ADO.NET データ プロバイダ と Feature オブジェクト モデルのブリッジです。このメソッドは、データ ソース接続に対してコマ ンド テキスト (SQL ステートメント) を実行し、IResultSetFeatureCollection を構築します。Feature モデルについては、「212 ページの「Feature と Feature コレクション」」を参照してください。 210 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 MIDataReader MIDataReader では、SQL Select ステートメントを実行して返されたデータに対して、前方向のみ、 かつ読み取り専用でアクセスできます。MIDataReader を作成するには、コンストラクタを直接使 用するのではなく MICommand オブジェクトの ExecuteReader メソッドを呼び出します。 MapInfo データ プロバイダを使用すると、1 つの接続で複数の MIDataReader インスタンスを使用 できます。ただし、アクセス対象の Table が Microsoft SQL Server データベースにある場合は、1 つ の MIDataReader しか一度に開くことはできません。 IsClosed プロパティと RecordsAffected プロパティは、MIDataReader が閉じた後でなければ呼び出 せません。RecordsAffected プロパティについては、MIDataReader が存在していればアクセス可能 です。ただし、正確な値を取得するには、RecordsAffected の値を取得する前に必ず Close を呼び出 す必要があります。 MIDataReader を使い終わったら、Close メソッドを明示的に呼び出す必要があります。 IEnumerator インターフェイスまたは IFeatureEnumerator インターフェイスを使用して DataReader に アクセスするとき、MoveNext() が false を返すと、Close() が自動的に呼び出されます。なお、 DataReader では 1 つの列挙子しか使用できません。 注意 MIDataReader は、パフォーマンス上の理由から不必要なオブジェクトや不必要なデータの コピーはできるだけ作成しないようにしています。その結果、GetValue などのメソッドへ の複数の呼び出しが、同じオブジェクトへの参照を返すことがあります。GetValue などの メソッドによって返された、オブジェクトの基本となる値を変更するときは、特に注意を 払う必要があります。 MIDataReader は、MapInfo データ プロバイダからの前方向ストリーム行の読み取りを可能にしま す。このタイプのカーソルは、セットアップに伴うオーバーヘッドがほとんど発生しないため、 選択された一連の行にアクセスする目的では最も高いパフォーマンスを発揮します。 スクロール可能データ リーダー MIScrollableReader は MIDataReader から派生し、前方向および逆方向の読み取りを行うことができ ます。MIScrollableReader で使用できるオプションには、次のものがあります。 • • • • • • ReadPrevious Rewind Unwind ReadTop ReadBottom AtTop / AtBottom 注意 開発者ガイド MIScrollableReader を作成すると、MIDataReader を作成するよりも大きな負荷がかかりま す。スクロールが可能であるという反面、セットアップに伴うオーバーヘッドが発生する ほか、レコードの順序を追跡するために余分なリソースが必要となるため、最も負荷の大 きいカーソルと言えます。レコード セットをスクロールする必要がある場合以外は使用し ないでください。 211 Feature と Feature コレクション MapInfo SQL MapInfo SQL 言語を使用すると、MapXtreme アプリケーションに強力な分析機能を追加できます。 MapXtreme で は、デー タ (特 に 「MICommand」 オブジェクト) アクセス用の SQL 処理機能を MapInfo ADO.NET データ プロバイダによってユーザに公開します 。式は、ラベル付け、主題図、 凡例、AddColumns、Feature 検索、および Selection 処理にも使用されます。 MapInfo SQL は、SQL-3 仕様に基づいて標準化されています。たとえば、次の点が挙げられます。 • • • 文字列定数は、一重引用符で囲みます。 識別子は、二重引用符で囲むことができます。 Select は、Selection と関係ありません。 95 MapInfo SQL 言語とコード例については、Visual Studio のヘルプシステムから直接表示できる 「MapInfo SQL リファレンス」を参照してください。 Feature と Feature コレクション MapXtreme の Feature クラス オブジェクト モデルは、SQL ベース以外のアプローチでデータへの アクセスと操作を行います。このセクションでは、Feature クラスと IFeatureCollection インター フェイスについて説明します。Feature での作業で最も重要なのは、クエリ定義オブジェクトを使 用して Feature を検索する能力です。 Features と Feature コレクション IFeatureCollection Alias Add Remove MultiFeatureCollection Feature Key Geometry Style MultiResultSetFeatureCollection GmlFeatureCollection MIGmlFeatureCollection フィールド IDynamicFeatureCollection FeatureCollection ITableFeatureCollection IResultSetFeatureCollection B Feature Feature は、ジオメトリ、スタイル、データ ソース、キー、および属性で記述されています。通 常、Feature はテーブル内の行です。Feature のジオメトリは、FeatureGeometry オブジェクトです。 FeatureGeometries は、指 定 し た 領 域 (MultiPolygon)、位置 (Points, MultiPoints)、および距離 (MultiCurves, LegacyArcs) を覆います。FeatureGeometry から派生する追加の Geometry クラスには、 FeatureGeometryCollection と LegacyText があります (Rectangle、RoundedRectangle、および Ellipse オブジェクトも FeatureGeometry から派生しますが、基本的に見た目をよくする目的で使用されま す)。 コンピュータ処理されたマップの主な用途の 1 つとして、Feature に関する情報を収集するという ことがあります。MapXtreme では、スキーマを使って新規に作成する方法、選択ツールやメソッ ドを使って選択する方法、条件に基づいて Catalog を検索する方法など、いずれの方法でもフィー チャは FeatureCollections で返されます。 212 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 Load メソッドを使用すると、Load を実行できます。Feature に加えられた変更を基本となるテーブ ル (存在する場合) に反映させるには、Feature をテーブルに保存する必要があります。Feature を テーブルに保存するには、Update メソッド、UpdateFeature、または InsertFeature を使用します。 Feature オブジェクトに対する編集は、保存前であれば DiscardEdits メソッドを使用してすべて破棄 することができます。 Feature には、Feature の属性を記述するスキーマがあります。そのスキーマは、Columns プロパ ティによって記述されます。 Table から Feature を取得 Table は Feature コレクションの種類の 1 つです。したがって、テーブル内の Feature は直接列挙で きます。以下に例を示します。 VB の例: Dim ftr As Feature For Each ftr In table ... テーブルに対するデフォルトの列挙子は、次のコマンドで MIDataReader を内部的に使用します。 command.CommandText = "Select MI_Key, * From \"" + table.Alias + "\""; テーブル内の Feature のサブセットを取得するには、Catalog.Search メソッドの 1 つを使用するか、 または MICommand.ExecuteFeatureCollection メソッドの 1 つを使用します。 Table 内の Feature を修正 テーブル内の Feature を修正するには、次のメソッドの 1 つを使用します。 • • • Feature.Update Table.UpdateFeature Table.InsertFeature Feature コレクション Feature コレクション は、Feature オブジェクトのグループです。コレクション内のすべての Feature は、同じ Schema (フィールド) を共有します。Feature コレクションは、そのメンバ Feature のすべ てのインスタンスのスキーマとなるスキーマを持っています。Feature コレクションによっては独 自の Feature を持つものがあり、また他の Feature コレクションには Feature への参照を保持するも のがあります。 Feature の検索 Pitney Bowes Business Insight のマッピング アプリケーションの最も共通性の高いタスクの 1 つに、 特定の条件を満たす Feature の検索があります。必要な Feature を取得したら、主題図など、より一 層の分析を実行できます。MapXtreme では、Feature の検索は、ツールの使用、Catalog 検索メソッ ドの使用、または SQL および MapInfo ADO.NET データ プロバイダの使用など、いくつかの方法 で実行できます。 開発者ガイド 213 Feature と Feature コレクション 同じ対象 (この例ではニューヨーク州内の市) を検索する 2 つの方法を、次のコード例に示しま す。 // Using SQL command.CommandText = "Select Obj From States Where state = 'NY'; FeatureGeometry nyGeom = command.ExecuteScalar() as FeatureGeometry; command.CommandText = "SELECT * FROM Cities WHERE Obj within @newyork"; command.Parameters.Add("@newyork", nyGeom); MIDataReader reader = command.ExecuteReader(); // orÅc to get a FeatureCollection IFeatureCollection fc = command.ExecuteFeatureCollection(); // Using Features Feature fNY = catalog.SearchForFeature("States", _ SearchInfoFactory.SearchWhere("state='NY'")); SearchInfo si = SearchInfoFactory.SearchWithinFeature(fNY, _ ContainsFilter.ContainsType.Centroid); IDynamicFeatureCollection dfc = _ catalog.Search("Cities", si) as IDynamicFeatureCollection; Console.Out.WriteLine( _ "There are {0} cities whose centroid is within NewYork." _ dfc.Count); SQL 検索については、「208 ページの「MapInfo ADO.NET データ プロバイダ」」でさらに詳しく 説明します。以降の各セクションでは、Catalog と SearchInfo を使用する検索を中心に説明しま す。 Catalog 検索メソッド Catalog には、いくつかの検索メソッドがメンバとして含まれています。オーバーロードされた Search メソッドを使用すると、1 つ以上のテーブルを検索できます。これらのメソッドに異なる引 数を指定すると、一意な検索を行うことができます。たとえば、基本的な Search(Table, SearchInfo) は、指 定さ れ た テ ー ブ ル を 検 索 し、FeatureCollection を返します。Search(ITableEnumerator, SearchInfo) メソッドは、複数のテーブルで検索を実行し、MultiResultSetFeatureCollection を返しま す。 SearchForFeature メソッドは、検索結果から最初の Feature を返します。SearchReader メソッドは、 検索結果と共に MIDataReader カーソルを返します。 コード サンプル: SearchForFeature 次の例では、Catalog.SearchForFeature および Catalog.SearchWithinGeometry の使用方法について示し ます。ここでは、uscty_1k テーブル内で、Florida にあるすべての都市を検索します。この例は、 テーブル "usa" および "uscty_1k" が開いており、1 つのマップがあることを前提としています。 214 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 VB の例: Public Shared Sub MapInfo_Data_SearchInfo(ByVal catalog As Catalog) Dim fFlorida As Feature = _ catalog.SearchForFeature("usa",MapInfo.Data._ SearchInfoFactory.SearchWhere_("State='FL'")) Dim si As SearchInfo = MapInfo.Data.SearchInfoFactory.SearchWithinGeomeTry(fFlorida._ Geometry,ContainsType.Centroid) Dim fc As IResultSetFeatureCollection = _ MapInfo.Engine.Session.Current.Catalog.Search("uscty_1k",si) ' Set the map view to show search results MapInfo.Engine.Session.Current.MapFactory(0).SetView(fc.Envelope) ' Set the view of the first map. ' Add results to selection. MapInfo.Engine.Session.Current.Selections.DefaultSelection.Add(fc) End Sub SearchInfo と SearchInfoFactory MapInfo.Data.SearchInfo クラスは、検索と検索結果に対して必要となる後処理で使用するクエリを 定義しています。 SearchInfoFactory は SearchInfo オブジェクトを作成します。SearchInfoFactory には、検索場所への 空間的参照を使用する検索や、画面に描画されるジオメトリを使用する検索を可能にする検索メ ソッドがいくつか含まれています。 SearchInfoFactory 検索メソッドを、次の表に示します。 SearchInfoFactory メソッド 動作 SearchAll すべての行を返します。 SearchNearest 指定した検索ポイントに一番近いテーブル ジオメトリの行を返し ます。 SearchWhere where 句で指定された行を返します。 SearchWithinDistance テーブル ジオメトリが検索ポイント、長方形、またはジオメトリ の距離内に含まれている行を返します。このメソッドでは、オブ ジ ェ ク ト が 検 索 範 囲 の 内 に あ る か 外 に あ る か の 判 別 に、 Geometry.Distance メソッドが使用されます。以前の SearchWithinDistance では、距離をバッファにしてそのバッファ内 を検索していたため、結果の正確性が低くなっていました。 SearchWithinFeature テーブル ジオメトリが検索フィーチャのジオメトリに含まれてい る行を返します。 開発者ガイド 215 Feature と Feature コレクション SearchInfoFactory メソッド 動作 SearchWithinGeometry テーブル ジオメトリが検索ジオメトリに含まれている行を返しま す。 SearchWithinRect 指定した長方形とテーブル ジオメトリが交差する行を返します。 SearchIntersectsFeature テーブル ジオメトリと検索フィーチャのジオメトリが交差する行 を返します。 SearchIntersectsGeometry テーブル ジオメトリと検索ジオメトリが交差する行を返します。 SearchWithinScreenRadius 画面上の円とテーブル ジオメトリが交差する行を返す SearchInfo を作成します。 SearchWithinScreenRect 指定した画面上の長方形とテーブル ジオメトリが交差する行を返 します。 MapXtreme には、Search サンプル アプリケーションが同梱されてます。このアプリケーションを 実行すると、各検索についての理解を深めることができます。以下の図は、空間的な参照を使用 する SearchInfoFactory メソッドが表示される [Search] メニューです。Map の [Search] メニューから は、描画された画面上のジオメトリ オブジェクト (円と長方形) に基づいて検索を実行することが できます。[QueryDefinition] メニューでは、SQL ステートメントに対して機能する、使用されてい る フ ィ ル タ が 強 調 表 示 さ れ ま す。こ の サ ン プ ル は、 ..\MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features\Search フォルダにあります。 216 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 コード サンプル このセクションでは、SearchInfoFactory メソッドに関連するコード サンプルをいくつか示します。 SearchNearest このコードは、SearchNearest メソッドを使用して Select Point ツールの動作をシミュレートする方 法を示しています。ここでは、マウスをクリックして最上位の項目を選択し、選択範囲に追加し ています。 VB の例: Public Shared Sub MapInfo_Mapping_SearchInfoFactory(ByVal _ mapControl1 As MapControl) ' Get a point from mouse click.Hard coded value use in sample. Dim pt As System.Drawing.Point = New System.Drawing.Point(100, 100) ' Assumes there is a MapControl with a map in it. Dim map As Map = mapControl1.Map Dim session As ISession = MapInfo.Engine.Session.Current Dim si As SearchInfo = _ MapInfo.Mapping.SearchInfoFactory.SearchNearest(map, _ pt, 3) ' 3 pixel tolerance radius si.QueryDefinition.Columns = Nothing ' fetch all columns instead of just default ' Customize to stop at topmost layer where something is found CType(si.SearchResultProcessor, ClosestSearchResultProcessor)._ Options = ClosestSearchOptions.StopAtFirstMatch ' Puts results of search directly into default selection ' Searches all tables in map in order from top to bottom. MapInfo.Engine.Session.Current.Catalog.Search(map._ Layers.GetTableEnumerator(), si, _ session.Selections.DefaultSelection, _ ResultSetCombineMode.Replace) End Sub SearchIntersectsFeature VB の例: Public Shared Sub _ MapInfo_Data_SearchInfoFactorySearchIntersectsGeomeTry(ByVal _ map As Map) Dim ti As Table = _ MapInfo.Engine.Session.Current.Catalog.GetTable("usa") Dim lParks As MapInfo.Mapping.FeatureLayer = _ CType(map.Layers("USA"), MapInfo.Mapping.FeatureLayer) Dim g As MapInfo.Geometry.FeatureGeometry = New _ MapInfo.Geometry.Point(map.GetDisplayCoordSys(),-98,34) Dim si As SearchInfo = _ MapInfo.Data.SearchInfoFactory.SearchIntersects_ Geometry(g,MapInfo.Data.IntersectType.Geometry) Dim fc As IResultSetFeatureCollection = _ Session.Current.Catalog.Search("usa",si) map.SetView (fc.Envelope) End Sub 開発者ガイド 217 Feature と Feature コレクション SearchWithinScreenRadius このサンプルは、画面に描画された円を使用してフィーチャを検索する方法を示しています。 C# の例: // find nearest city to center of map private void menuItemSearchNearest_Click(object sender, System.EventArgs e) { try { Cursor.Current = Cursors.WaitCursor; // to compare to SearchWithinScreenRadius, we are // calculating the search distance the same way it does System.Drawing.Rectangle rect=mapControl1.Bounds; System.Drawing.Point pt = new System.Drawing.Point(rect.Left, rect.Top); pt.X += rect.Width/2; pt.Y += rect.Height/2; DPoint dpt1 = new DPoint(); // convert center point to map coords (could use map.Center) _map.DisplayTransform.FromDisplay(pt, out dpt1); Distance d = MapInfo.Mapping.SearchInfoFactory.ScreenToMapDistance (_map, 3); SearchInfo si =MapInfo.Data.SearchInfoFactory.SearchNearest(dpt1, _map.GetDisplayCoordSys(), d); IResultSetFeatureCollection fc = _catalog.Search("uscty_1k", si); MapInfo.Geometry.Point p = new MapInfo.Geometry.Point(_map.GetDisplayCoordSys(), dpt1); FeatureGeometry buffer = p.Buffer(d.Value, d.Unit, 20, DistanceType.Spherical); ShowSearchGeometry(buffer); SelectFeatureCollection(fc); } finally { Cursor.Current = Cursors.Default; } } 218 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 コード例: ポイントを含むフィーチャの検索方法 逆の種類の検索を実行して、特定のポイントを含むフィーチャを探すことが必要な場合もありま す。たとえば、配送計画のために、顧客がどの地域に位置しているかを把握したい場合などで す。 VB の例: Dim g As MapInfo.Geometry.FeatureGeometry = New _ MapInfo.Data.SearchInfoFactory.SearchIntersectsGeometry(g, _ MapInfo.Data.IntersectType.Geometry) Dim irfc As MapInfo.Data.IResultSetFeatureCollection = _ MapInfo.Engine.Session.Current.Catalog.Search("british_ columbia", si) Me.MapControl1.Map.SetView(irfc.Envelope) データの分析 Catalog 内のデータを分析することによって、その結果を事業目標の達成に役立てることができま す。Catalog には、データを解析したり集計したりするための SQL プロセッサが備わっています。 その際の選択肢としては、次の 2 つがあります。 • • OGC オブジェクト ベースのクエリ インターフェイス ADO.NET SQL ベースのインターフェイス 以下の図は、両者の関係を示したものです。 グループ 1 は、OGC のクエリ インターフェイスです。クエリを作成するには、これらのオブジェ クトを使用します。このインターフェイスを使用すると、空間/非空間の条件を追加したり、列と 行をフィルタリングするためのクエリを作成したりできます。作成したクエリは、これらの Query オブジェクトの検索メソッドを通じて、データ リーダーおよび結果セットを返します。オブジェ クト指向のプログラミングには精通しているが、SQL 構文には自信がないという方は、これらの オブジェクトを使用できます。「215 ページの「SearchInfo と SearchInfoFactory」」を参照してくだ さい。 ADO.NET インターフェイス (グループ 2) は、定義済みの ADO.NET モデルを採用することで、 MapInfo SQL 言語を介したアクセスを可能にします。ADO.NET インターフェイスでは、Catalog と の 対 話 に SQL 構 文 が 使 用 さ れます。この場合、SQL ステートメントを作成して、それを MICommand オブジェクトに渡す必要があります。これらのオブジェクトでは、データ リーダーま たは結果セットを返す Execute コマンドが使用されます。208 ページの「MapInfo ADO.NET データ プロバイダ」を参照してください。 開発者ガイド 219 データの分析 MapXtreme データ モデル OGC オブジェクトまたは SQL クエリに対するレスポンスとしてデータ ソースをオーガナイズする 役割は、Catalog (グループ 3) がつかさどります。これは、OGC クエリベースのアプローチを使用 するか、ADO.NET コマンドベースのアプローチを使用するかに関係ありません。OGC オブジェク トベースのクエリ API は、SQL を生成し、これを Catalog に渡して処理を委譲します。場合によっ ては、より効率的な SQL を開発者が作成することもできますが、OGC オブジェクトは最適な SQL を生成できるよう、熟慮を重ねて定義されており、開発者による対話方法が制限されています。 SQL 言語に慣れている方は、ADO.NET を使用した方法をお勧めします。ただし、SQL に不慣れな 方も、OGC オブジェクト ベースのクエリを使用することで同様の操作を実行できます。 MapInfo SQL 構文は、MapXtreme に付属の SQL リファレンスに記載されています。このリファレ ンスは、MapXtreme をインストールすると、Visual Studio からも参照できます。この SQL 言語は、 SQL3 をベースに設計され、空間分析を可能にする MapInfo の特殊な演算子が追加されています。 これらの演算子には、MI_ という接頭辞が付きます。 220 MapXtreme 2008 v7.0.0 第 10 章 : データでの作業 Visual Studio に表示される MapInfo SQL Language Reference テーブルの内容 データ リーダー、MemTables、結果セット データにアクセスするメソッドでは、データ リーダーまたは結果セットが返されます。データ リーダーを使用することで、データに対してシーケンシャルにアクセスできます。データのコ ピーは保存されません。データはデータ ソースから取り出されます (データ ソースがキャッシュ されている場合を除く)。結果セットは、キーのコレクションです。これらのキーを使用すること で、元のテーブルにアクセスでき、データのコピーは作成されません。 MemTable では、各種のソースから取得したデータを、1 つのテーブルに保存することができま す。このタイプのテーブルでは、メモリ アレイと一時的なディスク ストレージを併用することに よってデータが保存されます。データが追加されると、MemTable は、元のテーブルを指し示す キーやポインタを保持するのではなく、データのコピーを作成します。マップの一時レイヤを保 存する場合や、処理で返された値 (ジオコード結果やルーティング結果) のコンテナとして使用す ることができます。MemTable におけるアクセス性能とマップのレンダリング パフォーマンスは、 ネイティブのテーブルと匹敵します。 結果セットは、定義された一連の行にアクセスしたり、データ ソースから特定のデータを取得し たりする必要がある場合の強力な手段となります。データ ソースが同時アクセスをサポートして いれば、取り出し元のデータがセッション中に変更された可能性がある場合、この方法を用いる ことで、結果を確認できます。MemTables はデータのコピーであるため、取得されたデータ行は不 変です。元のデータ ソースに対して行われた変更は反映されません。 開発者ガイド 221 データの分析 データ アクセス パフォーマンスの強化 パフォーマンスは、データにアクセスするあらゆるアプリケーションに共通した重要な要素で す。アプリケーションの設計と開発の計画を立てる際は、次の点を考慮してください。 • • • • • • • • • • • 222 必要なデータだけをリクエストする (特に RDBMS からデータを取得する場合)。これにより、 接続を介してやり取りされるデータ量を抑えることができます。 Web アプリケーションの場合は、属性フィールド情報をワークスペース ファイルに配置しま す。これによって、MapInfo Session の作成時に、必要なすべてのデータが事前に読み込まれま す。この例については、「第 6 章、119 ページの「主題図サンプルの概要」 」を参照してくだ さい。 データに序列を付ける必要がある場合以外、テーブルの並べ替えは行わない。テーブルを並べ 替えるには、テーブル全体を読み取る必要があるため、時間がかかります。フィールドがイン デックス化されていない場合、さらに速度が低下します。 テーブルへのランダム アクセスが必要な場合は、必ずスクロール可能なリーダーを使用する。 インデックスが構築され、データ全体を読み込む必要がないため、アクセス速度も向上しま す。不要なデータが読み取られることなく、目的のデータに直接アクセスできます。 Join や Search では一貫した座標系を使用する。アクセスのたびにジオメトリを変換する負荷を 排除できます。 Join / Filter / Sort / Aggregate の各操作では、インデックス付きフィールドを使用する。 実際にジオメトリの交差をチェックする前に CentroidWithin、ContainCentroid、および EnvelopesIntersect を使用する。これらのテストはきわめて高速に実行されます。また、ほとん どの場合、大量のジオメトリをわずかな手間で排除できます。 複数のクエリまたは更新操作を実行する場合 (ファイルベースのテーブルの場合は特に)、 BeginAccess/EndAccess を使用する。 Where 句で Area や Buffer を呼び出すことはできるだけ避ける (新しいカーソルが作成されるた びに実行する必要が生じてしまうため)。 Select ステートメントでビューや結果セットに含めるフィールドを定義するときに Area や Buffer を呼び出すことはできるだけ避ける (上記と同様の理由による)。 中間的な結果や、キーを扱う操作には結果セットを使用する。結果セットはきわめて軽量であ り、オリジナルのデータに直接的かつ迅速にアクセスできます。 MapXtreme 2008 v7.0.0 11 式の作成 式は、マッピング アプリケーションで具体的にどのような情報を表示し、分 析するかを表すために、MapXtreme 全体を通して使用されます。この章では、 データのアクセス、主題図の作成、マップへのラベル付けなど、さまざまな用 途における式の作成について説明します。 この章の構成 「式の概要」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「式の作成」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「where 句 – ブール式」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「式内の関数」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「式の例」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 224 225 225 226 式の作成 式の概要 式は、データの記述と書式設定に使用するステートメントです。たとえば、日本語で式の意味を 記述すると、「50,000 ドルを超える収入の中央値」や「人口に占める女性の割合」のようになりま す。 式は、フィールド名、定数 (具体的なデータ値)、およびフィールドや定数に作用する関数と演算子 を 使 用 して 構 成 し ま す。演 算 子 と 関 数は MapInfo SQL 言語で定義されています。これは、 MapXtreme、および MapInfo .NET がサポートするその他の製品を発展させるために開発されたも のです。詳細については、Visual Studio の統合ヘルプで「MapInfo SQL リファレンス」(ヘルプの目 次ペインで「MapInfo SQL リファレンス」を検索) を参照してください。 式を使用して、データを最大限に活用してください。式では、次の操作を行うことができます。 • • • • 興味のあるデータのフィールドと行だけを表示。 既存のフィールドの内容に基づいて新しい値を計算することにより、新しいフィールドを派生 させる。 テーブル全体ではなく、部分合計で作業を行うためにデータを集計。 2 つ以上のテーブルを、1 つの結果テーブルに結合。 使用するデータ セットの多くには、ユーザのプロジェクトで必要とするものよりも多くのオブ ジェクトや情報が含まれています。多くの場合、完全なデータ製品のサブセットで作業するほう が簡単です。たとえば、国勢調査の報告書を使用して特定の郡の犯罪統計を追跡する場合は、州 全体の構成調査報告書は必要ありません。この場合、その郡の国勢調査だけを抽出する式を使用 します。 式は、MapXtreme 全体を通して、次の分野で使用されます。 • • • • • • • • SQL ステートメント (select、insert、update、delete、group by、order by) 引数に式を取る SQL 関数 (たとえば、MI_Area() のジオメトリ引数は、Geometry オブジェクト を返す式) フィールドの追加 (MapInfo.Data.Table.AddColumn は、式に基づいて一時フィールドを作成) フィーチャの検索 (SearchInfo と SearchInfoFactory) 主題図 (FeatureStyleModifier) ラベル (LabelModifier) InfoTips (FeatureLayer、MapTools) Expression ダイアログ 式の作成 最も単純な式は、"2" (数値式) や "Friday" (テキスト例) など、1 つの定数で構成されます。 また、次に示すように、1 つのフィールドで構成されるものもあります。 POP_2000 STATE 224 MapXtreme 2008 v7.0.0 第 11 章 : 式の作成 たとえば、1 つのステートメントで複数のフィールドを要求する場合、これらのフィールドはまと めて式リストと呼ばれます。 Select colA, colB, colC from Table1, Table2 Select colA/2, ColB/ColC from Table1 また、データに対して数学演算を実行する式を記述できます。 たとえば、RENT + UTILITIES は、2 つのフィールドを加算する式です。SQL ステートメントでこ の式を使用すると、合計費用が月額 800 ドル未満のアパートをすべて見つけることができます。 where 句 – ブール式 ブール式は、true または false のいずれかの値になる検索条件です。たとえば、次の式 2 < 5 は、結果が true になるのでブール式です。 より小 さいことを 示す記号 (<) などの比較演算子を含む式は、すべてブール式です。演算子 AND、OR、および NOT はブール演算子です。ブール式は、比較式、条件式、および関係式とも 呼ばれます。 POP_2000 POP_2000 PROVINCE County = > 500000 <= POP_1990 <> 'Ontario' 'Columbia' AND VALUE >= 250000 MapInfo SQL でサポートされる演算子は、Visual Studio の統合ヘルプの「MapInfo SQL リファレン ス」(ダイナミック ヘルプ ペインで「MapInfo SQL リファレンス」を検索) で定義されています。 ブール式は、SQL ステートメントの「where 句」で使用されます。where 句は、返される行 (true に なる行) を制御する式です。 たとえば、このステートメントでは、WHERE の後にブール式が記述されています。France との境 界に該当する Europe テーブル内のオブジェクトだけが、true となって返されます。 "SELECT * FROM Europe WHERE MI_Geometry within @France"; 式内の関数 MapXtreme の関数を使用すると、特定の条件を満たすデータを抽出する複雑な式を作成できま す。たとえば、MapInfo SQL は、文字列、日付、および数値に作用する多くの一般的なデータベー ス関数をサポートしています。 MapInfo SQL で最も強力なのは、マッピング データの空間的な性質を利用する関数です。これら の地理的関数を使用して、新しいジオメトリの作成、領域や長さの計測、空間情報の取得、ジオ メトリ間の空間的な関係の検証などを行います。サポートされる関数は、「MapInfo SQL リファレ ンス」で定義されています。 たとえば、学区などの境界テーブルで領域を見たいときに、式で関数を使用します。MI_Area() 関数を使用して、テーブル内の各レコードの領域を返します。 開発者ガイド 225 式の例 さらに、式で関数を使用する例を、以下の「式の例」のセクションに示します。 式の例 以下に、MapXtreme の各領域での式の使用例を示します。 SQL ステートメントの例 この例では、Germany 内にあり、人口が 100 万を超えるすべてのレコードを Eurcity_1K テーブル から選択します。 Select * from Eurcity_1K WHERE (MI_Geometry MI_Within @Germany) AND Tot_Pop > 1000000 次の例では、テーブル内の Time および Date 型フィールドに基づいて選択が実行されます。この例 では、"CrimeActivity" テーブルから、午前 12 時から午前 6 時までの間に発生した犯罪に関するレ コードがすべて選択されます。 SELECT * FROM CrimeActivity WHERE CrimeTime BETWEEN '12:00:00 AM' AND '6:00:00 AM' この式に含まれている CrimeTime は、犯罪が発生した時間が格納されている Time 型フィールドで す。 次の例では、1970 年 12 月 31 日より前に生まれた従業員の名前が "Employee" テーブルから選択さ れます。 SELECT Names FROM Employee WHERE BirthDay < '12/31/1970 12:00:00 AM' この式に含まれている BirthDay は、従業員の生年月日が格納されている Date 型フィールドです。 MapInfo SQL 関数の例 次の例では、MapInfo SQL 関数を使用してバッファ内のフィーチャを検索しています。 Obj CentroidWithin MI_Buffer(Obj, 5, 'km', 'Spherical', 24) この式では、地理的オブジェクト用に予約された 'Obj' と呼ばれる MapInfo SQL の特殊キーワード を使用しています。このキーワードは、座標系や境界など、オブジェクトのジオメトリを記述し ます。このキーワードは、旧バージョンの MapX および MapInfo Professional と互換性がありま す。これは、フィールド名 MI_Geometry に相当します。 km と Spherical が一重引用符で囲まれていることに注意してください。MapInfo SQL では、解析ロ ジックが識別子を正確に解析できない場合にのみ、文字列リテラルを一重引用符で囲み、フィー ルド名、テーブル名、エイリアスなどの識別子を二重引用符で囲む必要があります。名前の中に スペースや他の特殊文字が含まれる識別子がこれに該当します。 バッファに含まれないフィーチャを検索する場合、式は次のようになります。 NOT Obj CentroidWithin MI_Buffer(Obj, 5, 'km', 'Spherical', 24) 226 MapXtreme 2008 v7.0.0 第 11 章 : 式の作成 フィールドを追加する例 AddColumns メソッドを使用して一時 (計算) フィールドをテーブルに追加するとき、指定した フィールドには、フィールドの値の計算方法を定義する式が含まれます。フィールドを追加する テーブルの 1 つのレコードに対して複数のソース レコードが対応付けられることが予想される場 合は、その式に集計関数を含めることができます。 以下 の 例 で は、人 口 密 度 を 表 現 する式 "Pop_1990 / MI_Area(Obj, 'sq mi', 'Spherical')" を使用しています。式の前には、新しいフィールド名が付記されています。 PopDensity1990 と PopDensity2000 がフィールド名です。 VB の例: Public Shared Sub MapInfo_Data_TableAddColumns(ByVal miTable _ As Table) Dim NewCols As Columns = New Columns NewCols.Add(New Column("PopDensity1990", "Pop_1990 / _ MI_Area(Obj, 'sq mi', 'Spherical')")) NewCols.Add(New Column("PopDensity2000", "Pop_2000 / _ MI_Area(Obj, 'sq mi', 'Spherical')")) miTable.AddColumns(NewCols) End Sub フィールドの追加の詳細については、「第 10 章、195 ページの「テーブルへの式フィールドの追 加」 」を参照してください。 フィーチャ検索の例 次の例では、実行すると FL を含む各行について値 1 を返すブール式 SearchWhere("State='FL'") を使 用します。 VB の例: Public Shared Sub MapInfo_Data_SearchInfo(ByVal catalog As Catalog) Dim fFlorida As Feature = catalog.SearchForFeature("usa", _ MapInfo.Data.SearchInfoFactory.SearchWhere("State='FL'")) Dim si As SearchInfo = _ MapInfo.Data.SearchInfoFactory.SearchWithinGeometry(fFlorida._ Geometry, ContainsType.Centroid) Dim fc As IResultSetFeatureCollection = _ MapInfo.Engine.Session.Current.Catalog.Search("uscty_1k", si) ' Set the map view to show search results MapInfo.Engine.Session.Current.MapFactory(0).SetView(fc.Envelope) ' Set the view of the first map. ' Add results to selection. MapInfo.Engine.Session.Current.Selections.DefaultSelection.Add(fc) End Sub Feature クラスおよび検索メソッドの詳細については、「第 10 章、212 ページの「Feature と Feature コレクション」 」を参照してください。 開発者ガイド 227 式の例 主題図の式の例 円グラフ主題図は、主題図の式の数値によって決まる円グラフを描画するオブジェクト主題図で す。主題図に関する式は、"Pop_Native"ÅA"Pop_Asian"ÅAÇ®ÇÊÇ— "Pop_Other" の 3 つの フィールドで構成されいます。 VB の例: Public Shared Sub MapInfo_Mapping_Thematics_PieTheme(ByVal _ map As Map) ' Load a map based on one table map.Load(New MapTableLoader("world.tab")) Dim lyr As FeatureLayer = CType(map.Layers("world"), FeatureLayer) ' Create a new pie theme Dim pieTheme As MapInfo.Mapping.Thematics.PieTheme = New _ MapInfo.Mapping.Thematics.PieTheme(map, lyr.Table, "Pop_Native", _ "Pop_Asian", "Pop_Other") ' Create an object theme layer based on that pie theme Dim thmLayer As ObjectThemeLayer = New ObjectThemeLayer("World _ Pop Growth Rate", Nothing, pieTheme) 'Add object theme to the map's layer collection. map.Layers.Add(thmLayer) End Sub 主題図の詳細については、「第 15 章、291 ページの「主題図と凡例の使用」 」を参照してくださ い。 ラベルの式の例 式は、ラベル修飾子のプロパティであり、このラベル修飾子はラベル作成で使用するプロパティ の デ フ ォル ト 値 の 変 更 に 使 用 さ れ ま す。以下のコード例の式は、ラベルを Capital Name: <name of capital> の形式で表示するよう指示しています。 VB の例: Public Shared Sub MapInfo_Mapping_OverrideLabelModifier(ByVal _ modifier As OverrideLabelModifier) modifier.Name = "'Capital Name: ' + Capital" End Sub ラベル付けの詳細については、「第 13 章、265 ページの「Labels」 」を参照してください。 InfoTips 式の例 InfoTips は、ツールを Feature 上に置いたときに表示されるテキスト項目です。ラベルに対するの と同様の方法で式を使用して、InfoTips 用のテキストを生成することができます。静的なヘルパ関 数 MapTool.SetInfoTipExpression を使用して、InfoTip を設定します。この関数は InfoTip ハッシュ テーブルを作成し、ハッシュテーブルにレイヤ エントリが存在しない場合には追加します。各 ツールは、InfoTips を有効または無効にするよう設定できます。 228 MapXtreme 2008 v7.0.0 第 11 章 : 式の作成 次の例では 2 行のテキスト ラベルが生成され、オブジェクト上にカーソルが置かれたときに、 テーブル エイリアスと、オブジェクトの中心点の X 座標または Y 座標が表示されます。 VB の例: Public Shared Sub MapInfo_Mapping_HowDoICreateExprForInfoTip(ByVal mapControl1 As MapControl) MapTool.SetInfoTipExpression(mapControl1.Tools.MapToolProperties,_ CType(mapControl1.Map.Layers(0), FeatureLayer), "@TableAlias + _ char(13) + _ 'Centroid X:' + MI_CentroidX(obj) + ' Y:' + _ MI_CentroidY(obj)") End Sub InfoTip の詳細については、「第 24 章、443 ページの「レイヤの管理」 」を参照してください。 開発者ガイド 229 式の例 230 MapXtreme 2008 v7.0.0 12 DBMS のデータへのアク セス MapXtreme には空間サーバへのアクセス機能が提供されています。これは、 Microsoft SQL Server や Oracle Spatial などのデータベースで実行されている MapInfo SpatialWare などの空間サーバに保存されているライブ データに接続で きる強力な機能です。空間サーバとは、データの一元管理を実現すると共にセ キュリティ保護のために、企業内のエンタープライズ データベースでマップ データをホストするサーバです。空間サーバには SpatialWare などがあり、企 業の空間データを処理できるように、高度なクエリ処理機能のほか、高いパ フォーマンスを備えています。 この章の構成 「リモートの空間データへのアクセス」 . . . . . . . . . . . . . . . . . . . . . . 「.TAB ファイルを使用するリモート テーブル アクセス」. . . . . . . 「.TAB ファイルを使用しないリモート テーブル アクセス」. . . . . 「DBMS データと X/Y フィールドとのマッピング」 . . . . . . . . . . . . 「Oracle データへのアクセス」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「MS SQL Server データへのアクセス」 . . . . . . . . . . . . . . . . . . . . . . . 「DBMS 接続文字列の形式」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「サーバ テーブル クエリでのマップ作成可能テーブルの定義」 . 「属性データへのアクセス」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「パフォーマンスに関する問題」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「キャッシュの設定」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「MapInfo_MapCatalog」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「MapInfo_MapCatalog への行の追加」 . . . . . . . . . . . . . . . . . . . . . . . . 「レコードごとのスタイル」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「トラブルシューティング」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 232 233 233 233 236 239 241 243 244 244 246 248 253 254 .TAB ファイルを使用するリモート テーブル アクセス リモートの空間データへのアクセス MapXtreme では、他の DBMS サーバのデータにアクセスできます。対応しているサーバは以下の とおりです。 • • • • MapInfo SpatialWare 4.8.1 for Microsoft SQL Server 2000 MapInfo SpatialWare 4.9 for Microsoft SQL Server 2000 MapInfo SpatialWare 4.9 for Microsoft SQL Server 2005 MapInfo SpatialWare 4.9.2 for Microsoft SQL Server 2005 • • • • • • MapInfo SpatialWare 4.9.2 for Microsoft SQL Server 2008 32 ビットおよび 64 ビット エディション Microsoft Access 97 Microsoft Access 2000 Microsoft SQL Server 2000 Microsoft SQL Server 2005 Microsoft SQL Server 2008 • Oracle 9ir2、10G、10Gr2、Oracle 11G (11.1.0.6.0 および 11.1.0.7.0) MapInfo.Data 名前空間の TableInfoServer クラスを使用して、DBMS のデータからテーブルを追加で きます。 以降のセクションでは、空間データを追加する方法について詳しく説明します。 .TAB ファイルを使用するリモート テーブル アクセス MapXtreme で開発したアプリケーションでは、DBMS のデータにライブでアクセスすることも、 MapInfo Professional のリンク テーブルとして開くこともできます。しかし、リンク テーブルは読 み取り専用となるため、アプリケーションが更新することはできません。データは実際にはリ モート データベースに存在しており、ローカルのリンク データベースを変更しても、リモート データベースのデータは変更されません。 リ モ ー ト デ ー タ に ア ク セ ス す る に は、.TAB ファイルを作成する方法があります。MapInfo Professional で .TAB ファイルを作成するには、[ファイル] メニューの [DBMS テーブルを開く] を選 択します。 .TAB ファイルはテキスト ファイルです。このため、テキスト エディタでも作成できます。作成し た .TAB ファイルは、MapInfo の他の .TAB ファイルと同じように、Catalog オブジェクトを使用す るかワークスペース マネージャを使用することによってプログラムから操作できます。 232 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス .TAB ファイルを使用しないリモート テーブル アクセス アプリケーションでは、.TAB ファイルを使用せずにリモート データにアクセスすることもできま す。以下のコード サンプルに、その方法を示します。 VB の例: Public Shared Sub MapInfo_Data_TableInfoServer(ByVal connection As _ MIConnection) ' Note: Do not specify any columns.These are determined ' dynamically from the query Dim ti As TableInfoServer = New TableInfoServer("Provinces") ti.ConnectString = "SRVR=ontario;UID=mapx;PWD=mapx" ti.Query = "Select * From Provinces" ti.Toolkit = ServerToolkit.Oci ti.CacheSettings.CacheType = CacheOption.Off ' On is the default Dim tbl As Table = connection.Catalog.OpenTable(ti) End Sub DBMS データと X/Y フィールドとのマッピング X 座標と Y 座標を格納している DBMS テーブルのデータにアクセスできます。これを行うには、 MapInfo_MapCatalog を作成し、DBMS テーブルを SpatialType 4.0 として登録して、2 つのフィール ドを座標フィールドとして指定します。このフィールドは、テーブルのインデックスである必要 があります。次に ODBC 経由で DBMS に接続し、クエリ内で、これらの新しいフィールドを "Obj" または "MI_Geometry" として指定します。 Oracle データへのアクセス MapXtreme アプリケーションから Oracle データベースに接続するには、Oracle OCI 接続クライアン トをインストールしていて適切な権限があることが必要です。詳細については、Oracle のマニュア ルを参照してください。 ジオメトリ変換 MapXtreme のオブジェクトから Oracle Spatial (SDO_GEOMETRY) への変換が行われた場合の、両 者の対応関係を以下の表に示します。 MapInfo オブジェクト Oracle の変換先 NULL ジオメトリ NULL Point 1 POINT 開発者ガイド 233 Oracle データへのアクセス MapInfo オブジェクト Oracle の変換先 MultiCurve (IsLegacyLine = true の場合) 2 1 つの線ストリングを持つ LINESTRING ジオメトリ Polygon 3 1 つのポリゴンを持つ POLYGON ジオメトリ FeatureGeometryCollection 4 異種要素コレクションである Collection ジオメトリ MultiPoint 5 MULTIPOINT MultiCurve 6 複数の線ストリングを持つ MULTILINESTRING ジオメ トリ MultiPolygon 7 複数のポリゴンを持つ MULTIPOLYGON ジオメトリ Ellipse NULL LegacyArc NULL Rectangle NULL LegacyText NULL RoundedRectangle NULL PieTheme、BarTheme NULL Oracle (GTYPES) から MapInfo 空間オブジェクトへの変換が行われた場合の、両者の対応関係を以 下の表に示します。 Oracle GTYPES MapInfo のオブジェクト 0 *UNKNOWN_GEOMETRY (Spatial はこのジオメトリを無視) 1 1 つの ポイントを持つ POINT ジオメトリ Point 2 1 つの線ストリングを持つ LINESTRING ジオメトリ MultiCurve 3 1 つのポリゴンを持つ POLYGON ジオメトリ MultiPolygon 4 *異種要素コレクションである Collection ジオメトリ FeatureGeometryCollection 5 複数のポイントを持つ MULTIPOLYGON ジオメトリ MultiPoint 6 複数の線ストリングを持つ MULTILINESTRING ジオメトリ MultiCurve 7 複数のポリゴンを持つ MULTIPOLYGON ジオメトリ (複数の外 MultiPolygon 部境界) *MapInfo オブジェクト形式との間で変換を行うと、データの一部が失われる場合があります。これらの型は、 可能な場合、既に NULL でなければ 1 ポイントの SDO_POINTTYPE 値として解釈されます。これらは、順序付 き配列の先頭の要素を占めるようになり、これが NULL ジオメトリとして解釈される可能性があります。 234 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス Oracle での Z 値と M 値のサポート MapXtreme では、Z 値と M 値を含めた Oracle GTYPE の読み取りおよび書き込みをサポートしてい ます。Z 値と M 値が存在するかどうか、およびそれらの順序は、USER_SDO_GEOM_METADATA 内の DIM_INFO 配列によって決定されます。MapXtreme では、以下の次元名を確認します (大文字 と小文字は区別しません)。 • • Z 次元 : "Z"、"Elevation"、" Depth"、"Z Dimension" M 次元 : "M"、"Measure"、"M Dimension" M 値または Z 値を含むテーブルは、存在する次元のデータを含む FeatureGeometry オブジェクトを 返します。Oracle テーブルに対して挿入または更新された FeatureGeometry インスタンスには、 Oracle テーブルでサポートするよう定義されている新しいジオメトリの 4 つの各次元 (XYZM) が保 持されます。Oracle テーブルでサポートされていない次元を含むジオメトリについては、挿入/更 新操作でそれらの次元の値が無視されます。Oracle テーブルでサポートされている次元を含んでい ないジオメトリについては、挿入/更新操作で、存在しない次元に対して NULL 値が使用されま す。たとえば、次元 x、y、m が定義されたテーブルに、Z 値または M 値を含まないジオメトリを 挿入すると、テーブルに格納される M 値は NULL となります。 これらの挿入 / 更 新 操作が成功するかどうかは、明示的なフィールド制約や、 SDO_GEOM_METADATA システム テーブルで指定された次元の範囲に対する値の検証など、サー バ側での追加の検証にも依存する場合があります。 SDO_GEOMETRY Arc および Circle の変換 円および円弧は MultiCurve に解決することができます。このとき、360 度の円が 25 セグメントに 変換されます。 変換できない Oracle オブジェクトの表示 MapXtreme アプリケーションが変換できない Oracle Spatial オブジェクトは、デフォルト スタイル ( 黒い 星 印) の Point オ ブ ジ ェ クトとなり、SDO_Spatial ポイントの位置 ( 座標配列の先頭の SDO_Spatial ポイント) に配置されます。これにより、変換できないオブジェクトも、そのオブ ジェクトが属する地理エリアに正しく表示されるようになります。変換できないオブジェクトの 例には、ユーザ定義オブジェクトの GType 0、4、5、または認識できない GType、EType、解釈を含 む無効な SDO_geometry があります。後者は SDO_VALIDATE_GEOMETRY() を使用すると失敗し ます。 中心点のサポート MapXtreme アプリケーションは、SDO_POINT をポリゴンの中心点の値として使用します。この中 心点フィーチャは、ラベルの配置に用いられるほか、オブジェクトの選択ツールにも影響を与え ます。Oracle の SDO_GEOMETRY.SDO_POINT_TYPE フィールドは、NULL でない場合、ポイント がリージョン内にあれば、フィーチャの中心点であると解釈されます。ポイントがリージョンの 外にある場合は、通常の方法で中心点が計算されます。 注意 開発者ガイド 現在、MapXtreme にはリージョン フィーチャの中心点を設定するためのメソッドやツール がありませんが、保存されている中心点を読み込んで使用することは可能です。 235 MS SQL Server データへのアクセス Oracle 空間参照系 (SRID) のサポート Oracle の SDO_GEOMETRY フィールドは、空間参照系と共に定義することができます。これを行 う に は、USER_SDO_GEOM_METADATA に Oracle SRID を与え、保存されている SDO_GEOMETRY 値内にこの SRID を割り当てます。割り当てた SRID を持つ Oracle Spatial フィー ルドがテーブルに含まれる場合、MapXtreme アプリケーションは、そのテーブルのデータをクエ リ し て、正 し く 解 釈 で き ま す。デ ー タ の 解 釈 お よ び 更 新 に 現 在 使 用 さ れ て い る MapInfo_MapCatalog 内の Coordsys は SRID であるため、データの SRID と同じ MapInfo Professional CoordSys 文字列が MapInfo_MapCatalog に定義されている必要があります。 Spatial フィールドが SRID 値を含まない (値が NULL である) 場合、MapXtreme アプリケーション は、MapCatalog に定義されている MapInfo Professional Coordsys を使用してデータを解釈すること もできます。 緯度/経度座標系 (世界測地系データ) を使用しているテーブルを Oracle Spatial に読み込む場合、す べてのジオメトリ座標の経度が -180 ~ 180 の範囲内にあり、かつ緯度が -90 ~ 90 の範囲内にある ことを必ず確認します。この範囲を超える測地データ座標は Oracle Spatial ではサポートされず、 問題が発生する可能性があります。Oracle Spatial にデータを読み込む前に、MapInfo Professional で デ ー タ を検 査 し ま す。ま た、テ ー ブ ルの読み込み後に Oracle Spatial の SDO_GEOM.VALIDATE_LAYER() 関数を使用してテーブルを検査することも可能です。 OCI 接続ダイアログ MapInfo.Data.DBMSConnectionCollection クラスは、ConnectionFailedEvent イベント ハンドラをサブ スクライブすることで ConnectionFailed イベントをサポートします。このイベントが発生すると、 OCILoginDlg が表示され、ユーザはログイン情報を変更して Oracle データベースへの接続をもう 1 回試みることができます。このハンドラは MapXtreme OCI ツールキットに固有です。このイベン トは、MapInfo.Windows.Dialogs 名前空間の LoadMapWizard クラスからも使用することができま す。 MS SQL Server データへのアクセス MapXtreme では、Microsoft SQL Server 2000、SQL Server 2005、SQL Server 2008 に格納されたデー タをサポートしています。以下の情報は、SQL Server 2008 に適用されます。 SQL Server 2008 のサポート MapXtreme では、Microsoft SQL Server 2008 からのデータの読み取り、および Microsoft SQL Server 2008 へのデータの書き込みをサポートしています。これには、空間データ型 GEOMETRY および GEOGRAPHY が含まれ、両方の空間形式に対して M 値と Z 値がサポートされます。 MapXtreme で SQL Server 2008 のデータにアクセスするには、SQL Server Native Client 10 が必要で す。これにより、データは、MapXtreme でサポートする他のリモート データベース管理システム1 のデータと同じように扱われます。MapInfo.Data.TableInfoServer クラスを使用して、リモート テー ブルに対する接続文字列および SQL ステートメントを定義できます。MapXtreme は、内部的に ODBC を使用して、リモート データベースにアクセスします。 236 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス SQL Server 2008 の各種のオブジェクトが MapXtreme でどのように扱われるかを次の表に示しま す。 SQL Server 2008 Spatial の GEOGRAPHY または GEOMETRY SQL Server 2008 GEOGRAPHY/GEOMETRY MapXtreme の FeatureGeometry の FeatureGeometry Spatial Point Point LineString MultiCurve Polygon MultiPolygon MultiPoint MultiPoint MultiLineString MultiCurve MultiPolygon MultiPolygon GeometryCollection FeatureGeometryCollection Point、MultiPoint GeometryCollection だけを含む MultiPoint LineString、MultiLineString GeometryCollection だけを含む MultiCurve Polygon、MultiPolygon GeometryCollection だけを含む MultiPolygon 空 の GEOMETRY/GEOGRAPHY empty など) (Point NULL MapXtreme の FeatureGeometry が SQL Server 2008 にどのように書き戻されるかを次の表に示しま す。 SQL Server 2008 Spatial の GEOGRAPHY または GEOMETRY MapXtreme の FeatureGeometry 1. 開発者ガイド Point Point MultiPoint MultiPoint 1 つの Point だけを含む MultiPoint Point MultiCurve MultiLineString 完全なリストについては、第 2 章: 「サポートされているデータベース」を参照してください。 237 MS SQL Server データへのアクセス MapXtreme の FeatureGeometry SQL Server 2008 Spatial の GEOGRAPHY または GEOMETRY 2 つの Point で構成される 1 つの Curve だ LineString けを含む MultiCurve MultiPolygon MultiPolygon FeatureGeometryCollection GeometryCollection * Rectangle NULL RoundedRectangle NULL Ellipse NULL LegacyArc NULL LegacyText NULL * この GeometryCollection には、MultiPoint、MultiLineString、MultiPolygon のいずれかまたは 全部が含まれる場合があります。 SQL Server 2008 では、日付と時刻の情報のために新しい型が提供されています。日付と時刻の型 が MapXtreme の 日 付 と 時 刻 の 型 にどのようにマッピングされるかを次の表に示します。 MapXtreme では、バージョン 6.8 以降、Time および DateTime のサポートが 導入されました。 SQL Server MapXtreme Date Date Time Time DateTime DateTime SmallDateTime DateTime DateTime2 DateTime DateTimeOffset 未サポート MapXtreme で 内 容 を 認 識 で き る よ うにするため、SQL MapInfo_MapCatalog に登録する必要があります。 Server 2008 の空間テーブルは MapCatalog には、SQL Server 2008 のテーブルを表すために 4 つの新しい SpatialColumn 値が追加さ れています。 17.x : M 値と Z 値を含まない GEOMETRY 用 18.x : M 値と Z 値を含まない GEOGRAPHY 用 20.x : M 値と Z 値を含む GEOMETRY 用 21.x : M 値と Z 値を含む GEOGRAPHY 用 238 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス MapInfo Professional ま た は EasyLoader を使用してデータをアップロードできます。または、 MapInfo Professional を使用して既存のデータをマップ作成可能にすることで、MapCatalog にエン トリが作成されます。MapCatalog の詳細については、246 ページの「MapInfo_MapCatalog」を参照 してください。 MapXtreme では、MapInfo Professional (テーブル バージョン 900、950、1000) および EasyLoader で 作成された SQL Server 2008 のテーブルをサポートしています。 DBMS 接続文字列の形式 ODBC 接続文字列の形式 ODBC 接続文字列は複数の句で構成され、句どうしがセミコロン (;) で区切られています。各句は 「キー=値」の形式を持ちます。重要なキーは以下のとおりです。 注意 接続の属性とパラメータは任意に指定することができるため、冗長な接続を回避するに キーワード DLG= 説明 接続ダイアログ ボックスの表示を制御する数値: 0 - 接続ダイアログを表示しません。 1 - 接続ダイアログを表示します。 2 - 必要な場合だけ接続ダイアログを表示します (一部の必須情報が提供されな かった場合) (デフォルト)。 注意 DSN= プールを使用する ASP.NET アプリケーションでは、ODBC 接続文字列に 「DLG=0」句を指定する必要があります。 ODBC データ ソース名を指定します。 注意: 「DSN= 構文キー」を使用する場合、指定する名前は、ユーザのシステムで 使用されているデータ ソースの名前に一致している必要があります。さまざまな ユーザが別々の名前を使用して同じデータ ソースを参照する可能性があります。 使用するデータ ソース名が事前にわからない場合は、「DSN= 構文キー」の代わ りに、「DRIVER= 構文キー」を使用します。 DRIVER= インストールされているドライバの名前を正確に指定します。「DSN= 構文キー」 の代わりに使用されます。 例: DRIVER={SQL Server} 注意 これは Oracle Spatial には適用されません。 UID= 必要に応じて、データ ソースを使用するユーザの ID を指定します。 PWD= 必要に応じて、データ ソースを使用するユーザのパスワードを指定します。パス ワードが接続文字列の中になくても文字列は一致すると見なされます。同じデー タベース内に 2 つのテーブルがある場合、接続文字列は同じです。 開発者ガイド 239 DBMS 接続文字列の形式 は、ダイアログを使用して既存の接続プールから接続を取得するようにします。API の以 前のバージョンでは、同じデータベースに接続するたびにダイアログを使用したり、接続 文字列内の接続キーワードを指定された順序で記述しなかったりすると、その接続は共有 されず、複数の接続が確立されていました。 Web アプリケーションの ODBC レイヤおよびプール プールを使用する ASP.NET アプリケーションに ODBC 経由でリモート レイヤを追加する場合、接 続文字列に必ず「DLG=0」句を指定するようにします。こうすることで、ユーザ ID とパスワード を入力するための不要なダイアログが表示されなくなり、タイム アウトの発生を防ぐことができ ます。これは、.TAB ファイルとワークスペースにも当てはまります。「DLG=0」句を含む接続文 字列の例を次に示します。 <ConnectString>DRIVER={SQL Server};DATABASE=Devel;Server=Paladin; UID=devel;PWD=devel;QuotedID=Yes;Trusted_Connection=No; Network=DBMSSOCN;Address=PALADIN,1433;DLG=0</ ConnectString> TableInfoServer を使用していてプールがオンの場合に SQL Server にアクセスするには、接続文字列 で「DLG=SQL_DRIVER_NOPROMPT」を指定して、MapInfo.Data.TableException "テーブルを開く ことができません。" がスローされるのを回避します。 Oracle Spatial の接続文字列の形式 Oracle Spatial のキーワードを以下に示します。文字列はセミコロン (;) で区切られる複数の句で構 成されます。各句は「キー=値」の形式を持ちます。重要なキーは以下のとおりです。 キーワード 説明 SRVR= Oracle Net8 EasyConfig ユーティリティで設定したサーバのサービス名です。Oracle 接続には必要ですが、ODBC 接続には該当しません。 UID= 必要に応じて、データ ソースを使用するユーザの ID を指定します。 PWD= 必要に応じて、データ ソースを使用するユーザのパスワードを指定します。 接続文字列の例 Oracle Spatial、Microsoft SQL Server 2008、および SpatialWare の ODBC ドライバの接続文字列の例 を以下に示します。 Oracle Spatial の接続文字列: UID=george;PWD=password;SRVR=OracleSpatial9i Microsoft SQL Server 2008 の接続文字列: DRIVER={<driver>}; SERVER=<server>;UID=<uid>;PWD=<pwd>;Database=<database> ここで、SQL Server Spatial の <driver> は、現在入手できる最新版である SQL Server Native Client 10.0 とします。 240 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス SpatialWare for SQL Server の接続文字列: DRIVER={SQL SERVER}; SERVER=ServerName;UID=Troll;PWD=secret;Database=GEORGETOWN サーバ テーブル クエリでのマップ作成可能テーブルの定義 サーバ テーブルに対して指定したクエリは、DBMS のデータの結果セットを定義しており、これ が追加しようとしているテーブルのデータを表しています。複雑なクエリを作成して、マップ作 成可能テーブルを定義するサーバ サイドの分析を MapXtreme で行うことができます。MapXtreme アプリケーションはこのクエリを内部的に使用してデータにアクセスします。 MapXtreme は、selection/key を使用するクエリのほか、開発者が作成したクエリを基に内部クエリ をいくつか生成して、マップ内のデータにアクセスします。ジオメトリ フィールドの選択先とな るテーブルは、サーバの MapInfo MapCatalog に登録されている必要があります。MapXtreme で は、座標系、空間の種類、デフォルトのスタイルなどのジオメトリ フィールドに関する特定のメ タデータを取得するには、テーブルを登録する必要があります。 クエリによってマップ作成可能テーブルを定義するには、そのクエリがジオメトリ フィールドと キー フィールドの両方を含んでいる必要があります。少量のデータに対して複雑なクエリを実行 すると、空間インデックスまたは空間述語が原因でクエリが失敗します。少量のデータに対して 複雑なクエリを実行するには、「TableInfoServer.MbrSearch=false」と指定し、クエリ結 果をマップ可能にします。 ジオメトリ フィールド MapXtreme アプリケーションによって認識可能なジオメトリ フィールドを指定しない場合、テー ブルは開くことはできますが、マップに追加できなくなります。つまり、テーブルはマップ作成 可能ではなくなります。MapXtreme は、MapCatalog 内でテーブルのジオメトリ フィールドを検索 するほか、フィールドの結果セットのデータ型を調べてジオメトリ フィールドを決定します。擬 似フィールド名 "Obj" を使用すれば、総称的にジオメトリ フィールドを参照することができます。 また、ジオメトリ フィールドの固有のフィールド名を指定して、ジオメトリ フィールドを参照す ることも可能です。この形式は、X/Y マップ作成可能レイヤのジオメトリ フィールドを参照する のに必要となります。サーバがサポートしているジオメトリ関数またはジオメトリ式を使用して ジオメトリ フィールドを指定する方法もあります。 例 Select Obj from rdbsdata Select sw_geometry from rdbsdata select sw_member, ST_Buffer(geometry, 66.0, 0.1) from rdbsdata // a geometry function Select st_geometry(st_point(72.5, 42.5) from rdbsdata // a geometry constructor Oracle sdo_buffer の例: Select mi_prinx, mdsys.sdo_geom.sdo_buffer(geoloc, (select diminfo from sdo_geom_metadata where table_name = 'ALINE'), 20) from aline where prinx = 1 開発者ガイド 241 サーバ テーブル クエリでのマップ作成可能テーブルの定義 Oracle constructor の例: Select 1 "mi_prinx", mdsys.sdo_geometry(3,null,null,mdsys.sdo_elem_info_array(1,3,3), mdsys.sdo_ordinate_array(-79.919909,40.553465,-71.060457,45.363657)) from dual SQL Server 2008 Spatial 関数の例: select location_id, geography::Point(lat, long, 4326 /*WGS84*/) as geog from dbo.store_locations SpatialWare 関数の例: select sw_member, ST_Buffer(sw_geometry, 66.0, 0.1) from rdbsdata select ST_Overlap(flood100.sw_geometry, lake.sw_geometry) from flood100, lake where ST_Overlaps(flood100.sw_geometry, lake.sw_geometry) キー フィールド クエリをテーブルとして開くためには、クエリ内にキー フィールドが返される必要があります。 キー フィールドがあれば、MapXtreme アプリケーションが結果セットの各行を識別できるように なり、レイヤで色分け、選択およびラベル操作を行えます。 多くの場合、クエリ内にキー フィールドを指定する必要はありません。 MapXtreme アプリケーションは、結果セット内の行を一意に参照するために、キー フィールドを 探して、最も適したキー フィールドを決定することができます。キー フィールドがなければクエ リに追加します。多くの場合、キー フィールドはプライマリ キー/一意のインデックスになりま す。 Oracle Spatial のテーブルでは MI_PRINX が使用されることもあります。 クエリの中には、MapXtreme アプリケーションがキーを特定できないものもあります。このよう な例に、ビューまたはシノニムに対するクエリがあります。ビューまたはシノニムは MapInfo MapCatalog に定義されている必要があります。また、多くの場合、基本となる Spatial インデック ス システムも併せて必要であることが登録されている必要があります。ビューまたはシノニムで は MapXtreme によってキーが特定されないため、結果セット内でキー フィールドを特定するため の方法が提供されています。キーは、1 つのフィールドであり、かつ結果セット内で固有の値であ る必要があります。キー フィールドとして使用するフィールドを特定するには、prinx または mi_prinx のフィールド エ イリアスを指定します。たとえば、「select custid mi_prinx, custname, Obj from mycust」のように指定します。 例 Select customer_id mi_prinx, obj from customer_view フィールド エイリアス "mi_prinx" を使用して、customer_id フィールドをテーブルのキー フィール ドとして特定して使用します。または、create view ステートメント内で、必要なキー フィールド のエイリアスを作成し、そのビューに対するすべてのクエリにおいてキー フィールドが自動的に 特定されるようにすることもできます。 242 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス 例 Create view customer_view as select customer_id mi_prinx, geoloc from customer 一般に、フィールド名か、prinx または mi_prinx のフィールド エイリアスが結果セット内に存 在する場合は、そのフィールドがテーブルのキー フィールドとして使用されます。このため、ク エリで好きなキー フィールドを指定できるようになります。 属性データへのアクセス 利用可能な全データ フィールドを指定するには、クエリを「Select * From tablename」のよ うに指定します。アスタリスク (*) は必ず必要というわけではありません。アスタリスクの代わり に、使用するフィールド名を指定しても構いません。クエリのパフォーマンスを上げるには、必 要なフィールドのみを取得するようにクエリを指定します。 DBMS テーブルを追加する際には、パフォーマンスを上げるために、アプリケーションで使用す るフィールドのみをクエリに指定します。空間フィールド、キー フィールドなどが必要で、これ らは指定しなくても自動的に追加されます。また、ラベル用のフィールドや主題図を作成するた めのフィールドも使用します。マップ作成可能テーブルでは、擬似フィールド "OBJ" を使用し て、空間データを格納しているフィールドを参照できます。これは、X/Y フィールドを持つテーブ ルの MapMarker MDIGEOADDRESS フィールドを使用するテーブルで必要です。 サーバ サイドの式または関数を使用して、フィールドを指定することができます。また、実際の アプリケーションでは、「select * from tab」のようなクエリを使用するのを避けます。 以下のコード サンプルでは、TableInfoServer を使用してサーバ テーブルを定義し、この定義によ りマップにレイヤを追加しています。このテーブルのフィールドを使用して、ラベルや主題図を 作成できるようになります。 VB の例: Public Shared Sub MapInfo_Data_TableInfoServer(ByVal connection As _ MIConnection) ' Note: Do not specify any columns.These are determined ' dynamically from the query Dim ti As TableInfoServer = New TableInfoServer("Provinces") ti.ConnectString = "SRVR=ontario;UID=mapx;PWD=mapx" ti.Query = "Select * From Provinces" ti.Toolkit = ServerToolkit.Oci ti.CacheSettings.CacheType = CacheOption.Off ' On is the default Dim tbl As Table = connection.Catalog.OpenTable(ti) End Sub 開発者ガイド 243 キャッシュの設定 パフォーマンスに関する問題 データベース サーバへの接続を確立できるまで数秒かかることがあります。この待ち時間は、 テーブルを最初に開くときのみに生じる一度限りのものです。 マップの表示速度は、サーバから取得するデータの量によって決まります。時には、ローカル ファイルのマップの場合と比べて、サーバのデータのマップ表示が目立って遅いこともありま す。速度は、表示しようとしているマップ フィーチャを MapXtreme アプリケーションがキャッ シュしているかどうかによっても変わります。 キャッシュの設定 MapXtreme で Cache がどのように動作するかを覚えておくと、アプリケーションのパフォーマン スを上げることができます。以降の各セクションでは、キャッシュとは何かを紹介し、MapXtreme オブジェクト モデルでのその動作と、TableInfoServer オブジェクトの CacheSettings プロパティに ついて説明します。 キャッシュとは アプリケーションは、ローカル ファイルではなく、リモート データベースにある MapXtreme の各 種フィーチャにアクセスすることができます。キャッシュにはデータベースのレコードが一時的 に保存されます。つまり、マップを操作するたびにいちいちそのレコードをデータベースから読 み取る必要がないのです。これにより、アプリケーションとリモート データベース間の呼び出し の数を抑えることができます。サーバ テーブルのレコードをキャッシュすれば、アプリケーショ ンの描画、主題図作成およびラベル作成などのパフォーマンスが向上します。サーバ テーブルの データが Map ウィンドウに読み込まれて描画されると、そのデータが内部的にキャッシュされま す。その後、再描画が行われるたびに、このデータがサーバ データベースから取得される代わり に、キャッシュから取得されるようになります。キャッシュにより、再描画のパフォーマンスが 格段に向上します。 キャッシュの使用状況は、さまざまな設定を使用して開発者がカスタマイズします。サーバ テー ブルを追加するときに、TableInfoServer オブジェクトの CacheSettings プロパティでキャッシュの有 効/無効を切り替えることができます。このプロパティはデフォルトで On になっています。 キャッシュの動作 キャッシュされたレコードごとに、属性データ値がメモリに格納され、各フィーチャ オブジェク トが一時 Rtree ファイルのディスクに格納されます。テーブルに格納されているレコードの数が多 い場合、あるいはレコードのサイズ (属性データのレコードあたりのバイト数) が大きい場合、 キャッシュ機能はかなりの量のメモリを消費します。このため、アプリケーションが大量のデー タをキャッシュしようとすると、大量の仮想メモリが必要となり、パフォーマンスが低下してし まうことがあります。アプリケーションでのキャッシュの使用方法をよく検討して決定するよう にします。MapXtreme では、さまざまな方法によってキャッシュを管理できます。 244 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス TableInfoServer オブジェクトおよび CacheSettings プロパティ マップにテーブルを追加すると、デフォルトでキャッシュが有効になりますが、TableInfo オブ ジェクトの CacheSettings プロパティでキャッシュの有効/無効を切り替えることができます。この プロパティに設定できる値は、ON、OFF、ALL、USER の 4 つです。TableInfoServer の場合のデ フォルトは ON、それ以外の TableInfo オブジェクトの場合のデフォルトは OFF です。 パラメータ 説明 OFF テーブルが一切キャッシュされません。データ操作を行うたびに、データベース サーバに直接接続されます。 ON キャッシュが有効になっており、テーブルではマップ ビュー (中心/ズーム) に基 づいてキャッシュを自動的に行います。ユーザは、キャッシュ制約のオブジェク トを使用してキャッシュを制御することもできます。 キャッシュされたテーブルにはレコード キャッシュが維持されます。これに よって、標準的なマップ操作の効率性が向上します。キャッシュは、テーブルが 属している (表示されている) 各 Map の現在のウィンドウに表示されているすべ てのレコードが最低でも含まれるように維持されます。初期のマップ ウィンド ウがいったんキャッシュされると、キャッシュの初期範囲に収まる移動操作およ びズーム操作では、キャッシュ済みのレコードがアクセスされます。そのため、 データベースに対してクエリを実行する必要がありません。移動/ズーム操作が キャッシュ領域の範囲外に及ぶ場合、テーブルはマップ ウィンドウの新しい MBR (ビュー) をキャッシュに追加し、不足しているレコードをデータベース サーバから取得して、キャッシュに追加します。古いマップ ビューが最初に破 棄されることはありません。その代わりに、以前のマップ ビューの内部履歴が 維持されます。キャッシュのサイズが過度に大きくならないようにするため、コ ントロールを利用できます。このコントロールをテーブルのキャッシュに配置し て、キャッシュ済みの古いビュー (マップ ウィンドウの MBR 領域) を破棄するタ イミングを判断できます。これらのコントロールは CacheParameters オブジェク トのプロパティであり、テーブルを最初に開くときに設定できます。開発者はこ れらのコントロールを使用して、キャッシュによって使用されるメモリ量やディ スク容量の最大値、履歴で維持する以前のマップ ウィンドウ ビューの最大数、 キャ ッ シュ 内 で 維持するレコードの最大数、および古いマップ ウィンドウ ビューをキャッシュ履歴に残す最長時間について上限を設定できます。これらの 制限を個別に、または組み合わせて使用することによって、アプリケーション側 で必要となる最適なキャッシュ管理を行うことができます。 TableInfoServer の場合、CacheParameter 設定のデフォルトは ON です。それ以外 の TableInfo データ ソースの場合、デフォルトは OFF です。たとえば、TAB ファ イルはデフォルトではキャッシュされません。 開発者ガイド 245 MapInfo_MapCatalog パラメータ USER 説明 LayerInfo CACHE パラメータを USER に設定すると、アプリケーションによって キャッシュが作成されますが、指定されたレコードのみがキャッシュされるよう になります。キャッシュに格納するレコードを指定できるオブジェクトは、 BoundConstraint、FeaturesConstraint、および AllFeaturesConstraint です。名前に含 まれる "Constraint (制限)" という語は、これらのオブジェクトが、指定されたレ コードのみをキャッシュに格納するように制約を課していることを示していま す。BoundsConstraint オブジェクトでは、フィーチャの MBR と制約の MRB とが 交差するすべてのレコードをキャッシュに格納します。 FeaturesConstraint オブジェクトでは、特定のレコードをキャッシュに追加するこ と が で き ま す。た と え ば、多段階の分析や、フィーチャの Feature または RowValues を 何 度も読み出す分析を実行 し、その対象が、Layer.Search、 Layer.SearchWithinDistance 等から返されるフィーチャのセットである可能性があ る場合、分析中にレコードをローカル キャッシュに格納して、分析が終わった らレコードを削除できれば便利です。FeaturesConstraint ではこのような操作が可 能です。また、全レコードが対象となる可能性のある、分析を多用する操作を実 行する場合、レイヤのデータのセット全体を一時的にキャッシュできれば便利で す。AllFeaturesConstraint ではこのような操作が可能です。上に挙げたキャッシュ 制約オブジェクトは、キャッシュが ON に設定されている場合にも使用できま す。この場合、キャッシュ制約オブジェクトはレコードをキャッシュに追加しま すが、以前のマップ ウィンドウ ビューのキャッシュ履歴には影響を与えませ ん。キャッシュが OFF または ALL に設定されている場合にもキャッシュ制約オ ブジェクトを使用できますが、これらは影響を及ぼさなくなります。 注意 ALL 制約オブジェクトは、サーバ せん。 テーブル以外のテーブルはキャッシュしま テーブル全体がキャッシュされます。このオプションを使用すると、テーブルの データはサーバから 1 回だけ取得され、それ以降はローカルでアクセスされま す。キャッシュ内のデータをリフレッシュするには、テーブルに対して Refresh メソッドを使用します。 大量のデータまたはテーブルをキャッシュすると、仮想メモリが使用されるようになり、キャッ シュによるパフォーマンスの向上効果が得られないことがあります。 MapInfo_MapCatalog MapXtreme アプリケーションでデータをマップに表示するには、MapInfo_MapCatalog という特別 なテーブルにアクセスする必要があります。MapXtreme アプリケーションがデータベース内の テーブルをマップ レイヤとして表示するには、このカタログがあらかじめ作成されている必要が あります。カタログはデータベースごとに 1 つ必要です。データベースの、アクセスしようとして いるすべてのマップ作成可能テーブルの空間フィールドが MapCatalog に登録されている必要があ ります。データベースにテーブルをアップロードするときに、MapInfo EasyLoader ユーティリティ が、MapInfo_MapCatalog に必要な行を自動的に追加します。 246 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス サーバに MapInfo_MapCatalog が既に存在する場合、アプリケーションはこれを利用できます。こ のカ タ ロ グ は、さ ま ざ ま な MapInfo クライアントによって共有されます。サーバに MapInfo_MapCatalog がない場合は、作成が必要です。MapXtreme では、リモート データベース内 の個々のフィーチャにスタイル情報を保存することができます。 DBMS への空間データのロード 空間データを MapInfo テーブルに格納している場合、このデータを DBMS データベースにイン ポートできます。 Microsoft SQL Server、MapInfo SpatialWare for SQL Server、および Oracle Spatial にデータをロードす るには、MapInfo EasyLoader を使用します。このユーティリティは、MapInfo Professional に付属し ており、 www.pbinsight.com からダウンロードすることも可能です。EasyLoader ユーティリティ は、テーブルのアップロード時に MapInfo_MapCatalog が存在しなければ、MapInfo_MapCatalog を 自動的に作成します。 手動による MapInfo MapCatalog の作成 MapInfo Professional または EasyLoader のいずれも使用していない場合は、MapCatalog を手動で作 成するか、データベース管理者に手動で作成してもらう必要があります。これを行うには、以下 の手順に従います。サーバ/データベースごとに一度 MapCatalog を作成すれば、それ以降作成する 必要はありません。 1. マップ作成可能テーブルが格納されているデータベースに、MAPINFO という名前のユーザを 作成します。 2. このデータベースに、MAPINFO_MAPCATALOG というテーブルを作成します。 このときの Create Table ステートメントは、以下のようになります。 Create Table MAPINFO_MAPCATALOG ( SPATIALTYPE Float, TABLENAME Char(32), OWNERNAME Char(32), SPATIALCOLUMN Char(32), DB_X_LL Float, DB_Y_LL Float, DB_X_UR Float, DB_Y_UR Float, VIEW_X_LL Float, VIEW_Y_LL Float, VIEW_X_UR Float, VIEW_Y_UR Float, COORDINATESYSTEM Char(254), SYMBOL Char(254), XCOLUMNNAME Char(32), YCOLUMNNAME Char(32), RENDITIONTYPE INTEGER, RENDITIONCOLUMN CHAR(32), RENDITIONTABLE CHAR(32) NUMBER_ROWS INTEGER) 開発者ガイド 247 MapInfo_MapCatalog への行の追加 注意 テーブルの構造は、このステートメントとまったく同じでなければなりません。唯一の 例外は、varchar データ型または text データ型をサポートするデータベースの場合で、 Char データ型の代わりにこれらのデータ型を使用することが可能です。 3. TABLENAME と OWNERNAME に対して一意のインデックスを作成します。これにより、1 人 の所有者につき 1 つのテーブルだけがマップ作成可能になります。 create unique index mapcat_i1 on mapinfo.mapinfo_catalog (OwnerName,TableName) 4. MAPINFO_MAPCATALOG に Select、Update、Insert および Delete の権限を設定します。この設 定により、ユーザはテーブルをマップ作成可能にすることができます。 grant select, insert, update, delete on mapinfo.mapinfo_mapcatalog to public MapInfo_MapCatalog への行の追加 アプリケーションからアクセスするすべての空間テーブルについて、MAPINFO_MAPCATALOG テーブルに行を追加します。MapInfo_MapCatalog の管理に MapInfo Professional を使用しない場合 は、MAPINFO_MAPCATALOG テーブルに手動で行を追加します。次の表に、各フィールドの構文 とその意味を示します。 248 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス フィールド名 SPATIALTYPE 割り当てる値 例 14.0 = SQL Server 14.1 1: micode (シリアライズされた四分木キー) でイン 14.2 デックスが設定された 14.3 X/Y フィールドのポイント レイヤ 4: X/Y フィールドのポイント レイヤ 5.x: SpatialWare for Oracle 6.x: Ingres SQL - サポートされていません 7.x: Sybase SQS - サポートされていません 8.x: Oracle SDO バージョン 2 - サポートされてい ません 9.x: MapInfo Geocoding DataBlade SpatialWare Point Module 10.x: MapInfo Geocoding DataBlade XY Module 11.x: SpatialWare IDS/UDO datablade 13.x: Oracle Spatial 14.x: SpatialWare for Microsoft SQL Server 17.x:M 値 と Z 値を含まない SQL Server 2008 GEOMETRY 18.X: M 値 と Z 値を含まない SQL Server 2008 GEOGRAPHY 20.x: M 値と Z 値を含む SQL Server 2008 GEOMETRY 21.x: M 値と Z 値を含む SQL Server 2008 GEOGRAPHY MapInfo 空間オブジェクトの形式 空間オブジェクトのタイプ x.0: ポイントのみ x.1: ラインのみ x.2: リージョンのみ x.3: すべてのタイプがサポートされます 注意 このフィールドは、データの保存およびイ ンデックス付けの方法を定義する空間オブ ジェクトの形式のほか、フィールドでサ ポートされている、またはサポートされて いない空間オブジェクトのタイプを示しま す。整数部分は、空間オブジェクトの形式 を表します。小数部分は、フィールドに保 存可能な空間オブジェクトのタイプを表し ます。 MapInfo.GeometryColumn.PredominantGeometryType お よ び Has<Line/Point/Region/Text>Geometries に マッピングされます。 開発者ガイド 249 MapInfo_MapCatalog への行の追加 フィールド名 割り当てる値 例 TABLENAME テーブルの名前。 STATES OWNERNAME テーブルの所有者の名前。 BOB SPATIALCOLUMN 空間フィーチャを格納しているフィールド名 (存 SW_GEOMETRY 在する場合) SW_GEOMETRY (SpatialWare Type/IDS/UDO を使用してマップ作成 可能) NO_COLUMN (X–Y を使用してマップ作成可能) MI_SQL_MICODE (MI Code を使用してマップ作成 可 能)。あ る い は IDS/UDO の名前、または ST_SPATIAL デ ー タ 型の Oracle フィールドの名 前。 Oracle SDO_GEOMETRY フィールドの名前。 DB_X_LL レイヤの外接四角形の左下隅の X 座標の値。単位 –360 は、COORDINATESYSTEM (下記参照) によって示 される単位。 MapInfo.Data.GeometryColumn.Bounds にマッピン グされます。 DB_Y_LL 外接四角形の左下隅の Y 座標の値。 –90 DB_X_UR 外接四角形の右上隅の X 座標の値。 360 DB_Y_UR 外接四角形の右上隅の Y 座標の値。 90 VIEW_X_LL デフォルト ビューの左下隅の X 座標。 -180 デフォルト ビューは、最初に開かれるテーブルの 場合にだけ適用されます。 MapInfo.Data.GeometryColumn.DefaultView にマッ ピングされます。 VIEW_Y_LL デフォルト ビューの外接四角形の左下隅の Y 座標 -45 の値。 VIEW_X_UR デフォルト ビューの外接四角形の右上隅の X 座標 180 の値。 VIEW_Y_UR デフォルト ビューの外接四角形の右上隅の Y 座標 45 の値。 250 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス フィールド名 COORDINATESYSTEM 割り当てる値 例 MapInfo CoordSys 句を表す文字列 (ただし、先頭に Earth Projection 1, CoordSys キーワードを付けません)。マップ投影 0 法、座標単位などを指定します。単純な緯度/経度 マップでは、「Earth Projection 1, 0」と指 定します。 MapInfo.Data.GeometryColumn.CoordSys にマッピン グされます。 SYMBOL MapInfo Symbol 句 (レイヤがポイントのみを含む 場合)。または、Symbol 句、線形フィーチャのス タイルを示す Pen 句、リージョンの枠のスタイル を示す別の Pen 句、Brush 句の順に指定します。 Symbol(35,0,12) Pen(1,2,0) Pen(1,2,0) Brush(2,255,255) MapInfo.Data.GeometryColumn.DefaultStyle にマッ ピングされます。 XCOLUMNNAME X/Y マップ作成可能テーブルでは、X 座標を含む NO_COLUMN フィールド名を指定します。このフィールドがな い場合 (X フィールドと Y フィールドの対ではな く、単一の空間フィールドを使用するテーブルの 場合) は、「NO_COLUMN」を指定するか、指定せ ずにおきます。 MapInfo.Data.SpatialSchemaXY にマッピングされま す。 YCOLUMNNAME X/Y マップ作成可能テーブルでは、Y 座標を含む NO_COLUMN フィールド名を指定します。このフィールドがな い場合は「NO_COLUMN」を指定します。 MapInfo.Data.SpatialSchemaXY にマッピングされま す。 開発者ガイド 251 MapInfo_MapCatalog への行の追加 フィールド名 RENDITIONTYPE 割り当てる値 例 オブジェクト スタイル情報の適用方法を示しま 0 NjǾÇÕ 1 す。 0 - MapCatalog のシンボル フィールドに指定され ているスタイルが、テーブル内のすべてのオブ ジェクトに適用されます。レコードごとのスタイ ルは適用されません。テーブルのデフォルトのス タイルを使用してオブジェクトがロードまたは更 新されます。 1 – テーブルにレコードごとのスタイルが使用さ れます。テーブル内の各オブジェクトに対するス タイル情報を定義する MapBasic の文字列フィール ド を、テ ー ブ ル が 別に持っています ( 現在 MapCatalog の SYMBOL フィールドで使用されて い る も の と 同 じ 形 式 )。テーブル内のスタイル フィールドは、RENDITIONCOLUMN に記録され ます。 RENDITIONCOLUMN RENDITIONTYPE が 1 の場合、このフィールドに MI_SYMBOLOGY は、スタイル情報を格納している空間テーブルの フィールド名が保存されています。このフィール ドは、テーブルに対するすべてのクエリに自動的 に追加され、オブジェクトが更新されると維持 ( 更新) されます。intersect ステートメントまたは update ステートメントで問題が発生するため、ク エリ内でこのフィールドを指定しないでくださ い。ワイルドカード文字 "*" を使用する場合を除 き、select 句にこのフィールドが含まれるクエリ は、Dataset オブジェクト経由で値にアクセスする ことがあります。スタイル フィールドが NULL 値 の行では、MapCatalog の SYMBOL フィールドの スタイルがオブジェクトに適用されます。 MIDBType.Style を 持 つ MapInfo.Column.DataType を作成します。 RENDITIONTABLE 現在は使用されていません。将来のために予約さ NULL れています。 NUMBER_ROWS MapInfo Professional で現在使用されています。 252 NULL MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス レコードごとのスタイル レコードごとのスタイルがサポートされていることにより、MapInfo TAB ファイルで長い間使用さ れてきた空間データベースにフィーチャを使用できるようになります。具体的に言うと、1 つの テーブル内の各ジオメトリにスタイルを設定できるようになります。たとえば、Oracle Spatial にあ る public institution という 1 つのテーブルに、学校、市役所、図書館、および警察署のレコードが あり、各ポイントの種類を別個のシンボルによって表す (すべての学校を学校のシンボルによって 表す) 場合があります。同様に、SpatialWare SQL Server の 1 つの道路テーブルにさまざまな道路タ イプのレコードがあり、道路を 1 ピクセル幅の黒のライン、補助道路を 2 ピクセル幅の赤のライ ン、交差点を平行な赤のラインで表す例もあります。 レ コ ー ド ご と の ス タ イ ル を 使 用 す る に は、RENDITIONTYPE、RENDITIONCOLUMN、 RENDITIONTABLE が適切に設定された MapCatalog 内のエントリでテーブルが定義されている必 要があります。 注意 上に挙げたフィールドがない場合は、テーブルのデフォルトのスタイルが全オブジェクト に適用されます。 Symbol 句、Pen 句および Brush 句の構文 リモート空間データベースをサポートするために MAPINFO_MAPCATALOG テーブルを手動で作 成する際には、シンボル スタイルを設定する必要があります。また、ライン スタイルおよびフィ ル スタイルの指定も必要となる場合もあります。 ポイント スタイルの指定 ポイント スタイルを指定するには、Symbol 句を使用します。Symbol 句には 3 種類あり、それぞれ MapInfo 3.0 スタイルのシンボル、TrueType フォント シンボル、およびビットマップ シンボルの指 定に使用されます。 Symbol の構文 Symbol(shape, color, size) または Symbol(shape,color,size,font,fontstyle,rotation) または Symbol(bitmapname,color,size,customstyle) 例 Symbol(35,0,12) Symbol(64,255,12,"MapInfo Weather",17,0) Symbol("sign.bmp", 255, 18, 0) ライン スタイルの指定 ライン スタイルを指定するには、Pen 句を使用します。MapInfo_MapCatalog では、線形フィー チャの外観を指定する Pen 句と、リージョンの境界を指定する Pen 句の 2 つの Pen 句を使用しま す。 Pen の構文 Pen(thickness, pattern, color) 開発者ガイド 例 Pen(1, 2, 0) 253 トラブルシューティング フィル スタイルの指定 閉じたフィーチャ (リージョン) のスタイルを指定するには、Brush 句を使用します。 Brush の構文 Brush(pattern,color,backgroundcolor) 例 Brush(2, 255, 65535) MapXtreme のスタイル API については、第 16 章、309 ページの「マップのスタイル設定」 を参照 してください。スタイルのパターンは、付録 G、575 ページの「スタイルのルックアップ」に示さ れています。 Text オブジェクトの制限 LegacyText オブジェクトには、MI_Style フィールドを使用する方法とは別のスタイルの表示方法が あります。このため、どのような種類のテキスト オブジェクトも、他のオブジェクトとは異なる 方法で処理する必要があります。すべてのテキスト オブジェクトでは、スタイルが埋め込まれて おり、スタイル フィールドに NULL 値が挿入されています。 トラブルシューティング SpatialWare アプリケーションまたは Oracle アプリケーションで問題が発生した場合、次の表を参 考にして問題を解決します。 問題の内容 テーブルを照合できない。 254 考えられる原因 解決法 SpatialWare レイヤに対して 現在、SpatialWare レイヤに データ バインドを行おうとし AddColums がサポートされてい た。 ません。 MapXtreme 2008 v7.0.0 第 12 章 : DBMS のデータへのアクセス 問題の内容 考えられる原因 解決法 指定したインデックスを使用 存在しないテーブルに対して 大 文 字 と 小 文 字 の 区 別 を 含 め て、テーブル名を正しく指定し してオブジェクトを検索でき クエリを行った。 て い る こ と を 確 認 し ま す。ま ない。 た、テーブルがマップ作成可能 である必要があります。 空間クエリの結果に空間オブ EasyLoader Upload ユーティリ ジェクトが含まれていない。 テ ィ を 使 用 し て、テ ー ブ ル を マップ作成可能にします。 空間テーブル以外のテーブル クエリに構文エラーがないかを に対してクエリを行った。 確 認 し ま す。ま た、 MapInfo_MapCatalog の空間 フィールドに指定されている フィールドが、クエリ結果に含 まれていることを確認します。 マップのズーム レベルが正 しくない。たとえば、マップ の縮小度が高すぎて、地形を 識別できない。 開発者ガイド DBMS レイヤの MBR は、 MapInfo_MapCatalog テーブル に よ っ て 決 定 さ れ ま す。 MapCatalog のテーブル範囲が 原因で、ズーム レベルが、 マップに出力しようとしてい るズーム レベルから外れるこ とがあります。 MapInfo Professional MBX ツール (MISETMBR.MBX) を使用して MapInfo_MapCatalog に格納され ている範囲の値 (DB_X_LL、 D B _ X _ U R 、D B _ Y _ L L 、 DB_Y_UR) を変更します。 255 トラブルシューティング 256 MapXtreme 2008 v7.0.0 13 アプリケーションへのマッ ピング機能の追加 MapInfo.Mapping 名前空間を使用して、アプリケーションにマッピング機能を 追加します。この章では、Mapping 名前空間を使用してマッピング アプリケー ションを拡張する方法について説明します。 この章の構成 「MapInfo.Mapping 名前空間とは」 . . . . . . . . . . . . . . . . . . . . . . . . . . . 「マッピングのベース クラス」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「Layers」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「Labels」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「Adornments」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「フィーチャ スタイル修飾子」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「マップの印刷」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 258 261 265 269 271 272 マッピングのベース クラス MapInfo.Mapping 名前空間とは MapInfo.Mapping 名前空間には、マップ、レイヤ、修飾子、主題図、凡例、およびラベルを作成、 表示、エクスポートするためのクラス、インターフェイス、および列挙体が含まれています。 Map クラスは、デスクトップ アプリケーション内のマップに関する最上位のオブジェクトです。 Map オブジェクトごとに 1 つのマップを含めることができます。各 Map は、Adornment コレク ションと Layer コレクションを 1 つずつ持っています。Web アプリケーションを開発するときに、 マップ イメージをビットマップまたはストリームにエクスポートするために、Map を MapExport オブジェクトにアタッチします。 「第 3 章、61 ページの「レイヤ」 」に説明されているように、マップは、基本的にはお互いに上 に積み重ねられたレイヤの集合です。Mapping 名前空間クラスを使用すると、これらのレイヤを操 作するよう必要に応じてアプリケーションを設計できます。 マッピングのベース クラス このセクションでは、MapInfo.Mapping 名前空間で使用されているマップのベース クラスについて 説明します。Map 階層を UML で表したものを、次の図に示します。 MapExport (マップのエクスポート) MapExport クラスは、イメージへの Map のエクスポートで使用します。このクラスのプロパティ は、BorderPen、ExportSize、Format などのイメージの各項目を指定します。 MapExport は、BMP (デ フ ォ ル ト)、WBMP、WMF、EMF、GIF、J2K、JPG、PNG、PSD、TIFF、 TIFFCymk、TIFFLzw など、さまざまなイメージ形式をサポートします。パフォーマンスが懸念さ れる場合は、LEADTOOLS API の代わりに .NET Framework API を使用して、BMP、GIF、JPG、 PNG、TIFF の各フォーマットをエクスポートすることもできます。エクスポートの速度は異なり ますが、どちらの方法も、エクスポート後のイメージの品質は同じです。 形 式 を 選 択 す る に は、ExportFormat (ExportFormat.WindowsPNG など) を設定します。 注意 258 プロパティに、上記のいずれかの形式 LegendExport クラスも、.NET framework および LEADTOOLS の API を使用し、上記の形式 でファイルがエクスポートされます。 MapXtreme 2008 v7.0.0 第 13 章 : アプリケーションへのマッピング機能の追加 MapExport の使用例 MapControl を使用する場合は、次の例に示すように、エクスポートする前にマップを複製してお く必要があります。 VB の例: Public Shared Sub MapInfo_Mapping_MapExport(ByVal mapControl1 As MapControl) 'must clone since map is coming from mapcontrol and is linked to it via the HWND Dim NewMap As Map = CType(mapControl1.Map.Clone(), Map) Dim exportObject As MapExport = New MapExport(NewMap) exportObject.ExportSize = New MapInfo.Mapping.ExportSize(2931, 4104) exportObject.Format = ExportFormat.Gif exportObject.Export("C:\Temp\ExportImage.gif") End Sub Map Map クラスには、マップに包含できるものがすべて含まれます。Map オブジェクトは、デスク トップ アプリケーションに関しては MapControl オブジェクトに置かれており、また Web アプリ ケーションに関しては MapExport オブジェクトにアタッチされています。 Map には、次のプロパティがあります。 • • • • • • • • Bounds Center Zoom Scale Size Rotation DisplayTransform DisplayCoordSys Map ごとに Layers コレクション (261 ページの「Layers」を参照) と 1 つの Adornment コレクション があります。Layers コレクションにはマップを構成するすべてのレイヤ、Adornment コレクション にはマップの修飾すべてが含まれています。また、Adornment には、凡例、タイトル、スケール バーが含まれます (「第 15 章、305 ページの「凡例の概要」 」を参照)。 MapFactory MapFactory クラスには、Geoset ファイル、ワークスペース、テーブルのリストからマップを作成 するためのオブジェクトが含まれます。また、MapFactory は、特定のセッションで作成された全 マップのコレクションのコンテナとして機能するとともに、そのコレクションを追跡します。 開発者ガイド 259 マッピングのベース クラス MapFactory の使用例 この例は、MapFactory の CreateEmptyMap を使用して、300×300 ピクセルのサイズで空のマップを 作成します。 ' Create a new map Dim map As Map = Session.Current.MapFactory.CreateEmptyMap(New Size(300, 300)) MapLoader MapLoader クラスは、Geoset ファイル、XML ワークスペース ファイル、または TAB ファイルから マップのレイヤを読み込むためのメカニズムを提供します。各種類のマップを読み込むために、 マップの読み込みに使用する MapLoader のサブクラスが用意されています。これらのサブクラス には、MapGeosetLoader、MapWorkspaceLoader、MapTableLoader などがあります。 VB の例: Public Shared Sub MapInfo_Mapping_MapLoad() ' Create an empty map Dim map As Map = _ MapInfo.Engine.Session.Current.MapFactory.CreateEmptyMap(New Size(400,_ 300)) ' Create a maploader.Make sure that Session.Current.TableSearchPath points to the folder with the tables in it Dim tl As MapTableLoader = New MapTableLoader("ocean.tab", _ "usa.tab", "mexico.tab", "us_hiway.tab") ' Load tables into a map map.Load(tl) End Sub MapViewList、MapView これらのクラスには、マップの前のビューまたは次のビューのリストを保持するためのオブジェ クトが含まれます。MapViewList クラスを使用してマップ ビューのスタックを順に移動し、 MapView クラスを使用して各マップ ビューの固有情報 (Name、Center、および Zoom) を表示しま す。 MapXtreme の VB サンプルは、<MapXtreme のインストール ディレクトリ>\MapInfo\ MapXtreme\7.x.x\Samples\Desktop\Features に収録されています。 MapControl MapControl クラスには、画面上にマップを視覚化するためのオブジェクトが含まれます。Windows フォームに MapControl を追加してマップを表示します。MapControl には、MapTools コレクション も含まれます。Web アプリケーションで使用するバージョンの MapControl も存在します。 デスクトップ アプリケーションで使用する MapControl クラスは、MapInfo.Windows.Controls 名前 空間にあります。実際に操作して機能を確認できるデスクトップ MapControl の実例を見るには、 Windows の [スタート] メニューからワークスペース マネージャを実行してください。また、第 24 章: 「ワークスペース マネージャ」も参照してください。 260 MapXtreme 2008 v7.0.0 第 13 章 : アプリケーションへのマッピング機能の追加 Web アプリケーションで使用する MapControl クラスは、MapInfo.WebControls 名前空間にありま す。「第 5 章、84 ページの「Web コントロールのアーキテクチャ」 」を参照してください。Web アプリケーションに対して広域図を作成する方法のチュートリアルについては、[スタート] メ ニューからラーニング リソースの「チュートリアル」セクションを参照してください。 Layers 以下のセクションでは、Layers オブジェクトとクラスについて説明します。Layers 階層を UML で 表したものを、次の図に示します。 FeatureLayer FeatureLayer は、Table から Feature を表示するレイヤです。たとえば、世界各国を表すリージョン オブジェクトのレイヤが FeatureLayer です。FeatureLayers は、ネイティブ .TAB データ、リモート RDB、シームレス、またはラスタ データとすることができます。 Layers 各マップには、Layers クラスで表現される FeatureLayers のコレクションがあります。コレクショ ン内の順序は、レイヤが描画される順序です。このコレクション クラスのメソッドには、Add、 Insert、Move、および Delete があります。Layers コレクションは LayersBase クラスから派生しま す。レイヤを通して列挙していく最も良い方法は、Layer フィルタを使用することです。 レイヤを変更するには、まず、そのレイヤを編集可能にする必要があります。レイヤを編集可能 にするには、EditMode プロパティを変更します。EditMode プロパティは、LayerControl 内の設定 を変更するか、またはプログラムによって変更されます。レイヤがいったん編集可能になると、 そのレイヤ内のフィーチャを移動または削除したり、そのサイズを変更したりできます。 注意 開発者ガイド 特定のレイヤについては、レイヤに対する編集がすぐに反映されます。したがって、編集 可能なレイヤでフィーチャを選択するときは注意が必要です。 261 Layers フィルタをインプリメントするには、MapLayerFilterFactory クラスを使用します。このクラスを使 用すると、レイヤ タイプや可視レイヤなど、ストック フィルタのセットからフィルタを作成でき ます。独自のフィルタを作成するには、インターフェイス IMapLayerFilter をインプリメントする クラスを記述します。 MapLayer MapLayer クラスは、すべてのレイヤのベース クラスです。このクラスは IMapLayer インターフェ イスをインプリメントします。プロパティには、Enabled、VisibleZoomRange、Name、および Alias が含まれます。このクラスを使用して、一般的なレイヤ プロパティにアクセスします。 UserDrawLayer UserDrawLayer は、描画メソッドをオーバーライドして独自のレイヤを描画できるようにする抽象 クラスです。これにより、マップの座標系を使用し新しいフィーチャを作成して実際にマップに 追加するのではなく、Windows の描画メソッドを使用して MapControl の上にカスタム オブジェク トを追加するという効率的な方法を使うことができます。 ObjectThemeLayer ObjectThemeLayer クラスには、異なる 3 種類の主題図 (円グラフ、棒グラフ、およびサイズ可変シ ンボル) が含まれます。これらのレイヤは他のレイヤと同様に機能します。また、グループ化した り、表示/非表示を設定したりすることもできます。 GroupLayer このクラスは、移動やオンとオフの切り替えが同時に行われるレイヤ グループを示します。 GroupLayer は、IMapLayer に結合された LayersBase コレクションです。このオブジェクトは、 AnimationLayers を実行する機能もサポートしています。 グループ内のレイヤの VolatilityHint が Animate の場合は、グループ内のそれらのレイヤを再描画す るだけで済みます。レイヤの VolatilityHint が CacheIfPossible または Normal の場合は、すべてのレ イヤを再描画する必要があります。 LabelLayer LabelLayer クラスは、ラベルを生成し、そのラベルをマップの特定のレイヤ位置に描画します。 265 ページの「LabelLayer」および第 24 章、451 ページの「ラベル レイヤの設定」 を参照してくだ さい。 GraticuleLayer このクラスは、マップ ウインドウに経線と緯線のグリッドを表示するために使用されます。第 24 章、464 ページの「経緯度線レイヤ」 を参照してください。 262 MapXtreme 2008 v7.0.0 第 13 章 : アプリケーションへのマッピング機能の追加 レイヤ フィルタ IMapLayersFilter および IMapLayersFilterFactory インターフェイスは、レイヤ列挙体をサポートしま す。 IVisibilityConstraint IVisibilityConstraint は、特定のオブジェクトを表示するかどうかを決定するインターフェイスで す。このインターフェイスは、LabelModifiers、FeatureStyleModifiers、および Themes などのすべて のレイヤ タイプを含む、さまざまなタイプによりインプリメントされます。 コード例: Animation レイヤ MapInfo Knowledgebase に収録されている次の VB サンプルを使って、レイヤのアニメーションの 設定方法を示します。 Private Sub btnInitializeObjects_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnInitializeObjects.Click Dim Cat As Catalog = MapInfo.Engine.Session.Current.Catalog 'Create Temp layer Dim tblInfoTemp As New TableInfoMemTable("Animation") Dim tblTemp As Table = Cat.GetTable("Animation") If IsNothing(tblTemp) = False Then 'Table exists close it Cat.CloseTable("Animation") End If tblInfoTemp.Columns.Add(ColumnFactory.CreateFeatureGeometryColumn(Map_ Control1.Map.GetDisplayCoordSys())) tblInfoTemp.Columns.Add(ColumnFactory.CreateStyleColumn()) tblInfoTemp.Columns.Add(ColumnFactory.CreateStringColumn("Name", 40)) tblInfoTemp.Columns.Add(ColumnFactory.CreateStringColumn("Dept", 15)) tblInfoTemp.Columns.Add(ColumnFactory.CreateIntColumn("Level")) tblTemp = Cat.CreateTable(tblInfoTemp) Dim lyr As New FeatureLayer(tblTemp) MapControl1.Map.Layers.Add(lyr) 'Create Points Dim pt As FeatureGeometry = New Point(lyr.CoordSys, New DPoint(-76, 42)) Dim cs As New CompositeStyle(New SimpleVectorPointStyle(37, _ System.Drawing.Color.Red, 10)) Dim ftr As New Feature(tblTemp.TableInfo.Columns) ftr.Geometry = pt ftr.Style = cs ftr.Item("Name") = "Kelly" ftr.Item("Dept") = "Sales" ftr.Item("Level") = 3 tblTemp.InsertFeature(ftr) Dim pt2 As FeatureGeometry = New Point(lyr.CoordSys, New DPoint(-119, 34)) 開発者ガイド 263 Layers Dim cs2 As New CompositeStyle(New SimpleVectorPointStyle(44, _ System.Drawing.Color.Purple, 10)) Dim ftr2 As New Feature(tblTemp.TableInfo.Columns) ftr2.Geometry = pt2 ftr2.Style = cs2 ftr2.Item("Name") = "Greg" ftr2.Item("Dept") = "Marketing" ftr2.Item("Level") = 2 tblTemp.InsertFeature(ftr2) End Sub Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim cat As Catalog = MapInfo.Engine.Session.Current.Catalog Dim tbl As Table = cat.GetTable("Animation") If IsNothing(tbl) = False Then 'Update the position of the points Dim si As SearchInfo = MapInfo.Data.SearchInfoFactory.SearchWhere("Name= _ 'Kelly'") Dim ftr As Feature = cat.SearchForFeature(tbl, si) Dim si2 As SearchInfo =_ MapInfo.Data.SearchInfoFactory.SearchWhere("Name = 'Greg'") Dim ftr2 As Feature = cat.SearchForFeature(tbl, si2) If TimeOfDay.Now.Second Mod 4 = 0 Then ftr.Geometry.GetGeometryEditor().OffsetByXY(-5, -25, DistanceUnit.Mile, _ DistanceType.Spherical) ftr2.Geometry.GetGeometryEditor().OffsetByXY(0, 25, DistanceUnit.Mile, _ DistanceType.Spherical) Else ftr.Geometry.GetGeometryEditor().OffsetByXY(-10, 0, DistanceUnit.Mile, _ DistanceType.Spherical) ftr2.Geometry.GetGeometryEditor().OffsetByXY(10, 5, DistanceUnit.Mile, _ DistanceType.Spherical) End If ftr.Geometry.EditingComplete() ftr2.Geometry.EditingComplete() ftr.Update() ftr2.Update() End If End Sub 264 MapXtreme 2008 v7.0.0 第 13 章 : アプリケーションへのマッピング機能の追加 Labels 以下のセクションでは、Labels オブジェクトとクラスについて説明します。Labels 階層を UML で 表した図を次に示します。 LabelLayer LabelLayer クラスでは、ラベルとレイヤに独自の順序を付けることができます。LabelLayer は MapLayer の一種であり、MapLayer のように扱うことができます。このように MapLayer と似てい るため、MapLayer を配置できる場所ならどこでも LabelLayer を配置することができ、マップ内の 他のレイヤと比較して、Labels を相対的に位置づけることができるようになります。各 LabelLayer は LayerSources で構成されており、これらのオブジェクトのコレクションとして動作します。 LabelSource LabelSource クラスは、データ ソースと、そのソースへのラベルの設定方法を定義するルールに基 づいて、地形をラベルとして視覚的に表示します。LabelSource は、描画できるように、Map の LabelLayer に追加されます。LabelLayer は、Map 内の位置を提供するとともに、他の LabelSources との対話操作を制御するルールを提供します。LabelSource クラスを使用するには、データを取得 するテーブル (MITable)、ラベル テキストを定義する式、およびその他のデフォルトのラベル プロ パティを適切に指定します。 開発者ガイド 265 Labels LabelModifier LabelModifier クラスは、ラベル作成で使用するプロパティのデフォルト値を変更する際に使用し ます。Sources コレクションに含まれる各 LabelSource のラベルを作成する場合、まず、LabelLayer が DefaultLabelProperties を使ってラベルを作成します。次に、Modifiers コレクション内の表示され ている LabelModifier を使用します。 ILabelSourceFilter このインターフェイスでは、特定のルールに従ってフィルタリングしながら、LabelLayer 内の LabelSource オブジェクトを列挙することができます。また、このインターフェイスをインプリメ ントして、独自のフィルタリング ルールを定義できます。 LabelProperties このクラスには、スタイルや位置づけなどのラベル プロパティ情報が入っています。ラベル プロ パティは限定的に指定することができます。この機能は、LabelModifier を使用してラベル プロパ ティの一部だけを変更する場合に非常に便利です。また、優先度をラベルに設定して、ラベル位 置を調整することもできます。 ラベルの生成 LabelLayer クラスは、マップが描画されるとき、または LabelLayer.Refresh メソッドが呼び出され たときに、ラベルを生成します。可視の各ラベル ソースがその対象です。1 つのマップに複数のラ ベル レイヤを含めることができます。 現在のマップ ビュー内にあるソースのテーブル内の各フィーチャについてラベルを生成する場 合、LabelLayer クラスでは次の処理が行われます。 1. DefaultLabelProperties 使用します。 プロパティを、ラベルの作成で使用するプロパティの開始セットとして 2. Modifiers コレクション内の可視ラベル修飾子ごとに Modify メソッドを呼び出します。これ で、各修飾子を使用して、ラベルの作成で使用するラベル プロパティを変更できるようになり ます。 3. 表示制約チェックを実行して、ラベルを保持するかどうかを判断します。 a. 表示制約を現在のマップのズーム / スケールと比較して、ラベルが表示されるかどうかを確 認します。 b. ラベルが表示され、このラベルで重なり合いも重複も発生してはならない場合は、 他の既 存のラベルと重なり合ったり重複したりしていないかどうかを確認します。重なり合いま たは重複が検出された場合は、「ラベルの優先度」を使用して、どのラベルを残すかを判 断します。 4. 表示制約を継承する場合は、生成されたラベルのコレクションにラベルを追加します。 ラベル生成ルールは各ラベル レイヤ内でのみ適用され、マップ全体には適用されないことに注意 してください。たとえば、マップのすべてのラベル レイヤに含まれるすべてのラベル ソースで AllowOverlap プロパティを False に設定しても、ラベル レイヤの間でラベルは重なり合います。こ れは、ラベルがラベル レイヤに関係なく個別に生成されるためです。 266 MapXtreme 2008 v7.0.0 第 13 章 : アプリケーションへのマッピング機能の追加 現在の マ ップ ビ ュ ーか ら ラベ ル を作成するためにマップがまだ描画されていない場合は、 LabelLayer.Refresh メソッドを使用します。 生成されたラベルへのアクセス 生成されたラベルにアクセスするには、LabelSource.Labels プロパティを使用します。このコレク ションは、現在のマップ ビュー内にあるラベルを表します。マップ内のすべてのラベルを表すわ けではありません。マップのビューが変更されると、コレクション内の項目も変更されます。 ラベルの優先度 AllowOverlap または AllowDuplicates が False に 設定されているとき、同じ LabelLayer 内のどのラベ ルを生成するかがラベルの優先度によって決定されます。「「ラベルの生成」」でも説明されて いるように、各ラベル レイヤは個別に設定されるため、他のレイヤで重なり合いや重複の設定が 違っていても影響しません。 ラベルが同じレイヤ内の別のラベルと重なり合うか、重複している場合、両方のラベルの優先度 を比較して、どちらのラベルを残すかが判断されます。まず、各ラベルの優先度 (ラベル間関係の ソースと呼ばれます) を比較します。優先度が高いラベルが残ります。 MapXtreme では、ラベルの表示を制御するために Major と Minor という 2 つの優先度レベルを使用 します。これにより、優先度を基準にグループおよびサブグループに分類することができます。 たとえば、人口の多い都市のラベルを中小都市よりも高い優先度に設定できます。ただし、修飾 子を追加することで中小都市の Major 優先度を高め、大都市よりも上にすることもできます。 Major 優先度に null (Visual Basic の場合は nothing) が設定されている場合、LabelLayer 内のラベルの LabelSource の位置を逆にした値が使用されます。つまり、インデックス位置の値が大きいほど、 優先度は低くなります。たとえば、LabelSource がインデックス 3 にあり、10 個の LabelSource (イ ンデックス 0 ~ 9) がある場合、Major 優先度は 6 (インデックス計の反対の値) になります。 Minor 優 先 度 が null (Visual Basic の Nothing) のときは、使用される値は、ラベルが付けられる Feature の Key に基づきます。Table 内の行数に対するキーの数値表記の反対の値が使用されます。 たとえば、Table が 10 行のテーブルの場合、行 ID 7 のフィーチャに対するラベルのデフォルトの Minor 優先度は 3 (10 - 7 = 3) です。キーが数値以外の場合、マイナー優先度のデフォルトは 0 で す。 Major 優先度が等しいときは、Minor 優先度が高いラベルが残ります。 優先度を作成するには、結果が数値となる式を使用します。たとえば、C# の式で結果が数値とな るのは、数値型フィールドまたは以下のような式 (フィールド値の最初の文字の Asc 値など) とな ります。 "(1/Asc(Country))*1e6" ラベル レイヤの選択可能性 ラベ ル レ イ ヤ を選択可能にするかどうかを制御するには、プログラムから SelectMapToolProperties.LabelsAreEditable プロパティを使用するか、ワークスペース マネージャの [ ラベルの編集可能] チェックボックスを使用します。 LayerHelper.SetSelectable メソッドは、特定のレイヤ タイプの選択可能性に影響を及ぼしません。 このレイヤには、Label、WMS/WFS、Raster、Group の各レイヤが含まれます。 開発者ガイド 267 Labels コード例: LabelLayer の作成 以下の例は、Labels に関連するクラスの使用方法を具体的に示しています。 VB の例: ' Open usa table using the data catalog Dim table As Table = Session.Current.Catalog.OpenTable("usa.tab") ' Create a new map Dim map As Map = Session.Current.MapFactory.CreateEmptyMap(New _ Size(300, 300)) ' Create a new feature layer that references the table and add it to the map Dim featureLayer As New FeatureLayer(table) map.Layers.Add(featureLayer) ' Create a new label layer and add it to the map. ' Note that if you call MapInfo.Mapping.LayersBase.Add" method instead of ' MapInfo.Mapping.LayersBase.Insert method it will automatically position the ' label layer before the feature layer Dim labelLayer As New MapInfo.Mapping.LabelLayer() map.Layers.Insert(0, labelLayer) ' Create a new label source that references the table Dim source As New MapInfo.Mapping.LabelSource(table) ' Change its caption expression to be a specific column from the table ' called "State_Name" source.DefaultLabelProperties.Caption = "State_Name" ' Append the label source to the label layer so that it shows on the map labelLayer.Sources.Append(source) 湾曲ラベル 湾曲ラベルとは、ラインの湾曲に沿って表示されるラベルのことです。湾曲ラベルを使うこと で、道路や河川など、ラインから構成されるマップ フィーチャの外観を美しくすることができま す。 湾曲ラベルをワークスペース マネージャで作成するには、ラベル レイヤを選択し、[位置] タブで [ セグメントに沿ってラベルを曲線化] を選択します。第 24 章、461 ページの「湾曲ラベル」 を参照 してください。 API を 介 し て 湾 曲 ラ ベ ル を レ ン ダリングするには、ILayout インターフェイスおよび UseRelativeOrientation プロパティを使用します。ラベルをジオメトリに沿って湾曲させるには、 MapInfo.Text.RelativeOrientation.FollowPath を指定します。『開発者リファレンス』で ILayout イン ターフェイスのコード例を参照してください。 268 MapXtreme 2008 v7.0.0 第 13 章 : アプリケーションへのマッピング機能の追加 Adornments Adornments ク ラ ス は、マ ッ プの修飾の順不同コレクションです。修飾は、Legend、Title、 Scalebar、またはユーザ定義の他のオブジェクトです。各マップには、Adornments コレクションが 1 つ含まれます。各修飾は、単一の AdornmentControl に属します。 独自の修飾を作成するには、IAdornment インターフェイスおよび AdornmentControl 抽象クラスか らクラスを取得します。 Legends 凡例を主題図と組み合わせて使用できます。主題図の詳細については、「第 15 章: 「主題図と凡例 の使用」」を参照してください。凡例は LegendFactory クラスを使用して作成します。凡例 は 1 つ 以 上 の 凡 例 フ レ ー ム で 構 成 さ れます。各フレームには、ThemeLegendFrame または CartographicLegendFrame を使用します。どちらの LegendFrames も、LegendFrameFactory クラスを 使用して Legend から作成されます。凡例の取り扱いとカスタマイズには、 MapInfo.Mapping.Legends 名 前 空間のクラスを使用します。この名前空間のクラスには、 CartographicLegendFrame、ThemeLegendFrame、LegendFormat、LegendControl などがあります。 Legend のサイズは Legend.Size プロパティを使って設定できますが、LegendFrames のサイズは設定 できません。LegendFrame のサイズは、中に収められるデータの量に応じて決まります。 VB の例: Private Sub Page_Load(ByVal sender As Object, ByVal e As _ System.EventArgs) LegendControl1.Map = MapControl1.Map If Not IsPostBack Then Dim normalLyr() As MapInfo.Mapping.LayerType = New _ MapInfo.Mapping.LayerType(1) {} normalLyr(0) = MapInfo.Mapping.LayerType.Normal Dim filter As MapInfo.Mapping.IMapLayerFilter = _ MapInfo.Mapping.MapLayerFilterFactory.FilterByLayerType(normalLyr) Dim frame As MapInfo.Mapping.Legends.LegendFrame Dim NewLegend As MapInfo.Mapping.Legends.Legend = _ MapControl1.Map.Legends.CreateLegend(New System.Drawing.Size(5, 5)) NewLegend.Format.FrameAlignment = _ MapInfo.Mapping.Legends.LegendFrameAlignment.Horizontal Dim ftrLayer As MapInfo.Mapping.FeatureLayer For Each ftrLayer In _ MapControl1.Map.Layers.GetMapLayerEnumerator(filter) frame = _ MapInfo.Mapping.Legends.LegendFrameFactory.CreateCartographic_ LegendFrame(ftrLayer) NewLegend.Frames.Append(frame) Next LegendControl1.Legend = NewLegend Else LegendControl1.Legend = MapControl1.Map.Legends(0) End If End Sub 開発者ガイド 269 Adornments ScaleBar 修飾 スケール バーは、マップの単位 (キロメートルやフィートなど) を使ってマップ上の距離を測るた め に 使 用さ れ る 直 線 状 の オ ブ ジ ェ ク トです。ScaleBarAdornment クラスを使用して ScaleBarAdornmentControl を 作 成 し、マップにコントロールを追加します。マップ自体に ScaleBarAdornment を追加する場合、表示はされますが、ScaleBarAdornmentControl がないので、ス ケール バーはマップ自体にリンクされません。 VB の例: Public Shared Sub MapInfo_Mapping_ScaleBarAdornment(ByVal mapControl1 As _ MapControl) ' Create a scalebar Dim sba As ScaleBarAdornment = New ScaleBarAdornment(mapControl1.Map) ' Position the scalebar at the lower right corner of map Dim x As Integer = mapControl1.Map.Size.Width - sba.Size.Width Dim y As Integer = mapControl1.Map.Size.Height - sba.Size.Height sba.Location = New System.Drawing.Point(x, y) ' Add the control to the map Dim sbac As ScaleBarAdornmentControl = New ScaleBarAdornmentControl(sba, _ mapControl1.Map) mapControl1.AddAdornment(sba, sbac) End Sub Title 修飾 Title 修飾は、マップのタイトルを表示するためや、マップ上にその他の情報を示すテキストを追 加するために、マップに描画されるテキスト オブジェクトです。MapXtreme では、TitleAdornment クラスを使用してタイトルを作成し、そのタイトルをマップに追加します。 VB の例: Public Shared Sub MapInfo_Mapping_TitleAdornment(ByVal mapControl1 As MapControl) ' Create a Titlebar Dim ta As New MapInfo.Mapping.TitleAdornment(New System.Drawing.Size(100, 50), mapControl1.Map) ta.Title = "This is a watermark" mapControl1.Map.Adornments.Append(ta) End Sub 270 MapXtreme 2008 v7.0.0 第 13 章 : アプリケーションへのマッピング機能の追加 フィーチャ スタイル修飾子 フィーチャ スタイル修飾子では、Feature を描画する前に、そのスタイルを変更または修正するこ とができます。これらのクラスは、CompositeStyle オブジェクトの限定的な属性項目を使用して、 スタイルの一部を変更できます。レンジ、個別値、ドット密度の各主題図は、スタイル修飾子で す。主題図の詳細については、「第 15 章: 「主題図と凡例の使用」」で説明します。Modifier 主題 図階層を UML で表したものを、次の図に示します。 FeatureStyleModifier これは、すべての修飾子が派生する抽象ベース クラスです。IndividualValue、Ranged、および DotDensity 主題図は、すべて FeatureStyleModifier オブジェクトです。FeatureStyleModifier から派生 する独自のクラスを作成し、Modify() メソッドをオーバーライドすることができます。 FeatureStyleModifiers FeatureStyleModifiers クラスは、各 FeatureLayer に含まれる FeatureStyleModifier オブジェクトの順 序型集合です。コレクション内の各修飾子は、フィーチャのジオメトリを描画する前に順に呼び 出されます。 開発者ガイド 271 マップの印刷 FeatureOverrideStyleModifier FeatureOverrideStyleModifier は、単純な種類の FeatureStyleModifier です。このクラスは、Layer レベ ルでのスタイル オーバーライド機能を提供します。FeatureOverrideStyleModifier は複合スタイルを 持ち、IVisibilityConstraint をインプリメントします。これは、MapX および MapInfo Professional の 機能と類似しています。 マップの印刷 アプリケーションを作成した後で、ユーザが生成したマップを印刷できるようにする場合があり ます。MapInfo.Printing 名前空間を利用することで、印刷機能を任意のアプリケーションに組み込 むことができます。この名前空間のクラスは印刷用の .NET Framework クラスを基に構築されてい るため、必要な作成手順は他の Windows アプリケーションと同じです。通常の印刷機能だけでな く、作成したマップを印刷用に最適化するためのさまざまな機能が用意されています。 MapXtreme アプリケーションからの印刷の詳細については、「付録 F: 「MapXtreme アプリケー ションからの印刷」」を参照してください。 272 MapXtreme 2008 v7.0.0 場所の検索 MapInfo.Data.Find 名前空間には、住所、道路の交差点または名前によってマッ プ フィーチャを検索するための各種クラスがあります。 この章の構成 「Find の機能の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 「Data.Find 名前空間の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 「Find 処理の調整」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 14 Find の機能の概要 住所、道路の交差点または名前によってマップ フィーチャを検索するには Find を使用します。選 択ツールまたはクエリを使用して、特定の場所にあるフィーチャを検索するには、Data 名前空間 ( 「213 ページの「Feature の検索」」を参照) の Search クラスを使用します。 Find 操作が正常に行われた結果、完全に一致するものが見つかることもあれば、近いものが 1 つ 以上見つかることもあれば、一致するものが見つからない、つまり検索が失敗することもありま す。Find 操作は、さまざまなプロパティや各種フォールバック オプションによって調整できま す。これについては、「277 ページの「Data.Find 名前空間の概要」」で説明しています。次のセク ションでは、MapXtreme がどのように照合を行っているかを説明します。Find 処理に対する理解 が深まれば、検索対象が見つかる確率が高くなります。 Find の処理 MapXtreme は、住所、交差点、またはプレースの名前と、フィーチャ テーブルにある情報と照合 することによってマップ フィーチャを探します。たとえば、ユーザがワシントン D.C. の道路の テーブルを開いていれば、 ワシントン D.C. の 1600 Pennsylvania Avenue を見つけることができま す。 マップ フィーチャの検索もこれと似ています。たとえば、目標物のマップ作成可能テーブルがあ り、そのテーブルに "ホワイト ハウス" という名前と、その地理参照場所 (マップ作成可能な場所) が格納されていれば、ホワイト ハウスを見つけることができます。プレース名によって検索する のに、ホワイト ハウスの住所を指定する必要がありません。 道路の交差点を検索するには、その交差点を構成している 2 本の道路名を指定する必要がありま す。 MapXtreme は、完全一致を見つけようとします。完全一致とは、指定した住所、プレース、また は交差点の名前と、すべての文字が一致するものです。完全一致が見つからない場合、MapXtreme は一致規則と開発者の設定に基づいて、近い一致項目を検索します。近い一致が見つからない場 合は、検索が失敗したことを示すメッセージを返します。照合では大文字と小文字が区別されま せん。大文字も小文字も同じものとして見なされます。 通常、住所は、番地、道路名のほか、略語から構成されます。略語には、North など道路の接頭辞 や、Road など道路の接尾辞などがあります。住所の表記はさまざまで、マンション番号やルート など、他の情報を含むこともあります。さらに、指定した住所に、道路の種類などの重要な構成 要素の一部が含まれていないこともあります。 MapXtreme は、住所の各構成要素を調べ、構成要 素に特別なルールを適用して一致を見つけます。 以降の各セクションでは、MapXtreme が、道路名、道路略語、住所番号、調整テーブル、結果な どの特定の情報や条件をどのように処理するかを説明します。 道路名の照合 道路名の照合では、住所と、検索テーブルにある情報とを 1 文字ずつ比較するという単純な処理が 行われます。たとえば、道路名 LaSalle を検索する場合を考えます。MapXtreme は、テーブルに LaSalle という住所があれば完全一致を返し、住所が La Salle か LaSal であれば近い一致しか返しま せん。 274 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 道路略語の照合 住所レコードに用いられている道路略語はさまざまです。ときには、道路略語が一切ないことも あります。しかし、MapXtreme は多くの場合、検索対象の住所と検索テーブルとがわずかに異 なっていても、完全一致を見つけることができます。 MapXtreme は、標準的に用いられる住所の 省略形と置き換え語のリストを参照し、適切な比較を行います。このリストのファイル名は MapInfow.abb です。このリストは、Street の ST、Avenue の Av など、道路の接頭辞および接尾辞の 標準的な省略形をまとめたものです。MapXtreme でこの省略形ファイルを使用するにはプロパ ティの設定が必要になりますが、このファイルを使用すると、使用しない場合と比べて完全一致 が見つかりやすくなると共に、近い一致の個数も増えます。 以下の表に、住所表記と、省略形ファイルを使用した場合に、その住所が完全一致となるかどう かを示します。最初の列は、検索する道路名です。2 番目の列は、ソース テーブルにある道路名で す。3 番目の列は、2 つの道路名が一致しない理由です。4 番目の列は、略語ファイルを使って不 一致の問題を解消できるかどうかを示します。この表は、テーブル内の 1 つの列に住所が格納され ていることを前提としています。住所の列には、通常は番地も含まれていますが、道路名と番地 では処理方法が異なるためここでは取り上げません。 検索する住所 検索テーブル内 の住所 コメント 略語ファイルを使用して完 全一致となるどうか LaSalle Street LaSalle St "Street" と "St" が一致しませ ○ ん。 LaSalle Ave LaSalle Av "Ave" と "Av" が一致しません。 ○ LaSalle Ave LaSalle St "Ave" と "St" が一致しません。 LaSalle LaSalle St "St" がターゲットにありませ × (道路略語がない場合、 ん。 MapXtremeでは推測が行わ れます) LaSalle St North LaSalle St "North" が検索テーブルにあり × ません。 LaSalle St North LaSalle St N "North" と N が一致しません。 LaSalle St Apt 3 LaSalle St マンション番号がソースにある ○ (マンション番号は無視 ものと一致しません。 されます) Tenth St 10th St "Tenth" と "10th" が一致しませ ○ ん。 10th Av Tenth Av "10th" と "Tenth" が一致しませ ○ ん。 Saint John's Lane St John's Lane 開発者ガイド × ○ "Saint" と "St" が一致しませ ○ ん。 275 省略形が原因となり、一致する住所が見つからないことが多い場合の対処方法を以下に示しま す。 • • 省略形ファイルにある省略形に合わせて住所を変更する。 住所にある省略形に合わせて、テキスト エディタで省略形ファイルを編集する。MapInfow.abb は C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x にあります。省略形ファイルの編集 に関する詳細については、「283 ページの「Find 処理の調整」」を参照してください。 番地の照合 MapXtreme は、住所の表記が、住所番号、道路名の順であっても、道路名、住所番号の順であっ ても住所を照合できます。前者の表記は北米等で用いられており、後者はヨーロッパで一般的で す。MapXtreme は、デフォルトで、住所の表記が、住所番号、道路名の順であると仮定します。 住所表記が道路名、住所番号の順である場合は、プロパティの設定が必要となります。 MapXtreme は、指定した住所番号を、住所番号の範囲と比較します。通常、テーブルには住所番 号の範囲が含まれ、この範囲は、範囲が網羅する道路の一部に対応しています。道路を挟んだ一 方の側の番地は奇数で、もう一方の側は偶数となっていることが多いため、住所範囲が道路のど ちら側にあるかを正確に照合することができます。 MapXtreme が住所範囲の完全一致を見つけることができない場合は、近い一致を見つけようとし ます。近い一致では、最も近い範囲が一致と見なされます。厳密な完全一致条件は、非常に正確 な検索を行うときにのみ指定するようにします。高い検索精度が必要ではないことが往々にして あります。通常は近い一致でも差し支えありません。 調整領域テーブルの照合 MapXtreme は、一致するレコードが複数存在すると考えられる 1 つのテーブルから 1 つの住所を探 し出すこともできます。検索が外れることを防ぐには、調整テーブルとフィールドを指定して、 照合対象の範囲を絞り込みます。 絞り込みは、全国の道路が登録されているテーブルから Main St. を探す場合などに役立ちます。 Main St. がある町は多数存在すると考えられます。市街区域の調整テーブルを使用すれば、A とい う町の Main St. のみを検索するように 指定できます。 調整領域テーブルには、どのような種類のものでも使用できます。たとえば、郵便番号の境界や 国勢調査の領域を使用できます。さらに、Find を実行する調整領域を追加することも可能です。 Find の結果 MapXtreme は、完全に一致するものを返すこともあれば、近いものを 1 つ以上返すこともあれ ば、検索に失敗することもあります。結果はさまざまな要因によって決まります。この要因に は、指定するデータの精度や、Find 操作に指定する条件などがあります。このほか、検索に成功 した場合は住所の各部分の一致の程度を示す情報、失敗した場合は不一致を示す情報も返しま す。 276 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 Data.Find 名前空間の概要 MapInfo.Data.Find 名前空間には、マップ作成可能テーブル内でマップ フィーチャ、番地または道 路の交差点を検索するための各種クラスが含まれます。Find を設定するには、Find クラスの各種 プロ パ テ ィ お よ び メ ソ ッ ド を 使用します。Find の結果は、FindAddressRange クラス、 FindCloseMatch クラスおよび FindResult クラスによって返されます。 以下に、Find 名前空間の UML 図を示します。 Find Find オブジェクトは、指定したマップ作成可能なテーブル内でオブジェクト、番地、または交差 点を検索するために使用されます。Find は、一致するものがテーブル内に存在するかどうか検索 し、その結果を FindResult オブジェクトに格納して返します。 MapXtreme で Find を使用するために必要なものは以下のとおりです。 • • • • マップ作成可能テーブル (ジオメトリ オブジェクトを格納しているテーブル)。 インデックスが設定されているフィールド。検索の対象となります。 検索項目。プレース名、番地、道路の交差点などです。 検索対象の場所を絞り込むための調整テーブル (オプション)。 Find ク ラ ス に は、検 索 操 作 を調整するためのプロパティが数多くあります。たとえば、 CloseMatchesMax プロパティは、返す近い一致の数の設定に使用します。また、UseAbbreviations プロパティにより、一致の確率を上げるために略語ファイルを使用するように指定します。 開発者ガイド 277 Data.Find 名前空間の概要 プロパティ 278 説明 AddressNumberAfterStreet "Smith Street 107" のように、道路名の後に住所番号が付くかど うかを指定します。 ChooseAlternateBoundary 指定した調整地域以外の調整地域内で見つかったレコードを比 較するかどうかを指定します。 ChooseClosestAddressRange 住所番号が一致しない場合に、最も近い住所番号を使用するか どうかを指定します。 ChooseClosestObject 完全に一致するオブジェクトが見つからない場合に、最も近い オブジェクトを検索するかどうかを指定します。 CloseMatchesMax 完全に一致するものが見つからない場合に返す、近いオブジェ クトの数を指定します。 InsetDistance 住所の配置を調整するための、ラインの端からの距離を表す正 数の値。 InsetPercentage 住所の配置先を、ラインの長さに対する百分率で表します。 InsetUnit Inset に使用する距離の単位を表します。 OffsetDistance 道路から住所の位置を戻すオフセットに対する距離を表しま す。 OffsetUnit Offset に使用する距離の単位を表します。 UseAbbreviations 検索時に、略語ファイルにある置き換え用の略語 (たとえば "Smith Street" の略語の "Smith St") を使用するかどうかを指定し ます。 UseCloseMatches 完全に一致するものが見つからない場合に、近い N 個のオブ ジェクトを返すかどうかを指定します。 UseInsetAsPercentage Inset が百分率として使用されているかどうかを指定します。 Inset は距離として使用されることもあります。 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 Find クラスによる検索方法には 4 種類あります。このうちの 2 つは、住所またはフィーチャを検索 する方法で、残りの 2 つは、領域道路の交差点を検索する方法です。いずれの方法でも、調整領域 を用いるかどうかは任意です。 メソッド 説明 Search マップ作成可能なテーブルで指定の場所を検索し、FindResult オブ ジェクトを返します。 SearchIntersection マップ作成可能な道路情報テーブルで指定の交差点を検索し、 FindResult オブジェクトを返します。 Dispose Find オブジェクトによって保持されるアンマネージド リソースを 解放します。Find オブジェクトを使い終えたら、このメソッドを 必ず呼び出します。 FindAddressRange FindAddressRange オブジェクトは、Find.Search メソッドから返される住所範囲の項目を表します。 検索対象の番地が見つからない場合、指定した道路の番地の範囲内に検索対象の番地がない場 合、または住所番号が指定されなかった場合は、FindAddressRange オブジェクトが FindResult オブ ジェクトの一部として返されます。 コード サンプル public void GetAddressRangesOnStreetTable() { Table_table; _table = Session.Current.Catalog.OpenTable("North_Greenbush.tab"); Find _find = new Find(_table,_table.TableInfo.Columns[1]); FindResult _findResult= _find.Search("Meadow Dr"); If ((!_findResult.ExactMatch) && (_findResult.NameResultCode == FindNameCode.ExactMatch)&& (findResult.AddressResultCode == FindAddressCode.AddressNumNotSpecified)) { FindAddressRangeEnumerator _enum = _findResult.GetAddressRangeEnumerator(); FindAddressRange _findAddressRange; int _iIndex = 0; while (_enum.MoveNext()) { _findAddressRange = _enum.Current; Console.WriteLine("_findAddressRange.BeginRange"); Console.WriteLine("_findAddressRange.EndRange"); _iIndex++; 開発者ガイド 279 Data.Find 名前空間の概要 } if(_table != null) { _table.Close(); _table = null; } } } find.Dispose(); } FindCloseMatch FindCloseMatch オブジェクトは、Find の Search メソッドから返された近い一致項目を表します。 このオブジェクトは、FindResult オブジェクトの一部として返されます。近い一致項目とは、検索 対象に指定した名前に近いものとして返された項目のことです。 近い一致を使用するには、Find オブジェクトの UseCloseMatches プロパティと CloseMatchesMax プ ロ パ テ ィ を 設 定 し て お く 必 要 が あ り ま す。たとえば、UseCloseMatches を true に設定して、 "Washington Street" を検索すると、近い一致は "Washington Ave" となります。 コード サンプル public void CloseMatchesOnStreetTable() { Table _table; _table = Session.Current.Catalog.OpenTable("Rensselaer.tab"); Find _find = new Find(_table,_table.TableInfo.Columns[1]); _find.UseCloseMatches = true; _find.CloseMatchesMax = 5; FindResult _findResult= _find.Search("70 Washington"); if ((!_findResult.ExactMatch) && (_findResult.NameResultCode == FindNameCode.ExactMatchNotFound)) { FindCloseMatchEnumerator _enum = _findResult.GetCloseMatchEnumerator(); FindCloseMatch _findCloseMatch; int _iIndex = 0; while (_enum.MoveNext()) { _findCloseMatch = _enum.Current; Console.WriteLine(_findCloseMatch.Name); _iIndex++; } } if(_table != null) 280 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 { _table.Close(); _table = null; } find.Dispose(); } FindResult FindResult クラスは、Find.Search メソッドから返される一致の状態を示す情報を各種プロパティと して返します。このプロパティを以下の表に示します。検索に成功した場合、FoundKey プロパ ティには、見つかったオブジェクトのキーが格納されます。また、FoundPoint プロパティには、オ ブジェクトが見つかったポイントが格納されます。 プロパティ 説明 AddressOutOfRange 渡された住所が範囲外かどうかを指定します。 AddressResultCode 検索対象の住所部分に対する結果コードを示し、FindAddressCode 列挙 体を返します。 BoundaryResultCode 検索対象の調整境界部分に対する結果コードを示し、FindBoundaryCode 列挙体を返します。 ExactMatch 完全に一致するものが見つかったかどうかを指定します。 FoundKey 見つかったオブジェクトの Key を指定します。 FoundPoint 見つかったオブジェクトの Point を指定します。 IntersectionNotFound 交差点が見つからなかったかどうかを指定します。 MultipleMatches 一致するものが複数見つかったかどうかを指定します。 NameResultCode 検索対象の名前に対する結果コードを示し、FindNameCode 列挙体を返 します。 ResultCode Find の結果、完全に一致するものが見つかった場合、結果コードは 1 になります。近いものが見つかった場合、1 より大きい値になります。 一致する住所が見つからなかった場合は、結果コードは負の値になり ます。 UseSubstitution 略語ファイルにある置き換えが使用されたかどうかを指定します。 FindAddressCode 列挙体 検索対象の住所部分に対する結果コードを示し、FindResult.AddressResultCode プロパティによって 返されます。 注意 開発者ガイド この結果コードは、道路または交差点の検索でのみ使用します。 281 Data.Find 名前空間の概要 メンバ名 説明 ExactMatch 完全一致が見つかりました。 SideOfStreetUndetermined 道路のどちら側であるかが不明です。 WithinMinMax 住所番号が最小/最大範囲内でした。 NotWithinMinMax 住所番号が最小/最大範囲外です。 AddressNumNotSpecified 住所番号が指定されませんでした。 StreetsDoNotIntersect 道路は交差しません。 NoMapObjectForRowMatched 一致した行にマップ オブジェクトがありません。 FindBoundaryCode 列挙体 検索対象の調整境界部分に対する結果コードを示し、FindResult.BoundaryResultCode プロパティに よって返されます。同じ名前のフィーチャどうしを識別するには調整領域を使用します。 注意 この結果コードは、領域を使用して検索対象を調整している場合にのみ使用します。 メンバ名 282 説明 ExactMatch 完全一致が見つかりました。 FoundInOneOtherRegion その名前は、指定した地域以外の 1 つの地域だけで見つか りました。 FoundInMoreThanOneRegion その名前は、指定した地域以外の複数の地域で見つかりま した。 NoRegionSpecifiedOneMatch 調整地域が指定されませんでした。1 件の一致が見つかり ました。 NoRegionSpecifiedMultipleMatches 地域が指定されませんでした。複数の一致が見つかりまし た。 MultipleMatchesFound その名前は、指定した地域で複数回見つかりました。 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 FindNameCode 列挙体 検索対象の名前に対する結果コードを示し、FindResult.NameResultCode プロパティによって返され ます。 メンバ名 説明 ExactMatch 完全一致が見つかりました。 SubstitutionUsed 略語ファイルからの置き換えが使用されまし た。 ExactMatchNotFound 完全一致が見つかりませんでした。 NoObjectNameSpecified オブジェクト名が指定されていません。一致 は見つかりませんでした。 CloseMatch 近い一致が見つかりました。 Find 処理の調整 この章の冒頭で述べたように、Find オブジェクトの動作を深く理解できれば、そのプロパティを 使いこなせるようになるほか、入力する情報の精度が上がります。この結果、検索に成功する確 率が高くなります。このセクションでは、Find を使用する際に、期待どおりの結果を得るための 開発上のヒントを紹介します。 MapInfow.abb ファイルの編集 MapInfow.abb ファイルは、省略形と置き換え語を記述しているファイルで、MapXtreme に付属し ています。このファイルを使用すると、指定した住所中の省略形がこのファイルに存在する場合 に、Find で検索対象が見つかる確率を上げることができます。これについては、「275 ページの 「道路略語の照合」」のセクションで取り挙げています。このセクションでは、省略形ファイル の他の項目について説明します。 MapInfow.abb は、テキスト エディタまたはワード プロセッサで編集することができます。この ファイルを開き、必要に応じてキーワードを追加して内容を追加します。以下に、標準的な省略 形ファイルの内容を示します。 !Version 3.0 FIRST 1ST SECOND 2ND THIRD 3RD FOURTH 4TH FIFTH 5TH SIXTH 6TH SEVENTH 7TH EIGHTH 8TH NINTH 9TH TENTH 10TH 開発者ガイド 283 Find 処理の調整 NORTH N SOUTH S EAST E WEST W ALLEY AL AVENUE AV AVE AV BOULEVARD BLVD BRIDGE BR CIRCLE CIR COURT CT DRIVE DR EXTENSION EXT HIGHWAY HWY INTERSTATE I LANE LN MOUNT MT PARK PK PARKWAY PKWY PLACE PL PLAZA PLZ POINT PT RAILROAD RR ROAD RD ROUTE RT SAINT ST SQUARE SQ STREET ST STR ST TERRACE TER !EOLNOSPACE , ; # !EOLSPACE FLOOR SUITE "P.O. BOX" !NOSPACE . \" \! \\ !SPACE "STATE HIGHWAY"STHWY" "N ST"NORTH ST" "S ST"SOUTH ST" "E ST"EAST ST" "W ST"WEST ST" "N AV"NORTH AV" "S AV"SOUTH AV" "E AV"EAST AV" "W AV"WEST AV" 284 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 さまざまな問題を解決するために、このファイルに項目を追加することができます。追加できる 項目には数種類あるという点が最も重要です。 MapXtreme は 4 組の置き換え項目を認識でき、そ れぞれ解釈が異なります。略語ファイル内では、組を識別するために、各組の前に以下のキー ワードが置かれます。 スペース区切りの単純な置き換え !SPACE 単純な切り捨て !EOLNOSPACE スペース区切りの切り捨て !EOLSPACE 単純な置き換え !NOSPACE MapXtreme に対して、語ファイル内で行または行の組の解釈方法を指定するには、その行の前 に、解釈方法を指定するキーワードを置きます。 略語ファイル内のすべてのエントリにデフォルトの解釈を適用する場合は、エントリの前にキー ワードを付ける必要はありません。略語ファイルの先頭にキーワードがない場合、MapXtreme は 最初のほうのエントリをデフォルトの方法によって解釈します。しかし、デフォルト以外の解釈 方法を適用する置き換えペアを追加したら、キーワードの追加が必要です。 スペース区切りの置き換え デフォルトでは、スペース区切りの単純な置き換えが採用されています。つまり、MapXtreme は、検索対象の住所に含まれるスペースで区切られたトークンと、住所ファイル内の行とを比較 します。スペースで区切られたトークンとは、スペース文字によって区切られた文字列のことで す。た と え ば、MapXtreme は、"Park Ave" の "Ave" と "Av" とを照合しますが、"Avery Blvd" と "Avry Blvd" は照合しません。"Park Ave" と "Avery Blvd" にはいずれも文字列 "Ave" が含まれていま す。しかし、この文字列がスペースによって区切られているのは "Park Ave" だけで、"Avery Blvd" の "Ave" はスペースによって区切られていません。"Avery Blvd" では、"Ave" の次に来る文字はス ペースではなく "r" です。 略語ファイル内のすべてのエントリには、このデフォルトの解釈が適用されます。項目を追加す ると、追 加 し た 項 目 も 同 様 に 扱 われます。たとえば、"WK WALK" というペアを追加して、 MapXtreme で検索対象の住所内の "WK" が "WALK" として処理されるようにします。同様に、 "WAY WY" などのペアを追加することも可能です。 スペース区切りの単純な置き換えを指定するには、キーワード "!SPACE" を使用します。"!SPACE" の後に続くエントリには、デフォルトの解釈が適用されます。このため、.abb ファイル内の項目の 順序を工夫できます。別のキーワードが見つかると、MapXtreme での解釈方法が変更されます。 単純な切り捨て 単純な切り捨てでは、ある項目が住所内に見つかると、その項目とその後の住所が MapXtreme で 無視されます。単純な切り捨てに用いる項目は、スペースで区切られていなくても構いません。 この方法は、次のような住所を処理する場合に便利です。 123 Appian Way, Mail Stop 829 7305 Van Zandt # 23 開発者ガイド 285 Find 処理の調整 最初の例では、コンマ (,) とその後に続く文字列を MapXtreme ですべて無視するとします。2 番目 の例では、番号記号 (#) とその後に続く文字列を MapXtreme すべて無視するとします。このような 例を処理するには、次の略語を略語ファイルに追加します。 !EOLNOSPACE , # 単純な切り捨てに用いる項目を指定するには、キーワード "!EOLNOSPACE" をその項目の前に置 きます。この行の後に、コンマの行と番号記号の行が記述されています。このようにすれば、 MapXtreme は、住所にコンマか番号記号が見つかると、コンマまたは番号記号とその後の文字列 を無視するようになります。上の住所は次のように解釈されます。 123 Appian Way 7305 Van Zandt スペース区切りの切り捨て スペース区切りの切り捨てでは、MapXtreme によってスペースで区切られた項目が検索され、そ の項目とその後の文字列がすべて切り捨てられます。以下に例を示します。 73 Appian Way Suite 829 3033 Van Zandt Room 202 このような例を処理するには、次の略語を略語ファイルに追加します。 !EOLSPACE SUITE ROOM 単純な切り捨てに用いる項目を指定するには、キーワード "!EOLNOSPACE" をその項目の前に置 きます。その後に、"Suite" の行と "ROOM" の行を記述します。このようにすれば、MapXtreme で 住所内にこれらのトークンが見つかると、住所が切り捨てられます。上の住所は次のように解釈 されます。 73 Appian Way 3033 Van Zandt 単純な置き換え MapXtreme の単純な置き換えでは、ある項目が住所内にあればその項目を削除し、なければ住所 を変更しません。次の例を考えます。 433 Van-Rensselaer 91 St Albans' ハイフン (-) およびアポストロフィ (') を削除したいとします。略語ファイルに次の項目を追加しま す。 !NOSPACE – ' 286 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 単純な置き換えを示すキーワードは "NOSPACE" であり、この行の後に記述されているハイフンと アポストロフィが、削除されるトークンとなります。上の住所は次のように解釈されます。 369 VanRensselaer 91 St Albans 通常のスペースの指定 置き換え語を定義する際に、検索文字列にスペースが含まれることがあります。このような場合 は二重引用符を使用します。二重引用符は次の位置に置きます。 • • • 行の先頭 検索文字列と置き換え文字列との間 行の終わり たとえば、"State Highway" を "STHWY" に置き換える例を考えます。これには、次の行を追加しま す。 "State Highway"STHWY" これにより、道路名中に、略語ファイル内の項目と一致する文字列が複数含まれるという問題を 解決できます。この問題は見つけるのが困難です。たとえば、"North St" と "Park Av" はいずれも先 頭の文字列が略語ファイルに既に登録されています。このため、MapXtreme では "North" が "N" に 置き換えられて "N St" となり、"Park" が "Pk" に置き換えられて "Pk Av" となってしまいます。この 置き換えを元に戻すには、次の行を略語ファイルに追加します。 "N ST"North ST" "PK AV"PARK AV" 上の行は、"North" を "N" に、"Park" を "PK" に置き換えるように指定するエントリの後に追加する 必要があるという点に注意してください。前に追加しても意味がありません。つまり、次のよう に記述します。 ... ... NORTH N ... ... PARK PK .. .... "N ST"NORTH ST" "PK AV"PARK AV" ... ... MapXtreme では、NORTH N の指定が検出されると、NORTH ST が N ST に変換されます。次に、 "N ST"NORTH ST" の指定によって、N ST が NORTH STに変換されます。"PARK AV" も同様に処理 されます。 開発者ガイド 287 Find 処理の調整 特殊文字 MapXtreme は、感嘆符 (!)、二重引用符 (") および円記号 (\) を特殊文字として扱います。これらの 特殊文字は、特殊文字の次に来る文字列の MapXtreme での処理方法を定義しています。特殊文字 自体は、置き換え文字列中で通常の文字として処理されません。感嘆符は、次に来る文字列を省 略形として解釈しないことを MapXtreme 指定します。二重引用符は、文字列内のスペースが、区 切り記号ではなく、通常のスペースであることを MapXtreme に指定します。円記号は、特殊文字 を通常の文字として処理するように MapXtreme に指定します。 行内で、特殊文字が通常の文字として処理されるように指定するには、特殊文字の前に円記号を 付けます。つまり、次のように記述します。 \! \" \\ 略語ファイルへの行の追加 略語ファイルに、新しい行を追加することによって、新しい項目を追加できます。置き換えペア に記述した項目が互いに置き換えられて、置き換えの指定が無効になる場合を除き、行の順序に 特に決まりはありません。また、1 番目の項目と 2 番目の項目の間に入れるスペースの個数にも特 に決まりはありません。 正しくない住所範囲 ソース テーブルに存在しない住所範囲が住所に含まれていると、MapXtreme ではその住所を照合 できません。このような住所は、住所範囲と住所範囲の間にあるか、住所範囲の外にあると考え られます。この問題に対処するには、次の操作を行います。 1. Find.ChooseClosestAddressRange プロパティを true に設定し、検索を実行します。 2. FindResult.AddressOutOfRange プロパティから返される FindAddressCode 列挙体の内容を確認 し、検索の失敗を解決します。 このような住所は、ソース テーブル作成より後に追加された道路セグメントに関連している可能 性があります。その場合は、その道路の住所範囲をすべて反映するようにソース テーブルを編集 してください。 不正確な住所表記 MapXtreme では、検索操作の最後の手順として、照合する住所をどの地域で検索するかを判別し ます。検索処理の設定時にこれを指定しない限り、 MapXtreme でこの処理は行われません。一般 に、調整地域としては市や町の名前を使用します。この場合、国勢調査局で定められた地名を使 用しない場合も多いという問題があります。米国の電子地図のほとんどは国勢調査局の地図に基 づいて作成されているため、問題が発生します。 たとえば、"50 Wolf Rd., Albany, NY" という住所では、この番地が属する Colonie という地名が抜け ています。そのため、この住所を対象に検索しても、ソース ファイルの該当する地名と一致しま せん。 この問題に対処する方法の 1 つは、ChooseAlternateBoundary プロパティを使用することです。この オプションを有効にすると、MapXtreme ではどの境界に含まれているかに関係なく住所の照合が 試みられ、1 つの境界のみにその住所が含まれていれば正しい住所と一致します。複数の境界に住 所が含まれていると、検索は失敗します。 288 MapXtreme 2008 v7.0.0 第 14 章 : 場所の検索 この問題に対処する別の方法として、調整地域として市や町の名前ではなく ZIP コードを使用する 方法もあります。 開発者ガイド 289 Find 処理の調整 290 MapXtreme 2008 v7.0.0 15 主題図と凡例の使用 MapXtreme には、主題図と凡例をマップに追加するための数多くのオプション が用意されています。この章では、利用できるさまざまな種類の主題図と凡 例、およびその使用方法について説明します。 この章の構成 「主題図の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「GraduatedSymbolTheme (サイズ可変シンボル主題図)」. . . . . . . . . 「PieTheme」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「BarTheme (棒グラフ主題図)」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「RangedTheme」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「RangedLabelTheme (レンジラベル主題図)」 . . . . . . . . . . . . . . . . . . 「IndividualValueTheme (個別値主題図)」 . . . . . . . . . . . . . . . . . . . . . . 「IndividualValueLabelTheme (個別値ラベル主題図)」 . . . . . . . . . . . . 「DotDensityTheme (ドット密度主題図)」 . . . . . . . . . . . . . . . . . . . . . . 「凡例の概要」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 293 295 296 297 299 300 302 303 305 主題図の概要 主題図を使用すると、表形式のデータからは読み取ることが難しい、データの傾向を表すことが できます。主題図は通常、データ セットから取り出されるデータです。MapInfo ネイティブ テー ブルなどのデータ ソースからのデータを使用して、マップを主題に従って色分けします。たとえ ば、米国の各州の平均気温に基づいてマップを色分けできます。ある州が赤い色で示されている とき、その州は暑い (気温が高い) ことがわかり、青い色で示されているときは寒い (気温が低い) ことがわかります。 主題図ではデータを、色分け、塗りつぶしパターン、またはシンボルを使用して表示します。主 題図マップを使用してデータを表示する方法は多数あります。データの特定の値に従って、これ らの色、パターン、またはシンボルをマップに割り当てることで、さまざまな主題図マップを作 成できます。 Mapping.Thematics 名前空間 MapInfo.Mapping.Thematics 名前空間には、主題図を、フィーチャ レイヤに対するスタイル オー バーライドとしてインプリメントするクラス、およびオブジェクト主題図としてインプリメント するクラスが含まれています。修飾子主題図ではスタイルを変更し、オブジェクト主題図では新 しいレイヤを追加します。すべての主題図は ITheme インターフェイスをインプリメントします。 修飾子主題図 フィーチャ修飾子主題図の例として、レンジ主題図、個別値主題図、ドット密度主題図などの マップがあります。これらの主題図では、レイヤ内の既存のフィーチャを変更します。修飾子主 題図の階層を次の UML 図に示します。 292 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 オブジェクト主題図 オブジェクト主題図の例として、サイズ可変シンボル主題図、円グラフ主題図、棒グラフ主題図 などがあります。これらの主題図では、データの値を表すオブジェクトを作成します。オブジェ クト主題図の階層を次の UML 図に示します。 GraduatedSymbolTheme (サイズ可変シンボル主題図) サイズ可変シンボル主題図は、ポイント フィーチャを含むオブジェクト主題図であり、シンボル サイズは、主題図の式の数値によって決まります。 たとえば、サイズ可変シンボルを使用すれば、ある地域の特定の人口セグメントの所得を表示す ることができます。 開発者ガイド 293 GraduatedSymbolTheme ( サイズ可変シンボル主題図 ) サイズ可変シンボル主題図マップの例 サイズ可変シンボル主題図の用途 サイズ可変シンボル主題図で扱うことができるのは数値データのみです。各レストランが出す料 理の種類を使ってサイズ可変シンボルを作成しても、意味がありません。ただし、都市別の所得 分布を表すとき、サイズ可変シンボルは最適です。 VB の例 Public Shared Sub MapInfo_Mapping_Thematics_GraduatedSymbolTheme(ByVal map As Map) ' Load a map based on one table map.Load(New MapTableLoader("world.tab")) Dim lyr As FeatureLayer = CType(map.Layers("world"), FeatureLayer) ' Create a new graduated symbol theme Dim gradTheme As GraduatedSymbolTheme = New _ GraduatedSymbolTheme(lyr.Table, "Pop_Native") ' Create an object theme layer based on that graduated symbol theme Dim thmLayer As ObjectThemeLayer = New ObjectThemeLayer("World Pop _ Growth Rate", Nothing, gradTheme) ' Add object theme to the mapÅfs layer collection. map.Layers.Add(thmLayer) ' Adjust how we graduate the size. 294 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 gradTheme.GraduateSizeBy = GraduateSizeBy.Constant thmLayer.RebuildTheme() End Sub PieTheme 円グラフ主題図は、扇形で各データ値を示す円グラフを含むオブジェクト主題図です。円グラフ では、1 つの円グラフ内の扇形を比較したり、すべての円グラフの間で特定の扇形を分析したりし ます。円グラフでは、全体に対する各要素の割合も比較できます。 円グラフ主題図の用途 円グラフは、人口統計データの分析に便利です。たとえば、米国の人口統計情報を示すデータ セットがあるとします。このデータセットは、人口統計の主要グループの人口を示しています。 円グラフを使用すると、各人口統計グループの人口を表示し、各円グラフでそのグループが占め る割合を確認できます。これにより、人口統計グループの州ごとの分布や米国全体での分布を確 認できます。また、1 つの人口統計グループに注目し、各州での相対的な変化を確認することもで きます。 VB の例 Public Shared Sub MapInfoMappingThematicsPieTheme(ByVal map As Map) ' Load a map based on one table map.Load(New MapTableLoader("mexico.tab")) Dim lyr As FeatureLayer = CType(map.Layers("mexico"), FeatureLayer) ' Create a new pie theme Dim pieTheme As MapInfo.Mapping.Thematics.PieTheme = New _ MapInfo.Mapping.Thematics.PieTheme(map, lyr.Table, "Cars_91", _ "Buses_91", "Trucks_91") ' Create an object theme layer based on that pie theme Dim thmLayer As ObjectThemeLayer = New ObjectThemeLayer("Count by _ Vehicle Type", Nothing, pieTheme) 'Add object theme to the map's layer collection. map.Layers.Add(thmLayer) ' ' ' ' ' DataValueAtSize is calculated automatically if not specified in the pie's constructor.But, you can adjust it.If you do so here, you have to rebuild the theme.You can adjust it before creating the object theme layer, and that way the pies won't need to be built twice. pieTheme.DataValueAtSize /= 2 pieTheme.GraduateSizeBy = GraduateSizeBy.Constant thmLayer.RebuildTheme() End Sub 開発者ガイド 295 BarTheme ( 棒グラフ主題図 ) 円グラフ主題図/棒グラフ主題図を含むマップの印刷 円グラフ主題図または棒グラフ主題図を含むマップを印刷用に複製する場合、予想される結果を 得るためには用紙のサイズを考慮する必要があります。用紙サイズを使用して、印刷出力内の円 グラフ/棒グラフのサイズが計算されます。100 パーセントの用紙サイズを使用すると、印刷プレ ビューと MapControl におけるグラフ/主題図の相対サイズが同じになります。 BarTheme (棒グラフ主題図) 棒グラフ主題図は、棒で各データ値を示す棒グラフを含むオブジェクト主題図です。棒グラフは マップ オブジェクト (フィーチャ) ごとにオブジェクトの中心点に作成されるので、棒の高さを比 較することで主題図を分析できます。 棒グラフ主題図の用途 棒グラフ主題図は、マップ上のすべてのフィーチャで同じ変数を分析したいときに便利です。た とえば、 男女の人口を含む米国の州域テーブルがあるとします。棒グラフを使用すれば、女性の 人口と男性の人口を示す 2 つの棒グラフを表示する主題図マップを作成できます。州ごとに人口の 差を比較したり、複数の州を分析して人口の差を比較したりできます。 VB の例 Public Shared Sub MapInfo_Mapping_Thematics_BarTheme(ByVal map As Map) ' Load a map based on one table. map.Load(New MapTableLoader("world.tab")) Dim lyr As FeatureLayer = CType(map.Layers("world"), FeatureLayer) ' Create a new bar theme. Dim barTheme As MapInfo.Mapping.Thematics.BarTheme = New _ MapInfo.Mapping.Thematics.BarTheme(map, lyr.Table, "Pop_Native", _ "Pop_Asian", "Pop_Other") ' Create an object theme layer based on that bar theme. Dim thmLayer As ObjectThemeLayer = New ObjectThemeLayer("World _ Pop", Nothing, barTheme) ' Add object theme to the mapÅfs layer collection. map.Layers.Add(thmLayer) ' Stack the bars and graduate by a constant amount. barTheme.Stacked = True barTheme.GraduateSizeBy = GraduateSizeBy.Constant thmLayer.RebuildTheme() End Sub 296 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 円グラフ主題図および棒グラフ主題図の表示サイズの制御 MapXtreme には、円グラフと棒グラフのオブジェクト主題図を作成できる、MultiVariableTheme 抽 象ベース クラスがあります。ObjectTheme クラスから派生したこのクラスには、特定の値における オブジェクト主題図のジオメトリの表示サイズを制御する、DataValueAtSize および Size という 2 つのプロパティがあります。DataValueAtSize のデフォルト値は、マップされたフィーチャの最大 データ値に設定されます。Size 値は円グラフの幅および棒グラフの高さを用紙の単位で制御しま す。 RangedTheme レンジ主題図は、指定の条件に従って、データをレンジ (Bin) にグループ分けして表示します。 MapXtreme のレンジ主題図は、指定の条件を反映させるために、既存のレイヤを変更します。前 のバージョンの MapX や MapXtreme とは異なり、新しいレイヤは作成しません。レンジ主題図を 作成する場合、MapXtreme はすべてのデータセット行をレンジにグループ分けし、各行のオブ ジェクトに色、シンボル、ラインを割り当てます。 レンジ主題図マップの例 レンジ主題図の用途 レンジ主題図は、ある地域の人口統計データの表示などに便利です。たとえば、アジアの農村部 の男性の人口を Bin にグループ分けして色分けし、その地域に存在する人口レンジを表示します。 データセットに含まれるレコードは、すべてレンジに割り当て、レンジをベースとするスタイル で描画します。たとえば、黄-緑のレンジを使う場合、一番人口の多い国は黄色、少ない国は 緑、その間の国は中間の色で表示します。マップを表示すると、人口が最も多い国と少ない国が 色で明確にわかります。レンジ主題図マップに透明効果を適用する方法については、461 ページの 「主題図に半透明効果を適用する方法」を参照してください。 レンジは、リージョンのサイズがデータ値の大きさに関係していない場合にも便利です。 開発者ガイド 297 RangedTheme レンジ値の種類 MapXtreme では、5 つの配分方法を使って自動的にレンジを作成できます。 • • • • • • レコード数均等 レンジ幅均等 標準偏差 自然分布 クウォンタイル カスタム レコード数均等 [レコード数均等] では、各レンジのレコード数が同じになります。[レコード数均等] を使用して、 100 個のレコードを 4 つのレンジにグループ化する場合は、MapXtreme では、設定した丸めの方法 に従って、各レンジに約 25 個のレコードが入るようにレンジが計算されます。 [レコード数均等] またはその他のレンジ設定方法を使用するときは、主題図マップに影響する可能 性のある、極端に異なる値に注意することが重要です (統計学では、このような値を外れ値といい ます)。 レンジ幅均等 [レンジ幅均等] では、同じサイズのレンジにレコードが振り分けられます。たとえば、テーブルの フィールド値が 1 ~ 100 で、 同じサイズの 4 つのレンジで構成された主題図マップを作成すると します。MapX では、1 ~ 25、26 ~ 50、51 ~ 75、および 76 ~ 100 のレンジが作成されます。 MapXtreme では、データの分布によっては、レコードを含まないレンジが作成される場合があり ます。 標準偏差 [標準偏差] を使用してレンジを作成すると、値の中間値をはさんで中間のレンジが配置され、その 前後のレンジは中間値から 1 標準偏差上または下になります。 自然分布 均等に分布していないデータを表示するには、[自然分布] を使用します。[自然分布] では、各レン ジの平均値を使用してデータをより均等にレンジ間に振り分けるアルゴリズムに従ってレンジが 作成されます。値は、各レンジの平均値が、そのレンジ内のレンジ値になるべく近くなるように 振り分けられます。したがって、平均値がそのレンジを的確に表し、各レンジ内のデータ値は密 集します。 クウォンタイル 均等に分布していないデータを表示するためのもう 1 つの方法が [クウォンタイル] です。[クウォ ンタイル] では、2 つの変数式を使用します。たとえば、人口と識字率を示す場合に [クウォンタイ ル] 配分方法を使用します。 298 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 カスタム レンジ 上記の配分方法ではニーズが満たされない場合は、DistributionMethod.CustomRanges メソッドを使 用し て カ ス タ ム レ ン ジ を 作 成 できます。『MapXtreme 開発者リファレンス ヘルプ』にある MapInfo.Thematics.RangedTheme.Recompute メソッドのコード例を参照してください。 VB の例 Public Shared Sub MapInfo_Mapping_Thematics_RangedTheme(ByVal map As Map) ' Create a ranged theme. Dim lyr As FeatureLayer = CType(map.Layers(0), FeatureLayer) Dim theme As MapInfo.Mapping.Thematics.RangedTheme = New _ MapInfo.Mapping.Thematics.RangedTheme(lyr, "Pop_1990/Area(obj,_ 'sq mi')", "PopDensity", 5,DistributionMethod.EqualCountPerRange) ' Add the ranged theme to the layer. lyr.Modifiers.Append(theme) End Sub RangedLabelTheme (レンジラベル主題図) このクラスは、レンジ スタイルでラベルを描画するレンジ主題図を作成します。レンジ主題図の 詳細については、297 ページの「RangedTheme」を参照してください。 RangedLabelTheme クラスの用途 レンジ ラベル主題図は、ラベル付けの対象に関する情報を、ラベルを使って表示したいときに便 利です。たとえば、市や町の人口にラベルを付ける場合に、レンジ ラベル主題図を使用できま す。人口の多い市のラベルは大きなフォントで表示し、人口の少ない市のラベルは小さいフォン トで表示します。 VB の例 Public Shared Sub MapInfo_Mapping_Thematics_RangedLabelTheme(ByVal labelSource As MapInfo.Mapping.LabelSource, ByVal columnExpr As _ String, ByVal themealias As String) ' Create new ranged label theme based on the label source of a ' LabelLayer already in the map.It will use 5 bins of equal range. Dim rangedLabelTheme As RangedLabelTheme = New _ RangedLabelTheme(labelSource.Table, columnExpr, themealias, 5, _ DistributionMethod.EqualCountPerRange) ' Add the label modifier to the label layer. Dim labelModifier As MapInfo.Mapping.LabelModifier = _ CType(rangedLabelTheme, MapInfo.Mapping.LabelModifier) labelSource.Modifiers.Insert(0, labelModifier) End Sub 開発者ガイド 299 レンジ主題図とシリアライゼーション レンジ主題図とシリアライゼーション v7.0.0 以 降、パ フ ォ ー マ ン ス を 向 上する目的で、RangedTheme (レンジ主題図) および RangeLabelTheme (レンジ ラベル主題図) のシリアライゼーションとデシリアライゼーションが変更 されました。 変更により、主題図のシリアライゼーションの中で、主題図の Bin またはカテゴリのレコード カ ウントがシリアライズされます。デシリアライゼーションの際は、レコード カウントは再計算さ れなくなり、シリアライズされたレコード カウントが主題図に適用されます。この変更は、シリ アライゼーション/デシリアライゼーションのパフォーマンスを向上するために行われました。 デシリアライゼーション時に主題図のレコード カウントを更新することが期待されるアプリケー ションの場合、デシリアライゼーション後に主題図の Bin またはカテゴリのレコード カウントを 更新するためのロジックを追加する必要があることに注意してください。RangeTheme および RangeLabelTheme の場合、MapInfo.Mapping.Thematic.IRangedTheme.Recompute メソッドの呼び出し がこれに当たります。 IndividualValueTheme (個別値主題図) 個別値主題図は、データセットの特定のフィールドに含まれる個別値でポイント、ライン、境界 を色分けする修飾子主題図です。個別値主題図では、数値と名目値の両方を使用できます。 MapXtreme では、各スタイルに一意の値が与えられています。 たとえば、個別値主題図を使用して、区画の地区分類を示します。地区 (商業地区、住居地区、工 業地区) ごとに別々の色を使用します。区画は、対応する地区分類の色になります。 IndividualValueTheme クラスの用途 名目データを使ってポイント、ライン、領域を色分けする場合は、個別値を使う必要がありま す。名目データは、数値以外のデータ (名前、料理の種類、販売されている車のブランドなど) か、数値が計測を表していない数値データのどちらかです。たとえば、ID 番号を含むフィールド は名目データです。 日付は数値データと見なされ、レンジ主題図と個別値主題図のいずれでも使用できます。 VB の例 Public Shared Sub MapInfo_Mapping_Thematics_IndividualValueTheme(ByVal_ map As Map) ' Load a map based on one table map.Load(New MapTableLoader("world.tab")) Dim fLyr As FeatureLayer = CType(map.Layers("world"), FeatureLayer) ' Create an individual value theme Dim thm As IndividualValueTheme = New _ IndividualValueTheme(fLyr, "Country", "World Pop") ' Add the theme to the FeatureStyleModifiers list fLyr.Modifiers.Append(thm) End Sub 300 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 カスタム ビットマップ シンボルを使用する IndividualValueTheme の 作 次の C# の例は、カスタム ビットマップ シンボルを使用する IndividualValueTheme の作成方法を示 しています。使用可能なビットマップ シンボルのテーブルは、付録 G、595 ページの「カスタム シンボル」にあります。 // Open a connection to the Catalog MapInfo.Data.MIConnection conn = new MapInfo.Data.MIConnection(); conn.Open(); // Retrieve a table from the Catalog MapInfo.Data.Table ti=conn.Catalog.GetTable("usa_caps"); // Add it as a layer to MapControl MapInfo.Mapping.FeatureLayer fl=mapControl1.Map.Layers["usa_caps"] _ as FeatureLayer ; // Create a new IndividualValueTheme MapInfo.Mapping.Thematics.IndividualValueTheme iv=new _ MapInfo.Mapping.Thematics.IndividualValueTheme(fl,"state","state"); // Add a custom bitmap symbol MapInfo.Styles.BitmapPointStyle bitmappointstyle = new _ MapInfo.Styles.BitmapPointStyle("AMBU1-32.BMP", _ MapInfo.Styles.BitmapStyles.All ,System.Drawing.Color.Red , 30); // Set the style MapInfo.Styles.CompositeStyle cs = new _ MapInfo.Styles.CompositeStyle(null, null, null, bitmappointstyle); // Apply the style to the first bin MapInfo.Mapping.Thematics.ModifierThemeBin mtb= iv.Bins[0]; mtb.Style.ApplyStyle(cs); // Add another bitmap symbol bitmappointstyle = new _MapInfo.Styles.BitmapPointStyle("BADG1-32.BMP", _ MapInfo.Styles.BitmapStyles.All ,System.Drawing.Color.Red , 30); // Set the style cs=new MapInfo.Styles.CompositeStyle(null, null, null, _ bitmappointstyle); // Apply the symbol to the second bin mtb= iv.Bins[1]; mtb.Style.ApplyStyle(cs); // Append the style modifiers fl.Modifiers.Append (iv); to the feature layer //Close the connection conn.Close(); 開発者ガイド 301 IndividualValueLabelTheme ( 個別値ラベル主題図 ) IndividualValueLabelTheme (個別値ラベル主題図) このクラスは、レイヤのラベルに対して適用される個別値主題図を作成します。個別値主題図の 詳細については、300 ページの「IndividualValueTheme (個別値主題図)」を参照してください。 IndividualValueLabelTheme クラスの用途 レンジ ラベル主題図と同様、個別値ラベル主題図もラベル付けの対象に関する情報を、ラベルを 使用して表示したいときに便利です。たとえば、道路のデータを操作するとき、個別値ラベル主 題図を使用して種類の異なる道路を別々のフォントでラベル付けできます。その場合、高速道路 は、一般道路とは異なるスタイルのラベルで表されます。 VB の例 Public Shared Sub MapInfo_Mapping_Thematics_IndividualValueLabelTheme(ByVal labelSource As MapInfo.Mapping.LabelSource, ByVal columnExpr As String, ByVal _ themeAlias As String) ' Create new individual value label theme Dim theme As IndividualValueLabelTheme = New _ IndividualValueLabelTheme(labelSource.Table, columnExpr, themeAlias) ' Add the label modifier to the label layer. Dim labelModifier As MapInfo.Mapping.LabelModifier = CType(theme, _ MapInfo.Mapping.LabelModifier) labelSource.Modifiers.Insert(0, labelModifier) End Sub 個別値主題図とシリアライゼーション v7.0.0 以 降、パ フ ォ ー マ ン ス を 向 上 する目的で、IndividualValueTheme ( 個別値主題図) および IndividualValueLabelTheme (個別値ラベル主題図) のシリアライゼーションとデシリアライゼーショ ンが変更されました。 変更により、主題図のシリアライゼーションの中で、主題図の Bin またはカテゴリのレコード カ ウントがシリアライズされます。デシリアライゼーションの際は、レコード カウントは再計算さ れなくなり、シリアライズされたレコード カウントが主題図に適用されます。この変更は、シリ アライゼーション/デシリアライゼーションのパフォーマンスを向上するために行われました。 デシリアライゼーション時に主題図のレコード カウントを更新することが期待されるアプリケー ションの場合、デシリアライゼーション後に主題図の Bin またはカテゴリのレコード カウントを 更新するためのロジックを追加する必要があることに注意してください。IndividualValueTheme お よ び IndividualValueLabelTheme の 場 合、MapInfo.Mapping.Thematics.IModifierTheme.RecomputeBins メソッドの呼び出しがこれに当たります。 302 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 DotDensityTheme (ドット密度主題図) ドット密度主題図は、主題図の式の数値に基づいてドットを作り、リージョンの塗りつぶしパ ターンを描画するスタイル修飾子です。 ドット密度主題図は、ドットを使用して、領域やリージョンに関連するデータ値を示します。 リージョンに含まれるドットの総数は、リージョンのデータ値を表します。ある郡に 10,000 人の 高齢者がいて、1 つのドットが 100 人の高齢者を表す場合、その郡域には 100 個のドットが表示さ れます。 DotDensityTheme クラスの用途 ドット密度主題図は、人口、ファースト フードの店舗数、あるブランドの炭酸飲料の販売店の数 など、大きな値のデータを 1 つのドットで表す場合に便利です。 たとえば、郡域ごとの人口を示すテーブルがある場合、ドット密度主題図を使用すれば、各郡域 での人口集中の度合いを表示できます。ドット密度主題図を制御するプロパティには、2 つの種類 があります。1 つのドットで示す値を指定できます。たとえば、ニューヨーク州レンセリア郡在住 の 20,000 人の高校生をドット密度主題図で表示する場合、1 つのドットで表す生徒数を 200 人と指 定できます。この郡を色分けすると、マップには 100 個のドットが描画されます。 VB ÇÃó· Public Shared Sub MapInfo_Mapping_Thematics_DotDensityTheme(ByVal map As Map) ' Load a map based on one table map.Load(New MapTableLoader("mexico.tab")) ' Create a dot density theme. ' Add it as a modifier. Dim lyr As FeatureLayer = map.Layers("mexico") Dim thm As MapInfo.Mapping.Thematics.DotDensityTheme = New MapInfo.Mapping.Thematics.DotDensityTheme(lyr, "Pop_90", "mexico Pop", System.Drawing.Color.Red, DotDensitySize.Large) ' thm.DotColor is System.Drawing.Color.Red ' thm.DotSize is DotDensitySize.Large ' Set each dot to represent 20,000 people thm.ValuePerDot = 20000 End Sub 開発者ガイド 303 DotDensityTheme ( ドット密度主題図 ) 二変数主題図マップ 二変数主題図では、ポイント オブジェクトまたはライン オブジェクトを使用して 2 つの主題変数 を表します。たとえば、星はティーンエージャーの数など 1 つの変数を表し、星に適用する青色の 塗りつぶしはティーンエージャーが 1 年間で買い物に費やす金額を表します。 MapX で二変数主題図マップを作成するには、2 つの主題図を作成し、それらのオブジェクトを重 ね合わせることによって、2 つの変数が表示されるようにします。 マップと変数の種類 二変数主題図に適した主題図マップは、レンジ主題図と個別値主題図のマップのみです。データ の内容に基づいて、以下の二変数主題図の組み合わせのいずれかを選択できます。 • • レンジ主題図が 2 つ レンジ主題図と個別値主題図が 1 つずつ 1 つの変数が数値以外の場合、いずれか 1 つを個別値主題図にする必要があります。2 つの変数が どちらも数値以外の場合、二変数主題図を作成することはできません。 属性の表示 1 つのシンボル内で 2 つの変数を表示するには、変数ごとに別々のシンボル属性を選択することが 大切です。たとえば、両方の変数に色を選択することはできません。片方の色がもう片方の色に よって上書きされてしまうからです。以下の組み合わせの中から選択します。 • • • 色とシンボルの種類 色とサイズ サイズとシンボルの種類 シンボルの種類と数量との間には関連性がないので、シンボルの種類は名目データまたは数値以 外のデータでのみ使用してください。 VB の例 Public Shared Sub MapInfo_Mapping_Thematics_RangedThemeConstructor(ByVal lyr As FeatureLayer) Dim thm As MapInfo.Mapping.Thematics.RangedTheme = New _ MapInfo.Mapping.Thematics.RangedTheme(lyr, "Literacy", "Pop_1994", _ "Literacy Quantile by Pop", 4) lyr.Modifiers.Append(thm) End Sub 304 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 凡例の概要 MapInfo.Mapping.Legends 名前空間には、主題図凡例とシンボル凡例を作成および表示するため の、クラス、インターフェイス、列挙体が含まれています。凡例は、主題図またはシンボルの LegendFrame の コ レ ク シ ョ ン です。各フレームは LegendRow のコレクションを含み、各 LegendRow にはテキストおよびスタイル プロパティがあります。 主題図凡例 主題図凡例は、主題図で使用する色、シンボル、スタイルのキーを提供します。このキーは、 色、シンボル、スタイルに関する説明を提供します。 主題図凡例の用途 主題図凡例は、マップに主題図が含まれている場合に便利です。天気図で降水量を表示する場 合、濃さの異なる緑で色分けして降水量を示すことができます。主題図凡例は、一番濃い緑は降 雨量が最高であり、一番薄い緑は降雨量が最低であることを視覚的に説明するという点で、重要 な役割を果たします。 \Samples\Desktop\Features\ThemeLegend フォルダには、テーブルに基づいてレンジ主題図を作成す る方法、その凡例および凡例フレームを作成する方法、およびそれを修飾としてマップに追加す る方法を示すサンプル アプリケーションがあります。 シンボル凡例 シンボル凡例クラスを使用すると、シンボル凡例メタデータの読み取りや書き込みを実行できま す。凡例は、テキストやメタデータのスタイルを使って、マップ上の各地図フィーチャを識別し ます。 開発者ガイド 305 凡例の概要 シンボル凡例の用途 シンボル凡例は、マップ上の項目を示すオブジェクトを含んだマップを操作する場合に、非常に 便利です。たとえば、マップにランドマークがある場合、シンボル凡例が必要になります。病 院、学校、教会、空港は、それぞれ異なるシンボルで示されます。シンボル凡例は、マップ上に あるさまざまなランドマークを視覚的に説明します。 シ ン ボ ル 凡 例 の 作 成 方 法 を 示 す コ ー ド 例 に つ い て は、『開 発 者 リ フ ァ レ ン ス』の MapInfo.Mapping.Legends.Legend クラスを参照してください。 凡例の書式設定 MapInfo.Mapping.Legends.LegendFormat クラスには、凡例内でのフレームの描画方法を制御するプ ロパティが含まれています。配置、1 つの行や列で表示する凡例フレームの数、フレーム間のス ペース、凡例のサイズやフレーム位置の自動調整など、表示プロパティを制御できます。 LegendFormat.FrameAlignment プロパティは、FramesPerRow (横方向の配置用) や FramesPerColumn ( 縦方向の配置用) と一緒に使用します。 た と え ば、凡 例 に 含 ま れ て い る フ レ ームが 10 個あるとします。ここで、FrameAlignment を Horizontal、FramesPerRow を 5 に設定した場合、それぞれ 5 つのフレームを含む 2 つの行が凡例に 表示されます。1 行につき 10 フレームを指定した場合は、10 フレーム分の幅を持つ 1 行に 10 個の フレームが表示されます。 縦方向の配置に関しても同じような指定を行うことができます。たとえば、フレームが 10 個ある とします。ここで、FrameAlignment を Vertical、FramesPerColumn を 5 に設定した場合、それぞれ 2 つのフレームを含む 5 つの行 (2 列、5 行) が凡例に表示されます。フレームは、1 列あたり最大 5 フレームまで整列されます。FramesPerColumn を 10 に設定した場合は、それぞれ 1 つのフレーム を含む 10 の行が凡例に表示されます (1 列あたり 10 フレーム)。 306 MapXtreme 2008 v7.0.0 第 15 章 : 主題図と凡例の使用 FramesPerRow お よ び FramesPerColumn のデフォルト設定は 0 です。使用される値は、 LegendFrameRows.Count プロパティまたは LegendFrameColumns.Count プロパティで示された行ま たは列の現在のフレーム数です。 開発者ガイド 307 凡例の概要 308 MapXtreme 2008 v7.0.0 16 マップのスタイル設定 MapXtreme に含まれるスタイルは、マップ フィーチャの外観だけでなく、 マッピング アプリケーションの数多くのコンポーネントに影響します。スタ イルは、ラベル、テキスト、主題図、凡例、選択範囲、およびプレゼンテー ションで使用されます。数多くの属性があり、これらを設定することにより、 希望のスタイルを自由にデザインできます。 この章では、MapXtreme フレームワーク、特に MapInfo.Styles 名前空間の観点 から、スタイルについて説明します。 この章の構成 「MapInfo.Styles 名前空間の概要」. . . . . . . . . . . . . . . . . . . . . . . . . . . . 「スタイルの説明」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「定義済みのスタイルと StyleRepository クラス」. . . . . . . . . . . . . . . 「スタイルの使用」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「スタイルのオーバーライド」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 311 314 315 316 MapInfo.Styles 名前空間の概要 MapInfo.Styles 名前空間は、MapXtreme の新しい Styles オブジェクト モデルを強調表示します。 Style クラスは、すべてのスタイルのベース クラスです。Style の派生クラスには、AreaStyle、 BaseLineStyle、BaseInterior、BasePointStyle、CompositeStyle、Font、RasterStyle、TextStyle などがあ ります。BaseLineStyle の派生クラスには SimpleLineStyle があります。BaseInterior の派生クラスに は SimpleInterior があります。BasePointStyle の派生クラスには、BitmapPointStyle、FontPointStyle、 および SimpleVectorPointStyle があります。また、GridStyle は RasterStyle から派生してグリッド固 有のスタイル設定を含みます。StockStyles クラスは一般的な種類のスタイルを作成するために用意 されています。 抽象スタイル クラスの Style、BaseLineStyle、BaseInterior、または BasePointStyle をインスタンス化 することはできません。SimpleLineStyle などの特定の種類を作成するか、CompositeStyle として作 成する必要があります。 Style は、独立したオブジェクトであり、オブジェクト内には格納されません。テーブルにジオメ トリ フィールドが含まれる場合は、データ型である Style を含む Style フィールド (エイリアス MI_Style) も 含 ま れ ま す。ス タ イ ル オーバーライドについては、Feature クラスは、 FeatureStyleModifier および FeatureOverrideStyleModifiers を提供します。この Style オブジェクト モ デルは、スタイル ダイアログ コントロールがいくつかのコレクション クラス (スタイル リポジト リ) を使ってスタイルを保持できるようにします。 す べ て のス タ イ ル ク ラ スで、限定的に修飾する機能がサポートされています。 FeatureOverrideStyleModifiers に関するセクションを参照してください。 スタイルは、ライン、内部の塗りつぶし、ポイント スタイルなど、MapXtreme のさまざまな場面 で地理フィーチャを表すために使用されます。また、ラベル、テキスト、レイアウト、主題図、 オーバーライド、凡例、選択範囲などに欠かせないパーツでもあります。スタイル プロパティの 範囲は、標準的な色の塗りつぶし、ラインの幅およびポイント サイズから、背景色の効果、ポイ ント スタイルとしてのビットマップ、および回転角度まで、多岐に渡ります。事実上、考えうる すべてのスタイル プロパティを作成したアプリケーションに盛り込んで使用することができま す。スタイルは、全体的にも、フィーチャごとでも変更可能です。現在の表示方法のオーバーラ イドとして、または完全な変更として行います。 310 MapXtreme 2008 v7.0.0 第 16 章 : マップのスタイル設定 MapXtreme には、すぐに使用できる多数のサンプル スタイルが同梱されています。170 種類を超 える内部塗りつぶしパターン、約 120 種類のライン スタイル パターン、および約 70 種類のビット マップ ポイント スタイル イメージがあります。ビットマップ イメージは、MS Paint や Paint Shop Pro などのビットマップを作成できるアプリケーションで作成できます。イメージのサイズには事 実上制限はありません。ただし、MapXtreme で表示できるかどうかは、利用可能なメモリ量によ ります。イメージは四角形である必要はなく、最大 24 ビットの色深度を設定できます。イメージ が希望の高さと幅で表示されるようにするには、BitmapPointStyles の [実寸で表示] オプションを選 択します。イメージを作成したら、CustSymb ディレクトリに配置します。カスタム シンボルは C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x\CustSymb フォルダに格納されます。 MapXtreme には、フォームや Web アプリケーションに簡単に追加できるスタイル コントロールと スタイル ダイアログも付属しています。この章で説明するすべてのスタイル クラスをまとめた Sample フォルダ内にある ChangeStyles と FeatureStyles のサンプル アプリケーションを参照してく ださい。フォームのスタイル コントロールとスタイル ダイアログの詳細については、第 8 章: 「デ スクトップ アプリケーション、コントロール、ダイアログ、ツール」を参照してください。Web コントロールの詳細については、第 5 章: 「Web アプリケーション、コントロール、およびツー ル」を参照してください。 サポートされているスタイル要素の表示については、付録 G: 「スタイルのルックアップ」を参照 してください。 StyleFactory StyleFactory クラスは、各種のスタイル パラメータから MapInfo Style オブジェクトを生成するため のメ ソ ッ ド を 含 む MapInfo.Styles から利用できます。たとえば、 MapInfo.Styles.StyleFactory.FromMBstring は、MapBasic スタイル句を入力文字列として受け取り、 CompositeStyle として返します。詳細およびコード例については、オンライン版『開発者リファレ ンス』を参照してください。 スタイルの説明 AreaStyle AreaStyle クラスには、リージョンの描画で使用するスタイル プロパティが含まれています。リー ジョンは、BaseLineStyle および BaseInterior を使用して描画されます。 BitmapPointStyle MapInfo BitmapPointStyle クラスには、カスタム ビットマップ ( ) を使用してポイントを描画す るためのスタイル プロパティが含まれています。このクラスは、ポイントの位置をマークするた めに使用します。BitmapPointStyle は、サポートされている 3 つのポイント スタイルの種類の 1 つ です。残りの 2 つは FontPointStyle および SimpleVectorPointStyle です。 BitmapPointStyle には、ShowWhiteBackground プロパティがあります。false に設定すると、ビット マップ内の白いピクセルはすべて透明になります。デフォルトでは、ShowWhiteBackground は false に設定されています。たとえば、世界中のオフィスの場所を表すとき自社のロゴを使用したい 開発者ガイド 311 スタイルの説明 が、近隣の他のマップ フィーチャを覆いたくない場合があります。BitmapPointStyles の表示方法を 制御するには、他にも設定があります。詳細については、オンライン ヘルプで BitmapStyles 列挙 体を参照してください。 MapXtreme には、すぐに使用できる多数のビットマップ ポイント スタイルが同梱されています。 これらのスタイルは、CustSymb ディレクトリにあります。このディレクトリには、独自のビット マップを追加することもできます。イメージの許容最大数は 32,767 個です。 CompositeStyle CompositeStyle クラスには、デフォルトのスタイル、修飾子のスタイル、およびレイヤ オーバーラ イド スタイルで使用されるすべての種類のスタイルのコレクションが含まれています。また CompositeStyle は、Collection オブジェクト タイプのスタイルを説明する場合にも使用できます。 CompositeStyle に 含 ま れ る ス タ イ ル の種類として、AreaStyle、BaseLineStyle 派生クラス、 TextStyle、BasePointStyle 派生クラス、RasterStyle、および GridStyle があります。CompositeStyle は これらの種類の一部またはすべてを使用して作成できますが、上記のスタイルを 1 つ以上含んでい る必要があります。 たとえば、スタイルのオーバーライドを作成して (FeatureOverrideStyleModifier)、レイヤ内にある すべてのフィーチャの外観を変更できます。1 つのレイヤにはポイント、ライン、リージョンを格 納できるので、スタイルのオーバーライドを作成するときはポイント、ライン、エリアのどのス タイルかを指定しなければならない場合があります。必要なスタイルのタイプはすべて、1 つの CompositeStyle オ ブ ジ ェ クト内で指定できます。指定後、このオブジェクトは FeatureOverrideStyleModifier コンストラクタに渡されます。 SimpleInterior MapInfo SimpleInterior クラスには、リージョン内部の塗りつぶしで使用するスタイル プロパティ が含まれています。SimpleInterior 属性には、パターン、前景色と背景色、背景の透過などがあり ます。デフォルトの SimpleInterior は、白の塗りつぶしです。 Font MapInfo Font クラスには、テキストの描画で使用するスタイル プロパティが含まれています。 フォントの属性には、太字、斜字、下線、打ち消し線、陰影、蛍光色、すべて大文字、ダブル ス ペース、サイズ、前景色、背景色などがあります。フォントの種類 (Arial、Times、New Roman な ど) およびフォント サイズも変更できます。白抜きのフォント プロパティは削除されました。白 抜きを作成するには、黒の背景色で蛍光色を使用します。 FontPointStyle FontPointStyle クラスには、主に MapInfo.Styles.Font クラスを使用したポイントの描画で使用するス タイル プロパティが含まれています。ポイント サイズ、フォント カラー、回転角度、およびその 他のフォント プロパティをカスタマイズできます。許容される最大ポイント サイズは 240 ポイン トです。 312 MapXtreme 2008 v7.0.0 第 16 章 : マップのスタイル設定 GridStyle GridStyle は、色の屈折、null セルの色、透明設定など、グリッドに関する表示スタイル情報が含ま れるヘルパ クラスです。グリッドは、連続して色調が変化するマップです。この色調の変化は、 データ値が補間されていることを表します。グリッドの詳細については、第 18 章: 「ラスタとグ リッドの操作」を参照してください。 RasterStyle RasterStyle は、明るさ、コントラスト、グレー スケール (色、オン/オフ)、透明性、透過性など、 ラスタ イメージの表示スタイル情報が含まれるヘルパ クラスです。ラスタ イメージの詳細につい ては、第 18 章: 「ラスタとグリッドの操作」を参照してください。 Hillshade Hillshade は、グリッドに対する陰影処理のパラメータの保存で使用するヘルパ クラスです。陰影 処理は、レリーフ色分けともいい、グリッド マップに追加してマップ上で光源の効果を表示でき ます。これにより、グリッド マップにより多くの定義が加わるため、標高マップでは特に便利で す。陰影処理のプロパティには、光源の水平方向と垂直方向の角度、垂直方向の比率因数などが あります。グリッドの詳細については、第 18 章: 「ラスタとグリッドの操作」を参照してくださ い。 Inflection Inflection は、単一の屈折点を保持する場合に使用します。この屈折点が色と値を関連付けていま す。グリッドには屈折の配列が含まれており、その色を表しています。グリッド マップとは、領 域に渡って色調の変化を表示するマップのことです。1 つの色から隣の色への遷移は、屈折による ものです。グリッドの詳細については、第 18 章: 「ラスタとグリッドの操作」を参照してくださ い。 SimpleLineStyle SimpleLineStyle クラスには、折れ線の描画で使用する MapBasic Pen 句に基づいたスタイル プロパ ティが含まれています。道路、ケーブル路線、リージョンの境界線などのマップ フィーチャで使 用されます。SimpleLineStyles を定義する属性には、パターン、幅 (ピクセルまたはポイント)、色 な ど が あ り ま す。デ フ ォ ル ト の SimpleLineStyle は、幅が 1 ピクセルの黒の実線です。 SimpleLineStyle の単位は、ピクセル (デフォルト) またはポイントです。 MapInfo.Styles 名前空間の LineWidth クラスは、ライン スタイルの幅と単位の定義で使用するヘル パ クラスです。 BasePointStyle BasePointStyle は、すべての MapInfo ポイント スタイルの抽象ベース クラスです。インスタンス化 することはできません。SimpleVectorPointStyle、BitmapPointStyle、および FontPointStyle は、この クラスから派生しています。 開発者ガイド 313 定義済みのスタイルと StyleRepository クラス BaseLineStyle BaseLineStyle は、すべての MapInfo ライン スタイルの抽象ベース クラスです。インスタンス化す ることはできません。SimpleLineStyle は、このクラスから派生しています。 BaseInterior BaseInterior は、すべての MapInfo 内部スタイルの抽象ベース クラスです。インスタンス化するこ とはできません。SimpleInterior は、このクラスから派生しています。 StockStyles このクラスには、さまざななスタイル オブジェクトを作成するための静的メソッドが含まれてい ます。たとえば、黒、青、赤、白の内部、黒、青、赤のライン、中抜きの内部とライン、デフォ ルトのフォントとポイント スタイルなどのスタイル オブジェクトを作成できます。 SimpleLineStyle redLine = StockStyles.RedLineStyle( ); TextStyle TextStyle ク ラ ス に は、テ キ ス ト の 描 画 で使用するスタイル プロパティが含まれています。 MapInfo.Styles.Font ク ラ ス と、引 出 し線用の BaseLineStyle 派生クラスが含まれています。 BaseLineStyle はオプションです (TextStyle に含まれていない場合があります)。 SimpleVectorPointStyle このクラスには、MapInfo 3.0 互換の専用フォント (MapInfow.fnt は MapXtreme に付属) を使用して ポイントを描画するためのスタイル プロパティが含まれています。SimpleVectorPointStyle プロパ ティには、ポイントについて描画する実際のシンボルの色、ポイント サイズ、形状コードなどが あります。標準のシンボル セットには 31 ~ 67 種類のシンボルが含まれています。 注意 MapInfo Symbol と呼ばれる別のシンボル フォント セットは、FontPointStyle クラスを使用し て表示される TrueType フォント セットです。 定義済みのスタイルと StyleRepository クラス MapXtreme には、ビットマップ ポイント スタイルとして使用できる、数多くの主題図をカバーす るさまざまなビットマップ イメージが付属しています。170 種類を超える塗りつぶしパターンやラ イン スタイルも利用できます。これらのスタイルはすべてアプリケーションによってインストー ルされ、スタイル ダイアログ (LineStyleDlg など) またはさまざまな StyleRepository クラスからアク セスできます。 サポートされているスタイル要素の表示については、付録 G: 「スタイルのルックアップ」を参照 してください。 314 MapXtreme 2008 v7.0.0 第 16 章 : マップのスタイル設定 StyleRepository クラス StyleRepository ク ラ ス に は、ス タイル コレクション クラス (VectorSymbolRepository、 BitmapSymbolRepository、LineStyleRepository、InteriorStyleRepository) が含まれています。これらの クラスを使用すると、特定のファイル (複数可) またはディレクトリから新しいスタイルを持つコ レクションを再読み込みできるほか、現在のすべてのスタイルをループ処理することができま す。また、このクラスには、システムにインストールされた TrueType フォントに関する情報を表 すリポジトリ (TrueTypeFontInfoRepository) も含まれています。 VectorSymbolRepository は、MapInfo 3.0 互換シンボル セットからのシンボル セットを表します。 BitmapSymbolRepository は、現 在 CustSymb ディレクトリにあるイメージ セットを表します。 LineStyleRepository は、ラ イ ン スタイルで利用できる現在のパターン セットを表します。 InteriorStyleRepository は、利用できる内部パターン セットを表します。 スタイルの使用 スタイルとレイヤ管理 スタイルを変更およびオーバライドするには、設計時または実行時に LayerControl を使用します。 MapInfo.Windows.Controls.LayerControl オブジェクト モデルの概要については、LayerControl サンプ ル アプリケーションを参照してください。このコード サンプルでは、LayerControl オブジェクト を直接フォーム上で使用します。LayerControlDlg の使用方法は示していません。このクラスは、 関連はありますが、別のクラスです。LayerControlDlg クラスは LayerControl プロパティを公開して いるので、このコード サンプルで示すすべての操作は、LayerControlDlg オブジェクトにも適用で きます。 開発者ガイド 315 スタイルのオーバーライド LayerControl については、第 8 章: 「デスクトップ アプリケーション、コントロール、ダイアロ グ、ツール」および第 24 章: 「ワークスペース マネージャ」で詳しく説明しています。 カスタム ビットマップ スタイルの作成 ビットマップ イメージは、MS Paint や Paint Shop Pro などのビットマップを作成できるアプリケー ションで作成できます。イメージのサイズには事実上制限はありません。ただし、MapXtreme で 表示できるかどうかは、利用可能なメモリ量によります。イメージは四角形である必要はなく、 最大 24 ビットの色深度を設定できます。イメージが希望の高さと幅で表示されるようにするに は、BitmapPointStyles の [実寸で表示] オプションを選択します。イメージを作成したら、CustSymb ディレクトリに配置します。 スタイルのオーバーライド フィーチャのスタイルは、新しいスタイルをテーブルに保存することにより、永久に変更できま す。また、フィーチャの現在のスタイルをオーバーライドすることによって、現在の表示 (永続的 な表示ではない) を変更することもできます。たとえば、レンジ主題図ではリージョン オブジェク トのスタイルをオーバーライドして、そのオブジェクトを色分けします。詳細については、第 15 章、291 ページの「主題図と凡例の使用」 を参照してください。 ラベル スタイルもオーバーライドできます。ここでは、フィーチャの主なスタイル オーバーライ ド クラスについて説明します。フィーチャとラベルの詳細については、261 ページの「Layers」 Mapping 名前空間に関する265 ページの「Labels」およびを参照してください。 FeatureOverrideStyleModifiers このクラスは FeatureStyleModifier をインプリメントして、フィーチャーのスタイルをオーバーラ イドします。その Style プロパティは複合スタイル オブジェクトであり、オーバーライドする フィーチャの部分を指定します。 Modify() メソッドに渡されるスタイル オブジェクトのコンテンツが、描画するフィーチャごとに 動的に変化するようになりました。その結果、スタイル修飾子を含むレイヤがすばやく描画され るようになりました。したがって、アプリケーションの別の場所でスタイル オブジェクトを使用 す る 必 要 が あ る 場 合 は、必 ず そ の コ ピ ー を 作 成 す る 必 要 が あ り ま す。ま た、 FeatureStyleModifier.Modify() メソッドに渡される、スタイル スタック内の CompositeStyles に対し て、Changed イベントは発生しなくなりました。 コード サンプル: FeatureOverrideStyleModifier 次の例では、FeatureOverrideStyleModifier とレイヤの FeatureStyleModifiers を使用して、マップ内の さまざまなフィーチャのスタイルを変更する方法を示します。 このコードは ChangeStyles サンプル アプリケーションからの抜粋です。各国の首都のレイヤ (worldcap) を 1 つの赤色のシンボルでオーバーライドします。ただし、ポイント サイズはそのまま です。 316 MapXtreme 2008 v7.0.0 第 16 章 : マップのスタイル設定 VB の例 'Get the layer we want Dim _lyr As FeatureLayer = Me.mapControl1.Map.Layers("worldcap") 'Create a sparse point style Dim vs As MapInfo.Styles.SimpleVectorPointStyle = New _ SimpleVectorPointStyle 'Just change the color and code and attributes flag to indicate that vs.Code = 55 vs.PointSize = 25 vs.Color = System.Drawing.Color.Red ' And apply to the layer Dim fsm As FeatureOverrideStyleModifier = New _ FeatureOverrideStyleModifier(Nothing, New _ MapInfo.Styles.CompositeStyle(vs)) _lyr.Modifiers.Append(fsm) Me.mapControl1.Map.Zoom = New MapInfo.Geometry.Distance(6250, _ MapInfo.Geometry.DistanceUnit.Mile) End Sub 開発者ガイド 317 スタイルのオーバーライド 318 MapXtreme 2008 v7.0.0 17 空間オブジェクトと座標系 この章では、MapInfo.Geometry 名前空間について説明し、Geometry オブジェ クトの作成と操作を行うアプリケーションの作成に関する解説と例を示しま す。 この章の構成 「MapInfo.Geometry 名前空間とは」. . . . . . . . . . . . . . . . . . . . . . . . . . . 「ジオメトリ」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「マップへの FeatureGeometry の追加」 . . . . . . . . . . . . . . . . . . . . . . . 「ポリゴン内のポイントの確認」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「座標系」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 320 327 329 330 ジオメトリ MapInfo.Geometry 名前空間とは MapInfo.Geometry 名前空間は、ジオメトリ オブジェクトおよびそれを使用する座標系の作成と操 作に使用されます。Geometry オブジェクトは、マップ内で、都市などの 1 つのポイント (Point オ ブジェクトで表示)、国境などの境界線 (MultiCurve オブジェクトで表示)、および国や郵便番号領 域などのリージョン (MultiPolygon オブジェクトで表示) を表示するのに使用されます。 MapInfo.Geometry 名前空間内のクラス、インターフェイス、および列挙体は、マップ上でジオメト リ フィーチャの表示に使用されるジオメトリと座標系を表す型を定義します。Geometry モデルで は、FeatureGeometry オブジェクト上の Z 値と M 値がサポートされます。インターフェイスでは、 ジオメトリ オブジェクトの作成と編集を行うことができます。Buffer、Combine、Difference、 Intersection などのメソッドでは、1 つのオブジェクトまたはオブジェクトのペアに対するオブジェ クト処理を行います。 ジオメトリ Geometry クラスでは、Geometry オブジェクトの作成、編集、およびその他の操作を行うことがで きます。Geometry クラスから継承する各クラス、および Geometry オブジェクトの表示型には、 Point、MultiPoint、Polygon、MultiPolygon、Curve、CurveSegment、LineString、および Ring が含ま れます。Rectangle、RoundedRectangle、Ellipse、LegacyArc、および LegacyText などのレガシー ク ラスも、Geometry から継承されます。 Geometry クラスは MapInfo Geometry オブジェクト モデルの最上層を表します。これは抽象クラス であり、インスタンス化することはできません。このクラスから派生しているすべてのクラス に、それぞれの座標系に関する情報が含まれています。また、どのクラスも自身をコピーし、他 の Geometry オブジェクトと自身が等しいかどうかを比較することができます。 320 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 次の図は、Geometry モデルを表しています。 Geometry オブジェクト MapXtreme のすべての Geometry オブジェクトは特定の座標系で作成され、作成後の座標系は変更 できません。オブジェクトの座標系を変更する必要がある場合には、新しい座標系でそのオブ ジェクトのコピーを作成します。 Geometry オブジェクトの編集 すべての Geometry オブジェクトには、そのオブジェクトを編集モードにするエディタへのイン ターフェイスを取得するメソッドが含まれています。編集の終了後、EditingComplete() メソッドを 呼び出して、オブジェクトの編集が完了したことを宣言する必要があります。EditingComplete() を 呼び出すと、Geometry に含まれるオブジェクトの順序が変更され、すべての参照が削除されるた め、オブジェクトにもう一度アクセスするためには再整理が必要になります。 たとえば、MultiPolygon を作成した後、それを編集するとします。この Polygon の内部にある Ring のノードを、Polygon の外部に誤って移動すると、Polygon が無効になります。EditComplete を呼び 出すと、MultiPolygon に含まれるすべてのオブジェクトが再整理され、問題が解決されます。 MapXtreme オブジェクト モデルの各 Geometry オブジェクトについては、以降の各セクションで説 明します。 開発者ガイド 321 ジオメトリ FeatureGeometry オブジェクト FeatureGeometry クラスは、テーブル内に配置して Feature および FeatureCollection に含めることが できるクラスを含むように特別に設計されています。マップに何かを表示するためには、それを テーブルに入れる必要があります。したがって、FeatureGeometry オブジェクトは定義に従ってこ のテーブルに含まれています。Geometry のサブクラスであり、FeatureGeometry のサブクラスでは ないオブジェクトは、テーブルに保存することも、また Feature あるいは FeatureCollection の一部 にすることもできません。このような操作を行うと、例外が発生するか、プログラムがコンパイ ルされません。FeatureGeometry クラスは、Geometry クラスと同様に抽象クラスであり、インスタ ンス化することはできません。 M 値と Z 値のサポート フィーチャ ジオメトリでは、オブジェクトの各ノードで M 値と Z 値の読み取りおよび書き込みが サポートされています。 線形オブジェクトに対する M 値と Z 値の読み取りおよび書き込みのサポートは、MapXtreme Geometry モ デ ル の 拡 張 に よ っ て 実 現されました。FeatureGeometry オブジェクト (Point、 MultiPoint、MultiPolygon、MultiCurve、FeatureGeometryCollection) は、各ノードに対して X、Y、 Z、M の各値を保持できるようになっています。 IsMeasured and Is3D プロパティによって、オブジェクトが M 値または Z 値を持つかどうかを確認 できます。各ノードの M 値または Z 値を読み取ったり変更したりするために、追加のプロパティ およびメソッドが用意されています。M 値と Z 値の最小および最大範囲も取得できます。 MapXtreme には、FeatureGeometry 作成および編集機能が用意されています。詳細については、 『開発者リファレンス』で MapInfo.Geometry.FeatureGeometry クラスの説明を参照してください。 MultiCurve の M 値は、線形ネットワーク アプリケーションで資産、イベント、条件を追跡および 管理するための貴重な情報を提供します。第 22 章: 「線形リファレンス」を参照してください。 Point Point は FeatureGeometry クラスから派生し、マップ上の一点を表します。Point は MultiPoint コレク ションに含まれ、集合的に操作を行うことができます。 次のコード例を使用すると、Point の作成をモデル化することができます。 using MapInfo.Geometry; using Mapinfo.Design.Windows; CoordSys longLatNad83; CoordSysFactory coordSysFactory = new CoordSysFactory(); longLatNad83 = coordSysFactory.CreateLongLat (MapInfo.Geometry.DatumID.NAD83); DPoint point = new DPoint(0.0, 0.0); Point pointGeometry = new Point(LongLatNad83, point); 322 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 MultiPoint MultiPoint には、順序付けされておらず接続されていない Point のセットが含まれており、複数の ポイントに対して複数の操作を行うのに便利です。 次のコード例を使用すると、MultiPoint オブジェクトの作成をモデル化することができます。 using MapInfo.Geometry; CoordSys longLatNad83; CoordSysFactory coordSysFactory = new CoordSysFactory(); longLatNad83=coordSysFactory.CreateLongLat (MapInfo.Geometry.DatumID.NAD83); MultiPoint multiPointGeometry = new MultiPoint (longLatNad83, pointArray); ここで、pointArray は DPoints の配列です。 MultiCurve MultiCurve クラスは FeatureGeometry の派生クラスです。このクラスには、Curve のセットが格納さ れています。Curve どうしは接続されていない場合もあります。これらの Curve は、接続すること も離すこともできます。また、互いに交差または重なり合うこともできるなど、さまざまな方法 で相互作用します。 Geometry オブジェクト モデルは、1 つの Curve に対して複数の CurveSegment をサポートしていま す。ただし、現在のバージョンの MapInfo エンジンでは、FeatureGeometry に属する Curve (つま り、MultiCurve) に格納できる CurveSegment が 1 つに制限されています。この制限は現在の TAB ファイル形式から派生しており、このバージョンの MapInfo では大部分がそのまま残されていま す。したがって、制限は FeatureGeometry オブジェクトのみに関係します。 こ の コ ン ス ト ラ ク タ を 使 用 し て MultiCurve を作成するとき、いずれかの Curve に複数の CurveSegment が含まれる場合は、Curve ごとに常に 1 つの CurveSegment しか含まれないように、 作成された MultiCurve 内の実際の Curve が変更されます。現在、存在する CurveSegment の唯一の 型は LineString です。複数の LineString CurveSegment が含まれる Curve は、複数の LineString を接 続して大きな 1 つの LineString を形成します。 MultiCurve に追加され、複数の CurveSegment を含む Curve はすべて、編集完了 (EditingComplete() を呼び出して宣言) 時に上記と同様の方法で変更され、1 つの CurveSegment を持つ Curve が生成さ れ ま す。MultiCurve の Curve に は 常に 1 つの CurveSegment しか格納できないという制限は、 EllipticalArc、CircularArc、Spline などの新しい種類の CurveSegment の導入や TAB ファイル形式の 変更に伴い、MapInfo の将来のバージョンでは削除される予定です。また、空の Curve は、生成中 および編集完了時に MultiCurve から自動的に削除されます。 MapInfo TAB フ ァ イ ル 内 の 2 つのポイントで構成される Line オブジェクトは、MultiCurve FeatureGeometry オブジェクトになります。これらのオブジェクトは、MultiCurve の IsLegacyLine プロパティを使用することにより、2 ポイントの Line として検出できます。 MultiCurve オブジェクトを作成したり編集したりするためのコード例については、『開発者リファ レンス』を参照してください。 開発者ガイド 323 ジオメトリ MultiCurve の指標値 Geometry オブジェクト モデルでは、FeatureGeometry オブジェクトの M 値と Z 値がサポートされ ています。M 値 (指標値) は、MultiCurve オブジェクトのノード上でマッピングや分析の対象とな るもの (物理的資産、条件、イベントなど) を記述するデータを保持します。M 値は、線形リファ レンスおよび動的セグメンテーションで重要な役割を持ちます。詳細については、第 22 章: 「線形 リファレンス」を参照してください。 Curve の並べ替え順序 MultiCurve 内の Curve の順番は、Curve の生成中、コンストラクタに渡された Curve の配列との比 較時、および編集完了時に変更される可能性があります。これらの理由 (Curve の順番の変更、空 の Curve の削除、現在のバージョンの制限など) により、編集前および編集中の MultiCurve 内に含 まれる Curve への参照は、編集完了後、つまり、EditingComplete() が実行されると無効になりま す。これらのオブジェクトが参照されると、ObjectDisposedException がスローされます。編集後に 有効な参照を取得するには、FeatureGeometry の各部分を再取得します。 Curve の並べ替え順序は、MultiCurve に対して何らかの線形リファレンス操作を呼び出すときに、 重 要 な 要 素 と な り ま す。 MapXtreme には、個々の Curve の並べ替え順序を処理するための MapInfo.LinearReferencing.ICurveSorter インターフェイスが用意されています。並べ替え順序を指定 しないと、MapXtreme では、最も長い Curve が最初に返され、残りの Curve は順不同で返されま す。たとえば、順序が指定されていない MultiCurve に対して CalculateMissingMeasures を使用した 場合、MapXtreme では、MultiCurve 内での位置に基づいて、ノードに対して誤った M 値を計算す る可能性があります。正しい並べ替え順序を指定することで、このような問題を避けることがで きます。 詳細については、第 22 章、409 ページの「曲線の順序」 を参照してください。 LineString LineString は、線形に接続された連続するポイントの指向性を持つ集まりを表します。LineString 内 の連続する 2 つのポイントはいずれも直線で接続されます。LineString は Curve または Ring の一部 になることができます。また、スタンドアロン Geometry として存在することも可能です。Curve または Ring の一部である LineString は、そのコンテナの座標系の LineString を継承しています。ス タンドアロンの LineStrings は空でもかまいません。編集モード以外の Curve または Ring に含まれ る LineString は空にできません。また、1 つのポイントだけを含むことができません。 コード例については、『開発者リファレンス』を参照してください。 Rectangle Rectangle Geometry には、Rectangle の左下隅と右上隅の角を表す 2 つのポイントが含まれます。残 りの 2 つのポイントは暗黙的に設定されます。Rectangle は常に軸整列され、座標系に関係なく形 状は常に長方形として表示され、投影されません。座標系によって生じる可能性のある歪みは含 まれません。 コード例については、『開発者リファレンス』を参照してください。 RoundedRectangle Rounded Rectangle は Rectangle と同様に動作しますが、角に表示時のみ丸みが適用されます。角の 丸みは四半円として表示されます。この四半円の半径は CornerRadius パラメータによって制御さ れます。 324 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 RoundedRectangle オブジェクトは Rectangle オブジェクトと同様に 2 つのポイントにより定義し、 常に平面的に、かつ軸整列して表示されるため、一般的には見た目をよくする目的で使用しま す。Rectangle オブジェクトではさまざまな操作 (たとえば Combine) が可能ですが、内部的には Rectangle オブジェクトの MultiPolygon のコピーが使用されます。生成される MultiPolygon は 5 つ のポイントを持ち (最初のポイントと最後のポイントは同一)、座標系に影響されます。場合によっ ては、変換された Rectangle は長方形として表示されないことがあります。RoundedRectangle を FeatureGeometry オブジェクトに変換するには、CreateMultiPolygon メソッドを使用します。 コード例については、『開発者リファレンス』を参照してください。 Ellipse Ellipse は、軸整列した長方形内に描画されます。この長方形は DRect で定義されます。DRect は長 方形の対角となる 2 つのポイントにより定義され、残りの 2 角のポイントは暗黙的に適用されま す。Ellipse は、座標系 (および座標系による歪み) に関係なく平面的に表示されます。 Ellipse オブジェクトは 2 つのポイントにより定義し、常に平面的に、かつ軸整列して表示されるた め、一般的には見た目をよくする目的で使用します。Ellipse オブジェクトではさまざまな操作が 可能ですが、内部的には Ellipse オブジェクトの MultiPolygon のコピーが使用されます。生成され る MultiPolygon は座標系の影響を受けるので、場合によっては、完全な楕円として表示されない ことがあります。 コード例については、『開発者リファレンス』を参照してください。 LegacyArc LegacyArc オブジェクトは Ellipse の一部であり、DRect、開始角度、および終了角度を使用して定 義されます。Ellipse は、DRect を使用して定義された長方形の中に描画されます。内部に Ellipse が描画された長方形は軸整列されており、使用する座標系に関係なく形状は必ず長方形となりま す。角度は正の X 軸上を 0 度とし、反時計回りの方向を正の角度として計測されます。最小計測 単位は 10 分の 1 度で、0.0 ~ 360.0 度の値が保存されます。 LegacyArc オブジェクトは 2 つのポイント (DRect 用) と角度を使用して定義され、常に軸整列して 表示されるため、一般的には見た目をよくする目的で使用します。LegacyArc オブジェクトではさ まざまな操作が可能ですが、内部的には LegacyArc の MultiCurve のコピーが使用されます。この ため、予期しない結果につながることがあります。 コード例については、『開発者リファレンス』を参照してください。 LegacyText LegacyText オブジェクトは、テキスト オブジェクトと同等の MapInfo Professional オブジェクトで す。データベースが Text をサポートしない場合には、その形式を使用すると LegacyText オブジェ クトが失われる可能性があります。LegacyText オブジェクトは、左下のアンカーポイントを指定す ることにより、地理的にサイズが設定された長方形内に配置されます。テキストのポイント サイ ズは、長方形の中に収まる最適なサイズに基づきます。 LegacyText オ ブジェ クトは、Geometry モデルにうまく適合しません。Combineなど、Geometry FeatureGeometry クラスに使用できるメソッドのいくつかは、LegacyText に対しては意味を持た ず、NotSupportedException をスローします。Text オブジェクトは、MapInfo ネイティブ TAB ファイ 開発者ガイド 325 ジオメトリ ル内の Geometry フィールドに存在します。LegacyText クラスは、これらのオブジェクトにアクセ スする方法を提供します。LegacyText オブジェクトの特定の動作については、オンライン リファ レンスを参照してください。 Geometry オブジェクト FeatureGeometry オブジェクト以外の Geometry オブジェクトは、マップ上に表示される適切な FeatureGeometry オブジェクトに変換する必要があります。大部分の FeatureGeometry クラスは、適 切な Geometry オブジェクトを取り、新しい FeatureGeometry オブジェクトを作成するコンストラク タを持っています。 using MapInfo.Geometry; Curve curve = new Curve(csys, lineString); MultiCurve multiCurve = new MultiCurve(curve.CoordSys, curve); 上記のコードでは、コード内の別の場所で定義されている 2 つのパラメータ CoordSys (csys) およ び LineString (lineString) を 使 用 し て Curve を作成しています。次に、Curve と Curve の CoordSys プロパティを使用して、新しい MultiCurve が作成されます。 上記の例では、参照を共有できないため、オブジェクトから作成された FeatureGeometries 内と同 様に、元のオブジェクトのコピーが作成されます。 Curve Curve クラスは、CurveSegmentList の継承クラスで、連続した線形の Geometry を表します。Curve には CurveSegment のコレクションが含まれます。これらは必ず連続していなければなりません。 このクラスは、将来の拡張と OGC 標準への参加を可能にするため、モデルに含まれています。 次のコード例を使用すると、Curve の作成をモデル化することができます。 using MapInfo.Geometry; DPoint[] points = new DPoint[4]; points[0]= points[1]= points[2]= points[3]= new new new new DPoint(-88.135215,43.998892); DPoint(-104.875119,43.998892); DPoint(-120.242895,47.048364); DPoint(-89.135215 46.998892); LineString lineString = new LineString(csys, points); Curve curve = new Curve(csys, lineString); CurveSegment 現 在、CurveSegment は LineString としてのみ使用できます。将来のバージョンで Spline、 CircularArc、および EllipticalArc CurveSegments をサポートできるよう設計されています。Curve お よび Ring は CurveSegment から構成されます。 326 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 Ring Ring は CurveSegment のコレクションです。これらは必ず連続しており、かつ閉じていなければな りません。 次のコード例を使用すると、Ring の作成をモデル化することができます。 using MapInfo.Geometry; dPoints = new DPoint[102]; dPoints[0] = new DPoint(-109.171279,49.214879); dPoints[1] = new DPoint(-109.169283,49.241794); ... dPoints[101] = new DPoint(-109.171279,49.214879); Ring newRing = new Ring(longLatNad83, CurveSegmentType.Linear, dPoints); Polygon Polygon は Ring で構成されるオブジェクトです。Polygon は、少なくとも 1 つ Ring を持っていなけ ればなりません。その Ring は、Polygon の外部境界を定義するものです。これ以外に、Polygon の 内部にあり、Polygon の穴を定義する Ring が含まれる場合があります。Ring を他の Ring の内部に 配置すると、そのオブジェクトは MultiPolygon となります。 次のコード例を使用すると、Polygon の作成をモデル化することができます。 using MapInfo.Geometry; DPoint[][] points = new DPoint[1][]; points[0] = polyPointArrays[0]; Polygon polygon = new Polygon (longLatNad83, CurveSegmentType.Linear, polyPointArrays[0]); マップへの FeatureGeometry の追加 ジオメトリを作成したら、表示、選択、ラベル付けなどのマップ関連の操作を行えるよう、その ジオメトリをマップに追加する必要があります。 Public Shared Sub MapInfo_Mapping_HowDoICreateFeatureAddToMap(ByVal mapControl1 As MapControl, ByVal connection As MIConnection, ByVal x As _ Double, ByVal y As Double) Dim map As Map = mapControl1.Map 'uses wldcty25 as a template Dim table As Table = _ MapInfo.Engine.Session.Current.Catalog.GetTable("wldcty25") ' create a temp table and add a featurelayer for it Dim coordSys As CoordSys = map.GetDisplayCoordSys() Dim tableInfo As TableInfoMemTable = New TableInfoMemTable("temp") tableInfo.Temporary = True ' add Geometry column 開発者ガイド 327 マップへの FeatureGeometry の追加 Dim column As Column ' specify coordsys for object column column = New GeometryColumn(coordSys) column.Alias = "MI_Geometry" column.DataType = MIDbType.FeatureGeometry tableInfo.Columns.Add(column) ' add style column column = New Column column.Alias = "MI_Style" column.DataType = MIDbType.Style tableInfo.Columns.Add(column) Dim pointTable As Table = _ Session.Current.Catalog.CreateTable(tableInfo) ' Set the location and display style of the point Dim Geometry As FeatureGeometry = _ New MapInfo.Geometry.Point(coordSys, x, y) Dim vStyle As SimpleVectorPointStyle = _ New SimpleVectorPointStyle(37, Color.Red, 14) Dim cStyle As CompositeStyle = _ New MapInfo.Styles.CompositeStyle(vStyle) 'Update the table with the location and style of the new feature Dim cmd As MICommand = connection.CreateCommand() cmd.Parameters.Add("Geometry", MIDbType.FeatureGeometry) cmd.Parameters.Add("style", MIDbType.Style) cmd.CommandText = "Insert Into temp (MI_Geometry,MI_Style) values _ (Geometry,style)" cmd.Prepare() cmd.Parameters(0).Value = Geometry cmd.Parameters(1).Value = cStyle Dim nchanged As Integer = cmd.ExecuteNonQuery() cmd.Dispose() 'add the table to the map map.Layers.Add(New MapInfo.Mapping.FeatureLayer(pointTable)) End Sub 328 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 ポリゴン内のポイントの確認 次のコード例は、ポイントが FeatureGeometry (Multipolygon) の境界内に存在するか、境界線上に存 在するか、境界の範囲外に存在するかを確認する方法を示しています。 Public Shared Sub MapInfoGeometryContainsPoint() Dim coordSysFactory As CoordSysFactory = Session.Current.CoordSysFactory Dim coordSys As CoordSys = _ coordSysFactory.CreateLongLat(MapInfo.Geometry.DatumID.NAD83) Dim points(6) As DPoint points(0) = New DPoint(-0.705036, -0.122302) points(1) = New DPoint(-0.446043, 0.486811) points(2) = New DPoint(0.235012, 0.36211) points(3) = New DPoint(0.422062, -0.304556) points(4) = New DPoint(-0.244604, -0.71223) points(5) = New DPoint(-0.705036, -0.122302) Dim multiCurve As MultiCurve = New _ MultiCurve(coordSys,CurveSegmentType.Linear,points) Dim multiPolygon As MultiPolygon = New _ MultiPolygon(coordSys,CurveSegmentType.Linear,points) Dim insidePoint As DPoint = New DPoint(-0.115108,0.160671) Dim boundaryPoint As DPoint = New DPoint(-0.446043,0.486811) Dim outsidePoint As DPoint = New DPoint(-1.103118,0.021583) If multiPolygon.ContainsPoint(insidePoint) Then _ Console.WriteLine("Points inside area inclosed by closed _ (GeometryDimension 2) objects are contained") End If If Not multiCurve.ContainsPoint(insidePoint) Then _ Console.WriteLine("But this is not true for linear _ (GeometryDimension 1) objects") End If If multiPolygon.ContainsPoint(boundaryPoint) Then _ Console.WriteLine("Points on the boundary of closed objects _ are contained") End If If multiCurve.ContainsPoint(boundaryPoint) Then _ Console.WriteLine("Points lying on linear objects are contained") End If If Not multiPolygon.ContainsPoint(outsidePoint) Then _ Console.WriteLine("Point completely outside closed objects _ are not contained") End If If Not multiCurve.ContainsPoint(outsidePoint) Then _ Console.WriteLine("Point completely outside linear objects _ are not contained") End If End Sub 開発者ガイド 329 座標系 座標系 座標系は、特定のオブジェクトまたはオブジェクトの集合が存在するドメインを記述します。座 標系を使用すると、記述しているオブジェクトまたはオブジェクト群を具体的に描画することが できます。CoordSys クラスには、座標系の作成、操作、および編集を行うためのメソッド、プロ パティ、およびインターフェイスが含まれます。 ジオメトリは、そのオブジェクトの作成用に指定された座標系で作成されます。オブジェクトの 座標系を変更することはできません。ただし、オブジェクトを他の座標系にコピーすることは可 能です。 CoordSys クラスを使用すると、座標系の作成と操作が容易になります。Coordsys クラスは、XML バージョンの投影法ファイル (C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x\MapInfoCoordinateSystemSet.xml) を使用します。 CoordSysFactory オブジェクトには、登録済みの座標系が含まれています。CoordSys の定義は、 XML 投影法ファイルを読み込むか、RegisterCoordSys メソッドまたは RegisterCoordSysInfo メソッ ドを使用することによって登録できます。ファクトリ、コードスペース (EPSG、SRID)、PRJ 文字 列、MapBasic 文字列、およびその他のファクトリ作成メソッドから CoordSys オブジェクトを作成 できます。また、CoordSys クラスには、対するミリタリー グリッド参照形式変換メソッドもあり ます。 CoordSys オブジェクトの作成 CoordSys オブジェクトを作成するいくつかの方法を、以下のコード例に示します。MapInfo コード スペースを使用する方法、EPSG による方法、PRJ 文字列からの経度と緯度で生成する方法、 MapBasic 文字列から生成する方法、および SRID による方法があります。 VB の例: Public Shared Sub MapInfoGeometryCreateCoordSys() Dim factory As CoordSysFactory = Session.Current.CoordSysFactory ' create CoordSys objects from srsName Dim csysWGS84 As CoordSys = factory.CreateCoordSys("EPSG:4326") Dim csysNAD83 As CoordSys = factory.CreateCoordSys_ ("mapinfo:coordsys 1,74") Dim csysNAD27 As CoordSys = factory.CreateCoordSys("SRID:8260") ' create CoordSys objects from code/codeSpace csysWGS84 = factory.CreateCoordSys("4326", CodeSpace.Epsg) csysNAD83 = factory.CreateCoordSys("coordsys 1,74", CodeSpace.MapInfo) csysNAD27 = factory.CreateCoordSys("8260", CodeSpace.Srid) ' create CoordSys objects from user-defined parameters Dim dat As Datum = factory.CreateDatum(DatumID.WGS84) csysWGS84 = factory.CreateCoordSys(CoordSysType.LongLat, _ dat, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nothing) dat = factory.CreateDatum(DatumID.NAD83) csysNAD83 = factory.CreateCoordSys(CoordSysType.LongLat, _ dat, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nothing) dat = factory.CreateDatum(DatumID.NAD27ContinentalUS) 330 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 csysNAD27 = factory.CreateCoordSys(CoordSysType.LongLat, _ dat, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nothing) ' create Long/Lat coordinate system csysWGS84 = factory.CreateLongLat(DatumID.WGS84) csysNAD83 = factory.CreateLongLat(DatumID.NAD83) csysNAD27 = factory.CreateLongLat(DatumID.NAD27ContinentalUS) ' create from MapBasic string Dim csysRGF93 As CoordSys = _ factory.CreateFromMapBasicString("CoordSys Earth Projection 3, _ 33, ""m"", 3, 46.5, 44, 49, 700000, 6600000") ' create from PRJ string csysNAD83 = factory.CreateFromPrjString("1, 74") Sub Geometry オブジェクトの座標系の変更 次の例では、Geometry オブジェクトをある座標系から別の座標系に変換しています。 VB の例: Public Shared Sub MapInfoGeomeTryCoordSys(ByRef coordSys As _ CoordSys, ByRef points() As DPoint, ByRef alternateCoordSys _ as CoordSys ' All Geometry constructors require a CoordSys parameter ' Note that the points array is assumed to be in coordSys Dim lineString As LineString = New _ LineString(coordSys,points) ' The Geometry has a reference to the CoordSys used during ' construction.Unlike the coordinate data represented by the ' points array, the CoordSys' is not copied If ReferenceEquals(coordSys, lineString.CoordSys) Then Console.WriteLine("Geometry objects hold a reference to _ the CoordSys used during construction") End If ' if you want to convert the object to another coordinate ' system, you need to make a new copy using one of the copy methods If Not coordSys.Equals(alternateCoordSys) Then Dim newGeometry as MapInfo.Geometry.Geometry = _ lineString.Copy(alternateCoordSys) End If End Sub 開発者ガイド 331 座標系 MapControl 内のマップの座標系を調べる方法 次のコード例は、Map オブジェクトの座標系を調査する方法を示しています。 VB の例: Public Shared Sub _ MapInfo_Mapping_FeatureViewerGetDisplayCoordSys(ByVal map As Map) 'Load the Default Projection File so that we can get the name. MapInfo.Engine.Session.Current.CoordSysFactory.LoadDefault_ ProjectionFile() 'Get the Coordinate System object for current map in the MapControl Dim mapCoordSys As MapInfo.Geometry.CoordSys = _ map.GetDisplayCoordSys() 'Assign the name of the Coordinate System to a string variable. 'note: the CoordSysName function will return a blank string if the 'Coordinate System is not found in the current CoordinateSystemSet '(loaded by the LoadDefaultProjectionFile above). Dim mapCoordSysName As String = _ MapInfo.Engine.Session.Current.CoordSysFactory.CoordSys_ Name(mapCoordSys) End Sub MapXtreme への座標系の追加 必要な座標系が MapInfoCoordinateSystemSet.xml ファイルに存在しない場合は、目的に合った座標 系を MapXtreme に追加することができます。EPSG コードや SRID コードを追加することによって MapXtreme の機能を拡張することが可能です。 EPSG コードは、OPG (International Association of Oil & Gas Producers) の主導の下で、EPSG Geodetic Parameter Dataset として管理されている座標系の集まり (コードスペース) です。この作業は、2005 年、European Petroleum Survey Group から OPG Survey and Positioning Committee に移管されました。 SRID コードは、Oracle Spatial テーブルのコードスペースを参照する一意の空間リファレンス番号 です。 (MapXtreme は、MapInfo と呼ばれる第 3 のコードスペースをサポートしています。) MapXtreme には、代表的な EPSG マッピングおよび SRID マッピングが数多く用意されています が、 特定の座標系に対し、異なる EPSG コードまたは SRID コードを登録しなければならない場合 もあるでしょう。これには、2 とおりの方法があります。 MapXtreme の機能を拡張して EPSG または SRID のコードスペースを使用するための 1 つ目の方法 と し て、必 要 な 情 報 を プ ロ グ ラ ム か ら 追 加 す る 方 法 が あ り ま す。こ の 場 合、座 標 系 情 報 は MapXtreme セッションが終了すると破棄されます。もう 1 つの方法は、Web.config ファイル (Web アプリケーションの場合) または app.config ファイル (デスクトップ アプリケーションの場合) に情 報を追加する方法です。この場合は、セッションが終了しても情報が維持されます。以下、それ ぞれの方法について説明します。 332 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 EPSG コードと SRID コードをプログラムから登録する方法 MapInfo.Geometry.CoordSysFactory クラスには、EPSG コードと SRID コードを、指定した座標系に 登録するためのメソッドがあります。 RegisterEPSGCode() および RegisterSRIDCode() は、それぞれ 2 つのパラメータを受け取ります。1 つは、コードスペースを表す EPSG コードまたは SRID コードです。もう 1 つは、1 つ目のパラ メータと対応付ける座標系情報です。 次の例では、Long/Lat NAD83 座標系に架空のコードを登録しています。 VB の例: Public Shared Sub MapInfo_Geometry_RegisterEPSGCode() Dim factory As CoordSysFactory = Session.Current.CoordSysFactory ' create CoordSys objects from srsName Dim csysNAD83 As CoordSys = _ factory.CreateCoordSys("mapinfo:coordsys 1,74") ' 9998 is a fictional code for demonstration purposes Try factory.RegisterEPSGCode(9998, csysNAD83) Catch ae As ApplicationException 'code already exists.Codes cannot be duplicated End Try End Sub 注意 EPSG コードまたは SRID コードが既に存在する場合は、そのことを示す例外がスローされ ます。 MapInfo、EPSG、または SRID のコードスペースに対し、座標系が既に登録されているかどうかを 調べるには、次のメソッドを呼び出します。 • MapInfo.Geometry.CoordSys.Code(codespace). このメソッドでは、対応するコードスペースの最初のエントリが返されます。存在しなかった場 合は、null が返されます。 同様に、入力したコードスペースに対応する最初の SRSName を取得するには、次のメソッドを呼 び出します。 • MapInfo.Geometry.CoordSys.SRSName(codespace). SRSName (空間リファレンス システム) は、GML (Geography Markup Language) で記述されたリファ レンス座標系を表します。通常は、パラメータ値のリストではなく、座標系のフレンドリ名で す。 特定の座標系にマッピングされたすべてのコードおよび座標系のリストを取得するには、次のメ ソッドを使用します。 • MapInfo.Geometry.CoordSys.Codes(codeSpace) • MapInfo.Geometry.CoordSys.SrsNames(codeSpace) プログラムから追加した座標系情報は、MapXtreme セッションの有効期間中しか維持されませ ん。 開発者ガイド 333 座標系 EPSG コードと SRID コードを Web またはデスクトップの構成ファイルに登録する方 法 MapXtreme に対し、EPSG コードまたは SRID コードを永続的に追加する方法もあります。Web ア プリケーションの web.config ファイルまたはデスクトップ アプリケーションの app.config1 ファイ ルに情報を登録します。以下のコードでは、構成ファイルにコピーする情報を太字で示してあり ます。詳細については、コード例の後の解説を参照してください。 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="MapInfo.CoreEngine" type="MapInfo.Engine.ConfigSectionHandler, MapInfo.CoreEngine, Version=6.8.0.536, Culture=neutral, PublicKeyToken=93e298a0f6b95eb1" /> </configSections> <appSettings> <add key="MapInfo.Engine.Session.UseCallContext" value="false" /> </appSettings> <MapInfo.CoreEngine> <EPSG_Code_Mappings> <EPSG_Code_Mapping> <srsName>My Custom CRS</srsName> <srsID> <code>coordsys 8,74,8,110.0833333333,47.5,0.9999375,2624666.667,328083.3333</code> <codeSpace>mapinfo</codeSpace> <remarks>My Custom CRS</remarks> </srsID> <EPSG_Codes> <EPSG_Code>9987</EPSG_Code> <EPSG_Code>9988</EPSG_Code> <EPSG_Code>9989</EPSG_Code> </EPSG_Codes> </EPSG_Code_Mapping> </EPSG_Code_Mappings> <SRID_Code_Mappings> <SRID_Code_Mapping> <srsName>My Custom CRS</srsName> <srsID> <code>coordsys 8,74,8,114.0833333333,47.5,0.9999375,2624666.667,328083.3333</code> <codeSpace>mapinfo</codeSpace> <remarks>My Custom CRS</remarks> </srsID> <SRID_Codes> <SRID_Code>9990</SRID_Code> <SRID_Code>9991</SRID_Code> <SRID_Code>9992</SRID_Code> </SRID_Codes> 1. 334 デスクトップ アプリケーションに app.config ファイルが使用されていない場合は、Visual Studio のアプリ ケーション構成ファイル テンプレートをプロジェクトに追加することによって作成できます。 MapXtreme 2008 v7.0.0 第 17 章 : 空間オブジェクトと座標系 </SRID_Code_Mapping> </SRID_Code_Mappings> </MapInfo.CoreEngine> </configuration> このコードでは、追加する情報が 2 つのセクションに分けて記述されています。1 つ目のセクショ ンでは、正しい CoreEngine dll およびバージョン番号1 を識別しています。2 つ目のセクションで は、EPSG コードおよび SRID コードをマッピングするための要素を追加しています。 EPSG コード マッピングは、SRSName、SRS ID、および EPSG コードで構成されます。SRSID は さらに、座標系のパラメータおよびコードスペースによって定義されます。 SRID コード マッピングも EPSG コード マッピングと似ていますが、SRID コード マッピングの場 合は Oracle Spatial ID 番号が参照されます。 座標系の詳細については、「付録 I: 「座標系の要素」」を参照してください。MapInfo コードス ペースの詳細については、「付録 H: 「MapInfo コードスペースの定義」」を参照してください。 1. 開発者ガイド MapInfo.CoreEngine アセンブリの正しいバージョン番号を調べるには、[スタート] メニューの [ファイル名 を 指定 し て実 行] をク リ ック し て [ フ ァイ ル 名を 指 定し て 実行] ダ イア ロ グ ボッ ク スを 表 示し、 「Assembly」と入力します。グローバル アセンブリ キャッシュに登録されているすべての MapXtreme ア センブリが一覧表示されます。 335 座標系 336 MapXtreme 2008 v7.0.0 18 ラスタとグリッドの操作 MapInfo.Raster 名前空間には、MapXtreme でのラスタ イメージとグリッド イ メージの使用および表示を制御するすべてのクラスが含まれています。ラスタ イメージとは、イメージ全体がピクセルによってレンダリングされるコン ピュータ グラフィックです。多くの衛星画像はラスタ イメージとしてレンダ リングされます。グリッド イメージとは、連続する色調の変化によって補間 された情報を示す主題図です。 この章の構成 「MapInfo.Raster 名前空間の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . . 「ラスタ イメージ」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「ラスタ ハンドラ」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「カスタム ラスタ ハンドラの構成」 . . . . . . . . . . . . . . . . . . . . . . . . . 「グリッド イメージ」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「グリッド作成」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「グリッド補間クラス」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「グリッド スタイル」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 338 341 342 343 346 347 348 ラスタ イメージ MapInfo.Raster 名前空間の概要 MapInfo.Raster 名前空間は、Pitney Bowes Business Insight の C/C++ Raster API と Grid Engine API の全 機能を提供します。ラスタ イメージは、マップに便利な背景レイヤや参照レイヤを提供するビッ トマップです。グリッド イメージは、イメージ全体にわたって連続する色調の変化を表示する主 題図の一種です。色調の変化は基本データの補間を表します。グリッド イメージは、データが関 連付けられているラスタです。一般的な例として標高マップがあります。ラスタには基本データ がありません。 ラスタ イメージ ラスタ イメージはマップの背景に最適です。たとえば、建物、製油所、植生などの現実世界の詳 細を表示する航空写真は、マップのベース レイヤとして最適です。スキャンされた紙の地図もラ スタ イメージの一例です。ラスタ イメージをベース レイヤとして使用し、街路網、顧客を表すポ イント、郵便番号の境界などのベクトル データを重ね合わせて、便利で、視覚効果の高いマップ を作成します。 ベクトル データと共に使用するラスタ イメージは登録する必要があります。イメージ上の既知の 地理ポイントをベクトル デ ー タ 上の対応するフィーチャと一致させるためです。また、 MapXtreme で表示する会社のロゴやその他のアートは、地理参照データではありませんが、地球 上の特定の位置に登録する必要があります。今日入手できる多くのラスタ イメージには、登録 ファイルが付属しています。その例として、GeoTIFF、ADRG、ASRP、CADRG、CIB などがあり ます。ラスタ イメージを登録するには、MapInfo Professional に読み込み、そこで登録します。登 録ファイル情報は .TAB ファイルに格納されます。 338 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 MapXtreme でサポートされているラスタ イメージの形式を以下に示します。 • • • • • • • • TIFF および GeoTIFF (*.tif) MrSID (*.sid) ECW (*.ecw) Spot (*.bil) JPEG (*.jpg) JPEG2000 (*.jp2, *.j2K) PCX (*.pcx) GIF (*.gif) • • • • Windows ビットマップ (*.bmp) PNG (*.png) Photoshop (*.psd) Targa (*.tga) • • • • • • Windows メタファイル (*.wmf) Windows 拡張メタファイル (*.emf) Wireless BMP (.WBMP) Vertical Mapper Continuous Grid (*.grd) Vertical Mapper Classified Grid (*.grc) ADRG - ARC Digitized Raster Graphics (*.gen) • • ASRP - ARC Standard Raster Product (さまざまなファイル拡張子) CADRG - Compressed ARC Digitized Raster Graphics (*.gen) • • CIB - Controlled Image Base (さまざまなファイル拡張子) NITF - National Imagery Transmission Format (*.ntf) カスタム ラスタ ハンドラがインストールされている場合は、その他のラスタ形式もサポートされ る場合があります。 ラスタ クラス ラスタ イメージのメインのクラスは、MapInfo.Raster.RasterInfo と RasterRead です。スタイル情報 は MapInfo.Style.RasterStyle によって処理されます。 RasterInfo は、イメージの高さと幅 (ピクセル単位)、ラスタの形式、色深度、および登録情報を提 供します。.\MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features\RasterInfo にある RasterInfo サンプル アプリケーションを参照してください。 RasterRead は、イメージをレンダリングするためにラスタ イメージとスタイル情報を読み込むク ラスです。 RasterStyle はラスタの外観を制御します。明るさとコントラストを制御したり、カラー イメージ をグレー スケールで表示したりできます。また、透明性と透過性を設定することも可能です。 MapXtreme は、イメージごとに 1 つの色の透明性をサポートしています。つまり、イメージ内で その色のある部分は非表示になります。これにより、イメージの下のレイヤが透けて表示されま す。透過性はイメージ全体の透明度です。ラスタ イメージの下のレイヤが透けて表示されるよう にする必要がある場合は、透過性に高い値を設定します (100% で透明)。 開発者ガイド 339 ラスタ イメージ ラスタ フィールドは読み取り専用なので、そのスタイルを永久に変更することはできません。た だし、明るさ、グレー スケール、および透過性などのイメージの属性をプログラムによって設定 および取得できます。オンライン版『開発者リファレンス』の RasterStyle クラスの説明を参照し てください。 ラスタ イメージと座標系 MapXtreme でラスタ、グリッド、または WMS のイメージをマップ レイヤとして表示するとき、 ラスタ イメージの回転および投影法と一致するように、すべてのベクトル マップ レイヤの回転お よび投影法が自動的に設定されます。 マップに複数のラスタ、グリッド、または WMS のイメージ レイヤが含まれる場合、MapXtreme では、最も顕著なラスタ イメージによって指定される投影法を自動的に使用してマップが表示さ れます。異なる投影法を使用する別のイメージが最も顕著になった場合は、マップ ビューが変更 されるのに合わせて (ズームや移動などによって)、座標系も変わる場合があります。その場合、 マップの表示座標系を変更することはできません。 ラスタ再投影 ラスタ再投影では、マップ内のラスタ レイヤの投影法を変更できます。さまざまな種類のラスタ イメージを再投影できます。そのようなラスタ イメージには、たとえば、衛星画像、航空写真、 スキャンされた地図、グリッド、シームレス ラスタ テーブル、WMS データがあります。 ラスタ レイヤとベクトル レイヤの両方の再投影を制御できます。ラスタ レイヤまたはベクトル レ イヤをマップに追加すると、新しいレイヤが現在のマップ ウィンドウの投影法を使って再投影さ れます。 ベクトル レイヤとラスタ レイヤの組み合わせを含むマップ ウィンドウの統計法を変更するとき、 すべてのレイヤ (ベクトル レイヤとラスタ レイヤ) を、新しいマップ ウィンドウの投影法に変更で きます。 ラスタ再投影の設定には、MapXtreme API またはワークスペース マネージャのレイヤの管理の ユーザ インターフェイスからアクセスできます。API のラスタ再投影を使用する方法について は、『MapXtreme 開発者リファレンス』の MapInfo.Mapping.RasterReprojectionMethod を参照してく ださい。ラスタ再投影のユーザ インターフェイスの詳細については、「第 24 章、448 ページの 「ラスタ再投影」 」を参照してください。 ワークスペースの再投影されたイメージ ラスタ再投影プロパティは、ワークスペースに読み込んだり、ワークスペースから読み出したり することができます。 さらに、MapXtreme では、MapInfo Professional から .mws ワークスペースにラスタ再投影情報を書 き込むことができます。この機能を使用すると、MapInfo Professional でワークスペースを作成した 後、それを MapXtreme に読み込むことができます。 ワークスペースを MapXtreme に読み込んだ後は、API 経由で、またはワークスペース マネージャ のレイヤの管理のユーザ インターフェイスを使用して、ラスタ再投影を変更できます。 340 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 ラスタ イメージの制限 • • フィーチャをラスタ レイヤとして選択することはできません。 フィーチャをラスタ レイヤとして検索することはできません。 コード サンプル: マップへのラスタ イメージの追加 次に示すとおり、マップにラスタ イメージを追加する方法は、その他のレイヤを追加する方法と 同じです。 C# の例: Table MyTable = Session.Current.Catalog.OpenTable("MyRaster.tab"); FeatureLayer MyLayer = new FeatureLayer(MyTable); MyMap.Layers.Add(MyLayer); VB の例 Dim MyTable As Table = _ Session.Current.Catalog.OpenTable("MyRaster.tab") Dim MyLayer As FeatureLayer = New FeatureLayer(MyTable) MyMap.Layers.Add(MyLayer) ラスタ ハンドラ MapXtreme では、数多くのライブラリのいずれか 1 つを使用してラスタ イメージを読み込むこと ができます。MapXtreme によってラスタ イメージが読み込まれるとき、そのファイルを読み込む ことのできる DLL が検索されます。DLL/ラスタ形式が一致すると、その DLL はイメージ ファイ ル の 形 式 処 理 を 行 う こ と が で きると MapXtreme によって判断されます。形式ハンドラは、 "xxxxxxxx.RHx" という名前の DLL です。名前の基本部分は形式に基づきます。拡張子は常に RH で始まりますが、最後は任意の文字 (A ~ Z) でもかまいません。MapXtreme では、形式ハンドラを 検索するとき、RHA から RHZ まで、形式をアルファベット順に検索します。MapXtreme では、こ のプロセスにより、使用するハンドラに優先順位を付けることができます。たとえば、SPOT ファ イルは他の形式に優先して確認されます。SPOT ファイルは他の形式と混同される可能性のある生 データであるためです。SPOT ハンドラの拡張子は RHD です。HALO 形式ハンドラには RHV が付 きます。LEADTOOLS 形式ハンドラには RHX が付きます。 ラスタ ハンドラは、デフォルトで Files\Common\MapInfo\MapXtreme\7.x.x\RasterGridHandlers フォルダにあります。 \Program LEAD Technologies, Inc. が 提供す る LEADTOOLS Win32 Pro および Media Cybernetics が提供する HALO Imaging ライブラリは、MapXtreme に付属しています。LEADTOOLS ラスタ ハンドラは、 MapXtreme でラスタ イメージが参照されるとき、イメージ全体をメモリに読み込みます。これ は、極端なメモリ要件によってイメージが非常に大きい場合には、イメージの読み込みに時間が かかり、失敗する可能性があることを意味しますが、移動とズームは高速になります。HALO ラ スタ ハンドラは、表示する必要のある内容だけをメモリに読み込みます。そのため、イメージの 読み込みは高速ですが、移動とズームには時間がかかります。HALO.RHV はアルファベット順で LEADTOOL.RHX よりも先であるため、HALO ハンドラがイメージを先に読み込もうとします。こ の順番を変更する方法については、342 ページの「カスタム ラスタ ハンドラの構成」を参照して ください。 開発者ガイド 341 カスタム ラスタ ハンドラの構成 マルチスレッド アプリケーション (ASP.NET アプリケーションなど) ではサポートされないラスタ 形式がいくつかあります。それらの形式を次の表に示します。 読み込み Vertical Mapper GRD、GRC HALO の JPEG (LeadTools の JPEG ハンドラはスレッ ドセーフです) HALO の TIFF (JPEG 圧縮を含む) (LeadTools の TIFF ハンドラはスレッドセーフです) エクスポート LeadTools の JPEG 2000 (Win2000 のみ) LeadTools の TIFF CMYK カスタム ラスタ ハンドラの構成 MapXtreme のディストリビューションに含まれているラスタ ハンドラとは異なるラスタ ハンドラ を使用したり、まったく新しい種類のラスタをサポートしたりするように、MapXtreme アプリ ケーションを構成することができます。ラスタ ハンドラを使用する場合の優先度を変更すること もできます。 MapXtreme のデフォルトのインストールでは、すべてのラスタ ハンドラが <program files>\Common Files\MapInfo\MapXtreme\7.x.x\RasterGridHandlers 内に配置されます。mirasteru.dll ファイルもここに 配置されます。ここは、アプリケーションで使用するラスタ ハンドラに推奨されるインストール 場所です。デフォルトの場所を使用する場合は、その他の構成手順は必要ありません。 カスタム ラスタ ハンドラをデフォルト以外の場所に配置する場合は、デスクトップ アプリケー ションのアプリケーション構成ファイル (Web アプリケーションの場合は web.config ファイル) に、カ ス タ ム ラ ス タ ハ ン ド ラ の格納位置を指定する必要があります。そのためには、 <ApplicationDataPaths> の下に <Path> 要素または <SpecialPath> 要素を定義し、選択したラスタ ハン ドラをそのフォルダにコピーします。 たとえば、デスクトップ アプリケーションのカスタム ラスタ ハンドラをデフォルト以外の MyAppData ディレクトリに構成する場合は、次のような .config ファイルを使用します。 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="MapInfo.CoreEngine" type="MapInfo.Engine.ConfigSectionHandler, MapInfo.CoreEngine, Version=6.8.0.536, Culture=neutral, PublicKeyToken=93e298a0f6b95eb1" /> </configSections> <MapInfo.CoreEngine> <ApplicationDataPaths> <SpecialPath> 342 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 <Personal>MyAppData</Personal> </SpecialPath> <Path>c:\MyAppData</Path> </ApplicationDataPaths> </MapInfo.CoreEngine> </configuration> この例の Personal タグは、ユーザの My Documents に定義されている特殊な場所を示します。この 指定により、My Documents 内の MyAppData フォルダが参照されます。<ApplicationDataPaths> タグ 内で、<SpecialPath> タグまたは <Path> タグを使用します。 両方のタグを使用するということ は、ラスタ ハンドラをどちらかの "MyAppData" フォルダに格納できることを意味します。これは エラーではありませんが、希望の設定ではありません。これはデフォルト以外の構成なので、 mirasteru.dll も同じディレクトリに配置する必要があります。 アプリケーション データが .NET Framework の特別なシステム フォルダからの相対パスにある場合 は、<SpecialPath> 構文を使用します。たとえば、"My Documents" ディレクトリの下の MyAppData というディレクトリにアプリケーション データがある場合、構成ファイルのエントリは次のよう になります。 <Personal>MyAppData</Personal> ここで "Personal" は、My Documents Environment.SpecialFolder 列挙体の値です。 ディレクトリを表す、.NET Framework の この構成方法を使用すると、複数のラスタ ハンドラで管理可能なファイルの種類に対して優先的 に 使 用 す る ラ ス タ ハ ン ド ラ を 変更できます。たとえば、JPEG ファイルは Halo または LEADTOOLS で処理できます (これらはどちらも MapXtreme に付属しています)。通常は Halo が優 先されます。これは、その *.rhv ファイル拡張子が LEADTOOLS の *.rhx 拡張子よりもアルファ ベ ッ ト 順 が 早 い か ら で す。し か し、MapXtreme では、構成ファイルに定義されている <ApplicationDataPaths> が最初に検索されるので、デフォルトの [CommonFiles] フォルダ内のハンド ラよ り も " 先 に"、指 定 さ れ た ラ スタ ハンドラが検索されます。したがって、たとえば、 LEADTOOLS *.RHX ハンドラを定義済みのフォルダにコピーした後、そのハンドラを最初に検索 および使用するように MapXtreme を構成することができます。 または、[CommonFiles] フォルダ内のファイルの拡張子を変更して、目的のラスタ ハンドラがアル フ ァ ベ ッ ト 順 リ ス ト で 先 に 表 示 さ れ る よ う に す る こ と も で き ま す。た だ し、こ の 方 法 は、 MapXtreme で開発されたすべてのアプリケーションに影響するので、予期しない結果を招く可能 性があります。さらに、このようにファイル拡張子を変更した場合、名前が変更されたラスタ ハ ンドラは、MapXtreme をアンインストールするときに削除されません。このような理由から、構 成方式を使用して、ラスタ ハンドラの場所および優先度を変更することが推奨されます。 グリッド イメージ グリッド イメージは領域全体にわたるデータ値の補間を表します。グリッド イメージは、データ が均等間隔のポイントで計測されているデータ ファイルから作成されます。マップ領域全体がグ リッドに変換され、各グリッド セルは値を表します。グリッドを生成するためにグリッド値が補 間される必要はありません。ただし、データ収集ポイントは均等に間隔が空いている必要があり ます。 MapXtreme および MapInfo Professional では、グリッド ハンドラを使用して値を補間するこ とによってグリッドを作成します。 開発者ガイド 343 グリッド イメージ グリッド イメージは、色調の変化だけでなく、陰影処理 (レリーフ色分け) も表示できます。レ リーフ色分けを使用すると、グリッド面が仮想的な光源に従って色分けされます。各グリッド セ ルの明るさは面に当たる光に対応し、光源に対する方向に基づいて調整されます。この機能は、 面の傾斜と方向を光の方向に対して相対的に考慮できる標高グリッド マップに最適です。最大の 明るさは、太陽光線が面に対して垂直に当たるポイントに割り当てられます。傾斜面が光源から 離れるにつれて、明るさの値は低くなります。 サポートされているグリッド形式を以下に示します。 • • • MapInfo Grid (*.mig) USGS DEM (*.dem) GTOPO30 (*.dem) • • DTED (*.dt0、*.dt1、*.dt2) Vertical Mapper Continuous Grid1 2(*.grd) カスタム グリッド ハンドラがインストールされている場合は、その他のグリッド形式もサ ポートされる場合があります。 グリッド クラス グリッド イ メ ー ジ のメインのクラスは、MapInfo.Raster.GridInfo、GridRead、 GridCreatorFromFeatures、GridInflectionCalculator、および HillShadeWrite です。GridInfo と GridRead は RasterInfo と RasterRead に似ており、グリッド ファイルに関する情報を取得する機能を提供しま す。グリッドは GridCreatorFromFeatures を使用してデータ ポイントのレイヤについて作成されま す。GridInflectionCalculator は、色調変化値および色の設定に使用されます。HillShadeWrite を使用 すると、グリッドにレリーフ色分けを追加したり、グリッドのレリーフ色分けを変更したりでき ます。グリッドのプロパティは、イメージ クラス、座標系、ラスタ基準点、MBR (最小外接四角 形) など、その多くが RasterInfo から継承されます。 コード サンプル: マップへのグリッド イメージの追加 次に示すとおり、マップにグリッド イメージを追加する方法は、その他のレイヤを追加する方法 と同じです。 C# の例: Table MyTable = Session.Current.Catalog.OpenTable("MyGrid.tab"); FeatureLayer MyLayer = new FeatureLayer(MyTable); MyMap.Layers.Add(MyLayer); VB の例 Dim MyTable As Table = _ Session.Current.Catalog.OpenTable("MyGrid.tab") Dim MyLayer As FeatureLayer = New FeatureLayer(MyTable) MyMap.Layers.Add(MyLayer) 344 1. グリッドまたはラスタとして表示できます。.TAB ファイルは、イメージがグリッド ハンドラまたはラス タ ハンドラのどちらを使用して描画する必要があるかを決定します。 2. マルチスレッド セーフではありません。 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 コード サンプル: グリッド マップからのデータの取得 次の例では、グリッド ファイルを開いて情報を読み取っています。 VB の例 : Public Shared Sub MapInfo_Raster_GridRead(ByVal strGridFilename _ As String) Dim strHillshadeFilename As String = _ MapInfo.Raster.GridRead.DefaultHillshadeFilename(strGridFilename) Dim session As ISession session = MapInfo.Engine.Session.Current Dim gridread As GridRead = New GridRead(strGridFilename,_ strHillshadeFilename) Console.WriteLine(gridread) End Sub 次の例では、グリッド ファイルを開いてセル値を読み取っています。 VB の例 Public Shared Sub MapInfo_Raster_GridReadStartRead(ByVal _ gridread As GridRead, ByVal strGridFilename As String) Dim strHillshadeFilename As String = _ gridread.DefaultHillshadeFilename(strGridFilename) If gridread.StartRead() Then Dim x As Integer = 0 ' TODO - set to a pixel column value Dim y As Integer = 0 ' TODO - set to a pixel row value Dim bIsNull As Boolean Dim dValue As Double If gridread.GetValue(x, y, bIsNull, dValue) Then If bIsNull Then ' read a null cell Console.Write("{0,20}", "NULL") Else ' read a non-null cell, with value == dValue Console.Write("{0,20}", dValue) End If End If gridread.EndRead() End If End Sub 開発者ガイド 345 グリッド作成 グリッド作成 MapXtreme には、書き込み可能なグリッド ハンドラおよび補間クラスを使用して連続グリッドを 作成する機能があります。これらのグリッドは、MapInfo.Raster.GridCreatorFromFeatures クラス、 Mig.ghl グリッド ハンドラ、および用意されている 2 つの補間クラスの 1 つを使用して、プログラ ムによって作成されます。グリッドは、データ ポイントのテーブル、または選択内容から作成で きます。 MapXtreme で作成されるグリッドは、MapInfo Professional v 10.0 と互換性があります。 連続グリッドは、いくつかのセルからなる長方形のグリッドにマップを分割したものであり、各 セルには、計測されたデータ ポイント、または周囲のデータ ポイントに基づく補間値を表す、 データ値が含まれています。連続グリッドは、マップ上で連続的な色調の変化を使用して、変化 するデータ値を表示します。 以前の MapXtreme は、グリッドの読み取りと、そのグリッド セル値の再取得だけに制限されてい ました。また、陰影処理やスタイルなど、グリッドに関する情報を読み取ることもできました。 ContinuousGridWrite クラスは用意されていましたが、補間クラスを利用してデータ ポイントをよ り適切に反映するようなグリッドを作成する機能はありませんでした。 新しい MapInfo.Raster.GridCreatorFromFeatures は、連続グリッドを作成するときに呼び出されるメ イン クラスです。このクラスは、MapInfo の書き込み可能なグリッド ハンドラおよび補間クラス を使用して、連続グリッド マップを作成します。 補間クラスである IDW と TIN は、特定の式に従ってグリッド セル値を決定するアルゴリズムを提 供します。IDW は人口データに最適であり、TIN は地形データに使用されます。「「逆距離加重 (IDW) 補間クラス」」および347 ページの「不定形三角網 (TIN) 補間クラス」を参照してくださ い。 用意されている補間クラスのいずれかでニーズが満たされない場合は、新しい IInterpolator イン ターフェイスから派生して独自の補間クラスを作成できます。348 ページの「IInterpolator イン ターフェイス」、および『開発者リファレンス』で MapInfo.Raster.Interpolators 名前空間の説明を 参照してください。 データ内の同じセル位置に一致する (重複した) データ ポイントが含まれる場合、グリッド API に は、ポイントを加算または平均する集約クラスが用意されています。他に利用できる集約メソッ ドには、count、min、および max があります。また、IGridCellAggregator をインプリメントする集 約クラスを作成または使用することもできます。 グリッド API に対する他の強化点としては、マップ境界の輪郭に合わせてマップをクリップする 機能があります。グリッドは、ソース データの最小外接四角形に基づいて作成されます。グリッ ド境界がマップ境界の輪郭に沿うようにするには、GridCreatorFromFeatures.ClippingGeometry プロ パティを、グリッド セルのクリップ対象とする Geometry に設定します。 データ ポイントからグリッドを作成したら、新しい [グリッド スタイル] ダイアログおよびワーク スペース マネージャを使用して、陰影処理、スタイル、色調変化点などの特性を変更できます。 詳細については、348 ページの「グリッド スタイル」を参照してください。 346 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 グリッド補間クラス MapXtreme には、連続グリッドを作成するための 2 つのグリッド補間クラス IDW および TIN があ ります。IDW および TIN 補間クラスは、MapInfo.Raster.Interpolators という固有の名前空間に含ま れています。 また、MapXtreme には、独自の補間クラスを作成するためのインターフェイスも用意されていま す。 逆距離加重 (IDW) 補間クラス MapInfo.Raster.Interpolators.InverseDistanceWeighted 補間クラスは、MapXtreme に用意されている 2 つのグリッド補間クラスの 1 つです。IDW 補間クラスは、隣接した値に関連したり影響を受けた りするデータではなく、人口などのデータ値や、グリッド上で任意の値を生成するデータに最も 適しています。この補間方法は、限定的なデータに対しても良く機能します。 IDW 補間クラスは、グリッド上の各セルに含まれる値を計算します。計算に含める各データ ポイ ント値は、セルの中心からの距離によって重み付けされます。この補間は、逆距離加重計算であ るため、ポイントがセルから遠いほど、その値が結果のセル値に与える影響は小さくなります。 IDW では、各ポイントが結果にどの程度の影響を与えるかが、指数によって決定されます。指数 が大きいほど、より近いポイントがセル値に与える影響が大きくなります。指数の範囲は、1 から 10 までです。 同じグリッド セル内の複数のソース データ ポイントの値に対して、集約メソッドを選択すること もできます。これは、average、count、sum、min、max の中から選択します。 IDW 補間クラスを使用してグリッドを作成するコード例については、『開発者リファレンス』で MapInfo.Raster.GridCreatorFromFeatures クラスの説明を参照してください。 不定形三角網 (TIN) 補間クラス 用意されている 2 番目の補間クラスは、不定形三角網または TIN と呼ばれます。TIN は、地形デー タに最適であり、グリッド上で線形に進むデータ ポイントや互いに線形の関係を持つデータ ポイ ント (温度など) に向いています。 TIN 補間クラスは、ポイントのネットワークから三角形を生成することで、IDW 補間クラスより も忠実に元のマップ地形を 再現します。ポイント間に線を描画して三角形に分割し、接続できる すべてのポイントを接続します。接続のメッシュを作成することで、グリッド ポイントを補間で きます。この補間は、隣接する元のデータ値から影響を受けないため、IDW 補間クラスで見られ るようなデータの "誤った衝突" が発生しません。 TIN パラメータ (オブジェクト プロパティ) を変更して、マップ地形の詳細度を調整できます。こ れらのプロパティには、Tolerance (狭い間隔で並ぶポイントを破棄するかどうかを制御)、Distance ( 出力を制御)、および FeatureAngle (グリッドのエッジの鋭さを制御) が含まれます。 詳細については、『開発者リファレンス』で MapInfo.Raster.Interpolators.TriangulatedIrregularNetwork クラスの説明を参照してください。 開発者ガイド 347 グリッド スタイル IInterpolator インターフェイス IInterpolator インターフェイスを使用した独自の補間クラスの作成もサポートされています。この インターフェイスから独自の補間クラスを派生することにより、独自のアルゴリズムに基づいて グリッド セル値を作成します。『開発者リファレンス』で MapInfo.Raster.IInterpolator インター フェイスの説明を参照してください。 グリッド スタイル MapXtreme には、連続したグリッド イメージの色調変化値および色を変更する機能があります。 以前の MapXtreme では、グリッドから情報を読み取ることだけができました。 グリッド スタイルのサポートは、MapInfo.Styles.GridStyle クラスを使用し、GridStyleControl を介し て、プログラムによって提供され、ワークスペース マネージャに組み込まれています。GridForm というサンプル アプリケーションもこの機能を提供します。色調変化値および色に対する変更 は、ワークスペースに保存して後で読み込むことができます。 グリッド イメージと色調変化点 連続したグリッド イメージには、領域全体にわたるデータ値の補間が表示されます。グリッドは グリッド セルから構成され、各セルが値を表します。これらの値は、データ値の範囲内で連続し た色調の変化としてマップ上に表されます。 グリッド値またはパーセンテージの変化によって色が変化するポイントを、色調変化点と呼びま す。MapXtreme では、サポートされているモデルのいずれかに基づいて色調変化値を計算する、 GridInflectionCalculator オブジェクトが作成されます。データ値の最小および最大範囲と組み合わ されたグリッドの色調変化点の数を使用して、マップ上の色調の変化が決定されます。色調変化 点を表す色は、FeatureStyleOverrideModifier としてグリッドに適用されます。 348 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 色調変化点の計算方法 MapXtreme では、次の計算方法をサポートしています。 • • • • パーセント等間隔 – 計算された各パーセント範囲内に等しい数のセル値が存在するように色調 変化値を計算します。 値等間隔 – 各色調変化値範囲が同じサイズになるように色調変化値を計算します。 パーセントを指定 – [パーセント等間隔] と同じですが、パーセント範囲を指定できます。 値を指定 – [値等間隔] と同じですが、色調変化値を指定できます。 色調変化値および色は、MapInfo.Raster.GridInflectionCalculator クラスを使用してプログラムで変更 できます。GridStyleControl は、Visual Studio の MapXtreme ツールボックスから使用できます。 このプロセスは、ワークスペース マネージャの [グリッド スタイル] ダイアログにも組み込まれて います。350 ページの「[グリッド スタイル] ダイアログ」を参照してください。 注意 色調変化点の計算方法が [値等間隔] または [パーセント等間隔] に設定されているときに値 またはパーセントを変更した場合、方法はそれぞれ [値を指定] および [パーセントを指定] に変更されます。 色調変化値および色に対する変更は、ワークスペースに保存して後で読み込むことができます。 グリッド レイヤの色調変化値および色の計算 色調変化値および色は、プログラムを使用して、またはワークスペース マネージャの [グリッド スタイル] ダイアログで計算できます。GridForm サンプル アプリケーションもこの機能を提供し ます。 GridInflectionCalculator クラス 次のコード例は、値および色の最初のセットを作成してから、それらを変更する方法を示してい ます。こ の コ ー ド 例 は、開 発 者 リ ファレンス API ドキュメントの MapInfo.Raster.GridInflectionCalculator クラスに示されています。 public static void MapInfo_Raster_GridInflectionCalculator(TableInfoGrid tableInfoGrid) { // Create 10 grid inflection values, by using the EqualRangeValues method, using colors from orange to red. GridInflectionCalculator gridInflectionCalculator = new GridInflectionCalculator(tableInfoGrid, InflectionMethod.EqualRangeValues, 10, Color.Orange, Color.Red); // Modify the colors to go from green to brown. gridInflectionCalculator.CalculateStyles(Color.Green, Color.Brown); // Calculate 5 grid inflection values, by using the EqualRangeValues method. gridInflectionCalculator.CalculateValues(InflectionMethod.EqualRangeValue s, 5); } 開発者ガイド 349 グリッド スタイル レリーフ色分け グリッド イメージは、色調の変化だけでなく、陰影処理 (レリーフ色分け) も表示できます。レ リーフ色分けを使用すると、グリッド面が仮想的な光源に従って色分けされます。各グリッド セ ルの明るさは面に当たる光に対応し、光源に対する方向に基づいて調整されます。この機能は、 面の傾斜と方向を光の方向に対して相対的に考慮できる標高グリッド マップに最適です。最大の 明るさは、太陽光線が面に対して垂直に当たるポイントに割り当てられます。傾斜面が光源から 離れるにつれて、明るさの値は低くなります。 陰影処理は、[グリッド スタイル] ダイアログにあるチェック ボックスで有効にできます。水平お よ び 垂 直 の 光 源 の 角 度 お よ び ス ケ ー ル は、LayerControl で設定します。 MapInfo.Raster.HillshadeWrite クラスを使用すると、プログラムによってグリッドに陰影処理を追加 できます。 [グリッド スタイル] ダイアログ [グリッド スタイル] ダイアログでは、色、色調変化値、コントラスト、明るさ、透過性といった グリッドのスタイル設定を、グラフィカル ユーザ インターフェイス (GUI) を使用して変更できま す。スタイルは、FeatureOverrideStyleModifier としてグリッド レイヤに適用されます。 [グリッド スタイル] ダイアログを使用するには、グリッド イメージをワークスペース マネージャ で開きます。グリッド レイヤを選択して右クリックし、[スタイル オーバーライドの追加] メ ニュー項目を表示します。[表示/非表示] タブで、[グリッド イメージ スタイル] ボタンをクリック してダイアログを表示します。[グリッド スタイル] ダイアログの各コンポーネントについて、以 下で説明します。 350 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 色/値/% (パーセント) 色/値/% (パーセント) グリッド ボックスには、色調変化点の色、値、およびパーセントの現在の設 定が表示されます。 色を変更するには、色見本をダブルクリックし、[色] ダイアログ パレットから新しい色を選択し ます。 値および % の設定は、グリッド内のデータから得られます。これらの値は、このダイアログの [色 調変化点の設定] グループの設定を変更したときに、変化する場合があります。その場合、色調変 化点が再計算され、新しい値が表示されます。たとえば、[値を指定] を選択したときに値を直接編 集したり、[パーセントを指定] を選択したときにパーセントを編集したりできます。 注意 色調変化点の計算方法が [値等間隔] または [パーセント等間隔] に設定されているときに値 またはパーセントを編集した場合、方法はそれぞれ [値を指定] および [パーセントを指定] に変更されます。 色調の調整 グリッド イメージの色に影響を与えるような調整を行うことができます。これらの変更は、レイ ヤ全体に等しく適用されます。 コントラスト [ コントラスト ] スクロール バーを使用して、イメージのコントラストを調整します。バー を 0 ~ 100% の範囲でスライドさせ、グリッドのコントラスト レベルを設定します。微調 整にはカーソル キーを使用できます。 明るさ [ 明るさ ] スクロール バーを使用して、イメージの明るさを調整します。バーを 0 ~ 100% の範囲でスライドさせ、グリッドの明るさレベルを設定します。微調整にはカーソル キー を使用できます。 透過性 [ 透過性 ] スクロール バーを使用して、イメージの透過性を調整します。透過性は、0 ~ 100% の範囲で設定できます。透過性が 0% のイメージは、完全に不透明となります ( 下が 透けて見えません )。透過性が 100% のイメージは、完全に透明となります ( 完全に見えな くなります )。 グレー スケール オンにすると、グリッド内にグレー スケールの色だけが表示されます。 [ 色調の反転 ] ボタン このボタンをクリックすると、色調変化色が反転します。これは、この時点の開始色と終 了色にだけ影響します。 開発者ガイド 351 グリッド スタイル 色調変化点の設定 [色調変化点の設定] では、データが領域内でどのように分布しているかを示す色調変化点の計算方 法を設定できます。[パーセント等間隔] および [パーセントを指定] は、パーセントに基づいてい ます。[値等間隔] および [値を指定] は、値に基づいています。 パーセント等間隔 計算された各パーセント範囲内に、ほぼ等しい数のグリッド セルが収まるように、色調変 化点を設定します。 値等間隔 各色調変化値範囲が同じサイズになるように、ソース データ範囲の最小値と最大値の間に 色調変化点を配置します。 パーセントを指定 この方法は、等間隔ではなく独自のパーセントを指定する場合に選択します。 値を指定 この方法は、等間隔ではなく独自の値を指定する場合に選択します。 色調変化点数 : リストから 2 ~ 16 の値を選択するか、または 2 ~ 255 の値を入力します。 丸め : 色調変化値に適用される丸め係数をリストから選択します。計算方法がパーセントに基づ いているときは、色調変化値が実際に計算されるまでの間、この丸めの効果が確認できな い場合があります。 レリーフ色分け レリーフ色分けを使用すると、仮想的な光源の向きに従ってグリッド面マップに陰影を付けるこ とができます。これにより、面の傾斜と方向を光の方向に対して相対的に考慮できます。[グリッ ド スタイル] ダイアログには、レリーフ色分けを有効または無効にするための設定があります。 レリーフ色分けの設定を調整するには、最初にレイヤ管理でグリッド レイヤを強調表示し、[陰影 処理情報] タブを選択します。レリーフ色分けは、色調変化点の設定のようにスタイル オーバーラ イドとしては適用されません。 光源位置 光源の水平角度、垂直角度、および垂直方向のスケールは、[レイヤ管理] ダイアログの [陰影処理 情報] タブで設定します。このタブは、グリッド レイヤが選択され、陰影処理が有効になっている 場合にのみ表示されます。 水平角度 光源を水平面上で回転させます。0 度は、真東から照らす光源に対応します。角度が正の場 合、光源は時計回りに回転します。したがって、たとえば 90 度の場合、光源は真北に位置 します。 垂直角度 光源を垂直面上で回転させます。0 度の場合、光源は水平線上に位置し、90 度の場合、光 源は真上に位置します。光源が面よりも下にあるように設定する場合は、180 ~ 360 度の角 度を指定します。 352 MapXtreme 2008 v7.0.0 第 18 章 : ラスタとグリッドの操作 垂直方向スケール 0 ~ 100 のスケールを指定します。このスケールを大きくすると、面が垂直方向に強調さ れ、陰影効果が強まります。これは、比較的平坦な面で詳細を強調する場合に役立ちます。 陰影処理情報の再計算 光源の設定に調整を加えた後、このボタンをクリックすると、陰影処理情報が再計算され ます。 色調変化値 これらの値は、グリッド テーブル内の最小値と最大値を示します。これらの値は編集できませ ん。 最小値 : ソース テーブル内の最小のデータ ポイント値を示します。 最大値 : ソース テーブル内の最大のデータ ポイント値を示します。 GridInfoForm サンプル アプリケーション MapXtreme には、GridInflectionCalculator を含む C# サンプル アプリケーションが用意されていま す。これらのサンプルは、\Samples\VisualStudio2005 または \Samples\VisualStudio2008 フォルダの \Desktop\Features\GridinfoForm にあります。 開発者ガイド 353 グリッド スタイル 354 MapXtreme 2008 v7.0.0 19 ジオコード この章では、ジオコードに関連した MapXtreme の名前空間について説明しま す。ジオコード サーバやジオコード サービスにアクセスするアプリケーショ ンの作成方法や作成例についても取り上げます。 この章の構成 「MapInfo.Geocoding 名前空間の概要」 . . . . . . . . . . . . . . . . . . . . . . . . 「ジオコード化に関連した主要なクラス」 . . . . . . . . . . . . . . . . . . . . 「ジオコード モデルについて」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「場所のジオコード化」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「制約を使った正確なジオコード化」 . . . . . . . . . . . . . . . . . . . . . . . . 「近い一致の正確さについて」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 356 358 360 363 366 ジオコード化に関連した主要なクラス MapInfo.Geocoding 名前空間の概要 MapInfo.Geocoding 名前空間には、住所レコードをジオコード化するためのインターフェイスやク ラスが用意されています。ジオコード化は、マップ上の位置を正確に特定するために、番地、交 差点、地名、郵便番号の地理的位置を調査するプロセスです。ジオコード クライアントは、Pitney Bowes Business Insight のジオコード サーバまたはジオコード Web サービス製品に対し、HTTP 経由 でリクエストを送信します。MapXtreme の購入時には、サーバと Web サービスは付属しません。 たとえば、ユーザが自分のいる地理的位置を住所で入力すると、最寄りの ATM を基準に、対応す る位置を示すマップが返されるような位置検索アプリケーションを作成するとします。マップ上 に位置を表示する関係上、住所だけでこれを実現することはできません。これらの地理的位置 (住 所、建物、関心地点) を地表上の座標に変換することになります。位置を正確に特定し、マップ上 に示すためには、緯度/経度 (座標) の値が必要です。MapXtreme のジオコード クライアントは、プ レース名、番地、郵便番号から、あるいは、2 本の道路の交差点から、こうした値を調査 (ジオ コード化) します。 ジオコード クライアントからは、座標値だけでなく、そのプレースの詳細な説明が返されるた め、限られた情報を有効に活用することができます。ジオコード クライアントからは、リクエス トの設定、使用した方法、指定された設定、一致条件などに応じて 0 個、1 個、またはそれ以上の レスポンスが返されます。 また、MapXtreme のジオコード クライアントは、住所の一部分をジオコード化するガゼッティア 型の機能 (世界/国/都市レベルのジオコーダ) を備えています。住所の一部分とは、たとえば、都 市、州、プレース名、ランドマーク、空港などです。 ジオコード化機能を使用して目的の座標を得る過程には、入力された住所と、既に座標が割り当 てられている住所とを照合するプロセスが伴います。1 つのリクエスト ドキュメントに複数の住所 を指定することもできます。指定する住所が不完全でも構いません。サーバからは完全な住所が 返されるので、入力された住所を訂正することも可能です。サービス リクエストを受け取った サーバは、データの質とリクエストの設定に応じて、0 個、1 個、またはそれ以上のレスポンスを 返します。通常、レスポンスには、潜在的な一致 (一致候補と呼ばれる) のリストと、一致候補の 位置的な正確さを示す結果コードが含まれます。座標を取得するには、アプリケーション側で適 切な住所候補を選択してレスポンスを解決する必要があります。 ジオコード化に関連した主要なクラス MapInfo ジオコード サーバまたは Envinsa Location Utility サービスを使用するジオコードがサポー トされています。どちらかのリソースを URL に配置して、提供する必要があります。適切なジオ コード クライアントを作成するには、GeocodeClientFactory クラスを使用します。両者のクライア ントのインターフェイスは似ています。ジオコード リクエスト、ジオコード設定、およびジオ コード レスポンスについて同じクラスを使用するためです。 ジオコード ク ライアントを使用するための主なインターフェイスは、 MapInfo.Geocoding.IGeocodeClient です。このインターフェイスでは、ジオコード クライアント オ ブジェクトが定義されます。このインターフェイスは、Geocode というメソッドを 1 つだけ持ちま す。入力としてリクエストを受け取り、住所候補 (入力された住所と一致する可能性のある一連の 住 所) を 含 ん だ レ ス ポ ン ス を返します。他にも、GeocodeRequest、GeocodeResponse、 GeocodeClientFactory、GeocodingConstraints、AddressCandidates、GeocodeMatchCode、 CandidateAddress などのクラスがあります。 356 MapXtreme 2008 v7.0.0 第 19 章 : ジオコード 次の図は、Geocoding 名前空間を構成するインターフェイスとクラスを示しています。 GeocodeRequest GeocodeRequest は、ジオコード サーバまたはジオコード サービスに対してリクエストを送信する クラスです。ジオコードの対象となる一連の住所を保持する AddressList プロパティと、住所リス トの項目数を表す Length プロパティを持ちます。番地、交差点、一次郵便番号、二次郵便番号、 国コードなど、さまざまな情報を含んだ住所を入力として使用できます。 GeocodeResponse GeocodeResponse クラスは、GeocodeRequest の各住所に対するレスポンスを保持します。レスポン スには、住所候補、つまり、入力された住所と一致する可能性のある住所が格納されます。複数 の住所を含んだ GeocodeRequest からは、入力された 1 件の住所ごとに一連の住所候補を保持する GeocodeResponse オブジェクトが得られる点に注意してください。 GeocodeClientFactory このクラスは、GeocodeRequest を送信したり、GeocodeResponse を受信したりする際に使用する IGeocodeClient を返します。MapMarker Java サーブレットのインスタンスと対話するジオコード ク ライアントは、GetMmjHttpClient メソッドで取得できます。リクエストを MapInfo Envinsa 4.0 の Location Utility Service に送信するには、GetEnvinsaGeocodeClient メソッドを使用します。 GeocodingConstraints このクラスには、ジオコードの設定が格納されます。すべての設定は、true または false (デフォル ト) を返す、set/get メソッドを持ったプロパティとしてインプリメントされています。 開発者ガイド 357 ジオコード モデルについて AddressCandidates GeocodeResponse で一致候補として返される住所のリストを保持するクラスです。 BaseGeocodeMatchCode と GeocodeMatchCode これらのクラスには、IGeocodeMatchCode インターフェイスがインプリメントされています。 ResultCode プロパティ (一致の精度を表す文字列) は、このインターフェイスによって公開されま す。BaseGeocodeMatchCode は、リクエストが Envinsa Location Utility Service に送信された場合に返 されます。GeocodeMatchCode は、BaseGeocodeMatchCode を拡張したクラスです。ジオコード リ クエストが MapMarker サーバに送信された場合に返されます。GeocodeMatchCode には、住所のど の 部 分 が一 致 し た か を 示 す プ ロ パ テ ィが追加されています。その中の StreetAddressMatch と MunicipalityMatch は、それぞれ番地と地方自治体が一致している場合に true 値を返します。結果 コードの詳細については、「366 ページの「近い一致の正確さについて」」を参照してください。 CandidateAddress このクラスは、ジオコード化された住所を定義します。プロパティとしては、Address (ジオコード 化された住所)、GeocodeMatchCode (ジオコード化された住所の精度)、Point (住所候補を表すジオ メトリ) などがあります。 ジオコード モデルについて ジオコード クライアントには、一連の重みによって制御される相対一致モデルが採用されていま す。住所の各要素をデータ内の候補レコード (一致候補) と照らし合わせてスコアが割り出されま す。結果として得られたスコアは加算され、候補の合計スコアをもとに最も高い一致が決定され ます。他の候補よりも高いスコアを持つ候補が "近い一致" として検出されます。さらに、検索処 理では、特定の一致条件を必須とするか、ある程度緩和して適用するかを判断するために、一連 のジオコード設定が使用されます。たとえば、デフォルトでは、郵便番号の一致は緩く、家番号 や道路名の一致は必須として設定されています。これにより、高いパフォーマンスを維持し、不 適切な検索結果 (誤検出) を少なくして、最適なヒット率を実現することができます。 ジオコード化のトレードオフ ジオコード クライアントなど、相対一致が採用されたシステムでは、必ずトレードオフが存在し ます。ジオコード化されたデータの用途を踏まえて、トレードオフを考慮しなければなりませ ん。たとえば、次のような質問に対する答えを明らかにしておく必要があります。 • • • 358 住所の検索にどの程度の正確さを期待するか (完全一致か近い一致か)? ジオコード化されたポイントに対し、どの程度の地理的正確さを期待するか 便番号中心点など)? 最終的な目的はできるだけ多くのレコードをジオコード化することか? (道路レベル、郵 MapXtreme 2008 v7.0.0 第 19 章 : ジオコード 以上の質問に対する答えは、ジオコード化されたレコードの用途によってまったく異なってきま す。たとえば、新たにオープンする店舗の場所を決めるために、現在の顧客と潜在的な顧客の分 布を把握しなければならないとします。この場合は、できるだけ多くの顧客をジオコード化する ことが大切で、顧客一人一人についての番地レベルでの一致精度は不要です。こうした分析で は、郵便番号中心点レベルのジオコード化で十分です。 一方、ガスなどの公共サービス事業者が、近隣のガス管線との関係で顧客の所在地を調べる場 合、顧客一人一人について正確な位置を割り出す必要があります。このような場合は、厳密な一 致設定で道路レベルのジオコード化を行うのが最適な選択肢となります。 住所について ジオコード化で最も重要なことは住所データの質です。ロケールの標準的な規則に従って適切に 住所を入力すれば、不完全な住所や形式に不備のある住所よりも、的確な結果を得ることができ ます。 このセクションでは、入力用の住所と、比較に使用される参照住所の両方の観点から、住所の質 について概説しています。ジオコード化で最適な結果を得るために大切なことは、ジオコード化 の対象となるデータと、比較対象となるデータの住所の構成を理解することです。 入力住所 入力住所とは、ジオコード化の対象となる住所のことです。そのままでは地理的座標は関連付け られていないため、マップ上で位置を特定することはできません。 入力住所は複数の要素で構成され、ジオコード サーバは、それらの要素を調べることによって一 致を検出します。入力住所の構成要素としては、住所番号、道路名、道路の接頭辞や接尾辞など があります。接頭辞は、「北」や「南」など方向性を示す情報を持つ傾向があり、特定の住所に のみ存在します。接尾辞としては、道路の種類 (Street、Road、Avenue など) が一般的です。入力住 所には、マンション番号やルート番号などの情報が含まれる場合もあります。 入力住所では、住所全体だけでなく、住所の一部分や綴りの揺れも許容されます。たとえば、 「LaSalle Street」と入力して、「LaSalle St」を検索することができます。ただし、道路の接尾辞を 付けずに「LaSalle」と入力した場合は、実際には LaSalle Ave である可能性もあるため、同じ結果 が得られるとは限りません。 MapXtreme のジオコード クライアントでは、いわゆる "ダーティ" データや不完全な住所を使用す ることができます。このクライアントは、サーバに適切な参照住所が格納されていれば、 米国式 と 非米国式の両方の住所をサポートします。 参照住所 参照住所は、サーバ側で入力住所と突き合わせるための住所です。これらのレコードには、マッ プ上で住所を特定するために必要な地理的座標が含まれています。参照住所はサーバ側で管理さ れ、最新の状態に保つように保守プログラムによって定期的に更新されます。参照住所は、ロ ケールの規則に従って標準化されています。たとえば、北米の住所の場合、番地が道路名よりも 先に来る形式で入力されています。北米以外では、番地が道路名よりも後に来る場合もありま す。 開発者ガイド 359 場所のジオコード化 一般に、参照住所の主要な構成要素は、住所番号、道路名、道路の接頭辞 (存在する場合)、道路の 接尾辞です。米国以外の ロケールでは、参照住所にマンション番号などの補足的な情報が含まれ ない場合もあります。したがって、こうした情報が入力住所に含まれていた場合は無視されま す。 カスタム ユーザ ディクショナリとは サーバやサービスに用意されている MapInfo の住所ディクショナリが、目的の地域をカバーしてい ないこともあります。また、ユーザが独自のデータ (国内で展開しているすべての店舗のデータな ど) を所有しているのであれば、そのカスタム データを使用したいと考えるのが普通です。もし、 このようなニーズがある場合、ユーザは、必要に応じて、こうしたデータが格納された独自の ディクショナリを使用できます。 ジオコード クライアントは、カスタム ディクショナリをサポートしています。カスタム ディク ショナリは、ジオコード化されていないレコードと突き合わせるための道路や番地の範囲を格納 したテーブルです。ジオコード化を行う際は、必要なカスタム ディクショナリをいくつでも使用 できます。カスタム ユーザ ディクショナリを作成する方法の詳細については、サーバまたはサー ビスのマニュアルを参照してください。 Geocoding World とは ジオコード クライアントでは、入力住所に国コードを指定することで、さまざまな国のジオコー ド化を行うことができます。Geocoding World コンポーネントは、1 コンポーネントあたり 1 つの国 や地域を提供する MapMarker ベースのコンポーネントとは異なります。Geocoding World コンポー ネントは、238 の国や地域について市町村/郵便番号データをカバーし、9 つの国については道路レ ベルのデータをカバーしています。どちらの場合も、データへのアクセスはライセンスで保護さ れており、有効なデータ ライセンス ファイルが必要となります。Geocoding World の詳細について は、Pitney Bowes Business Insight 販売代理店までお問い合わせください。 場所のジオコード化 場所をジオコード化すると、データの関係を視覚化することができます。たとえば、住所レコー ドがジオコード化されていれば、それをルート クライアントに渡すことにより、2 地点 (場所) 間 の運転用指示として表示させることができます。データに地理参照情報が与えられていれば、空 間検索を実行することで、"特定の場所から 10 マイル圏内のすべての顧客" を検索することも可能 です。以下は、すべてのジオコード リクエストに共通の機能です。 • • • • 不完全な住所をジオコード化して、完全な住所情報 (標準化された住所) を返す。 ジオコード リクエストに指定された特定の住所に対し、そのレスポンスとして完全一致または 近い一致を表示する。 単一のジオコード リクエストに含まれる 1 つまたは複数の住所を処理する。 結果の質についての情報を一致コードを使って提供する。 GeocodeRequest クラスを使用すると、ジオコード サーバまたはジオコード サービスに対してリク エ ス ト を 送 信 で き ま す。こ の ク ラ ス は、ジ オ コ ー ド の 対 象 と な る 一 連 の 住 所 を 保 持 す る AddressList プロパティと、住所リストの項目数を表す Length プロパティを持ちます (詳細について は、「363 ページの「制約を使った正確なジオコード化」」を参照)。入力住所には、その一部と 360 MapXtreme 2008 v7.0.0 第 19 章 : ジオコード して、番地、交差点、一次郵便番号と二次郵便番号、プレース名、国コードなど、さまざまな情 報を含めることができます。ジオコードの結果として得られる候補のレベルや正確さは、入力住 所に含まれる情報のレベルに左右されます。 以降、ジオコード クライアントで実行できる、さまざまなレベルのジオコード化について説明し ます。 番地のジオコード化 ジオコード化された番地情報を使用すると、対応する位置をマップ上に表示したり、空間検索や 空間クエリを実行したりできます。たとえば、これを利用して、店舗の所在地や、販促の対象と なる顧客の住所をマップ上に表示し、市場範囲を調査することもできます。番地のジオコード化 では、Address クラスを使用して、入力住所の情報を指定します。 住所をジオコード化する方法 次の C# コードは、ジオコード クライアントを使用して番地をジオコード化する例を示していま す。ジオコード リクエストは、1) パラメータの定義、2) Street オブジェクトと Address オブジェク トの作成、3) ジオコード リクエストの作成、という 3 つの部分に分けられます。 Geocode サンプル アプリケーション (..MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features\Geocode\cs) も参照してください。 パラメータの定義 Address オブジェクトに必要な情報を与えるためには、住所のパラメータを定義する必要がありま す。また、住所のパラメータのほかにも、サーバまたはサービスの URL を定義する必要がありま す。 //Define the server URL String MMJUrl = ""; //Define the address parameters String streetName = "One Global View"; String cityName = "Troy"; String stateName = "NY"; String zipCode = "12180"; String countryCode = "USA"; //The following are optional address parameters String directionalPrefix = ""; String typePrefix = ""; String typeSuffix = ""; String directionalSuffix = ""; Address の作成 Street、StreetAddress、Address の各オブジェクトを作成することによって住所情報を構築します。 //Create a Street object MapInfo.Geocoding.Street street = new MapInfo.Geocoding.Street( directionalPrefix, typePrefix, 開発者ガイド 361 場所のジオコード化 streetName, typeSuffix, directionalSuffix); //Create a StreetAddress object MapInfo.Geocoding.StreetAddress streetAddress = new MapInfo.Geocoding.StreetAddress(street); //Create an Address object MapInfo.Geocoding.Address address = new MapInfo.Geocoding.Address(streetAddress, countryCode); address.PrimaryPostalCode = zipCode; address.PlaceList = new MapInfo.Geocoding.Place[] {new MapInfo.Geocoding.Place( cityName, MapInfo.Geocoding.NamedPlaceClassification.Municipality), new MapInfo.Geocoding.Place( stateName, MapInfo.Geocoding.NamedPlaceClassification.CountrySubdivision)}; ジオコード リクエストの作成 Address オブジェクトを作成したら、住所をリストに追加し、そのリストを使ってジオコード リク エストを作成します。リクエストをジオコード サーバに送信するか、ジオコード サービスに送信 するかは、GeocodeClientFactory を使用して定義します。リクエストをジオコード サーバに送信す る場合は GetMmjHttpClient メソッドを、リクエストをジオコード サービスに送信する場合は GetEnvinsaLocationUtilityService メソッドを使用します。 //Add the address to a list of addresses MapInfo.Geocoding.Address[] addressList = {address}; //Create the geocode request MapInfo.Geocoding.GeocodeRequest geoRequest = new MapInfo.Geocoding.GeocodeRequest(addressList); //Create the geocoding client MapInfo.Geocoding.IGeocodeClient geoClient = MapInfo.Geocoding.GeocodeClientFactory.GetMmjHttpClient(MMJUrl); //Send the request and get the response MapInfo.Geocoding.GeocodeResponse geoResponse = geoClient.Geocode(geoRequest); 交差点のジオコード化 交差点は、さまざまな住所タイプまたは住所要素で構成されています。したがって、リクエスト の設定や精度のレベルもそれに応じて変わってきます。たとえば、モバイル契約者の利用形態を 例に挙げれば、交差点のジオコード化を使用して最寄りの交差点を入力し、現在位置のマップを モバイル デ バ イ ス 上 に 表 示 す る と いった使い方があります。交差点のジオコード化は、 StreetIntersection クラスを使用し、Street プロパティと IntersectingStreet プロパティを指定すること によって行います。 362 MapXtreme 2008 v7.0.0 第 19 章 : ジオコード 郵便番号のジオコード化 郵便番号中心点とは、郵便番号の該当範囲の中心位置を表します。マップ上でこれらの中心点を 特定することにより、販促活動やダイレクト メールの対象となる市場区域を見極めるための人口 統計分析を実施することができます。郵便番号レベルのジオコード化では、Address クラスを使用 し、PrimaryPostalCode の情報のみを指定することになります。 ガゼッティア型のジオコード化 ジオコード クライアントでは、都市名、州名、プレース名など、住所の一部分から、特定の位置 を検索するジオコード操作 (世界、国、または都市レベルのジオコード化) を実行できます。次の ような操作がサポートされています。 • • 国、国の細分区域、都市、都市の細分区域、ランドマーク、空港などを検索条件として対応す る位置を得る。 パターン検索機能により、1 つまたは複数のフィールドに検索値としてワイルドカード文字 (*) を指定し、その特定のフィールドで該当したすべての値を得る。 バッチ ジオコード処理 バッチ ジオコード処理は、IGeocodeClient.BatchRequests プロパティでサポートされています。この プロパティには、サーバに一括して送信する住所の数を設定します。デフォルトの住所数は 25 件 です。BatchRequest プロパティは、0 より大きく 500 未満の数値を指定する必要があります。 IGeocodeClient.Geocode() メソッドに対して送信する住所の数が、BatchRequest プロパティに指定し た数を上回っていても構いません。その場合、指定数以上の住所を含んだジオコード操作は、1 回 の操作が BatchRequest プロパティに指定された数を超えないように、複数の操作に分割されま す。 注意 BatchRequst の値が小さすぎると (2 など)、パフォーマンスが低下します。逆に BatchRequest の値が大きすぎると (500 など)、メモリ不足になる可能性があります。バッチ ジオコード 処理のパフォーマンスはシステム構成に依存します。 制約を使った正確なジオコード化 ジオコード クライアントでは、GeocodeConstraints クラスを使用して入力住所をジオコード化する 場合、一致制約、フォールバック、複数一致などの設定を指定できます。必要に応じて、これら の設定を厳密に適用するか、緩めに適用するかを指定することもできます。一致率、正確さ、パ フォーマンスのバランスを最優先するのであれば、次のように設定します。 • • • 家番号および道路名については完全一致を必須とする。 郵便番号中心点にフォールバックしない。 近い一致のみを返す。 最も厳密に一致条件を適用する場合は、家番号、道路名、郵便番号の完全一致を必須とし、郵便 番号中心点にフォールバックしない設定にします。この場合、原則的に入力住所に指定された郵 便番号の範囲内で、番地が完全に一致する住所がサーバまたはサービスによって検索されます。 開発者ガイド 363 制約を使った正確なジオコード化 一致制約とは 一致制約は、入力された住所の照合方法、それぞれの住所に対して返される候補の数、および返 される補足情報を制御します。情報が不足していたり不正確であるために、入力された住所が現 実の住所と正確に一致しない場合があります。GeocodeConstraints クラスには、住所のどの部分が 最も重要であると考えられるか、および正確に一致する情報が見つからなかった場合にどのよう な処理を行うかを決定する一連のプロパティがあります。 サ ー バ ま た は サ ー ビ ス か ら デ フ ォ ル ト 設 定 を 取 得 で き る 場 合 は、 IGeocodeClient.DefaultGeocodeConstraints プロパティを使用することもできます。GeocodeConstraints を指定しなかった場合、サーバまたはサービスから取得したデフォルト設定がジオコード クライ アントによって使用されます。 ジオコード サーバまたはジオコード サービスによるレコードの比較方法に影響する設定として は、次のようなものがあります。 • • • • • • • • • • • • 364 CloseMatchesOnly – ジオコードの結果、近い一致として検出された候補のみを返します。入力 住所と MustMatchXXX 設定の類似度に基づき、住所候補がランク付けされます。true の場合、 近い一致として検出された候補だけが返されます。デフォルトは false です。 MustMatchAddressNumber – 住所番号の一致した候補だけが近い一致と見なされます。デフォル トは true です。 MustMatchMainAddress – 道路名の一致した候補だけが近い一致と見なされます。発音の近い語 句を同一と見なす処理 (Soundex) は依然として有効になります。たとえば、"Muller Strasse" と "Mueller Strasse" は近い一致と見なされます。ただし、入力された道路から近い一致が検出され な か っ た 場 合 の 道 路 名 の 展 開 処 理 は抑制されます。つまり、"Mueller Strasse" を "Muleler Strasse" と入力しても、綴りのミスは修正されません。デフォルトは true です。 MustMatchCountry – 国の一致した候補だけが近い一致と見なされます。デフォルトは true で す。この設定はできるだけ変更しないでください。 MustMatchCountrySubdivision – 国の細分区域の一致した候補だけが近い一致と見なされます。 デフォルトは true です。CountrySubdivision は国によって異なる場合があります。たとえば、米 国の場合は州 (State) ですが、カナダの場合は省 (Province) になります。 MustMatchCountrySecondarySubdivision – 国の二次細分区域の一致した候補だけが近い一致と見 なされます。デフォルトは false です。CountrySecondarySubdivision は国によって異なる場合が あります。たとえば、米国の場合は郡 (County) ですが、カナダの場合は国勢調査区分 (Census Division) になります。 MustMatchMunicipality – 地方自治体の一致した候補だけが近い一致と見なされます。デフォル トは true です。地方自治体には市や町などが該当します。 MustMatchMunicipalitySubdivision – 地方自治体細分区域の一致した候補だけが近い一致と見な されます。デフォルトは false です。MunicipalitySubdivision には、MSA (Metropolitan Statistical Area) や市の行政区 (ニューヨーク市のブロンクスやブルックリン) などが該当します。 MustMatchPostalCode – 郵便番号の一致した候補だけが近い一致と見なされます。デフォルトは false です。 MustMatchInput – 特定の設定内容に関係なく、入力したすべての設定と一致する候補だけが近 い一致と見なされます。デフォルトは false です。 FallbackToGeographic – 道路のジオコード リクエストで候補が 1 つも検出されなかった場合に、 地理領域の中心点でのジオコードを実行するかどうかを示します。結果のポイントは、最高レ ベルの精度が得られる領域の地理的中心点に配置されます。デフォルト値は false です。 FallbackToPostal – 道路のジオコード リクエストで近い候補が 1 つも検出されなかった場合に、 郵便番号中心点でのジオコードを実行するかどうかを示します。デフォルト値は false です。 MapXtreme 2008 v7.0.0 第 19 章 : ジオコード • • • • • • • • • OffsetFromStreet – 住所の表示位置を調整する際の、道路セグメントからの距離を指定します。 この値は、道路を挟んで相対する住所のそれぞれに同じポイントが与えられるのを回避するた めに使用します。たとえば、40 から 60 までの範囲のセグメント上の番号が 50 の家は、そのセ グメントの中間点に配置されます。該当するポイントは、道路に対して直角方向に距離を持た せて配置されるため、道路の左側の家は左側に、道路の右側の家は右側に正しく表示されま す。OffsetFromStreet のデフォルト値は 25 メートルです。OffsetFromStreet は、Distance クラス を使用して計測単位とその値を定義することによって指定します。 OffsetFromCorner – 住所の表示位置を調整する際の、道路セグメントの端 (角) からの距離を指 定します。この値は、道路の角に位置する住所に対して交差点と同じポイントが与えられるの を回避するために使用します。OffsetFromCorner は、(番地に基づく) 道路に平行し、セグメン トに沿った距離にある位置にポイントを配置します。たとえば、40 から 60 までの範囲のセグ メント上の番号が 40 の家は、そのポイントが道路の交差点とならないように配置されます。 OffsetFromCorner のデフォルト値は 25 メートルです。OffsetFromCorner は、Distance クラスを 使用して計測単位とその値を定義することによって指定します。 MaxCandidates – レスポンスとして返される候補の最大数を定義します。実際に返される候補の 数は、この上限値よりも少ない場合があります。値 -1 は、他の制約を満たすすべての候補を返 すことを示します。MapInfo ジオコード サーバを使用した場合、デフォルト値は 3 です。 Envinsa Location Utility Service を使用した場合、デフォルト値は -1 (すべて) です。 MaxRanges – ジオコード操作で完全に一致した番地だけを返すか、番地の範囲を返すかを制御 します。MaxRanges を 0 に設定した場合、範囲は返されず、完全に一致した番地だけが返され ます。MaxRanges に 0 より大きい値を設定した場合、その値と同じ数の番地が返されます。 MaxRanges のデフォルト値は 0 です。たとえば、MaxRanges を 5 に設定した場合、該当する住 所範囲内の最大 5 件の一致がサービスによって返されます。-1 に設定した場合、対応するすべ ての一致が返されます。 MaxRangeUnits – 候補の範囲あたりに返される最大単位数を定義します。MaxRangeUnits のデ フォルト値はゼロ (0) です。 GeocodeType – サーバから利用できるジオコードの種類を指定します。サポートされるジオ コードの種類については、ご利用のサーバまたはサービスのマニュアルを参照してください。 LocalGeocodeConstraints – 国やそのジオコーダに固有の制約を設定できます。これらの値は常に Key/Value ペアです。使用可能なローカル制約については、ご利用のサーバまたはサービスの マニュアルを参照してください。 DictionaryUsage – サーバの住所ディクショナリだけを使用するか、設定されているユーザ ディ クショナリだけを使用するか、両方を使用するかを指定します。両方を使用する場合は、どち らを優先するかを指定できます。デフォルトでは、AD_AND_UD オプションが使用されます。 このオプションは、サーバの住所ディクショナリおよび設定されているユーザ ディクショナリ を使用することを示します。ユーザ ディクショナリの作成とアクセスについては、ご使用の サーバまたはサービスのマニュアルを参照してください。 UseCASSRules – サーバで CASS レベルのジオコード化を使用するかどうかを指定します (米国 のみ)。CASS 認証は、U.S. Postal Service? (USPS) の大口郵便割引要件に従って 住所の表を標準 化するプロセスです。ジオコード クライアントは、レコードをジオコード化する間、U.S. Postal Service が規定する厳密な照合条件の下で、 住所の標準化を実行します。CASS ジオコー ド化を使用する場合は、CASS をサポートする米国版のジオコード データ コンポーネントを展 開する必要があります。CASS の住所標準化に対応した最新バージョンの入手については、 MapInfo の販売代理店に問い合わせてください。デフォルトは false です。 一致制約を緩和した場合の影響 条件を緩和した場合、検索対象エリアが拡大されます。たとえば、郵便番号の条件を緩和する と、入力された住所の市内であれば、その郵便番号に該当しない候補も検索対象となります。ジ オコード化に適用する設定を決める際は、次の点を考慮してください。 開発者ガイド 365 近い一致の正確さについて 郵便番号の条件緩和 郵便番号の条件を緩和した場合、より広いエリアを対象に検索が実行されます。その結果、パ フォーマンスは低下しますが、一致候補との比較時、リクエストの内容と完全に一致することが 要求されないため一致率は高くなります。 細分区域と地方自治体の条件緩和 これらの条件を緩和した場合、特定の郵便番号と一致した番地を対象として検索が実行されま す。また、郵便番号が一致していれば、名前の異なる他の都市や細分区域も検索対象となりま す。 道路名の条件緩和 入力住所と発音の似た (または綴りに誤りのある) すべての候補が検索対象になります。パフォー マンスは低下します。メリットは、より多くの候補が調査の対象となるため一致率が向上する点 です。テーブルのインデックスを作成することにより、さほどパフォーマンスを犠牲にすること なく、一致率を上げることができます。 家番号の条件緩和 家番号の設定を緩和しても、著しいパフォーマンス低下は生じません。ただし、住所候補が、範 囲を一切含まないセグメントに該当した場合、照合のタイプに影響します。特定の候補の家番号 範囲に、入力された家番号が含まれなかった場合も、照合のタイプに影響が生じます。家番号の 条件を緩和した場合は、返される最大範囲を 0 より大きく設定することをお勧めします。 近い一致の正確さについて 結果のランクは、リクエストに対する一致の精度に基づいて決まります。GeocodeMatchCode クラ スでは、リクエストに含まれるジオコード化の制約と、サーバ/サービスの構成の組み合わせに基 づき、照合の対象となったすべてのレコードについて、ジオコード サーバまたはジオコード サー ビスから結果コードが返されます。このコードは、ジオコード処理の成否と、一致の質に関する 情報を表しています。結果コードのカテゴリは、大きく次の 5 つに分けられます。 • • • • • 「近い一致が 1 件存在 (S カテゴリ)」 「複数の候補からの最適一致 (M カテゴリ)」 「郵便番号中心点の一致 (Z カテゴリ)」 「地理的中心点での一致 (G カテゴリ)」 「一致が存在しない」 S カテゴリまたは M カテゴリの結果コードでは、コードの各文字が、住所の各要素の一致精度を 表します。 カテゴリ 366 説明 例 H 家番号 115 P 道路の接頭辞の方位 North MapXtreme 2008 v7.0.0 第 19 章 : ジオコード カテゴリ 説明 例 N 道路名 Main T 道路の種類 Place S 道路の接尾辞の方位 SE C 都市名 New York Z 郵便番号 80302 A 住所ディクショナリ A 近い一致候補の場合は、次のようなコードになります。 S5HPNTSCZA 一致の精度が低い場合は、次のようなコードになります。 S5-PNTSC-A 結果コードのダッシュ (-) は、不一致を示しています。リクエストに指定された郵便番号が、検出 されたデータの郵便番号と異なる場合 (入力された値が 28031 のとき、検出された値が 28013 であ るなど)、結果コードには、Z の代わりにダッシュが表示されます (例: S5HPNTSC-A)。 近い一致が 1 件存在 (S カテゴリ) S カテゴリの一致は、対象のレコードが単一の住所候補と一致したことを示します。1 文字目 (S) は、対象のレコードと一致する番地が、ジオコード サーバによって発見されたという意味です。 コードの 2 文字目は、ジオコード化されたレコードの、結果として得られたポイントの位置的な精 度を表しています。 • • • • • • • • S1 – 近い一致が 1 件存在。ポイントは郵便番号中心点に配置。 S2 – 近い一致が 1 件存在。ポイントは ZIP+2 中心点に配置 (主に米国)。 S3 – 近い一致が 1 件存在。ポイントは ZIP+4 中心点に配置 (主に米国)。 S4 - ポイントは、道路の折れ線の形状を定義する図形ポイント パスの中心に配置。 S5 – ポイントは番地位置に配置。 S6 – ポイントはジオメトリ上の郵便番号の中心点に配置。たとえば、大きな建物には独自の コードが割り当てられます。これは利用可能な最高の精度です。 SX – ポイントは交差点に配置。 SO – 座標を利用できない (非常にまれ)。 複数の候補からの最適一致 (M カテゴリ) M カテゴリの一致は、対象のレコードに近い一致候補が複数存在し、その中から最も適している と思われる候補がサーバまたはサービスによって選択されたことを意味します。S カテゴリと同 様、M カテゴリ コードの 2 文字目は、結果として得られたポイント オブジェクトの位置的な精度 を表わします。 • 開発者ガイド M1 – 近い一致が複数存在。ポイントは郵便番号中心点に配置。 367 近い一致の正確さについて • • • • • • • M2 – 近い一致が複数存在。ポイントは ZIP+2 中心点に配置 (主に米国)。 M3 – 近い一致が複数存在。ポイントは ZIP+4 中心点に配置 (主に米国)。 M4 – 近い一致が複数存在。ポイントは、道路の折れ線の形状を定義する図形ポイント パスの 中心に配置。 M5 – 近い一致が複数存在。ポイントは番地位置に配置 (利用可能な最高の精度)。 M6 – 近い一致が複数存在。ポイントは郵便番号位置に配置。 MX – 近い一致が複数存在。ポイントは交差点に配置。 M0 – 近い一致が複数存在。座標を利用できない。 郵便番号中心点の一致 (Z カテゴリ) Z カテゴリでの一致は、道路の照合が行われなかったことを示します。たとえば、1) 近い一致が存 在せず、かつ、サーバまたはサービスが郵便番号中心点にフォールバックする設定になってい る、2) 住所が私書箱か 僻地に該当する、3) サーバまたはサービスが郵便番号中心点で照合するよ うに設定されている、などが考えられます。結果のポイントは、次の 4 つの精度レベルで郵便番号 中心点に配置されます。 • • • • • Z1 – 郵便番号中心点での一致 Z2 – ZIP+2 中心点での一致 (主に米国) Z3 – ZIP+4 中心点での一致 (利用可能な最高の精度、主に米国) Z6 – 郵便番号中心点での一致 (Point ZIP の場合) Z0 – 郵便番号での一致。座標は利用できない (非常にまれ) 注意 Point ZIP とは、エリアを伴わない郵便番号のことです。P.O. Box ZIP や Unique ZIP (単一の 敷地、建物、または組織) などがこれに該当します。米国以外の住所ディクショナリを使用 している場合でも、このカテゴリの結果は Z になります。 地理的中心点での一致 (G カテゴリ) G カテゴリでの一致は、道路の照合が行われなかったことを示します。たとえば、近い一致が見つ からず、かつ、サーバまたはサービスが地理的中心点にフォールバックする設定になっている場 合は、このカテゴリが該当します。結果のポイントは、次の精度レベルで地理的中心点に配置さ れます。 • • • • • 368 G0 – areaName0 の中心点 (国) G1 – areaName1 の中心点 (国の細分区域) G2 – areaName2 の中心点 (国の二次細分区域) G3 – areaName3 の中心点 (地方自治体) G4 – areaName4 の中心点 (地方自治体の細分区域) MapXtreme 2008 v7.0.0 第 19 章 : ジオコード 一致が存在しない 次の結果コードは、一致が存在しないことを示します。 N – 近い一致が存在しない。こうしたレコードは、MapInfo のジオコード製品を使用してインタ ラクティブにジオコード化し直すか、自動的に処理したい場合は、別の一致条件を使用して再 度ジオコード化することになります。 NX – 交差点に対して近い一致が存在しない。 ND – 指定された郵便番号または地方自治体/国の細分区域に対応する住所ディクショナリが見 つからない。こうしたレコードは、住所ディクショナリを用意した後で再度ジオコード化する ことができます。 NG – ジオコード処理中、ユーザによってジオコード不可能として指定されたレコード。コード が削除されない限り、これらのレコードは照合されません。 開発者ガイド 369 近い一致の正確さについて 370 MapXtreme 2008 v7.0.0 20 Web Map Service MapXtreme では、Web Map Services (WMS) を展開およびアクセスして、各種 ソースから WMS マップを取得したり、他のユーザにマップを提供したりする ことができます。 この章の構成 「MapXtreme の Web Map Service の概要」 . . . . . . . . . . . . . . . . . . . . . 「WMS の処理について」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「WMS サーバの設定」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「WMS サーバのレイヤ情報の構成」 . . . . . . . . . . . . . . . . . . . . . . . . . 372 372 374 380 WMS の処理について MapXtreme の Web Map Service の概要 MapXtreme の WMS (Web Map Service) を使用すると、クライアント側からは、空間的に参照される マップ イメージをインターネットまたは私設のイントラネットを介してリクエストし、サーバ側 からはこれらのイメージを配信できます。 MapXtreme には、他からクエリできる WMS サーバを 展開し、WMS クライアントの機能をアプリケーションに統合して WMS サーバにイメージをリク エ ス ト で き る ツ ー ル が あ り ま す。WMS サーバとクライアントのインプリメントは、『1.1.1 OpenGIS? Web Map Service Implementation Specification』に基づきます。この文書は、 www.o:pengis.org にあります。 基本的な WMS は地理参照情報をレイヤに分類し、これらのレイヤを表示するための事前定義スタ イルを提供します。OGC 仕様に準拠する WMS は、一部のイメージ フォーマットの透過ピクセル 定義も同様にサポートしている場合があります。透過ピクセルによって、取得した WMS イメージ を、マップの背景レイヤとしてだけでなくラスタ オーバーレイとしても使用できます。データの 量と質は、個々の WMS サーバによって決まります。 政府、企業、およびその他の団体などが提供する地理空間情報が増えています。ユーザはこれら の情報を取得し、マップの精度と完全性を向上できます。土地と水路の利用に関するデータを 持っている企業は、 国勢調査局やローカルのデータ プロバイダから入手した標高や人口の情報を 追加できます。店舗の所在地情報に交通量のパターンのデータを組み合わせると、新店舗オープ ン時の調査や、マーケティングや製品展開の最適化が可能です。開発者は、WMS コードを拡張し て、特定のホテル、名所、または観光地を含めるようにルーティングのリクエストをカスタマイ ズできます。可能性を制限するのは、ニーズと想像力だけです。 MapXtreme の WMS サポートについては、以下のセクションで説明します。 • • • • 「WMS の処理について」 「WMS サーバの設定」 「WMS サーバのレイヤ情報の構成」 「WMS レイヤのリクエスト」 WMS の処理について MapXtreme の WMS は、基本的な WMS サービスについて 1.1.1 OGC 仕様に準拠しています。WMS サーバ固有の処理として、GetCapabilities、GetMap、および GetFeatureInfo の 3 つがあります。 GetCapabilities WMS マップをリクエストする前に、使用可能なレイヤの名前、使用中のスタイル、使用中の空間 情報、および WMS サーバが提供する他の情報を見つける必要があります。GetCapabilities は、イ ンターネットまたはイントラネットを介してサービス レベルのメタデータを取得する HTTP リク エストです。データには、サーバ名、レイヤ名、データに関する要約、有効なリクエスト パラ メータなどがあります。 MapXtreme では、WMS サーバから情報を収集する最初の手順として、GetCapabilities を使用しま す。取得した機能は、後でマップ イメージをリクエストする際に使用します。 MapXtreme では、GetCapabilities を直接呼び出しません。マップのリクエストは、機能インスタン スを入力として受け取る WMSClient を使用した呼び出しの中で行います。 372 MapXtreme 2008 v7.0.0 第 20 章 : Web Map Service // build the capabilities ICapabilities capabilities = WmsClientUtilities.GetCapabilities (url, "1.1.1"); // create the WMS client WmsClient wmsClient = new WmsClient(capabilities); wmsClient.AddLayer("WORLD"); wmsClient.Srs = "EPSG:4326"; wmsClient.BGColor = Color.Blue; wmsClient.MimeType = "image/gif"; GetMap WMS サーバの機能を把握できたら、GetMap リクエストを発行して、WMS サーバの 1 つまたは複 数のマップ レイヤのマップ イメージをリクエストします。WMS サーバの機能に基づいて、 GetMap リクエストには以下のものが含まれます。 • • • • • • • • レイヤ - マップ データの 1 つまたは複数のレイヤ。 スタイル – レイヤのレンダリング用の表示スタイル。指定しない場合は、デフォルトのスタイ ルが使用されます。 境界ボックス – マップ イメージに含まれる領域。 リファレンス座標系 - マップの数値表記。空間リファレンス システムとも呼ばれます。指定し ない場合は、デフォルトのレイヤ スタイルで定義されているデフォルトのリファレンス座標系 が使用されます。 出力フォーマット – GIF や PNG など、出力マップ イメージの MIME タイプ。 出力サイズ – マップ イメージの高さおよび幅 (ピクセル単位)。 背景色 – 0xFFFFFF など、赤、緑、青の値を示す 16 進値 (透過性が true に設定されている場合 に必要)。 透過性 – レイヤを他のレイヤの透過オーバーレイとして使用できるかどうかを true/false で指定 します。 MapXtreme では、GetMap を直接呼び出しません。マップのリクエストは、TableInfoWMS を作成 する呼び出しの中で行います。この呼び出しは、WMSclient を入力として受け取ります。以下の コード例は、「GetCapabilities」 セクションの例に基づいています。 // create the table info TableInfoWms wmsTableInfo= new TableInfoWms ("MyWmsTable", wmsClient); // create the table Table wmsTable = Session.Current.Catalog.OpenTable(wmsTableInfo); // creates a FeatureLayer from the table entry FeatureLayer featLyr = new FeatureLayer(wmsTable); GetFeatureInfo GetMap リクエストが正常に完了すると、マップに含まれるフィーチャについてさらに詳細な情報 をユーザが希望する場合があります。GetFeatureInfo 操作は、マップ内のレイヤおよび各レイヤの 問い合わせ可能な属性に関する情報を返します。この操作は WMS サーバ側で制御されますが、 開発者ガイド 373 WMS サーバの設定 サーバがこの機能を必ずしも提供するとは限りません。GetFeatureInfo は GetMap リクエストを送 信 し た 後に 発 行 す る 必 要 が あ り ま す。それは、マップ上のポイントの X/Y ピクセル座標が GetFeatureInfo リクエストの必須の入力であるからです。 // Get the feature info Byte[] info = WmsClientUtilities.GetFeatureInfo(new DRect(45.0, 45.0, 90, 90), 640, 480, new String[] {"WORLD"}, new Point(300,200), "text/xml")); MemoryStream memoryStream = new MemoryStream(byteArray); memoryStream.Seek(0, SeekOrigin.Begin); XmlDocument doc = new XmlDocument(); doc.Load(memoryStream); //parse the xml doc as desired. WMS サーバの設定 WMS クライアント機能をアプリケーションで使用したり、HTTP リクエストを送信したりするに は、まず、アプリケーションが WMS サーバにアクセスできる必要があります。これには、独自に WMS サーバを設定する方法と、既存の WMS サーバにリクエストを送信する方法の 2 つがありま す。 独自に WMS サーバを設定するには、IIS へのサーバ接続を設定し、Web Map Service のホスト用の データ接続に必要な XML ファイルを作成する必要があります。WMS の操作に関する知識と、 MapXtreme ワークスペース スキーマに関する知識があることが前提です。ワークスペース スキー マの詳細については、付録 D: 「MapInfo ワークスペースについて」を参照してください。 WMS サーバにアクセスしてマップ レイヤを取得するだけの場合は、383 ページの「WMS レイヤ のリクエスト」を参照してください。WMS クライアントのインプリメントを使用するために WMS サーバを作成する必要はありません。 WMS サーバは、Microsoft IIS (Internet Information Service) 内部で稼動します。以下に、WMS サー バをセットアップするための構成手順を示します。 手順 1: Web.config ファイルを作成または変更して、MapXtreme 固有の WMS 情報を指定します。 手順 2: ホスティング対象となるデータに関する情報を含む有効な WMS 構成ファイルを作成しま す。このファイルは、WMS サーバの実行時にエラーが発生しないように、WMS スキーマ ファイ ル (MXP_WMSConfiguration_1_0.xsd) と比較検証する必要があります。 手順 3: WMS サーバのセットアップを構成およびテストします。 MapXtreme の製品 CD には Web.config ファイルおよび WMS 構成ファイルのサンプルが収録されて います。これらのファイルは内容を確認し、必要に応じて変更できます。Web.config ファイルに は、ASP プ ロ セ ス の 処 理 方 法 と、WMS サーバと MapXtreme との関係が定義されています。 WMSSample.xml には、WMS サーバで提供するデータ ソースおよびレイヤの定義が記述されてい ます。 また、MapXtreme の WmsClient サンプル アプリケーションには、WMS サーバを操作するユーザ インターフェイスのサンプルも付いています。これは、MapXtreme をインストールしたディレク トリの Samples フォルダ内の Desktop\Features\WmsClient にあります。 374 MapXtreme 2008 v7.0.0 第 20 章 : Web Map Service 製品 CD には、MapXtreme ワークスペースおよび WMS サーバのスキーマも収録されています。 手順 1: Web.config ファイルの作成 Web.config は、Web アプリケーション用の標準的な構成ファイルです。ここでは、このファイルを 変更して MapXtreme 固有の WMS 情報を指定し、ASP.NET プロセスの処理方法を定義します。 1. Web.config および WMSSample.xml を含むフォルダを作成します。この例では、c:\wms に作成 します。 2. MapXtreme CD に収録されている Web.config および WMSSample.xml をこのフォルダにコピーし ます。 3. Web.config をテキスト エディタで開き、<appSettings"> 行を WMS 構成ファイルを参照するよう に変更します。 <configuration> <appSettings> <add key="configFile" value="C:\wms\WMSSample.xml" /> 4. さらにファイルの下の箇所で、MapInfo.Wms.Server および MapInfo.CoreEngine アセンブリの バージョン番号を更新し、必要に応じて PublicKeyToken も更新します。この情報を見つけるに は、[スタート] メニューの [ファイル名を指定して実行] をクリックします。[ファイル名を指定 して実行] ダイアログ ボックスで、assembly と入力して、インストールされているアセンブ リのリストを表示します。この例では、バージョン番号は 7.0.0.530 です。 <system.web> <httpHandlers> <add verb="GET,POST" path="*.ashx" type="MapInfo.Wms.WmsHttpHandler, MapInfo.Wms.Server, Version=7.0.0.530, Culture=neutral, PublicKeyToken=4ac3224575145b20"/> </httpHandlers> <httpModules> <add type="MapInfo.Engine.WebSessionActivator, MapInfo.CoreEngine, Version=7.0.0.530, Culture=neutral, PublicKeyToken=93e298a0f6b95eb1" name="WebSessionActivator" /> </httpModules> 5. このファイルを保存し、手順 手順 1 で作成したフォルダにコピーします。 手順 2: ホストするデータ用の有効な WMS 構成ファイルの作成 WMSSample.xml は、MapXtreme に付属する WMS 構成ファイルです。このファイルには、WMS サーバに関する情報として、サーバの名前、タイトル、概要、WMS サーバの URL、ホストする データなどが定義されています。 1. WMSSample.xml をテキスト エディタで開き、<mxp-wms:OnlineResource> 行を WMS サー バを参照するように変更します。 <mxp-wms:Service> <mxp-wms:Name>Sample WMS Server</mxp-wms:Name> <mxp-wms:Title>Sample WMS Server</mxp-wms:Title> <mxp-wms:Abstract>This is a sample WMS server</mxp-wms:Abstract> <mxp-wms:KeywordList/> <!-- The following is the URL of your WMS server, here assume it is localhost --> 開発者ガイド 375 WMS サーバの設定 <mxp-wms:OnlineResource>http://localhost/WMS/GetMap.ashx</mxpwms:OnlineResource> <mxp-wms:Fees>$10</mxp-wms:Fees> <mxp-wms:AccessConstraints>none</mxp-wms:AccessConstraints> </mxp-wms:Service> 必要に応じて、サーバ名、タイトル、概要、料金、アクセス制約などの要素も変更できます。 2. <DataSourceDefinitionSet> のパスを変更して、データ レイヤを登録します。WMS で処 理する各レイヤを 1 つずつ入力する必要があります。以下は、WMSSample.xml の一部で、サン プル WMS サーバの TAB ファイルを識別します。 <!-- The following data sources reference local TAB files, you need to replace MYPATH with the real path to those tab files.--> <TABFileDataSourceDefinition id="id1" readOnly="false" xmlns="http://www.mapinfo.com/mxp"> <DataSourceName>STATES</DataSourceName> <FileName>c:\Program Files\MapXtreme\7.x.x\Samples\Data\USA.TAB</FileName> </TABFileDataSourceDefinition> <TABFileDataSourceDefinition id="id2" readOnly="false" xmlns="http://www.mapinfo.com/mxp"> <DataSourceName>US_HIWAY</DataSourceName> <FileName>MYPATH\US_HIWAY.TAB</FileName> </TABFileDataSourceDefinition> <TABFileDataSourceDefinition id="id5" readOnly="false" xmlns="http://www.mapinfo.com/mxp"> <DataSourceName>OCEAN</DataSourceName> <FileName>MYPATH\OCEAN.TAB</FileName> </TABFileDataSourceDefinition> 3. WMS サーバでホストするレイヤを <mxp-wms:WMSLayer> セクションに記述します。WMS サーバで提供する各 WMS レイヤを 1 つずつ入力する必要があります。また、レイヤをネスト することで、親レイヤを呼び出すだけですべての子レイヤを呼び出すことができます。 以下の例は、States という単一のレイヤの項目を示しています。ここでは、座標系として SRS ( 空間リファレンス システム)、WMS スタイル要素として、青の塗りつぶしおよび赤の境界で構 成されるエリア スタイルを指定しています。 これらの項目の作成方法の詳細については、「WMS サーバのレイヤ情報の構成」を参照して ください。 <mxp-wms:WmsLayer> <mxp-wms:Name>States</mxp-wms:Name> <mxp-wms:Title>States</mxp-wms:Title> <mxp-wms:SRSNameSet> <mxp:SRSName>EPSG:4267</mxp:SRSName> </mxp-wms:SRSNameSet> <mxp-wms:WmsStyleSet> <mxp-wms:WmsStyle> <mxp-wms:Name>BlueFill</mxp-wms:Name> <mxp-wms:Title>Blue Fill</mxp-wms:Title> <mxp-wms:Abstract>This is a blue area fill with a red border.</mxp-wms:Abstract> <AreaStyle xmlns="http://www.mapinfo.com/mxp"> <!-- The following defines the red border --> 376 MapXtreme 2008 v7.0.0 第 20 章 : Web Map Service <LineStyle stroke="red" width="1" widthunit="mapinfo:imagesize pixel"> <Pen>mapinfo:pen 2</Pen> </LineStyle> <!-- The following defines the blue fill --> <Interior fill-opacity="0" fill="(#id7)"> <Defs> <Pattern id="id7"> <Bitmap uri="mapinfo:brush 2"> <ColorAdjustmentSet> <ColorAdjustment color-1="nonWhite" color-2="blue" opacity="1"/> <ColorAdjustment color-1="white" opacity="1"/> </ColorAdjustmentSet> </Bitmap> </Pattern> </Defs> </Interior> </AreaStyle> </mxp-wms:WmsStyle> </mxp-wms:WmsStyleSet> <FeatureLayer id="id8" name="STATES" alias="STATES" volatile="unknown" xmlns="http://www.mapinfo.com/mxp"> <DataSourceRef ref="id1"/> </FeatureLayer> </mxp-wms:WmsLayer> 4. フィーチャ レイヤ情報を追加できたら、WMSSample.xml を保存します。 開発者ガイド 377 WMS サーバの設定 手順 3: WMS サーバの構成およびテスト Web.config および WMSSample.xml ファイルを編集できたら、WMS サーバを Internet Information Services に登録し、最後にセットアップをテストする必要があります。 1. WMS フォルダ (c:\wms など) を右クリックし、[共有とセキュリティ] を選択します。[Web 共有 ] タブで、[このフォルダを共有する] を選択します。Web サーバのエイリアスを設定する場合 は、[追加] ボタンをクリックし、ダイアログ ボックスに名前を指定します。 2. IIS を開きます ([スタート] メニュー、[すべてのプログラム]、[コントロール パネル]、[管理 ツール]、[インターネット インフォメーション サービス])。[既定の Web サイト] を展開し、 WMS サーバを見つけます (フォルダ名、またはエイリアスを設定している場合はエイリアスで 探します)。 3. Web サイトを右クリックし、[プロパティ] を選択します。[ASP.NET] タブで、[ASP.NET バー ジョン] に [2.0.50727] を選択します (MapXtreme アセンブリは 2.0 Framework でコンパイルされ ています)。 4. 同じプロパティ ダイアログ ボックスの [ディレクトリ セキュリティ] タブで、右上にある [編集 ] ボタンをクリックします。[認証方法] ダイアログ ボックスで、[匿名アクセス] チェック ボッ クスをオンにします。これにより、WMS サービスのユーザはユーザ名とパスワードを指定す る必要がなくなります。[OK] を 2 回クリックして、IIS ウィンドウを閉じます。 378 MapXtreme 2008 v7.0.0 第 20 章 : Web Map Service 5. Web ブラウザから 「GetCapabilities」 リクエストを送信して、セットアップをテストします。 アドレス ボックスに、以下のように入力します。 http://localhost/wms/GetFeature.ashx?REQUEST=GetCapabilities&SERVICE=W MS&VERSION=1.1.1 localhost は、使用する Web サーバで置き換えます。Web サーバにエイリアスを設定してい る場合は、URL にエイリアスを指定します。たとえば、次のようになります。 http://localhost/My_WMS/GetFeature.ashx?REQUEST=GetCapabilities&SERVIC E=WMS&VERSION=1.1.1 テストが成功した場合、下図のような Web ページが表示されます。機能が返されない場合は、 構成ファイルにすべての入力事項が正しく入力されていることを確認します。構成ファイルは 手作業で作成しているため、入力ミスが起きやすく、タグが消えてしまうこともあります。 開発者ガイド 379 WMS サーバのレイヤ情報の構成 6. WFS サーバにアクセスした後、WMSSample.xml に何らかの変更を加えた場合は、IIS を再起動 して変更内容を反映する必要があります。IIS を再起動するには、コマンド プロンプトで以下 のように入力します。 c:\>IISreset 7. テスト用のマップ イメージをリクエストするには、以下の例のように、「GetMap」 リクエス トを送信します。 http://My_Wms/GetMap.ashx?service=WMS&VERSION=1.1.1&SRS=epsg:4267&REQU EST=GetMap&LAYERS=States&STYLES=&BBOX=180,0,0,90&WIDTH=800&HEIGHT=600&FORMAT=image/gif WMS サーバから、States レイヤのマップ イメージが返ります。 WMS サーバのレイヤ情報の構成 レイヤは、MXP_WMSConfiguration_1_0.xsd スキーマにレイアウトされる要素に応じて、WMS 構 成ファイルに定義されます。以下のような要素があります。 • • • • • 380 Name – レイヤ名。リクエスト内でレイヤを参照する際に使用します。 Title – ユーザが判読可能なレイヤ名。 Abstract – レイヤに関する詳細な説明。 SRSNameSet – このレイヤに適用する空間リファレンス システム。レイヤで複数の SRS を使用 できる場合は、SRS を 1 つずつリストできます。このリストは順不同で、親レイヤおよび子レ イヤに適用されます。 WmsStyleSet – このレイヤおよびすべての子レイヤでサポートする、順不同の定義済みのスタイ ル セット。WmsStyleSet は WmsStyles のコレクションで、スタイルごとにスタイル定義として 名前、タイトル、概要、および参照があります。 MapXtreme 2008 v7.0.0 第 20 章 : Web Map Service WMS レイヤは、データの単一のレイヤで構成することも、レイヤの階層コレクションで構成する こともできます。WMS の基本インプリメントにより、クライアントは必要なレイヤを指定した り、マップ イメージとしてレンダリングするレイヤの座標系やスタイルを指定したりできます。 WMS サーバの開発者として、データを WMS レイヤとして作成する方法を決める必要がありま す。たとえば、地理データを境界ファイル、ポイント ファイル、折れ線ファイルなど、10 個の .TAB ファイルに分割するとします。WMS 構成ファイルでは、これらの 10 個のレイヤを 1 つの WMS レイヤとして表すことも、個々のレイヤとして保持することもできます。データを WMS ク ライアントに 1 つのレイヤとして提供すると、クライアントは 10 個すべてのレイヤから 1 つの WMS イメージを表します。この場合、クライアントは不要な情報を切り離すことはできません。 一方、10 個のレイヤを個別のレイヤとして提供した場合、WMS クライアントは必要に応じて、1 つのイメージ (通常は複数のイメージ) として返すレイヤを 1 つ選択することも、複数選択するこ とも、すべて選択することもできます。開発者は、WMS サーバの構成時に、ユーザにどの程度の 柔軟性を与えるかを決める必要があります。 また、レイヤをネストすることで、親レイヤを呼び出すだけですべての子レイヤをマップ イメー ジに呼び出すこともできます。 MapXtreme ワークスペースを使用した WMS 構成ファイルの作成 WMS 構成ファイルにレイヤ情報を作成するには、以前に保存した MapXtreme ワークスペース (.MWS) から各レイヤに関する情報を抽出します。 以下は、MapXtreme ワークスペース マネージャで作成した .MWS の一部で、"World Countries" とい うレイヤを定義しています。.MWS のレイアウトは、MXP_Workspace_1_0.xsd に記述されたスキー マに準拠する XML ファイルです。 <FeatureLayer id="id10" name="World Countries" alias="world" volatile="unknown"> <Visibility visible="true"> <VisibleRange enabled="false"> <ZoomRange uom="mapinfo:length mi" minInclusive="true" maxInclusive="false">0 0</ZoomRange> </VisibleRange> </Visibility> <DataSourceRef ref="id4" /> </FeatureLayer> また、これと同じレイヤ情報が WMS 構成ファイルに含まれています。内容はほとんど同じです が、各 タ グ に 含 ま れ る "mxp:" は、これらの要素が MapXtreme ワークスペース スキーマ (MXP_Workspace_1_0.xsd) に属することを示しています。 <mxp:FeatureLayer id="id10" name="World Countries" alias="world" volatile="unknown"> <mxp:Visibility visible="true"> <mxp:VisibleRange enabled="false"> <mxp:ZoomRange uom="mapinfo:length mi" minInclusive="true" maxInclusive="false">0 0</mxp:ZoomRange> </mxp:VisibleRange> </mxp:Visibility> <mxp:DataSourceRef ref="id4" /> </mxp:FeatureLayer> 開発者ガイド 381 WMS サーバのレイヤ情報の構成 レイヤは、ワークスペース マネージャで設計し、情報を WMS 構成ファイルにコピーして作成で きます。第 24 章: 「ワークスペース マネージャ」を参照してください。 フィーチャ レイヤおよびその他の要素 フィーチャ レイヤ情報を WMS レイヤに取り込む以外の操作も行うことができます。たとえば、 ワークスペース マネージャでラベル、主題図、およびスタイル オーバーライドを取得して、WMS 構成ファイルに貼り付けることもできます。 以下は、.MWS の一部で、人口レイヤのサイズ可変シンボル主題図を定義しています。主題図を定 義する要素はすべて、ここで取得されます。取得した要素を WMS 構成ファイルに貼り付けるとき は、必ず各要素に mxp: を指定してください。 <ObjectThemeLayer id="id8" name="Graduated Symbol Theme on World Capitals by Cap_Pop" alias="GraduatedSymbolThemeLayer1" volatile="unknown"> <Visibility visible="true"> <VisibleRange enabled="false"> <ZoomRange uom="mapinfo:length mi" minInclusive="true" maxInclusive="false">0 0</ZoomRange> </VisibleRange> </Visibility> <DataSourceRef ref="id4" /> <FeatureGraduatedSymbolTheme id="id9"> <Alignment> <HorizontalAlignment>center</HorizontalAlignment> <VerticalAlignment>center</VerticalAlignment> </Alignment> <SymbolBaseSize useScale="false"> <MapScale>1.0</MapScale> <DataValueAtSize>20000000</DataValueAtSize> <PositiveSymbol> <PointStyle> <FontSymbol size="18" size-unit="mapinfo:length pt" stroke="red" stroke-opacity="1" text=""" family="MapInfo 3.0 Compatible" /> </PointStyle> </PositiveSymbol> <NegativeSymbol visible="false"> <PointStyle> <FontSymbol size="18" size-unit="mapinfo:length pt" stroke="blue" stroke-opacity="1" text=""" family="MapInfo 3.0 Compatible" /> </PointStyle> </NegativeSymbol> <SymbolGraduation>sqrt</SymbolGraduation> </SymbolBaseSize> <SymbolLayout /> <NumericValueExpression> <AttributeName>Cap_Pop</AttributeName> </NumericValueExpression> <SymbolLegendRowOverrideSet> <SymbolLegendRowOverride visible="false" row="4" /> <SymbolLegendRowOverride visible="false" row="5" /> 382 MapXtreme 2008 v7.0.0 第 20 章 : Web Map Service <SymbolLegendRowOverride visible="false" row="6" /> </SymbolLegendRowOverrideSet> </FeatureGraduatedSymbolTheme> </ObjectThemeLayer> WMS レイヤのリクエスト WMS マップ イメージは、プログラムを使用してリクエストでき、MapInfo.Data.TableInfoWMS を 介して MapXtreme WMS クライアントを使用する方法と、MapInfo Professional クライアント ([ファ イル] [Web サービスを開く] [WFS を開く] ) を使用する方法があります。どちらの方法を使用して も、返されるイメージは他のラスタ レイヤの場合と同様に、マップに表示できます。 WMS のマップ リクエストには、以下の要素が必要です。 • • • • • イメージのレンダリング時に使用するレイヤ。 各レイヤのレンダリング時のスタイル。 レンダリング時に使用する座標系。 マップが表す地理的領域 (境界)。 使用するイメージ フォーマット。イメージは指定の背景色の場合と透過背景色の場合がありま す。透過が使用できる場合は、マップ内でのイメージのオーバーレイに便利です。不透明なイ メージは、マップの最下位レイヤとしてのみ使用できます。 MapInfo Professional WMS クライアントの詳細については、MapInfo Professional v7.5 以降のマニュ アルを参照してください。 コード例: WMS レイヤのリクエスト WMS レイヤを MapXtreme でプログラムからリクエストするには、以下のコード例に従います。 注意 MapXtreme での WMS のインプリメントでは、返されるイメージの幅と高さがそれぞれ 2000 ピクセルに制限されています。 // build the capabilities ICapabilities capabilities = WmsClientUtilities.GetCapabilities (url, "1.1.1"); // create the WMS client WmsClient wmsClient = new WmsClient(capabilities); wmsClient.AddLayer("WORLD"); wmsClient.Srs = "EPSG:4326"; wmsClient.BGColor = Color.Blue; wmsClient.MimeType = "image/gif"; // create the table info TableInfoWms wmsTableInfo= new TableInfoWms ("MyWmsTable", wmsClient); // create the table Table wmsTable = Session.Current.Catalog.OpenTable(wmsTableInfo); // creates a FeatureLayer from the table entry FeatureLayer featLyr = new FeatureLayer(wmsTable); 開発者ガイド 383 WMS サーバのレイヤ情報の構成 384 MapXtreme 2008 v7.0.0 21 ルーティング この章では、ルーティングに使用される MapXtreme 名前空間について説明 し、ルーティング サーバまたはルーティング サービスにアクセスするアプリ ケーションの作成方法とその例を示します。 この章の構成 「MapInfo.Routing 名前空間の概要」 . . . . . . . . . . . . . . . . . . . . . . . . . . 「ルートの計算」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「高度なルート オプション」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「等値ルーティング (運転時間と運転距離)」. . . . . . . . . . . . . . . . . . . 「ルーティング データを使用したリクエストの更新」 . . . . . . . . . . 386 387 390 394 398 MapInfo.Routing 名前空間の概要 MapInfo.Routing 名前空間には、ジオコード クライアントと似た方法で MapXtreme ルーティング ク ライアントをアプリケーションに組み込むためのインターフェイスとクラスが用意されていま す。ルーティング クライアントから HTTP を使用して、Pitney Bowes Business Insight ルーティング サーバまたはルーティング Web サービス製品にリクエストを送信します。MapXtreme の購入時に は、サーバと Web サービスは付属しません。 ルーティング機能を使用することで、2 つのポイント間の最短距離または最短時間の経路 (ルート) を判別できます。また、さまざまな詳細ルーティング オプションを追加できます。ルート ジオメ トリ (マップ表示でのルートのレイアウト)、運転用指示、合計距離と合計時間を示すルート概要を 返すことができます。また、中間点を含むルートを作成することや、高速道路や特定地域など特 定の道路フィーチャを避けるように設定されたルートを作成することができます。 ルーティング機能には、運転時間と運転距離の計算 (isoChrone および isoDistance) を可能にする重 要な分析ツールや、特定の道路タイプの回避やルート再計算のための一時的更新を使用する機能 があります。ルート クライアントの機能は、次の 4 つの論理グループに分類されます。 • • • • ルートの計算 高度なルート オプション 等値ルーティング (運転時間と運転距離) ルーティング データを使用したリクエストの更新 主なルーティング クラス MapInfo ルーティング サーバまたは Envinsa ルート サービスを使用するルーティングがサポートさ れています。どちらかのリソースを URL に配置して、提供する必要があります。適切なルート ク ライアントを作成するには、RouteClientFactory クラスを使用します。この 2 つのクライアントの インターフェイスは似ています。ルート リクエスト、ルート設定、およびルート レスポンスにつ いて同じクラスを使用するためです。 ルート クライアントを使用すると、2 つの位置間の最短距離または最短時間の経路 (ルート) の判 別、中 間 点 の 追 加 (ViaPoint ク ラ ス)、特定の位置と道路タイプの回避 (AvoidList クラス、 PointExclude クラス、SegmentExclude クラス)、運転用指示の取得 (RouteInstructionsRequest クラス )、ルート ジオメトリの取得 (RouteGeometryRequest クラス)、より有効な分析結果を得るための多 数の設定によるルートのカスタマイズができます。ルート クライアントには、運転時間と運転距 離の計算 (等時線と等距離線) を可能にする重要な分析ツールと、特定の道路タイプの回避やルー ト再計算のための一時的更新を使用する機能が備えられています。ルート クライアントの機能 は、次の 3 つの論理グループに分類されます。 1. ルートの計算では、ポイントツーポイント ルートおよびマルチポイント ルートには RouteRequest クラスを、マトリックス ルートには MatrixRouteRequest クラスを使用します。 2. 運転時間と運転距離の計算では、運転時間の計算に IsoChroneRequest クラスを、運転距離の計 算に IsoDistanceRequest クラスを使用します。 3. より正確で有効なルートを得るための一時的更新によるルートの計算では、TransientUpdate ク ラスを使用します。 386 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング 次の図に、Routing 名前空間を構成するインターフェイスとクラスを示します。 ルートの計算 実行できるルート計算 (最短距離または最短時間のルートの決定) は、単純ルート (ポイントツーポ イント)、マルチポイント ルート、マトリックス ルート リクエストの 3 種類です。 ポイントツーポイント ルーティング 最も一般的に使用されるルーティングの 1 つが、2 つの住所、2 つのポイント、またはその組み合 わせを入力してルートを取得するという単純な運転用指示です。指定された始点から指定された 終点までのルートが計算されます。 最も単純なポイントツーポイント ルーティングでは、応答にルート概要が含まれます。この概要 に含まれるのは、ルートの距離と所要時間です。応答でその他の情報も返されるように、ポイン トツーポイント ルート リクエストにさまざまな設定を追加することができます。次の設定を追加 できます。 • • • • 開発者ガイド ルート設定 運転用指示 ルート ジオメトリ 回避するポイント、フィーチャ、セグメント 387 ルートの計算 • • 時間ベース ルーティング ルーティング データを使用したリクエストの更新 ポイントツーポイント ルートは、RouteRequest クラスを使用して作成します。API レベルでの構文 と説明については、開発者リファレンスを参照してください。 次のコード例は、単純なポイントツーポイント ルートの例です。 Public Shared Sub New_RouteRequest() ' Create the start point and end point Dim coordSys As MapInfo.Geometry.CoordSys = _ Session.Current.CoordSysFactory.CreateFromPrjString("1, 104") Dim dpt1 As MapInfo.Geometry.DPoint = _ New MapInfo.Geometry.DPoint(-74, 42) Dim dpt2 As MapInfo.Geometry.DPoint = _ New MapInfo.Geometry.DPoint(-74, 41) Dim startPoint As MapInfo.Geometry.Point = _ New MapInfo.Geometry.Point(coordSys, dpt1) Dim endPoint As MapInfo.Geometry.Point = _ New MapInfo.Geometry.Point(coordSys, dpt2) ' Create the point list Dim pointList As WayPointList = _ New WayPointList(startPoint, endPoint) ' Create the route plan object Dim plan As RoutePlan = _ New RoutePlan(pointList) ' Create the request object Dim request As RouteRequest = _ New RouteRequest(plan, DistanceUnit.Mile) End Sub マルチポイント ルーティング マルチポイント ルーティングは、ポイントを経由するルーティング機能です。ルーティング サー バでは、すべてのポイントを経由したときの最短距離または最短時間のルートを計算します。こ の機能は複雑な運転用指示に使用できます。このような指示は、日常的な車での立ち寄りや、流 通会社や修理会社などの顧客訪問、一般的な出張営業などを計画するユーザに必要なものです。 通常、始点と終点に加え、一連の経由先も計算に加えられます。始点と終点の間に経由ポイント が存在すること以外は、マルチポイント ルーティングとポイントツーポイント ルーティングに違 いはありません。 ポイントツーポイント ルーティングと同様に、応答でその他の情報も返されるように、マルチポ イント ルート リクエストにさまざまな設定を追加することができます。次の設定を追加できます。 • • • • • • 388 「ルート設定」 「運転用指示」 「ルート ジオメトリ」 「回避するポイント、フィーチャ、セグメント」 「時間ベース ルーティング」 「ルーティング データを使用したリクエストの更新」 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング マルチポイント ルートは、RouteRequest クラスを使用して作成します。ルートに中間点を追加す るには、WayPointList に 1 つ以上の ViaPoint を含める必要があります。API レベルでの構文と説明 については、開発者リファレンスを参照してください。 次のコード例で、startPoint、endPoint、ViaPoint で構成される WayPointList の作成方法を示しま す。 Public Shared Sub New_WayPointList() ' Create a start point and end point Dim coordSys As MapInfo.Geometry.CoordSys =_ Session.Current.CoordSysFactory.CreateFromPrjString("1, 104") Dim dpt1 As MapInfo.Geometry.DPoint = _ New MapInfo.Geometry.DPoint(-74, 42) Dim dpt2 As MapInfo.Geometry.DPoint = _ New MapInfo.Geometry.DPoint(-73, 42) Dim dpt3 As MapInfo.Geometry.DPoint = _ New MapInfo.Geometry.DPoint(-73.562, 42) Dim startPoint As MapInfo.Geometry.Point = _ New MapInfo.Geometry.Point(coordSys, dpt1) Dim endPoint As MapInfo.Geometry.Point = _ New MapInfo.Geometry.Point(coordSys, dpt2) Dim intermediatePoint As MapInfo.Geometry.Point = _ New MapInfo.Geometry.Point(coordSys, dpt3) ' Create the intermediate point object Dim point As ViaPoint = New ViaPoint(intermediatePoint) ' Create the collection Dim pointList As ViaPointList = New ViaPointList ' Append the object to the collection. pointList.Append(point) ' Create the WayPointList object Dim list As WayPointList = _ New WayPointList(startPoint, endPoint, pointList) End Sub マトリックス ルーティング マトリックス ルーティングでは、多数の始点と多数の終点との間で最短距離または最短時間の経 路を検索し、ルート コストを返すことができます。コストとは、個々のルートの合計時間と距離 です。たとえば、始点が 3 個、終点が 50 個あるような状況では、マトリックス ルーティングが非 常に有効です。すべての始点とすべての終点の間の最短経路を計算し、ルートのコストを返すこ とができます。 応答でのポイントの順序と経路の数は、リクエストに含まれる始点と終点の数により決まりま す。たとえば、リクエストで 2 つの始点と 2 つの終点が指定されている場合、S を始点、E を終点 とすると、経路の順序は S1 ~ E1、S1 ~ E2、S2 ~ E1、S2 ~ E2 という順序になります。 一般的に、この計算を使用して、消防署や警察署などの特定のサービスのサービス応答時間と対 応範囲を調べることができます。最初の通知から 20 分以内に対応できるスタッフを 1 人以上用意 するなどのサービス レベル契約に対応できるように、適切な体制を整えるためにこのような計算 が必要になる場合があります。最も単純なマトリックス ルーティングでは、応答に経路のリスト 開発者ガイド 389 高度なルート オプション が含まれます。各経路には、始点と終点に加え、距離と時間が含まれます。応答でその他の情報 も返されるように、マトリックス ルート リクエストにさまざまな設定を追加することができま す。次の設定を追加できます。 • • • 「ルート設定」 「回避するポイント、フィーチャ、セグメント」 「ルーティング データを使用したリクエストの更新」 マトリックス ルートは、MatrixRouteRequest クラスを使用して作成します。マトリックス ルート リクエストには MatrixRouteCost が常に含まれ、MatrixRoutingPreferences も含まれる場合がありま す。API レベルでの構文と説明については、開発者リファレンスを参照してください。 高度なルート オプション ルーティング アプリケーションには、さまざまな高度な機能を追加できます。ここでは、ポイン トツーポイント、マルチポイント、マトリックスの各種ルート リクエストのカスタマイズに使用 される重要な機能について説明します。 ルート設定 計算する各種のルートに、さまざまな設定を指定できます。このような設定はすべてオプション ですが、ルート精度の決定に非常に大きく関係し、より有効なルートを作成するために役立つ場 合があります。始点から終点までの間で、最短時間のルートや最短距離のルートを返すことがで きます。このような設定を指定した場合、サーバ構成やサービス構成で定義されていたルート最 適化設定がオーバーライドされます。サーバ設定の拘束力が強い場合は、設定がサーバ設定に オーバーライドされることもあります。 ルート計算の種類 (ポイントツーポイント、マルチポイント、マトリックス) によって、使用可能 なルート設定が決まります。次に、使用可能なルート設定の概要を説明します。 • • • • 390 DistanceUnit - すべてのルート計算の距離単位を指定できます。一般的な単位は、キロメート ル、メートル、マイル、ヤード、フィートです。値が指定されていない場合は、デフォルト設 定 (マイル) が使用されます。 RouteMethod - 実行するルート設定の一般タイプを指定します。ルート クライアントは、最短 時間ルートまたは最短距離ルートの計算を実行できます。値が指定されていない場合は、デ フォルト設定 (最短時間) が使用されます。 OptimizeIntermediatPoints (マルチポイント ルートのみで使用されます) - リクエストに指定され た順に経由ポイントを通過するか、または経由ポイントを使用する最適ルートをルート クライ アントで検索するかを決定します。デフォルト (false) では、ルート クライアントは、リクエス トに指定された順に経由ポイントを通過します。true に設定した場合、経由ポイントを使用す る最適ルートが計算されます。 StopThreshold (マルチポイント ルートのみで使用されます) - ルート計算アルゴリズムの停止し きい値を設定します。ルート アルゴリズムは、アルゴリズムで残されているルート候補間の時 間または距離の相違が停止しきい値に到達すると、計算を中止し、現在の "最善の" ルートを返 します。有効な値は、任意の正の数値です。パフォーマンスを高めるために、1 未満の正の数 値を推奨します。停止しきい値の設定は、精度と速度の釣り合いを決定する要因です。一般的 に、しきい値を小さくすると、結果の精度が向上しますが、ルート計算にかかる時間は長くな ります。停止しきい値は、経由ポイントが少ない (10 個未満) のルートにはほとんど影響しませ ん。デフォルトは 0.01 (1%) です。 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング • • • • • TimeOut - ルート計算アルゴリズムのタイム アウト値を設定します。タイム アウト値は秒単位 で指定します。デフォルトのタイム アウトは 600 秒です。タイム アウト値に指定された時間 が経過すると、ルート アルゴリズムは計算を中止します。 TimeUnit - すべてのルート時間の測定単位を設定します。デフォルトの時間単位は分です。 TavelPreferences - 独自のルーティング機能を指定して、通過する道路タイプの優先度を変更で き ま す。道 路 タ イ プ と 道 路 タ イ プ 設 定 を 指 定 し て、移 動 設 定 を 追 加 で き ま す。 RoadTypePreference を High、Medium、Low、または Avoid に設定することで、優先度に基づく ルーティングを実行できます。ルートの計算時に、優先度の低い道路タイプよりも優先度の高 い道路タイプが選択されます。RoadTypePreference を Avoid に設定して、特定の道路タイプを 回避することもできます。よく使用される移動設定の 1 つが、道路タイプ FERRY を Low にす る設定です。これにより、目的地への移動手段がフェリーに限られる場合にのみ、フェリーの ルートが使用されるようになります。 TravelTime (ポイントツーポイントおよびマルチポイント) - ルート リクエストの移動開始時間 または移動終了時間を設定します。移動時間など、時間ベースのルーティング オプションを設 定する方法については、「393 ページの「時間ベース ルーティング」」を参照してください。 Updates - ルート リクエストに一時的な更新を追加し、道路の速度やセグメントの速度、道路タ イプを一時的に変更することができます。更新の詳細については、「399 ページの「一時更 新」」を参照してください。 RoutingPreferences クラスと MatrixRoutingPreferences クラスは、ルート設定の定義で最初に使用す るクラスです。構文と説明については、開発者リファレンスを参照してください。 運転用指示 運転用指示は、ポイントツーポイント ルートまたはマルチポイント ルートの場合に使用できま す。運転用指示により、ルートの道順が段階的に示されます。ルートの各セグメントで、実行す る手順 (開始、右折など)、道路の名前、方向、距離、時間が返されます。運転指示にはさまざまな オプションがあり、指示をルートの特定のセクションに絞ったり、指示の表現や形式を変更した り、指示の言語を変更したりできます。 運転指示を設定または要求する方法は 2 つあります。1 つは、サーバ設定またはサービス設定を使 用する方法です。もう 1 つは、RouteInstructionsRequest クラスを使用して ReturnDirections プロパ ティを true に設定する方法です。 指示設定の変更 以下に説明する環境設定を使用して、運転指示を変更します。 • • 開発者ガイド DirectionBreakTurnAngle - 道路が新しい指示文字列に現れるときの方向転換の角度値を設定しま す。ルートに沿って進んでいくと、道路が同じ名前を維持しながら大きく折れ曲がることがあ ります。この値を使用すると、新しい指示を開始する方向転換角度を指定することができま す。有効な値は 0 ~ 180 度です。デフォルトは 45 度です。 DirectionsGeneratorName - ルート指示の作成に使用するサーバサイド指示ジェネレータを独自に 指定します。サーバまたはサービスに 1 つ以上の指示ジェネレータを設定している場合、この 環境設定を使用して、指示の生成を特定のジェネレータで実行するように指定できます。たと えば、"myGenerator" と設定すると、"myGenerator" という名前が設定されたジェネレータを サーバまたはサービスで使用するように指定されます。この設定は、サーバまたはサービスが カスタム指示ジェネレータで構成されている場合にだけ使用します。指示ジェネレータの作成 方法および使用方法については、サーバまたはサービスのマニュアルを参照してください。 391 高度なルート オプション • • • • • Focus - ルートのフォーカスを指定します。フォーカス対象ルートとは、ルートの始点または終 点に的を絞った、ルートのサブセットです。始点のフォーカス対象ルートでは、起点から最初 の主要高速道路まで (およびこの高速道路上) のルートをユーザに指示します。終点のフォーカ ス対象ルートでは、ルートの最後の主要高速道路から、この主要高速道路を含めて目的地まで のルートをユーザに指示します。ルートに主要高速道路が含まれない場合、フォーカス対象 ルートは非フォーカス対象ルートと同じになります。NONE を指定した場合、ルート全体が返 されます。START を指定した場合、ルートの始点が返されます。END を指定した場合、ルー トの終点が返されます。デフォルトは NONE です。 ShowDistance - 運転指示で指示の距離を返すかどうかを指定します。デフォルトは true です。 ShowPrimaryNameOnly - 道路の一次名のみを表示するかどうかを指定します。道路に複数の名 前が含まれていることはよくあります。これは、指示内に道路のすべての名前を表示するか、 または一次名だけを表示するかを指定するために使用します。true に設定した場合、道路の一 次名のみが運転指示で使用されます。false に設定した場合、一次名に加えて他の名前もすべて 使用されます。デフォルトは false です。 ShowTime - 運転指示で指示の所要時間を返すかどうかを指定します。デフォルトは true です。 Style - 返される指示の種類を指定します。クライアントでは、通常型と簡略型の 2 種類の指示 を返すことができます。通常型の指示は、標準的なルート指示です。たとえば、"Turn left on Yonge Blvd and travel Southeast (1 s)" などです。簡略型の指示は、ワイヤレス デバイスにより適 し た、省 略 化 さ れ た 指 示 で す。た とえば、"L on Yonge Blvd" などです。NORMAL または TERSE に設定できます。デフォルト設定は NORMAL です。 指示言語の設定 UserLocale プロパティを変更することで、ルート指示の出力言語を操作できます。ルート クライ アントでは、ISO 標準ロケール コード <language>_<country> (たとえば、フランス語は fr_FR、ドイ ツ語は de_DE など) を使用しています。現在、EN、FR、DA、DE、FI、NL、NO、ES、PT、IT、 SV がサポートされています。デフォルトの言語は英語 (en_US) です。 ルート ジオメトリ ルート ジオメトリを作成する機能は、マップの作成やルートの分析に欠かせません。ルート ジオ メトリとは、ルートのグラフィック表示です。デフォルトでは、ルート ジオメトリは返されませ ん。ただし、ReturnGeometry プロパティを true に設定することで、ルート ジオメトリをレスポン ス内で返すことができます。 回避するポイント、フィーチャ、セグメント 特定の道路タイプ、ポイント、ルート セグメントを回避したり、除外したりできます。ルートを 決定する前に、渋滞情報、事故、祝祭日、ラッシュ アワーなどの既知の要因に基づいて、回避す るべき道路や場所があらかじめ判っている場合があるでしょう。 回避または除外できるのは、ポイント、フィーチャ、セグメントの 3 種類です。 ポイントの回避 ルート上のポイントを回避する方法は、現状で 2 つあります。AvoidList クラスの Points プロパ ティを使用する方法と、PointExclude クラスを使用する方法です。PointExclude クラスを使用した 場合、ルート リクエスト内の任意の数のポイントを除外できます。 注意 392 ポイントを回避する場合は、PointExclude クラスを使用することをお勧めします。 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング フィーチャの回避 ルート上のフィーチャ (道路タイプ) を回避する方法は、現状で 2 つあります。RoutingPreferences ク ラ ス の TravelPreferences プ ロパティを使用すると、任意の道路タイプを回避できます。 TravelPreference プロパティの使用方法の詳細については、「390 ページの「ルート設定」」を参照 してください。 ルート クライアントでルートを計算する際には、他にも高速道路を回避する方法があります。こ の方法は、ルートをローカル道路に限定する場合に便利です。AvoidList クラスの Features プロパ ティを使用し、回避するフィーチャとして Highway を定義します。 セグメントの回避 SegmentExclude クラスを使用して、ルート リクエストから任意の数のルート セグメント (ID) を除 外できます。セグメント ID とは、ルート データの各ライン、道路、セクションに割り当てられて いる固有の識別子です。ルートの特定のセクションのセグメント ID は、前回のルート レスポンス で返された ID により判断できます。ルート レスポンスで ID が返される方法については、399 ペー ジの「セグメント情報の取得」を参照してください。 注意 ルートを計算できない場合や、回避または除外を使用すると目的地に到達できない場合 は、ルート指示が返されません。 時間ベース ルーティング 時間ベース ルーティングは、配送システム、モバイル作業、正確な運転時間およびルートの算出 に欠かせない機能です。ルートの開始時間と終了時間、さらにマルチポイント ルートにおける各 中間点の停止時間を指定できます。たとえば、A 地点から出発して、B、C、D の各地点で顧客へ の営業やトラックの荷積みに 5 分ずつ時間を使い、 最後に E 地点に到着すると指定できます。 開始時間と終了時間 時間ベース ルーティングでは、ルートの開始時間と終了時間も指定できます。ルートの開始時間 と終了時間は、他の時刻設定を使用する場合に重要です。たとえば、サーバにラッシュ アワーの 交通パターンが設定されている場合、ルートの開始時間と終了時間が分析に重要となることがあ ります。開始時間と終了時間は、TravelTime クラスを使用して設定できます。移動時間は、次のプ ロパティを使用して制御します。 • • • DateTime - ルート計算を開始または終了する日時を指定します。 TimeZone - 移動時間に使用するタイム ゾーンを指定します。タイム ゾーンは、グリニッジ標準 時 (GMT) からの時刻オフセット値を使用して定義します。 TravelTimePreference - 定義される移動時間が開始時間か終了時間かを指定します。StartTravel ま たは EndTravel を使用して定義します。 次のコード例では、ルートの移動時間を設定する方法を示します。この例では、StartTravel 設定を 使用して、開始時間 (年、月、日、時 (24 時間表記)、分、秒) とタイム ゾーンを定義しています。 Public Shared Sub New_TravelTime() Dim startTime As DateTime = New DateTime(2005, 5, 1, 14, 0, 0) Dim timeZone As MapInfo.Routing.TimeZone = _ New MapInfo.Routing.TimeZone(-4) 開発者ガイド 393 等値ルーティング ( 運転時間と運転距離 ) Dim travelTime As MapInfo.Routing.TravelTime = _ New MapInfo.Routing.TravelTime(startTime, _ TravelTimePreference.StartTravel, timeZone) End Sub 停止時間 ルート内の任意の中間点に、停止時間を指定できます。この時間はルート全体の所要時間に加算 されます。停止時間は、ユーザがマルチポイント ルートでルート上の特定の場所で費やす時間 (た とえば、配送トラックの荷積み時間や荷下ろし時間など) を定義する場合に役立ちます。ViaPoint クラスで停止時間を加算するには、Stop プロパティと StopTime プロパティを指定します。 • • Stop - 経由ポイントで停止するかどうかを指定できます。デフォルトでは、経由ポイントに停 止時間は追加されません (false)。経由ポイントで停止する場合、Stop を true に設定します。 StopTime - ルート沿いの任意の経由ポイントに停止時間を追加します。停止時間は TimeSpan に よ って 定 義 さ れ、ル ー ト の 合 計 時間に加算されます。デフォルトの停止時間は 0 です。 TimeSpan は、"[-]d.hh:mm:ss.ff" と い う形式の文字列で指定できます。ここで、"-" は負の TimeSpan 値を指定する場合の記号、"d" は日、"hh" は分、"mm" は秒、"ff" は少数点以下の秒数 です。たとえば、"11.13:46:40" と指定された TimeSpan は、11 日 13 時間 46 分 40 秒を表しま す。 等値ルーティング (運転時間と運転距離) 等時線と等距離線は、ルート決定で非常に有効な情報となります。等時線は、始点から特定の時 間内で移動できるネットワーク内の領域を表すポリゴン (一連のポイント) です。等距離線は、始 点から特定の距離内にある領域を表すポリゴン (一連のポイント) です。この 2 つを利用して、あ る場所からの運転時間境界または運転距離境界を判断できます。小売業、銀行業、保険業のユー ザは、このサービスを使用して、潜在的市場を調べたり、特定の資産のリスクを判断したりでき ます。さらに、新サービスの提供開始や新しい店の開店などを見込み顧客に通知するために、住 所名簿の中から境界の中に住む顧客を判別するなど、さらに詳細な分析に使用できます。 等時線の作成 (運転時間) 等時線を作成する際には、特定の時間 (移動時間コスト) 内に開始位置から移動できる領域を表す 1 つ以上のポリゴン (ノードのセット) を算出します。 等時線の計算に使用する時間は、コストにより指定されます。コストは、始点から道路ネット ワーク上の計算対象ポイントまでの所要時間です。複数のコストを指定して、同心円状の等時線 ( 複数の等時線) を作成し、道路ネットワークを経由して到達できるさまざまな距離をグラフィック で表示できます。複数のコストにはタグが関連付けられます。リクエストの各コストにタグ、つ まり ID を指定することで、レスポンスから適切な等値線結果 (ジオメトリ) を判別できます。 IsoChronePreferences クラスと IsogramPreferences クラスでは、さまざまな環境設定を指定できま す。環境設定によって、分析に必要な出力が得られます、 IsoChronePreferences IsoChronePreferences クラスでは、次の環境設定を使用できます。 394 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング • • DefaultAmbientSpeed - 道路ネットワーク外の道路の、未指定の速度を指定します。ネットワー クで識別されない道路としては、私道や連絡道路などがあります。たとえば、道路ネットワー ク外で残り時間 5 分の等時線のポイントにいる場合、アンビエント速度と残り時間に基づいた 距離に境界ポイントが置かれます。そのため、この場合でアンビエント速度が毎時 15 マイル の場合、境界ポイントは 1.25 マイル離れた場所に置かれます。 AmbientSpeedOverride - 特定の道路タイプについてアンビエント速度をオーバーライドします。 アンビエント速度は、すべての道路タイプでオーバーライドできます。たとえば、週末は交通 量が多いため、主要な市街地道路の速度を 30Mph に設定することなどが考えられます。 IsogramPreferences IsogramPreferences クラスでは、次の環境設定を使用できます。 • BandingStyle - 結果で使用するバンディング スタイルを指定します。バンディング スタイルと は、複数のコストに基づいて表示できる複数の時間バンドまたは距離バンドの種類です。スタ イルには、(各領域が次の最小領域を差し引くことで決定される) Donut と (各領域が他の領域と 無関係に決定される) Encompassing があります。複数の等時線バンドは、複数のコスト要因を 指定することでリクエストします。たとえば、同じ始点から 5 分離れた等時線と 15 分離れた 等時線をリクエストできます。このような指定により、近似同心円バンドが作成されます。 ユーザは、5 分離れた等時線と 15 分離れた等時線の間にある情報について、両方のデータをす べて示すか (すべてを表示する Encompassing スタイル)、2 つの等時線の間のバンドだけを示す か (Donut スタイル) を選択できます。 Donut バンディングを使用すると、2 つの境界 (時間) が非常に近い場合、ルーティング サーバ に問題が発生する可能性があります。その状況を避けるために、次の 3 つのリクエスト設定を 行います。 a. Donut バンディングで、道路からの最大逸脱距離を設定しない (可能な場合)。この設定を使 用する必要がある場合、できるだけ大きな値に設定します。 b. Donut バンディングでは、アンビエント速度を低く設定しない。 c. リクエストで、コストの増分がコストと比較して小さくならないようにする。たとえば、 4、5、6 分というコストをリクエストする (4 分から開始して 1 分ずつインクリメント) こと は問題にならないと思われますが、120、121、122 分というコストをリクエストすると問題 が発生する場合があります。コストを大きくする場合、コストの増分も大きくする必要が あります。 上の例は、始点から 5 分、10 分、15 分の Encompassing スタイルのバインディングで 返されるジオメトリを示したものです。各ジオメトリに、前の等時線領域が包含さ れていることに注目してください。 開発者ガイド 395 等値ルーティング ( 運転時間と運転距離 ) 上の例は、始点から 5 分、10 分、15 分の Donut スタイルのバインディングで返され るジオメトリを示したものです。各ジオメトリが前のジオメトリの末端から開始さ れており、前の等時線領域が除外されていることに注目してください。 • MajorRoadsOnly - 計算で使用する道路ネットワークを指定します。ネットワークには、主要道 路のみ含めるか、すべての道路を含めることができます。主要道路とは、メインの道路または 高速道路です。主要道路を使用することを選択した場合は、パフォーマンスが向上しますが、 精 度 が 低 下 しま す。下 の 図 は、主 要 道 路 オ プ シ ョ ン の 動 作 を 示 し て い ま す。左 側 の 図 は MajorRoadsOnly を true に設定したもの、右側の図は MajorRoadsOnly を false に設定したもので す。MajorRoadsOnly を false に設定した場合、等値レスポンスの計算時に脇道などの補助道路 が使用されます。 • MaxOffRoadDistance - アンビエント速度を使用する際の、道路ネットワークからの逸脱距離の 最大値を指定します。このプロパティのデフォルト設定は無制限です。等時線内で可能な限り の逸脱が許可されます。最大逸脱距離を非常に小さな値に設定すると、サーバでレスポンスを 生成できなくなる場合があります。 ReturnAccesibleNodes - 等時線リクエストから返される等値線またはフィーチャの種類が一連の ノードとなるようにします (MultiPoint)。デフォルトで、ReturnAccesibleNodes は false です。こ のプロパティが true の場合、等時線計算の際に、道路ネットワーク上で到達可能なすべてのポ イントが返されます。 ReturnGeometry - 等時線リクエストから返される等値線またはフィーチャの種類がジオメトリ となるようにします (MultiPolygon)。デフォルトで、ReturnGeometry は true です。このプロパ ティが false の場合、等時線計算の際に、道路ネットワーク上で到達可能なすべてのポイントが 返されます。 • • 396 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング • • • • ReturnHoles - レスポンスで穴を返すかどうかを指定します。穴とは、より大きな領域に含まれ る、道路ネットワークに基づいて希望の時間内または距離内で到達できない領域です。このよ うな孤立した区域は、通過が面倒なローカル道路の近くでよく発生します。穴は、そのまま返 すか、完全に削除するかを選択できます。この設定が適用されるのは、ReturnGeometry が true ( デフォルト) に設定されている場合だけです。このプロパティを設定しない場合、デフォルト 設定 (false) が使用されます。 ReturnIslands - レスポンスで島を返すかどうかを指定します。島とは、メインの領域の外部にあ り、希望の時間内または距離内で到達できる小さな領域です。このような領域は、主要な高速 道路の出口ランプの近くによく発生します。島は、そのまま返すか、完全に削除するかを選択 できます。この設定が適用されるのは、ReturnGeometry が true (デフォルト) に設定されている 場合だけです。このプロパティを設定しない場合、デフォルト設定 (false) が使用されます。 SimplificationFactor - ポリゴンの複雑さを軽減する係数を指定します。単純化係数は、元のポイ ントのうちの何パーセントを返すか、つまり元のポイントのうちの何パーセントに基づいて結 果のポリゴンを生成するかを示します。一連のポイントで構成されるポリゴン には、多数のポ イントが含まれる場合があります。単純化係数は、は、0 ~ 1.0 の範囲の 10 進数値で指定しま す (1 は 100% を示し、0.01 は 1%) を示します。値を小さくするほど容量が小さくなり、転送時 間も短縮されます。この設定は、結果の種類がジオメトリの場合にのみ適用されます。このプ ロパティを設定しない場合、デフォルト設定 0.05 (5%) が使用されます。下の図は、単純化係 数オプションの動作を示しています。左側の図は単純化係数 0.01、右側の図は単純化係数 1 で す。 TimeOut - サーバに許可する等値線作成の所要時間を指定します。このプロパティのデフォルト 値は 600 秒 (10 分) です。 等距離線の作成 (運転距離) 等距離線を作成する際には、特定の距離 (移動距離コスト) 内で道路ネットワークを移動できる領 域を表す 1 つ以上のポリゴン (ノードのセット) を算出します。 等距離線リクエストに指定されるコストは、等値線の計算に使用されるコスト値が距離である点 を除いて、等時線と同じです。コストは、始点から道路ネットワーク上の計算対象ポイントまで 移動するために必要な距離です。複数のコストを指定して、同心円状の等時線 (複数の等距離線) を作成し、道路ネットワークを経由して到達できるさまざまな距離をグラフィックで表示できま す。複数のコストには、タグが関連付けられます。リクエストの各コストにタグ、つまり ID を指 定することで、レスポンスから適切な等値線結果 (ジオメトリ) を判別できます。 開発者ガイド 397 ルーティング データを使用したリクエストの更新 次のコード例では、IsoDistanceDefinition の定義方法を示します。レスポンスでは、ポイントを中 心として、コストをマイル単位 (pt, DistanceUnit.Mile) として境界を定義し、等値線 (ジオ メトリ) が作成されます。 Public Shared Sub New_IsoDistanceDefinition() ' Create a point Dim coordSys As MapInfo.Geometry.CoordSys = _ Session.Current.CoordSysFactory.CreateFromPrjString("1, 104") Dim dpt As MapInfo.Geometry.DPoint = _ New MapInfo.Geometry.DPoint(-74, 42) Dim pt As MapInfo.Geometry.Point = _ New MapInfo.Geometry.Point(coordSys, dpt) ' Create a definition Dim def As IsoDistanceDefinition = _ New IsoDistanceDefinition(pt, DistanceUnit.Mile) End Sub IsoDistancePreferences クラスと IsogramPreferences クラスでは、さまざまな環境設定を指定できま す。環境設定によって、分析に必要な出力が得られます、 IsogramPreferences クラスで指定される 環境設定は、等距離線リクエストでも等時線リクエストでも同じです。IsogramPreferences の詳細 については、「395 ページの「IsogramPreferences」」を参照してください。 IsoDistancePreferences IsoDistancePreferences クラスでは、次の環境設定を使用できます。 • • DefaultPropagationFactor - 等距離線境界を算出するときに、ネットワーク外への逸脱が許可され る残りのコスト (距離) の、道路ネットワーク外部の割合を指定します。ネットワークで識別さ れない道路としては、私道や連絡道路などがあります。この伝搬係数は、始点と等距離線との 間の距離を計算するために使用されるコストの割合です。たとえば、道路ネットワーク外で残 り距離 5 マイルの等距離線上のポイントにいる場合、伝搬係数と残り距離に基づいた距離に境 界ポイントが置かれます。そのため、伝搬係数が 0.16 であれば、境界ポイントは 0.8 マイルの 位置に置かれます。 PropagationFactorOverrides - 特定の道路タイプの伝搬係数をオーバーライドします。伝搬係数 は、すべての道路タイプでオーバーライドできます。たとえば、市街地の主要道路の場合は 0.24 に設定できます。 ルーティング データを使用したリクエストの更新 ルート データにアクセスし、その情報を使用してより正確で情報量の多いルートを作成する機能 は、非常に有用です。ルートを作成してルート レスポンスを取得すると、渡すべきでない場所や セグメントが結果に含まれている場合や、道路タイプやセグメントにおける速度を増加または減 少する必要がある場合があるでしょう。MapXtreme には、ルート データのセグメント情報を返 し、ルート データの情報を使用してルート リクエストを修正または更新する機能が備えられてい ます (一時的更新)。つまり、基本データを再処理することなくルーティング ネットワークを更新 できます。 一時的更新処理は、2 つの手順で実行されます。 398 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング 1. ルート レスポンスでルート データ セグメント情報を返します。この情報は、道路タイプまた は速度の更新に使用されるセグメントの決定に必要です。詳細については、「399 ページの 「セグメント情報の取得」」を参照してください。 2. レスポンスで返された情報に基づいて、ルート データに一時的な更新を加えます。これを一時 的更新と呼びます。このような変更はルート リクエストの中で送信され、サーバまたはサービ スでこのリクエストが処理される際にのみ有効となります。この機能を使用して、動的な渋滞 データや事故データを反映したり、特定の道路タイプに環境設定を加えたりできます。詳細に ついては、「399 ページの「一時更新」」を参照してください。 セグメント情報の取得 道路セグメントの道路タイプや速度データの回避または更新を行うには、セグメント ID などの道 路情報を知る必要があります。MapXtreme には、セグメント ID、名前、距離、道路タイプ、速 度、移動時間、ジオメトリなどの重要データを含む道路セグメント データを返す機能がありま す。 デフォルトで、ルート リクエストではセグメント情報は返されません。クラスを使用して、 ReturnSegmentData を true に設定します。また、返された情報に適用する速度と角度の尺度単位を 定義することもできます。デフォルトの VelocityUnit (速度単位) は Mph (マイル/時)、AngleUnit (角 度単位) は Degree です。セグメント データは、運転指示の作成に必要なデータであり、ルート内 の各セグメントの詳細情報が含まれます。次のようなセグメント情報が返されます。 • • • • • • • • • • • • 道路名 (代替名を含む) 道路名の言語 方位 セグメント ID 一方通行のブール値 ラウンドアバウトのブール値 有料道路のブール値 道路タイプ 制限速度 方向転換角度 セグメントの通過所要時間 セグメント全体の距離 一時更新 より正確で情報量の多いルートを作成するために、ルート データに一時的な変更を加えることが できます。このような変更は各ルート リクエストの中で送信され、サーバまたはサービスでその リクエストが処理される際にのみ有効となります。この機能を利用して、ラッシュ アワー中に特 定の高速道路を回避したり、リクエストでその道路セグメントの速度を遅くしたりすることで、 現実の交通パターンを反映し、より正確な時間ベース ルーティングを生成できます。一時更新 は、任意の種類のルート リクエスト (ポイントツーポイント ルート、マルチポイント ルート、マ トリックス ルート) に含めることができます。このような変更を行うことで、次の操作を実行でき ます。 • • 開発者ガイド ポイント、セグメント、道路タイプの速度を設定する。 ポイント、セグメント、道路タイプの速度を特定の値だけ変更 (増加または減少) する。 399 ルーティング データを使用したリクエストの更新 • • ポイント、セグメント、道路タイプの速度を特定の割合で変更 (増加または減少) する。 セグメントの道路タイプを設定する。 一時更新で速度を設定する場合、速度の設定方法は基本的に 3 種類あります。 • • • 速度 - セグメントに新しい速度を指定します。 相対値 - 相対値によって、速度の増加分または減少分を指定します。この値が速度の変更を表 します。たとえば、値 10 を指定すると、デフォルトの速度が 10 だけ増加します。値 -10 MPH を指定すると、デフォルトの速度が 10 MPH だけ減少します。 パーセント - パーセントによって、速度の増加分または減少分を指定します。値の範囲は -100 ~ 100 です。たとえば、50 を指定すると、デフォルトの速度が 50% 増加します (速度が 30 MPH であれば 45 MPH に増加します)。-50 を指定すると、デフォルトの速度が 50% 減少しま す (速度が 30 MPH であれば 15 MPH に減少します)。 一時更新を使用したセグメントの変更 ルート レスポンスを取得した後で、特定のルート セグメントまたはセグメント グループ (道路) の 実際の交通状況がもっと遅い、またはもっと速いことがわかっている場合や、リクエストの道路 タイプを更新したい場合があるでしょう。一時更新を利用して道路セグメントまたは道路タイプ の速度を設定し、ルートを再計算することで、より正確な結果が得られます。次のクラスを使用 して、さまざまなセグメント一時更新を実行できます。 • • SegmentRoadTypeUpdate - セグメントの道路タイプを更新します。次のコード例では、設定済み のセグメント ID "S1256", RoadType.MAJOR_ROAD_URBAN に新しい道路タイプを指定しま す。 SegmentSpeedUpdate - セグメントの速度を新しい速度に更新します。 次のコード例では、指定されたルート セグメント (S1256) に新しい速度として毎時 50 マイル (Velocity(50, VelocityUnit.Mph)) を設定します。 Public Shared Sub New_SegmentSpeedUpdate() ' Create the velocity object Dim velocity As Velocity = New Velocity(50, VelocityUnit.Mph) ' Create the update object Dim update As SegmentSpeedUpdate = New SegmentSpeedUpdate("S1256", velocity) End Sub • SegmentRelativeSpeedUpdate - 速度の差分を指定して、セグメントの速度を更新します。 次のコード例では、指定されたルート セグメント (T1256) の速度を毎時 5 マイル (Velocity(5, VelocityUnit.Mph)) 増加します。 Public Shared Sub New_SegmentRelativeSpeedUpdate() ' Create the velocity object Dim velocity As Velocity = New Velocity(5, VelocityUnit.Mph) ' Increase the speed by 5 mph. Dim update As SegmentRelativeSpeedUpdate = New SegmentRelativeSpeedUpdate("T1256", velocity) End Sub 400 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング • SegmentPercentageSpeedUpdate - デフォルトの速度に対するパーセントを指定して、セグメント の速度を更新します。 次のコード例では、指定されたルート セグメントの速度を 20% 増加します ("S1256", 20)。 Public Shared Sub New_SegmentPercentageSpeedUpdate() ' Increase the speed by 20 percent. Dim update As SegmentPercentageSpeedUpdate = New SegmentPercentageSpeedUpdate("S1256", 20) End Sub 一時更新を使用したポイントの変更 ルート レスポンスを取得した後で、実際の交通状況がもっと遅い、またはもっと速いことがわ かっている場所 (ポイント) が結果に含まれていることに気付く場合があります。一時更新を利用 して、そのポイントに最も近いロード セグメントの速度を設定し、ルートを再計算することで、 より正確な結果が得られます。次のクラスを使用して、さまざまなポイント一時更新を実行でき ます。 • PointSpeedUpdate - ポイントに最も近いセグメントの速度を新しい速度に更新します。 次のコード例では、指定されたポイント (pt) に最も近い道路に新しい速度として毎時 50 マイル (Velocity(50, VelocityUnit.Mph)) を設定します。 Public Shared Sub New_PointSpeedUpdate() ' Create a point Dim coordSys As MapInfo.Geometry.CoordSys = Session.Current.CoordSysFactory.CreateFromPrjString("1, 104") Dim dpt As MapInfo.Geometry.DPoint = New MapInfo.Geometry.DPoint(-74, 42) Dim pt As MapInfo.Geometry.Point = New MapInfo.Geometry.Point(coordSys, dpt) ' Create the velocity object Dim velocity As Velocity = New Velocity(50, VelocityUnit.Mph) ' Create the update object Dim update As PointSpeedUpdate = New PointSpeedUpdate(pt, velocity) End Sub • PointRelativeSpeedUpdate - 速度の差分を指定して、ポイントに最も近いセグメントの速度を更 新します。 次の コ ー ド 例 で は、指 定 さ れ た ポイント (pt) に最も近い道路の速度を毎時 (Velocity(5, VelocityUnit.Mph)) 増加します。 5 マイル Public Shared Sub New_PointRelativeSpeedUpdate() ' Create a point Dim coordSys As MapInfo.Geometry.CoordSys = Session.Current.CoordSysFactory.CreateFromPrjString("1, 104") Dim dpt As MapInfo.Geometry.DPoint = New MapInfo.Geometry.DPoint(-74, 42) 開発者ガイド 401 ルーティング データを使用したリクエストの更新 Dim pt As MapInfo.Geometry.Point = New MapInfo.Geometry.Point(coordSys, dpt) ' Create the velocity object Dim velocity As Velocity = New Velocity(5, VelocityUnit.Mph) ' Increase the speed by 5 mph. Dim update As PointRelativeSpeedUpdate = New PointRelativeSpeedUpdate(pt, velocity) End Sub • PointPersentageSpeedUpdate - デフォルトの速度に対するパーセントを指定して、その場所に最 も近いポイントの速度を更新します。 次のコード例では、指定されたポイントに最も近い道路の速度を 20% 増加します (pt, 20)。 Public Shared Sub New_PointPercentageSpeedUpdate() ' Create a point Dim coordSys As MapInfo.Geometry.CoordSys = Session.Current.CoordSysFactory.CreateFromPrjString("1, 104") Dim dpt As MapInfo.Geometry.DPoint = New MapInfo.Geometry.DPoint(-74, 42) Dim pt As MapInfo.Geometry.Point = New MapInfo.Geometry.Point(coordSys, dpt) ' Increase the speed by 20 percent. Dim update As PointPercentageSpeedUpdate = New PointPercentageSpeedUpdate(pt, 20) End Sub 一時更新を使用した道路タイプ速度の変更 ルートを決定する前に、一部の交通情報 ( 工事、事故、ラッシュ アワーなど) がわかっていれば、 特定の道路タイプの速度を増加または減少したい場合があるでしょう。たとえば、祝祭日や週末 の道路状況を考慮して、 すべての高速道路の速度を下げることができます。また、特定の道路タ イプがルート計算に使用される可能性を低くすることもできます。最速のルートを決定する際に は、特定の道路タイプの移動速度を下げることで、その道路タイプの優先度が下がり、計算に使 用される可能性が低くなります。次のクラスを使用して、さまざまな道路タイプ一時更新を実行 できます。 • RoadTypeSpeedUpdate - 特定の道路タイプの速度を新しい速度に更新します。 次のコード例では、市街地のすべての主要道路 (RoadType.MAJOR_ROAD_URBAN) に新しい速度 として毎時 50 マイル (Velocity(50, VelocityUnit.Mph)) を設定します。 Public Shared Sub New_RoadTypeSpeedUpdate() ' Create the velocity object Dim velocity As Velocity = New Velocity(50, VelocityUnit.Mph) ' Create the update object Dim update As RoadTypeSpeedUpdate = New RoadTypeSpeedUpdate(RoadType.MAJOR_ROAD_URBAN, velocity) End Sub 402 MapXtreme 2008 v7.0.0 第 21 章 : ルーティング • RoadTypeRelativeSpeedUpdate す。 - 速度の差分を指定して、特定の道路タイプの速度を更新しま 次のコード例では、市街地のすべての主要道路 (RoadType.MAJOR_ROAD_URBAN) の速度を毎時 5 マイル (Velocity(5, VelocityUnit.Mph)) 増加します。 Public Shared Sub New_RoadTypeRelativeSpeedUpdate() ' Create the velocity object Dim velocity As Velocity = New Velocity(5, VelocityUnit.Mph) ' Increase the speed by 5 mph. Dim update As RoadTypeRelativeSpeedUpdate = New RoadTypeRelativeSpeedUpdate(RoadType.MAJOR_ROAD_URBAN, velocity) End Sub • RoadTypePercentageSpeedUpdate - デフォルトの速度に対するパーセントを指定して、道路タイ プの速度を更新します。 次 の コ ー ド 例 で は、市 街 地 の す べての主要道路の速度を (RoadType.MAJOR_ROAD_URBAN, 20)。 20% 増加します Public Shared Sub New_RoadTypePercentageSpeedUpdate() ' Increase the speed by 20 percent. Dim update As RoadTypePercentageSpeedUpdate = New RoadTypePercentageSpeedUpdate(RoadType.MAJOR_ROAD_URBAN, 20) End Sub 開発者ガイド 403 ルーティング データを使用したリクエストの更新 404 MapXtreme 2008 v7.0.0 22 線形リファレンス この章では、MultiCurve フィーチャ ジオメトリに関連付けられた M (指標) 値 を使用して線形ネットワークのマッピングと分析を行う MapXtreme の機能に ついて説明します。 この章の構成: 「線形リファレンスとは」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「線形リファレンスでの M 値の使用」. . . . . . . . . . . . . . . . . . . . . . . . 「曲線の順序」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「線形リファレンスのサンプル アプリケーション」 . . . . . . . . . . . . 406 406 409 410 線形リファレンスでの M 値の使用 線形リファレンスとは 線形リファレンスとは、従来のリファレンス座標系に代わって使用されるリファレンス システム であり、線形フィーチャの位置を地球上のポイントに結び付けます。線形リファレンスは、水資 源管理、輸送、石油やガスの探査など、多くの分野で使用されています。線形ネットワークの一 部としてマッピングできる物理的な資産はすべて、その資産または関連した条件やイベントにつ いて記述したデータを保持できます。そのデータは、位置の X および Y 座標と共に、MultiCurve オブジェクト上の M 値 (指標値) として格納されます。それらの M 値をさらにマッピングしたり分 析したりすることで、より適切なリソース管理を行えるようになります。 M 値は、線形リファレンスの基礎となるものです。M 値には、何らかの指標値が保持されます。 線形フィーチャに沿った各ポイントが、何か別のものを基準として確立された既知のポイントか ら参照されます。古典的な例の 1 つは、高速道路沿いに設けられたマイル マーカー ポストです。 マイル マーカーの ID は、M 値の一種であり、高速道路の合流点や郡境といった既知の場所からの 距離を参照しています。 M 値は、一般に、インフラストラクチャや運輸関連のデータ管理者が、ライン上に存在する資 産、条件、イベントに対して、より適切な視覚化、クエリ、監視、分析を行えるようにする目的 で使用します。たとえば、緊急コール センターのオペレータは、負傷者から知らされたマイル マーカーから、その負傷者の位置を特定できます。コール センターでは、マイル マーカーの位置 をあらかじめ把握しています。この情報を基に、コール センターでは、正しい場所に適切な人員 を派遣することができます。 MultiCurve と M 値をサポートする Geometry モデルの概要については、第 17 章、319 ページの「空 間オブジェクトと座標系」 を参照してください。 線形リファレンスでの M 値の使用 MapXtreme では、線形リファレンスおよび動的セグメンテーション機能を実現するために、 MultiCurve ジオメトリに対して指標 (M) 値を使用する操作がいくつか用意されています。これらの メソッドは、インスタンス化可能な MapInfo.Geometry.LinearReferencingOperations クラスの一部と して定義されています。このクラスは、必要に応じてプロパティを追加したり動作を拡張したり できる柔軟性を提供します。 これらの操作によって、線形ネットワークの複数の属性を同時に表示することができます。これ は動的セグメンテーションと呼ばれ、同じジオメトリのコピーを複数格納する必要がありませ ん。たとえば、高速道路は、舗装状態、車線種別、舗装材質などを表す個別の線形フィーチャに よって表現できます。これらはすべて同じ実世界のジオメトリを表していますが、複数の種類の 情報をより簡単に見ることができます。 406 MapXtreme 2008 v7.0.0 第 22 章 : 線形リファレンス MapXtreme に用意された線形リファレンスのサンプル アプリケーション 線形リファレンス メソッドは、1 次元の MultiCurve ジオメトリに適用される OGC Simple Feature Specification に従っています。MultiCurve は、いくつかの接続されていない曲線から構成される場 合もあります。つまり、MultiCurve に 2 つの Curve が含まれていて、一方の Curve の終点がもう一 方の Curve の始点と一致しない場合があります。ただし、操作に対しては、指標が MultiCurve 全 体に適用されるという想定で始点と終点の指標を与えることができます。この例やこれに類似し た例では、一方の曲線の終点ともう一方の曲線の始点の間で実際の位置データ (X, Y) が異なって いる場合でも、MapXtreme では指標値が同じと仮定されるとします。たとえば、高速道路ネット ワークで、いくつかの高速道路が互いに横切っていても交差はしていない (一方が他方を陸橋で越 えているため) 場合を考えます。このような場合、下を通っている高速道路の実際の線形表現は、 上を通っている高速道路の前後で物理的に切れている可能性があります。 LinearReferencingOperations クラスのメソッドは、3 つのカテゴリに分けることができます。 • • • 指標値決定メソッド 線形リファレンス操作 動的セグメンテーション操作 (PerpendicularOffset) 以 降 の セ ク シ ョ ン で は、こ れ ら の 操 作 に つ い て 簡 単 に 説 明 し ま す。詳 細 に つ い て は、 MapInfo.LinearReferencing 名前空間の説明も参照してください。 開発者ガイド 407 線形リファレンスでの M 値の使用 指標値決定メソッド このカテゴリを形成する操作は、MultiCurve 上の指標値の設定および管理を支援するヘルパ メ ソッドです。これらのメソッドを使用して、少なくとも 2 つの M 値がある場合に、MultiCurve 上 の欠けているノードを埋めることができます。または、M 値がまったくない場合は、相対的な開 始ノードと終了ノードを使用して M 値を設定します。1 つまたは 2 つの特定の場所の値が既知で あり、残りは距離に基づいて比例計算できることはよくあります。 • • • • • • • • CalculateMissingMeasures(MultiCurve) SetMeasures (MultiCurve, double startMeasure, double endMeasure) SetMeasuresAsDistance(MultiCurve, double startDistance) DropMeasures (MultiCurve) ScaleMeasures(MultiCurve, double scale) TranslateMeasures(MultiCurve, double offset) TranslateMeasures(MultiCurve) Reverse(MultiCurve) 線形リファレンス操作 2 番目のカテゴリの操作は、MultiCurve ジオメトリに沿って線形リファレンス システムを使用し、 特 定 の 指 標 値 の ポ イ ン ト を 見 つ け た り、2 つの指標値間のサブ曲線を抽出したりします。 MapXtreme では、これらのメソッドに入力される MultiCurve の各ノードの指標値を保存できます が、実際にすべてのユーザ データでジオメトリにリファレンス システムが保存されるわけではあ りません (または、この情報の保持を簡単には行えない格納テクノロジを使用しています)。した がって、一般にこれらのメソッドには、2 つのオーバーロードされた形式があります。1 つは、リ ファレンス システムが入力 MultiCurve 内で管理される形式であり、もう 1 つは、リファレンス シ ステムが入力 MultiCurve ジオメトリの最初と最後のノードに対応した開始および終了指標として 提供される形式です。 • • • • • • LocateAlong(MultiCurve, double Measure) LocateAlong(MultiCurve, double startMeasure, double endMeasure, double Measure) LocateMeasure (MultiCurve, Point) LocateMeasure (MultiCurve, double startMeasure, double endMeasure, Point) LocateBetween(MultiCurve, double subCurveStartMeasure, double subCurveEndMeasure) LocateBetween(MultiCurve, double startMeasure, double endMeasure, subCurveStartMeasure, double subCurveEndMeasure) double FeatureGeometry.Distance メソッド MapInfo.Geometry.FeatureGeometry クラスには、入力されたポイントが曲線上にない場合に MapXtreme で MultiCurve 上の指標値の特定に使用する、Distance メソッドのオーバーロードが含ま れています。このメソッドは、曲線から離れた入力ポイントと曲線上への投影ポイントとの間の 最 短 距 離ま た は 最 長 距 離 を 表 す MultiCurve を返します。最短か最長かを指定するために、 minimumDistance を ブ ー ル 値 と し て 渡す必要があります。最短距離が true です。返される MultiCurve は、LocateMeasure メソッドへの入力となり、これは入力ポイントから最も近い (または 最も遠い) MultiCurve 上のポイントを返します。 408 MapXtreme 2008 v7.0.0 第 22 章 : 線形リファレンス MultiCurve と渡された Point が異なる座標系にある場合は、MultiCurve インスタンスの座標系で Distance 操作が実行されます。生成される FeatureGeometry は常に、MultiCurve インスタンスと同 じ座標系にあります。 動的セグメンテーション操作 (PerpendicularOffset) PerpendicularOffset は、既存の MultiCurve から新しい MultiCurve を生成する操作です。これは、基 になる同じ x,y 座標でサブ曲線を抽出する前述のメソッドとは異なります。この操作は、元の MultiCurve から垂直方向に計測された距離である平行オフセット MultiCurve を作成します。この 新しい MultiCurve に対して、属性のクエリや結果の分析など、さらに処理を行うことができま す。 PerpendicularOffset は、M 値に基づいて MultiCurve をセグメントに分割することができる、線形 ネットワークの動的セグメンテーションの領域で使用されます。たとえば、道路建設アプリケー ションでは、建設中または修理中の高速道路のセクションのステータスを記述した、道路ネット ワークの M 値を使用できます。各セグメントは、マップ上で実際の道路から離れた位置に、独自 の配色やマークでステータスが一目でわかるように表示できます。Perpendicular を使用した動的セ グメンテーション アプリケーションの例については、410 ページの「線形リファレンスのサンプル アプリケーション」を参照してください。 PerpendicularOffset() メソッドの構文を次に示します。 • • PerpendicularOffset(MultiCurve, double distance) PerpendicularOffset(MultiCurve, double distance, DistanceUnit, int resolution) 正の distance 値は、ノード順 (ノード i からノード i+1 など)に進んだときに線の右側に垂直な方向 として解釈されます。負の distance は、左側となります。ゼロの distance は許可されません。 resolution は、丸みのある角に対して作成される弧に沿ってポイントを補間するために使用されま す。0 以上の値がサポートされ、最大値は 36 です。デフォルト値は 1 です。 この操作では、元の MultiCurve の指標値 (存在する場合) が保持されます。元の MultiCurve の標高 (Z) 値は保持されません。 曲線の順序 MapInfo.LinearReferencing 名前空間には、MultiCurve を構成する個々の曲線の並べ替え順序を処理 するための ICurveSorter インターフェイスが含まれています。並べ替え順序は、次の線形リファレ ンス操作を呼び出すときに重要となります。 • • • • • • 開発者ガイド CalculateMissingMeasures SetMeasures SetMeasuresAsDistance LocateAlong LocateMeasure LocateBetween 409 線形リファレンスのサンプル アプリケーション 並べ替え順序を指定しないと、MapXtreme では、最も長い曲線が最初に返され、残りの曲線は順 不 同 で 返 さ れ ま す。た と え ば、順 序 が指定されていない MultiCurve に対して CalculateMissingMeasures を使用した場合、MapXtreme では、MultiCurve 内での位置に基づいて、 ノードに対して誤った M 値を計算する可能性があります。正しい並べ替え順序を指定すること で、このような問題を避けることができます。 ICurveSorter インターフェイスは、曲線の順序を整数の配列として返す SortCurves メソッドを提供 します。その配列を使用して、曲線のリストを得ることができます。コード例については、『開 発者リファレンス』を参照してください。 注意 曲線の順序によってノードの x,y 位置が変化することはありません。 また、このインターフェイスは、DefaultCurveSorter クラスも提供します。このクラスは、インプ リメントされると、MultiCurve 自体が指定している構成曲線だけを返します。その SortCurve メ ソッドでは並べ替えが行われません。 線形リファレンスのサンプル アプリケーション MapXtreme のインストール場所にある Samples フォルダに、線形リファレンスのサンプル アプリ ケーションがあります。このアプリケーションは、道路の各種の特性を表す複数の平行線セグメ ントを生成します。この例では、舗装状態、最高速度ゾーン、および車線数を示す道路データ が、実際の道路に沿ったオフセット MultiCurve として表示され、特定の道路セクションの状態や 特性を示します。各特性または状態は、それぞれ異なるライン スタイルで表示されます。 一般的な MapXtreme テーブルでは、属性がフィーチャに全体として適用されます。線形ネット ワークでは、フィーチャに指標値と呼ばれる属性があり、線形ジオメトリ表現の各セグメントに 適用されます。たとえば、道路には一般に、表面状態の良いセクションと悪いセクション、また は修理中のセクションなどがあります。これらの状態が道路セグメントの全体と一致することは まれであり、MultiCurve 上の特定のノードと厳密に一致することもまれです。しかし、地球上の場 所に対してではなく、フィーチャを基準とした指標値を使用する線形リファレンス システムによ り、新しい便利な方法でセグメント データの取得、クエリ、表示、分析が可能になります。 線形リファレンス操作を通して、MapXtreme では MultiCurve をこれらの M 値に基づいて動的にセ グメント化できます。サポートされている操作の説明については、406 ページの「線形リファレン スでの M 値の使用」を参照してください。 410 MapXtreme 2008 v7.0.0 23 Web Feature Service MapXtreme では、マップ フィーチャのデータのホストおよびアクセスをイン ターネットや私設イントラネットの Web Feature Services (WFS) から行うことが できます。 この章の構成 「Web Feature Service」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「WFS サーバの処理について」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「WFS サーバの構成」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「MapXtreme WFS クライアントのプログラムによる使用」. . . . . . 「WFS レスポンスからのマップ レイヤの作成」 . . . . . . . . . . . . . . . 412 413 417 423 427 Web Feature Service MapXtreme は、Web Feature Service (WFS) をインプリメントしており、インターネットや私設イン トラネット経由でリクエストを送信して、Geography Markup Language 形式でエンコードされた地 理空間データを取得することができます。「Web Map Service」 は、マップ イメージを生成します が、WFS サーバに送信されるリクエストは、地理データを取得可能な XML 形式の GML を生成し ます。 基本的な WFS クライアントは、WFS サーバに 3 種類のリクエストを送信できます。1 つ目は機能 を取得するリクエストです。これはサーバに対して、地理データおよびそのデータに適用可能な 処理をリストするように要求します。2 つ目はフィーチャ タイプを記述するリクエストです。これ はサーバに対して、地理フィーチャのために提供できるデータを記述するように要求します。3 つ 目のリクエストは、サーバに対して、実際のデータを提供するように要求します。 WFS の地理データは、データに関する記述で構成されています。この段階では、取得したデータ は MapXtreme のマップ レイヤとして表示できません。ただし、MapXtreme の WfsClient を使用す ると、GML 出力を、MapXtreme で操作可能な MultiFeatureCollections に変換することができます。 これらのフィーチャ コレクションは、MapXtreme の他の FeatureCollection と同様に扱えるため、主 題図やラベルを適用し、さまざまな分析処理を実行できます。 MapXtreme WFS サーバのインプリメントは、WFS Basic プロファイルとして『1.0.0 OpenGIS? Web Feature Service Implementation Specification』に準拠しています。この文書は、www.opengis.org にあ ります。現時点で、MapXtreme の WFS インプリメントは、Transaction WFS 仕様には対応していま せん。 MapXtreme の WFS インプリメントによるフィーチャのリクエストは、HTTP GET または HTTP POST リクエストによって実行されます。レスポンスは、デフォルトでは GML2 で返されますが、 GML3 で返すようにリクエストすることもできます。 MapXtreme では、WFS を WFS サーバおよび WFS クライアントの 2 点でサポートしています。こ の章では、WFS サーバを構成して、ユーザ独自のデータを他のユーザからもアクセスできるよう にする方法について説明します。「WFS サーバの構成」を参照してください。 インターネット上の他の WFS サーバまたは私設イントラネットからデータにアクセスする方法に ついては、「MapXtreme WFS クライアントのプログラムによる使用」を参照してください。 以下のセクションでは、MapXtreme WFS を介して実行できる WFS サーバの処理について説明しま す。 412 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service WFS サーバの処理について MapXtreme WFS サーバ インプリメントの基礎となる WFS サーバの処理として、GetCapabilities、 DescribeFeatureType、および GetFeature の 3 つがあります。 GetCapabilities GetCapabilities リクエストは、WFS サーバへのクエリで、地理データおよびそのデータに対して実 行 可 能 な 処 理 の 観 点 か ら、こ の サ ー バ が 実 行 す る 処 理 に つ い て 詳 細 情 報 を 取 得 し ま す。 GetCapabilities リクエストに対するレスポンスは XML ドキュメントで返され、WFS がサポートす る処理および WFS で使用可能なフィーチャ タイプのリストが記述されています。WFS サーバに 初めてアクセスしたときには、サービスの機能をリクエストするのが一般的です。 GetCapabilities は、HTTP GET および HTTP POST に対応しています。 以下に、GetCapabilities リクエストからの XML 出力を示します。サポートされている機能、使用 可能なフィーチャ タイプ、フィーチャ タイプのデータのサブセットをリクエストするためのフィ ルタリング処理など、重要な機能のいくつかについてはボールド体で示しています。 <?xml version="1.0" encoding="utf-8" ?> - <WFS_Capabilities xmlns:ogc="http://www.opengis.net/ogc" xmlns:miwfs="http://www.mapinfo.com/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.opengis.net/wfs/1.0.0/WFScapabilities.xsd" version="1.0.0" updateSequence="0" xmlns="http://www.opengis.net/wfs"> - <Service> <Name>Sample WFS Server</Name> <Title>Sample WFS Server</Title> <OnlineResource>http://localhost/Wfs/GetFeature.ashx</OnlineResource> </Service> - <Capability> - <Request> - <GetCapabilities> - <DCPType> - <HTTP> <Get onlineResource="http://localhost/Wfs/GetFeature.ashx" /> <Post onlineResource="http://localhost/Wfs/GetFeature.ashx" /> </HTTP> </DCPType> </GetCapabilities> - <DescribeFeatureType> - <SchemaDescriptionLanguage> <XMLSCHEMA /> </SchemaDescriptionLanguage> - <DCPType> - <HTTP> <Get onlineResource="http://localhost/Wfs/GetFeature.ashx" /> <Post onlineResource="http://localhost/Wfs/GetFeature.ashx" /> </HTTP> </DCPType> </DescribeFeatureType> - <GetFeature> 開発者ガイド 413 - <ResultFormat> <GML2 /> </ResultFormat> - <DCPType> - <HTTP> <Post onlineResource="http://localhost/Wfs/GetFeature.ashx" /> </HTTP> </DCPType> </GetFeature> </Request> </Capability> - <FeatureTypeList> - <Operations> <Query /> </Operations> - <FeatureType> <Name>miwfs:USA</Name> <Title>Title for usa</Title> <Abstract>Abstract for USA</Abstract> <Keywords>Keywords for USA</Keywords> <SRS>epsg:4326</SRS> <LatLongBoundingBox minx="-179.62816" miny="18.925255" maxx="66.951403" maxy="71.42856" /> </FeatureType> </FeatureTypeList> - <ogc:Filter_Capabilities> - <ogc:Spatial_Capabilities> - <ogc:Spatial_Operators> <ogc:BBOX /> <ogc:Equals /> <ogc:Disjoint /> <ogc:Intersect /> <ogc:Within /> <ogc:Contains /> </ogc:Spatial_Operators> </ogc:Spatial_Capabilities> - <ogc:Scalar_Capabilities> <ogc:Logical_Operators /> - <ogc:Comparison_Operators> <ogc:Simple_Comparisons /> <ogc:NullCheck /> </ogc:Comparison_Operators> - <ogc:Arithmetic_Operators> <ogc:Simple_Arithmetic /> </ogc:Arithmetic_Operators> </ogc:Scalar_Capabilities> </ogc:Filter_Capabilities> </WFS_Capabilities> 414 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service DescribeFeatureType 使用 可 能 な フ ィ ー チ ャ タ イ プを GetCapabilities リクエストで検出したら、次は、 DescribeFeatureType リクエストを使用して、1 つまたは複数のフィーチャ タイプについての詳細情 報を取得します。MapXtreme では、WFS フィーチャ タイプはテーブルで表され、WFS フィーチャ はテーブルの一列の行に相当します。DescribeFeatureType リクエストに対するレスポンスには、 フィーチャ タイプの名前 (テーブルの名前)、テーブル内のプロパティの名前およびタイプ (フィー ルドの名前およびタイプ) などが含まれています。結果は、GML 形式の XML スキーマ ドキュメン トで返されます。 DescribeFeatureType は、HTTP GET および HTTP POST に対応しています。返されるスキーマは フォームを含んでいるため、フィーチャ タイプの各プロパティは要素になります。 MapXtreme は、以下のフィールド タイプをプロパティとして返しません。 • MIDbType.Binary • MIDbType.CoordSys • MIDbType.Grid • MIDbType.Key • MIDbType.Raster • MIDbType.Style 以下に、DescribeFeatureType レスポンス ドキュメントの一部を示します。このリクエストは、USA という名前のフィーチャ タイプについてのものです。この USA フィーチャ タイプには、ジオメト リ フィールド OBJ によって表されるいくつかのプロパティと、State および State_Name というデー タ フィールドがあります。 <?xml version="1.0" encoding="utf-8" ?> - <schema targetNamespace="http://www.mapinfo.com/wfs" xmlns:miwfs="http://www.mapinfo.com/wfs" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" /> <xs:import namespace="http://www.opengis.net/wfs" schemaLocation="http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd" /> <xs:element name="USA" type="miwfs:USA_Type" substitutionGroup="gml:_Feature" /> - <xs:complexType name="USA_Type"> - <xs:complexContent> - <xs:extension base="gml:AbstractFeatureType"> - <xs:sequence> - <xs:element name="Obj" minOccurs="0" maxOccurs="1"> - <xs:complexType> - <xs:sequence> <xs:element ref="gml:_Geometry" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="State" nillable="false" type="xs:string" minOccurs="0" maxOccurs="1" /> <xs:element name="State_Name" nillable="false" type="xs:string" minOccurs="0" maxOccurs="1" /> 開発者ガイド 415 </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </schema> GetFeature 使用可能なフィーチャ タイプおよびそのプロパティがわかったら、WFS フィーチャ情報を取得す る最後の手順として、GetFeature リクエストを送信します。このリクエストは、フェッチする フィーチャおよびプロパティを指定します。フィーチャのサブセットを取得する場合は、フィル タリングを使用してクエリを空間的および非空間的、あるいはそのいずれかで制限します。 「コード例: フィルタを使用したフィーチャのリクエスト」を参照してください。 GetFeature は HTTP POST に対応しています。 OGC でサ ポ ー ト さ れ る パ ラ メ ー タ のうち、Request と TypeName は必須です。PropertyName、 Filter、FeatureID などのパラメータは省略できます。FeatureID を指定した場合、TypeName は省略 可能です。詳細については、『OGC Web Feature Service Implementation Specification』を参照してく ださい。 以下の例は、USA というフィーチャ タイプに関する FeatureResponse の一部です。 <?xml version="1.0" encoding="utf-8" ?> - <wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.mapinfo.com/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd http://www.mapinfo.com/wfs http://localhost/Wfs/GetFeature.ashx?REQUEST=DescribeFeatureType&SERVICE= WFS&VERSION=1.0.0&TYPENAME=miwfs:USA"> - <gml:boundedBy> <gml:null>inapplicable</gml:null> </gml:boundedBy> - <gml:featureMember> - <USA> <State>AK</State> </USA> </gml:featureMember> - <gml:featureMember> - <USA> <State>AL</State> </USA> </gml:featureMember> - <gml:featureMember> - <USA> <State>AR</State> </USA> </gml:featureMember> - <gml:featureMember> - <USA> <State>AZ</State> </USA> 416 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service </gml:featureMember> - <gml:featureMember> - <USA> <State>CA</State> </USA> </gml:featureMember> - <gml:featureMember> - <USA> <State>CO</State> </USA> </gml:featureMember> ... </wfs:FeatureCollection> WFS サーバの構成 他のユーザに空間データを提供する場合、最初に WFS サーバを構成して、提供するデータおよび 処理を定義する必要があります。この定義を行うのに必要な構成ファイルが 2 つあります。ここで は、スキーマおよび Web サービスを操作する知識があることを前提として説明します。 他のユーザの WFS サーバにアクセスしてフィーチャを取得するだけであれば、WFS サーバを構成 する必要はありません。423 ページの「MapXtreme WFS クライアントのプログラムによる使用」 を参照してください。 このセクションで説明する主要な構成手順は、以下のとおりです。 手順 1: Web.config ファイルを作成または変更して、MapXtreme 固有の WFS 情報を指定します。 手順 2: ホスティング対象となるデータに関する情報を含む有効な WFS サーバ構成ファイルを作成 します。このファイルは、WFS サーバの実行時にエラーが発生しないように、WFS スキーマ ファ イル (MXP_WFSConfiguration_1_0.xsd) と比較検証する必要があります。 手順 3: WFS サーバのセットアップを構成およびテストします。 MapXtreme の製品 CD には Web.config ファイルおよび WFS 構成ファイルのサンプルが収録されて い ま す。こ れ ら の フ ァ イ ル は、独 自 の フ ァ イ ル を 作 成 す る 際 に 手 本 と し て 使 用 で き ま す。 Web.config ファイルには、ASP プロセスの処理方法が定義されています。WFSSample.xml には、 WFS サーバで提供するデータ ソースおよびフィーチャの定義が記述されています。 製品 CD には、MapXtreme ワークスペースおよび WFS サーバのスキーマも収録されています。 手順 1: Web.config ファイルの作成 Web.config は、Web アプリケーション用の標準的な構成ファイルです。このファイルを MapXtreme WFS サーバで使用するには、ファイルを編集して MapXtreme 固有の WFS 情報を指定し、ASP.NET プロセスの処理方法を定義する必要があります。 1. Web.config および WFSSample.xml を含むフォルダを作成します。この例では、c:\wfs に作成し ます。 2. MapXtreme CD に収録されている Web.config および WFSSample.xml をこのフォルダにコピーし ます。 開発者ガイド 417 WFS サーバの構成 3. Web.config をテキスト エディタで開き、<appSettings"> 行を WFS 構成ファイルを参照するよう に変更します。 <configuration> <appSettings> <add key="configFile" value="C:\wfs\WFSSample.xml" /> 4. さらにファイルの下の箇所で、MapInfo.Wfs.Server および MapInfo.CoreEngine アセンブリの バージョン番号を更新し、必要に応じて PublicKeyToken も更新します。この情報を見つけるに は、[スタート] メニューの [ファイル名を指定して実行] をクリックします。[ファイル名を指定 して実行] ダイアログ ボックスで、assembly と入力して、インストールされているアセンブ リのリストを表示します。この例では、アセンブリのバージョン番号は 7.0.0.530 です。 <system.web> <httpHandlers> <add verb="GET,POST" path="*.ashx" type="MapInfo.Wfs.Server.HttpHandler, MapInfo.Wfs.Server, Version=7.0.0.530, Culture=neutral, PublicKeyToken=5539cc02a8223bb3"/> </httpHandlers> <httpModules> <add type="MapInfo.Engine.WebSessionActivator, MapInfo.CoreEngine, Version=7.0.0.530, Culture=neutral, PublicKeyToken=93e298a0f6b95eb1" name="WebSessionActivator" /> </httpModules> 5. このファイルを保存し、手順 1 で作成したフォルダにコピーします。 手順 2: ホストするフィーチャ用の有効な WFS 構成ファイルの作成 WFSSample.xml は、MapXtreme に付属する WFS 構成ファイルです。このファイルには、WFS サー バに関する情報として、サーバの名前、タイトル、概要、WFS サーバの URL、ホストするデータ などが定義されています。 1. WFSSample.xml をテキスト エディタで開き、OnlineResource 行を変更して WFS サーバの URL を指定します。localhost を、WFS サーバに応じて適切な値に変更します。 <mxp-wfs:Service> <mxp-wfs:Name>Sample WFS Server</mxp-wfs:Name> <mxp-wfs:Title>Sample WFS Server</mxp-wfs:Title> <!-- The following is the URL of the WFS server --> <mxp-wfs:OnlineResource>http://localhost/wfs/GetFeature.ashx</mxpwfs:OnlineResource> </mxp-wfs:Service> 必要に応じて、サーバ名、タイトル、概要、料金、アクセス制約などの要素も変更できます。 2. 各テーブルの Table 要素を個別に作成して、WFS で処理するテーブルを登録します。<mxpwfs:DataSourceDefinition> の id の値は <mxp-wfs:Name> の値と一致している必要があります。 テーブルは任意の順序で登録できます。 3. <DataSourceDefinitionSet> で、MYPATH 変数を変更してデータへの実際のパスを指定します。 以下は、フィーチャの 2 つのテーブルを識別する WFSSample.xml の一部です。 <mxp-wfs:Table> <mxp-wfs:Name>USA</mxp-wfs:Name> 418 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service <mxp-wfs:Title>Title for usa</mxp-wfs:Title> <mxp-wfs:Abstract>Abstract for USA</mxp-wfs:Abstract> <mxp-wfs:Keywords>Keywords for USA</mxp-wfs:Keywords> <mxp:DataSourceDefinitionSet> <mxp:TABFileDataSourceDefinition id="USA"> <mxp:DataSourceName>USA</mxp:DataSourceName> <mxp:FileName>MYPATH\USA.TAB</mxp:FileName> </mxp:TABFileDataSourceDefinition > </mxp:DataSourceDefinitionSet> </mxp-wfs:Table> <mxp-wfs:Table> <mxp-wfs:Name>US_HIWAY</mxp-wfs:Name> <mxp-wfs:Title>Title for US_HIWAY</mxp-wfs:Title> <mxp-wfs:Abstract>Abstract for US_HIWAY</mxp-wfs:Abstract> <mxp-wfs:Keywords>Keywords for US_HIWAY</mxp-wfs:Keywords> <mxp:DataSourceDefinitionSet> <mxp:TABFileDataSourceDefinition id="US_HIWAY"> <mxp:DataSourceName>US_HIWAY</mxp:DataSourceName> <mxp:FileName>MYPATH\US_HIWAY.TAB</mxp:FileName> </mxp:TABFileDataSourceDefinition > </mxp:DataSourceDefinitionSet> </mxp-wfs:Table> 4. WFS でホストするデータが RDBMS に格納されている場合は、<ConnectionSet> および <ConnectionMember> 要素を以下の例のように指定します。 <mxp:ConnectionSet> <mxp:DBConnection dbType="sqlserver"> <mxp:ConnectionName>sqlserver2k</mxp:ConnectionName> <mxp:ODBCConnectionString>DRIVER={SQL Server};DATABASE=YOURDB;Server=YOURSERVER;UID=YOURUSER;PWD=YOURPASSWORD;Q uotedID=No;Trusted_Connection=No;Network=DBMSSOCN;Address=YOURSERVER,YOUR SERVERPORT</mxp:ODBCConnectionString> </mxp:DBConnection </mxp:ConnectionSet> ... <mxp-wfs:Table> <mxp-wfs:Name>MySQLServerTable</mxp-wfs:Name> <mxp-wfs:Title>Title for MySQLServerTable</mxp-wfs:Title> <mxp-wfs:Abstract>Abstract for MySQLServerTable</mxpwfs:Abstract> <mxp-wfs:Keywords>Keywords for MySQLServerTable</mxpwfs:Keywords> <mxp:DataSourceDefinitionSet> <mxp:DBDataSourceDefinition id="MySQLServerTable"> <mxp:DataSourceName>MySQLServerTable</mxp:DataSourceName> <mxp:ConnectionMember> <mxp:ConnectionName>my_sqlserver2000_advserver</mxp:ConnectionName> </mxp:ConnectionMember> <mxp:DBQuery> <mxp:Query>select * from MySQLServerTable</mxp:Query> </mxp:DBQuery> <mxp:DBDataSourceMetadata/> 開発者ガイド 419 WFS サーバの構成 </mxp:DBDataSourceDefinition> </mxp:DataSourceDefinitionSet> </mxp-wfs:Table> 手順 3: WFS サーバの構成およびテスト Web.config お よ び WFSSample.xml フ ァ イルを編集できたら、WFS サーバを Internet Information Services に登録し、最後にセットアップをテストする必要があります。 1. WFS フォルダ (c:\wfs など) を右クリックし、[共有とセキュリティ] を選択します。[Web 共有] タブで、[このフォルダを共有する] を選択します。Web サーバのエイリアスを設定する場合 は、[追加] ボタンをクリックします。 2. IIS を開きます ([スタート] メニュー、[すべてのプログラム]、[コントロール パネル]、[管理 ツール]、[インターネット インフォメーション サービス])。[既定の Web サイト] を展開し、 WFS サーバを見つけます (フォルダ名、またはエイリアスを設定している場合はエイリアスで 探します)。 3. Web サイトを右クリックし、[プロパティ] を選択します。[ASP.NET] タブで、[ASP.NET バー ジョン] ドロップダウン リストから [2.0.50727] を選択します (MapXtreme アセンブリは 2.0 Framework でコンパイルされています)。 420 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service 4. 同じプロパティ ダイアログ ボックスの [ディレクトリ セキュリティ] タブで、右上にある [編集 ] ボタンをクリックします。[認証方法] ダイアログ ボックスで、[匿名アクセス] チェック ボッ クスをオンにします。これにより、WFS サービスのユーザはユーザ名とパスワードを指定する 必要がなくなります。[OK] を 2 回クリックして、IIS ウィンドウを閉じます。 5. Web ブラウザから 「GetCapabilities」 リクエストを送信して、セットアップをテストします。 アドレス ボックスに、以下のように入力します。 http://localhost/wfs/GetFeature.ashx?REQUEST=GetCapabilities&SERVICE=W FS&VERSION=1.0.0 localhost は、使用する Web サーバで置き換えます。Web サーバにエイリアスを設定してい る場合は、URL にエイリアスを指定します。たとえば、次のようになります。 http://localhost/My_WFS/GetFeature.ashx?REQUEST=GetCapabilities&SERVIC E=WFS&VERSION=1.0.0 テストが成功した場合、下図のような Web ページが表示されます。機能が返されない場合は、 構成ファイルにすべての入力事項が正しく入力されていることを確認します。構成ファイルは 手作業で作成しているため、入力ミスが起きやすく、タグが消えてしまうこともあります。 開発者ガイド 421 WFS サーバの構成 6. 返されるフィーチャ タイプのプロパティを取得するには、「DescribeFeatureType」 リクエスト を送信します。 http://localhost/My_wfs/GetFeature.ashx?REQUEST=DescribeFeatureType&SE RVICE=WFS&VERSION=1.0.0&Typename=miwfs:USA このリクエストは、フィーチャ タイプ USA のプロパティの記述を返します。たとえば、 フィールド名として State および State_Name があります。 7. USA テーブルにフィーチャを要求するには、「GetFeature」 リクエストを送信します。 http://localhost/My_wfs/GetFeature.ashx?REQUEST=GetFeature&SERVICE=WFS &VERSION=1.0.0&Typename=miwfs:USA&propertyname=miwfs:State_Name このリクエストは、USA テーブルからフィーチャを FeatureCollection として返します。上記の URL では、USA テーブルの 2 つのフィールド プロパティのうち、State_Name のみをリクエス トしていることに注意してください。プロパティ名を何も指定しない場合は、テーブルのすべ てのプロパティが返されます。 422 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service MapXtreme WFS クライアントのプログラムによる使用 MapXtreme には、OGC 準拠の Web Feature Service のデータにアクセスするためにプログラムによ り使用できる WFS クライアントが用意されています。MapXtreme の WfsClient は、WFS 1.0.0 準拠 の任意のサーバと API レベルで対話できます。WfsClient と関連クラスは MapInfo.Wfs.Client 名前空 間にあり、OGC 仕様の WFS Basic 部分を使用します。WfsClient クラスを使用すると、WFS 1.0.0 準拠の任意のサーバにある 「GetCapabilities」、「DescribeFeatureType」、および 「GetFeature」 の 各メソッドを呼び出すことができます。 public void MapInfo_Wfs_Client_GetCapabilities1(string Url) { WfsCapabilities capabilities = WfsClient.GetCapabilities(RequestMethod.GET, Url); FeatureTypeList featureTypeList = capabilities.FeatureTypeList; IList featureTypes = featureTypeList.FeatureTypes; foreach (FeatureType featureType in featureTypes) { System.Console.WriteLine("FeatureType: " + featureType.Name); } } WFS クエリでのフィルタの使用 IFilter インターフェイスを使用して GetFeature リクエストにフィルタを適用できます。空間または 非空間 (スカラー) のフィルタを使用できます。Bbox や Within などの空間フィルタを使用すると、 特定の領域に存在するフィーチャを取得できます。スカラー フィルタを使用すると、フィーチャ タイプの特定のプロパティに基づいてクエリを実行できます。AND や OR を使用した複合フィル タも使用できます。 開発者ガイド 423 MapXtreme WFS クライアントのプログラムによる使用 MapXtreme の WFS は、以下のフィルタ処理に対応しています。 • • • 空間演算子: BBox、Equals、Disjoint、Intersects、Within、Contains 非空間比較演算子: 論理演算子: AND、OR、および NOT、PropertyIsEqualTo、 P r o p e r t y I s G r e a t e r T h a n 、P r o p e r t y I s G r e a t e r T h a n O r E q u a l To 、P r o p e r t y I s L e s s T h a n 、 PropertyIsLessThanOrEqualTo、PropertyIsNotEqualTo 単純な算術演算子: Add、Div、Mul、Sub 注意 HTTP プロトコルの場合、GetFeature リクエストで使用する URL は 2048 文字以下に制限さ れています。フィルタ処理ではこの制限をすぐに超えてしまうことがあるので注意してく ださい (制限を超えると例外が発生します)。 コード例: フィルタを使用したフィーチャのリクエスト 以下の C# コード例は、WFS データにフィルタを使用して必要なデータのみを取得する方法を示し ています。この例では、まず、WFS サーバにクエリを実行して使用可能なフィーチャを取得しま す。次に、WorldCap の人口フィールドが 1,000,000 以上のフィーチャのみを返すようにリクエスト します。GetCapabilities および GetFeatures メソッドの出力は、コード例の後に示しています。 private void doWFS() { string wfsUrl = @"http://localhost/MXTWFS/GetFeatures.ashx"; /// first we need to get the list of capabilities and list out /// the tables available /// MapInfo.Wfs.Client.WfsCapabilities capabilities = MapInfo.Wfs.Client.WfsClient.GetCapabilities( MapInfo.Wfs.Client.RequestMethod.GET, wfsUrl); MapInfo.Wfs.Client.FeatureTypeList featureTypeList = capabilities.FeatureTypeList; IList featureTypes = featureTypeList.FeatureTypes; foreach (MapInfo.Wfs.Client.FeatureType featureType in featureTypes) { System.Console.WriteLine("FeatureType: " + featureType.Name); } /// Now we can look at a specific table to see its contents /// string featureTypeName = "miwfs:WorldCap"; // Name taken from /// the above output MapInfo.Data.MultiFeatureCollection mfc = MapInfo.Wfs.Client.WfsClient.GetFeature(wfsUrl, new string[] { featureTypeName }, null, "GML3", -1, null); DisplayFeatureCollection(mfc[0]); /// Now we can apply a filter /// MapInfo.Wfs.Client.IFilter filter = new MapInfo.Wfs.Client.PropertyIsGreaterThanOrEqualTo( 424 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service new MapInfo.Wfs.Client.PropertyName(wfsUrl, "CAP_POP"), new MapInfo.Wfs.Client.Literal("1000000")); /// Create the Query container /// IList queries = new MapInfo.Wfs.Client.Query[] { new MapInfo.Wfs.Client.Query(new MapInfo.Wfs.Client.TypeName("http://www.mapinfo.com/wfs", "WorldCap"), null, filter) }; /// Run the filter and return the subset. /// mfc = MapInfo.Wfs.Client.WfsClient.GetFeature( wfsUrl, queries, "GML3", -1); DisplayFeatureCollection(mfc[0]); } 上記の GetCapabilities コードの出力は、以下のとおりです。 FeatureType: FeatureType: FeatureType: FeatureType: miwfs:Ocean miwfs:WldCty25 miwfs:World miwfs:WorldCap 最初の GetFeature の呼び出しで、WorldCap のすべてのフィーチャ (行) を取得します (一部を下に示 します)。1 行目は WorldCap データのフィールドで、2 行目以降は各データの行です。 Obj, Capital, Country, Cap_Pop, MI_Style, Point,Abidjan,IVORY COAST,2700000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Abu Dhabi,UNITED ARAB EMIRATES,722000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Accra,GHANA,949000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Addis Ababa,ETHIOPIA,1423111,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Agana,GUAM,132726,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Algiers,ALGERIA,1483000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Alma-ata,KAZAKHSTAN,1108000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Alofi,NIUE,3300,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Amman,JORDAN,936000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Amsterdam,NETHERLANDS,694656,MapInfo.Styles.SimpleVectorPointStyle: 12 point, ... フィルタ処理された GetFeature の呼び出しからは、PropertyIsGreaterThanOrEqualTo の条件 (人口 1,000,000) を満たす行のみが返されます。Abu Dhabi は人口が 722,000 であるため結果に含まれてい ません。 開発者ガイド 425 MapXtreme WFS クライアントのプログラムによる使用 Obj, Capital, Country, Cap_Pop, MI_Style, Point,Abidjan,IVORY COAST,2700000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Addis Ababa,ETHIOPIA,1423111,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Algiers,ALGERIA,1483000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Alma-ata,KAZAKHSTAN,1108000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Ankara,TURKEY,2553000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Baghdad,IRAQ,3400000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, Point,Baku,AZERBAIJAN,1115000,MapInfo.Styles.SimpleVectorPointStyle: 12 point, ... 空間演算子によるフィルタリング 以下の例は、GetFeature リクエストで空間クエリを使用する方法を示しています。この例では、指 定した最小外接四角形を満たすすべての行を Europe テーブルから取得します。この処理を適切に 行うために空間演算子 Bbox を使用します。これは、ほとんどの WFS サーバが対応している空間 演算子です。 /// Now lets find rows in an MBR /// // WGS84 - Europe MapInfo.Geometry.DRect bbox = new MapInfo.Geometry.DRect(11.69, 35.36, 48.77, 65.05); mfc = MapInfo.Wfs.Client.WfsClient.GetFeature( wfsUrl, new string[] { featureTypeName }, bbox, null, "GML3", -1); DisplayFeatureCollection(mfc[0]); 426 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service WFS レスポンスからのマップ レイヤの作成 WFS フィーチャ データを MapXtreme にマップ レイヤとして移してさらに分析を行う場合、GML を解析して MultiFeatureCollection を作成するコードを実行する必要があります。 WFS レスポンスの解析 レスポンスの解析は、WFS 仕様で指定されていません。また、仕様では GetFeature リクエストの 結果の具体的な形式も定められていません。WFS 仕様では、リクエストが GML2 以上である必要 があると決められているだけです。GML2 には複数のバージョンがあるので、MapXtreme WFS ク ライアントで WFS サーバからの GML2 のレスポンスを正しく変換するには、開発者が GML2 の GetFeature のレスポンスを MapXtreme の MapInfo.Data.MultiFeatureCollection に変換するパーサーを 作成する必要があります。そのためには、IWfsReader インターフェイスをインプリメントし、こ のインプリメントを MapInfo.Wfs.Client.WfsReaderFactory クラスに登録します。登録は URL ごとに 必要です。つまり、同じ GetFeature レスポンスがある 2 つの WFS サーバと対話したい場合は、各 サーバ URL 用に IWfsReader のインプリメントを 2 回登録する必要があります。インターフェイス 全体 を イ ン プ リ メ ン ト す る 必 要はありません。MapInfo.Wfs.Client.WfsReader クラスは、 ReadGetFeature(XmlReader) メソッドをオーバーライドするように拡張できます。その他のメソッド は、非準拠の WFS サーバとの対話中にオーバーライドされる可能性があります。 以下のコード例は、フィーチャをリクエストし、マップ レイヤを作成して、フィーチャをマップ に表示するまでのプロセス全体を示しています。この例で使用しているコードは、MapXtreme を インストールした場所の \Samples フォルダに展開される WfsClient サンプル アプリケーションに含 まれています。 using using using using System; System.Drawing; System.Windows.Forms; System.Xml.Schema; using using using using MapInfo.Data; MapInfo.Engine; MapInfo.Mapping; MapInfo.Wfs.Client; namespace MapInfo.Wfs.Client.Samples { /// <summary> /// Simple sample to demonstrate how to register a WfsReader to handle /// requests from a specific Wfs server, get the capabilities of the server, /// get the schema for a feature type located on the server and getting all /// of the features from the server. /// </summary> class SimpleSample { private const string URL = "http://www.mapinfo.com/miwfs"; private const string defaultExportFileName = "WfsClient.gif"; [STAThread] static void Main(string[] args) { 開発者ガイド 427 MapXtreme WFS クライアントのプログラムによる使用 string exportFileName = defaultExportFileName; if (args.Length > 0 && args[0] != null && args[0].Trim().Length != 0) exportFileName = args[0]; // register URL with a specific WFS reader WfsReaderFactory.RegisterHandler(URL, typeof(WfsReader)); // Get the WFS capabilities of the WFS server using the HTTP GET method. try { // Get the WFS capabilities of the WFS server using the HTTP GET method. WfsCapabilities Capabilities = WfsClient.GetCapabilities(RequestMethod.GET, URL); } catch { MessageBox.Show("Please check if " + URL + " is a valid WFS URL"); return; } // Do something with the the WfsCapabilities here... // Get the schema for the USA feature type string[] TypeNames = new string[] { "miwfs:USA" }; // Do something with the schema here... XmlSchema usaSchema = WfsClient.DescribeFeatureType(URL, TypeNames); // Get all features from the USA feature type MultiFeatureCollection usa = WfsClient.GetFeature(URL, TypeNames, null, null, -1, null); IFeatureCollection fc = usa[0]; // iterate over the Usa MultiFeatureCollection and add each // IFeatureCollection to a MemTable, etc... TableInfoMemTable memTableInfo = new TableInfoMemTable("myMemTable"); foreach (Column c in fc.Columns) { memTableInfo.Columns.Add(c); } Table memTable = Session.Current.Catalog.CreateTable(memTableInfo); memTable.InsertFeatures(fc); // create a layer from the MemTable FeatureLayer featureLayer = new FeatureLayer(memTable); 428 MapXtreme 2008 v7.0.0 第 23 章 : Web Feature Service // create the map and add the layer Map map = Session.Current.MapFactory.CreateEmptyMap(new Size(500, 500)); map.Layers.Add(featureLayer); // export the map to a file using (MapExport mx = new MapExport(map)) { mx.Format = ExportFormat.Gif; mx.Export(exportFileName); } // clean up the map Session.Current.MapFactory.Remove(map); } } } 開発者ガイド 429 MapXtreme WFS クライアントのプログラムによる使用 430 MapXtreme 2008 v7.0.0 24 ワークスペース マネー ジャ MapXtreme に付属のワークスペース マネージャ ユーティリティを使用する と、XML ベースのワークスペース ファイル (.MWS 形式) を作成および管理で きます。ワークスペース マネージャの便利なユーザ インターフェイスを使用 すると、マップを構成するテーブルを簡単に構築したり、数多くの追加設定を 適用したりできます。また、マップをワークスペースとして保存することも可 能です。完成したワークスペースは独自のアプリケーションで使用できます。 印刷したり、ファイルに出力したりすることもできます。 この章の構成: 「ワークスペース マネージャの機能」 . . . . . . . . . . . . . . . . . . . . . . . . 「ワークスペースの形式と内容」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「ワークスペース マネージャのメニュー コマンド」 . . . . . . . . . . . 「レイヤの管理」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「ワークスペース マネージャの機能の使用」 . . . . . . . . . . . . . . . . . . 432 433 433 443 456 ワークスペース マネージャの機能 ワークスペース マネージャを使用すると、ワークスペース ファイルに格納できる大部分の設定を 制御できます。たとえば、ワークスペースにはシンボル凡例や修飾に関する情報を含めることが 飾を作成するには、API を使用します。 ワークスペース マネージャを使用すると、以下の操作を行うことができます。 • • • • • • • • • • • • • • • • • • 432 XML ワークスペース、テーブル、Geoset、および MapInfo ワークスペース (.wor ファイルでは なく .mws ファイル) を読み込む。 ワークスペースを .MWS として保存する。 ワークスペースの一部として開くテーブルを制御する。 名前付き接続マネージャを使用して名前付き接続を作成し、読み込む。 マップを追加または削除する、および 1 つ以上のマップを表示する。 マップ ウィンドウ上部のタブを使用してマップを切り替える。 組み込みのレイヤ管理ウィンドウを使用して、マップとレイヤの表示/非表示、レイヤとラベル のスタイル、および主題図のプロパティを設定する。 カスタム ラベルを追加、削除、または変更する。 グループ レイヤを作成する。これにより、レイヤを論理グループにまとめて、グループ全体を 1 回のクリックで表示または非表示できるようになります。 前または次の複数のマップ ビューを表示する。 マップ ツールを使用して移動および手動ラベル配置を行い、選択ツールを使用してレイヤの選 択可能性の設定が正しいかどうかを確認する。 マップをプレビューおよび印刷する。 最近使用したワークスペースを、最近使用したファイルのリストから簡単に開く。 マップ、ラベル、および主題図レイヤに対する半透明効果を作成する。 折れ線フィーチャに対する湾曲ラベルを作成する。 経緯度線レイヤをマップに追加する。 ラスタ レイヤを現在のマップ ウィンドウの投影法に再投影する。 ラスタ レイヤとベクトル レイヤで構成されるマップ ウィンドウを、異なる投影法に再投影す る。 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ • 拡張機能を追加して、ワークスペース る。 マネージャおよびレイヤ管理にカスタム機能を追加す ワークスペースの形式と内容 ワークスペース ファイルは、ワークスペースを構成するすべてのマップ、テーブル、レイヤ、お よび設定の場所、説明、およびメタデータが記述された XML ドキュメント (拡張子は .MWS) で す。XML 形式なので移動することができます。つまり、別のコンピュータ、別のネットワーク、 または別のサイトで作業している他のユーザとワークスペースを共有できるのです。 この XML ワークスペースの移植性は、MapXtreme では名前付き接続によってインプリメントされ ています。名前付き接続を使用すると、別のドライブ、パス、およびデータベース接続情報を独 自の環境に基づいて定義できます。これにより、他のユーザが作成したワークスペースを使用で きるようになります。すべてのパスと接続文字列は、ワークスペースを開くときに解決されま す。名前付き接続はワークスペース マネージャで直接設定できます ([ファイル]、[名前付き接続の 管理] の順に選択します)。XML ワークスペース構造の詳細については、付録 D: 「MapInfo ワーク スペースについて」を参照してください。 ワークスペース マネージャのメニュー コマンド ここでは、ワークスペース マネージャで利用できる各メニュー コマンドについて説明します。 [ファイル] メニューのコマンド [ファイル] メニューのコマンドは、ファイルのオープン、保存、印刷など、一般的なファイル メ ニュー機能すべてと、ワークスペース マネージャに固有の一部の機能を提供します。各コマンド について以下に説明します。 開発者ガイド 433 ワークスペース マネージャのメニュー コマンド 新しいワークスペース 新しい空のファイルを作成します。ファイルを作成したら、レイヤ管理ウィンドウの追加ツール または [ファイル] メニューの [テーブルを開く] を使用してテーブルを追加できます。現在のワー クスペースに変更を加えた場合は、新しいワークスペースを作成する前に、変更を保存するかど うかの確認が求められます。 開く 既存のワークスペースまたはテーブルを開きます。現在のワークスペースに変更を加えた場合 は、既存のワークスペースを開く前に、変更を保存するかどうかの確認が求められます。1 つ以上 のテーブルを開き、それらをマップに追加できます。 ワークスペースの挿入 1 つまたは複数のワークスペースのマップおよびテーブルを、現在のワークスペースに追加しま す。 ワークスペースを閉じる 変更を保存するかどうかの確認が求められ、ワークスペースを閉じます。 ワークスペースを保存する マップをワークスペースとして保存します。 名前を付けて保存 ワークスペースのコピーを新しいファイル名で保存します。 名前付き接続を使用して保存 名前付き接続の情報をワークスペースに保存します。また、435 ページの「名前付き接続の管理」 も参照してください。 すべてのテーブルを閉じる 開いているすべてのテーブルを閉じます。 テーブルの管理 マップを構成しているテーブルがリストされたダイアログ ボックスを表示します。また、マップ に含める追加のテーブルを開くことができます。テーブルを開くには、[開く] をクリックして [開 く] ダイアログ ボックスを表示します。開いたテーブルは、[テーブルの管理] ダイアログ ボックス 434 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ の開いているテーブルのリストに追加されます。次に、追加ツールを使用してテーブルをマップ に追加できます。追加ツールは、ワークスペース マネージャのレイヤ管理ウィンドウの上に配置 されています。 テーブルを閉じるには、リスト内のテーブルをクリックして強調表示します。[閉じる] ボタンがア クティブになります。[閉じる] をクリックしてテーブルを閉じます。閉じたテーブルを参照してい るレイヤはマップから削除されます。 ワークスペースは、まだマップにないテーブルを開くことができます。 名前付き接続の管理 名前付き接続は、エイリアスでデータ ソースへの接続を表します。FilePath、DatabaseSource、 ODBC、または Oracle OCI といった種類の名前付き接続を作成できます。指定した接続文字列また はファイル パスは、後で再利用できるように XML ファイルとして保存できます。ワークスペース マネージャを実行したときにデータ ソースへの接続が利用できるように、デフォルト接続を設定 できます。名前付き接続もワークスペースに保存されます。 ページ設定 印刷するマップの用紙のサイズ、用紙の向き、および余白を指定できます。このオプションを使 用して、プリンタ固有の設定にアクセスすることもできます。 開発者ガイド 435 ワークスペース マネージャのメニュー コマンド 印刷 マップを用紙またはファイルに出力できます。[印刷] ダイアログ ボックスでは、使用するプリン タ、印刷するページの範囲 (印刷ジョブが複数のページにわたる場合)、および印刷部数を指定しま す。[プリンタの設定] では、レイアウトを設定したり、使用しているプリンタに固有のその他のオ プションを設定したりできます。[ファイルへ印刷] チェック ボックスをオンにすると、マップを ファイルに出力できます。 印刷プレビュー 印刷する前に、出力がどのように表示されるかを確認できます。 最近使用したワークスペース 最近開いたワークスペースのリストを表示します。 [ビュー] メニューのコマンド このメニューを使用すると、ツールバー、ステータス バー、およびレイヤ管理ウィンドウの表示 と非表示を切り替えることができます。 [マップ] メニューのコマンド [マップ] メニューのコマンドを使用して、マップの追加と削除、マップのビューの操作、主題図 マップの作成などを行います。ビュー関連のコマンドはポップアップ メニューからも利用できま す。ワークスペース マネージャのマップ ウィンドウを右クリックすると、メニューが表示されま す。 436 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ マップの管理 このメニュー コマンドを選択すると [マップの管理] ダイアログが表示されます。ここでは、マッ プの追加または削除、デフォルト マップの設定、マップおよびエイリアスの名前変更、および [凡 例] タブの表示/非表示 (マップに凡例がある場合) を行うことができます。[新規作成] コマンドで は、現在開いているテーブルを使用して新しいマップ ウィンドウを作成できます。[ワークスペー ス マップの管理] には、マップ内のレイヤと凡例の数も表示されます。 レイヤ管理 このメニュー コマンドを選択すると、[レイヤ管理] ダイアログが表示されます。このメニュー コ マンドは、[ビュー] メニューの [レイヤ管理] チェック ボックスがオフで、レイヤ管理ウィンドウ が表示されていない場合に使用できます。レイヤ管理の機能の詳細については、443 ページの「レ イヤ管理ツール」を参照してください。 ビューの変更 マップの現在のビュー、つまり現在ウィンドウに表示されているマップの領域を変更できます。 マップのズームと縮尺も独自の設定に変更できます。マップ ウィンドウの中心を設定したり、回 転角度を変更したりすることもできます。 [ビューの変更] ダイアログ ボックスでは、ズーム幅の単位 (マイル、キロメートルなど)、および 中心の X/Y 座標の単位 (メートル、度など) を選択できます。このダイアログで選択した単位は、 レイヤ管理ウィンドウでも使用されます。たとえば、レイヤ管理ウィンドウで使用されるすべて の距離をマイルではなくキロメートルで表示したい場合は、[ビューの変更] ダイアログ ボックス を表示し、[ズーム] フィールドの横に表示される単位のリストから [キロメートル] を選択しま す。 レイヤ全体の表示 レイヤ全体またはマップ内のすべてのレイヤを表示できます。[レイヤ全体の表示] ダイアログ ボックスには、マップを構成するレイヤのリストが表示されます。希望のレイヤをリストから選 択するか、すべてのレイヤを表示する [すべてのレイヤ] を選択して、[OK] をクリックします。 マップが再描画されてレイヤ全体が表示されます。 前のビュー マップの前のビューに戻ることができます。 開発者ガイド 437 ワークスペース マネージャのメニュー コマンド 次のビュー このコマンドは、[前のビュー] を使用した後に利用できます。このコマンドを使用すると、[前の ビュー] コマンドを使用する前に表示されていたマップのビューが再表示されます。 [前のビュー] コマンドと [次のビュー] コマンドを一緒に使用して、マップの 2 つのビューを交互に 切り替えることができます。これらのコマンドは、ツールバーからも利用できます。 縮尺を維持/ズームの維持 マップのサイズと形状を変更するとき、同じ縮尺またはズームを維持したい場合に、これらのコ マンドを使用します。 再描画 マップを再描画します。 選択の表示 選択したオブジェクトを拡大表示または縮小表示します。 主題図 ウィザード フィーチャ主題図とラベル主題図を作成するには、[マップ] メニューの [主題図 ウィザード] を選 択します。フィーチャ主題図の種類には、レンジ、個別値、ドット密度、サイズ可変シンボル、 円グラフ、および棒グラフがあります。ラベル主題図の種類には、レンジおよび個別値がありま す。 マップに 1 つ以上のラベル セット (ラベル レイヤに表示される) が含まれる場合は、ラベル主題図 を作成できます。ラベル主題図では、テーブル内のデータに基づいて、各ラベルにさまざまなラ ベル スタイル (色、フォント サイズなど) を割り当てます。たとえば、ラベル主題図を使用する と、一部の場所を他の場所より際立たせて表示できます。レンジ ラベル主題図は、人口など、共 通のデータ値に基づいてラベルをグループ化します。特定の人口区分に当てはまる都市にはある スタイルのラベルを付け、別の区分に当てはまる都市には別のスタイルのラベルを付けます。こ れは、人口の値を使用することによってラベルを付けずに都市の規模を示すあまり目立たないス タイルです。 主題図ウィザードでは、3 つのダイアログを使用して主題図を作成します。 主題図を作成するには 1. [マップ] メニューの [主題図 ウィザード] を選択します。 [主題図の作成: 手順 1/3] ダイアログ ボックスが表示されます。 2. フィーチャ主題図またはラベル主題図のいずれかを選択し、作成する主題図の種類を選択しま す。 3. [次へ] をクリックします。 [主題図の作成: 手順 2/3] ダイアログ ボックスが表示されます。 4. 色分けするテーブルを選択します。 5. 使用するデータを選択します。データが含まれるテーブルのフィールドを選択するか、[式] を 選択して必要なデータをテーブルから抽出する式を使用します。 438 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ 6. [次へ] をクリックします。 [主題図の作成: 手順 3/3] ダイアログ ボックスが表示されます。ここでは、主題図の種類の設 定、スタイル、および凡例をカスタマイズできます。主題図マップに透明効果を適用する方法 については、461 ページの「主題図に半透明効果を適用する方法」を参照してください。 7. [適用] をクリックしてカスタマイズ設定を適用します。 8. 終了したら [OK] をクリックします。 フィーチャまたはラベルの円グラフ主題図、棒グラフ主題図、および個別値主題図を作成してい る場合、手順 2/3 のダイアログ ボックスには [ゼロと空白を無視] オプションが表示されます。こ のオプションをオンにすると、ワークスペース マネージャの主題図作成処理のパフォーマンスが 低下する可能性があります。 主題図を変更するには、レイヤ ツリー内で目的の主題図を強調表示し、表示される [主題図] タブ をクリックします。[主題図の変更] ボタンをクリックして、主題図を変更します。 レイヤ リストから主題を削除するには、主題図の名前を右クリックし、[削除] を選択します。主 題図の名前を変更したり、レイヤ ツリーでこのレイヤの表示/非表示を切り替えることもできま す。 [ツール] メニューのコマンド ワークスペース マネージャの [ツール] メニューのコマンドからは、各種のマップ ツールにアクセ スできます。これらのツールを使用して、マップの拡大表示と縮小表示、マップの位置の変更、 さまざまな方法によるマップ オブジェクトの選択などを行うことができます。これらのツール は、ワークスペース マネージャ ツールバーからも利用できます。各ツールについて以下に説明し ます。 矢印 これは基本のポインティング ツールです。マップ フィーチャを選択することはできません。 開発者ガイド 439 ワークスペース マネージャのメニュー コマンド ズームイン マップの領域を拡大表示できます。マップを拡大表示するには、以下の手順に従います。 1. [ツール] メニューの [ズームイン] を選択して、ツールをアクティブにします。 ポインタが、プラス記号の付いた虫眼鏡のアイコンに変わります。 2. マップをクリックします。 マップの領域が拡大して再描画され、クリックしたポイントに中心が設定されます。 ズームアウト マップの領域を縮小表示できます。マップを縮小表示するには、以下の手順に従います。 1. [ツール] メニューの [ズームアウト] を選択して、ツールをアクティブにします。 ポインタが、マイナス記号の付いた虫眼鏡アイコンに変わります。 2. マップをクリックします。 マップの領域が縮小して再描画され、クリックしたポイントに中心が設定されます。 1 つのツールで拡大と縮小 同じズーム ツールを使用して拡大と縮小を行うには、Ctrl キーを押しながら操作を行います。Ctrl キーを押しながら拡大ツールを使用すると、クリックするたびに段階的に縮小されます。Ctrl キー を押しながら縮小ツールを使用すると、クリックするたびに段階的に拡大されます。 移動 ズーム レベルを変更せずに、マップを再配置できます。たとえば、特定の国や都市が中心に来る ように、マップ ビューの位置を変更したい場合があります。マップを移動するには、以下の手順 に従います。 1. [ツール] メニューの [移動] を選択して、ツールをアクティブにします。 ポインタがポインティング ハンドに変わります。 2. マップをクリックし、マウス ボタンを押しながら希望の位置までドラッグします。 マップが新しい位置で再描画されます。 選択 オブジェクトを 1 つずつ選択したり、同じ領域にあるすべてのオブジェクトを選択したりできま す。 オブジェクトを選択するには、以下の手順に従います。 1. [ツール] メニューの [選択] を選択して、ツールをアクティブにします。 ポインタが矢印に変わります。 2. 選択するマップ上のオブジェクトをクリックします。 選択したオブジェクトが強調表示されます。 半径選択 特定の半径内にあるすべてのオブジェクトを選択できます。たとえば、献血者のテーブルと献血 場所のテーブルがあるとします。半径選択ツールを使用すれば、各献血場所から半径 0.5 マイル以 内に在住している献血者の一時リストを作成できます。 440 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ 半径選択ツールでは、中心点が円の中に入っているすべてのオブジェクトが選択されます。オブ ジェクト全体が円の中に収まっている必要はありません。半径内のオブジェクトを選択するに は、以下の手順に従います。 1. [ツール] メニューの [半径選択] を選択して、ツールをアクティブにします。 ポインタをマップ上に移動すると、ポインタは、下部に小さい円が付いた選択矢印に変わ ります。 2. 半径検索の中心点に設定する場所をマップ上でクリックします。たとえば、消防署から半径 2 マイル以内にあるすべての消火栓を選択する場合は、消防署をクリックし、そこを中心点に設 定します。 3. マウス ボタンを押したまま、中心点から外側にドラッグします。 中心点から円が描画され、円の半径距離がステータス バー (画面の左下隅) に表示されま す。 4. 希望の半径距離に達したら、マウス ボタンを離します。 その円に含まれるすべてのマップ オブジェクトが強調表示されます。 長方形選択 長方形内のオブジェクトを選択できます。長方形選択ツールを使用してクリックおよびドラッグ すると、選択するオブジェクトの周囲に点線の四角形 (長方形ボックス) が作成されます。 長方形選択ツールでは、中心点が長方形の中に入っているすべてのオブジェクトが選択されま す。オブジェクト全体が長方形の中に収まっている必要はありません。長方形内のオブジェクト を選択するには、以下の手順に従います。 1. [ツール] メニューの [長方形選択] を選択して、ツールをアクティブにします。ポインタをマッ プ上に移動すると、ポインタは、下部に小さい長方形が付いた選択矢印に変わります。 2. 作成する長方形ボックスの一角となる点をマップ上でクリックします。 3. マウス ボタンを押したままマウスをドラッグして、選択するオブジェクトの周囲に点線の四角 形を描画します。 4. 希望のサイズに達したら、マウス ボタンを離します。 その四角形に含まれるすべてのマップ オブジェクトが強調表示されます。 ポリゴン選択 マップ上に描画するポリゴン内のマップ オブジェクトを選択します。 オブジェクトを選択するには、以下の手順に従います。 1. [ツール] メニューの [ポリゴン選択] を選択して、ツールをアクティブにします。 ポインタをマップ上に移動すると、ポインタは、下部に小さいポリゴンが付いた選択矢印 に変わります。 2. ポリゴンの始点を置く場所をマップ上でクリックします。任意の方向にポインタを移動しま す。 クリックした点からポインタまでのラインが描画されます。 3. マウスをクリックして別の端点を作成します。希望する数の辺が描画されるまでポインタの移 動とマウスのクリックを続けます。 4. ポリゴンを閉じるには、始点にできるだけ近い場所を最後にクリックするか、最後のポイント をダブルクリックします。 ポリゴンが閉じられ、その中に含まれるすべてのオブジェクトが選択されます。 開発者ガイド 441 ワークスペース マネージャのメニュー コマンド ラベル ラベル ツールを使用すると、ユーザがクリックするマップ上の位置にラベルを手動で追加できま す。ラベル ツールでは、水平ラベルと湾曲ラベルのどちらも描画できます。デフォルト設定でラ ベルを描画するのが最も簡単です。しかし、MapXtreme のラベル機能は多機能であり、非常に多 くのスタイル、位置、および表示/非表示のオプションを備えており、これを使用することで多彩 なラベルを作成できます。451 ページの「ラベル レイヤの設定」および461 ページの「湾曲ラベ ル」も参照してください。 [機能拡張] メニュー コマンド MapXtreme v7.0.0 以降、カスタムの .NET アセンブリをワークスペース マネージャに読み込み、[ 機能拡張] メニューを通じてその機能を拡張できるようになりました。たとえば複数のタブ ウィン ドウを作成し、それぞれのウィンドウにマップ別の設定を適用するといった場合に利用できま す。[機能拡張] では、[機能拡張] メニューを含めて、ワークスペース マネージャの任意のメ ニューにメニュー項目を追加することもできます。 このメニューのコマンドは、[機能拡張の読み込み] と [機能拡張の管理] の 2 つです。 機能拡張の読み込み [ 開 く] ダ イ ア ロ グ が 表 示 さ れ、カ スタム拡張機能の位置に移動できます。拡張機能は、 <your_extension>.WorkspaceManager.Extensions.dll というファイルの命名規則に基づいて .DLL とし て作成され、保存されます。 機能拡張の管理 [機能拡張マネージャ] ダイアログが表示され、拡張機能のロードやアンロード、および拡張機能の プロパティの変更を行うことができます。読み込まれた拡張機能は、名前、バージョン、および アセンブリの場所がリスト ボックスに表示されます。 カスタム拡張機能の作成方法については、 付録 C: 「カスタマイズMapXtreme」の「ワークスペー ス マネージャ機能拡張」を参照してください。 442 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ レイヤの管理 ワークスペース マネージャのアプリケーション ウィンドウは 2 つのセクションに分かれていま す。レイヤ管理ウィンドウとそのコマンドが左側、マップ ウィンドウが右側に表示されます。レ イヤ管理ウィンドウは、レイヤ ツリーと、マップ設定とレイヤ設定が含まれるダイアログ ボック スのタブから構成されます。レイヤ ツリーには、開いているマップと、それに付随するすべての レイヤが表示されます。 ワークスペース マネージャのレイヤ管理機能を使用すると、マップのレイヤを構成し、レイヤま たはマップの表示を制御する設定を個々のレイヤまたはマップ全体に適用できます。 レイヤ管理ツール レイヤ管理の上部にあるツールを使用すると、レイヤ ツリー ウィンドウからレイヤの追加、移 動、および削除を簡単に行うことができます。 • • • 各追加ツールでは、テーブルを開いたり、グループ レイヤとラベル レイヤをマップに挿入し たりできます。 選択したアイテムの削除ツールでは、選択したレイヤをマップから削除できます。 [上へ] および [下へ] の各ツールバー ボタンを使って、レイヤ リスト内でレイヤを上下に移動 できます。これによって、レイヤの表示順序を変更します。 レイヤ ツリー レイヤ管理ウィンドウ内のレイヤ ツリーには、マップと、主題図レイヤ、ラベル レイヤ、経緯度 線レイヤなどのマップ内のすべてのレイヤが表示されます。レイヤ ツリーを使用して、以下の操 作を行うことができます。 開発者ガイド 443 レイヤの管理 マップ エイリアス マップ ノード (レイヤ リストの最上位のノード) にポインタを合わせると、ツールチップにマップ エイリアスが表示されます。ツールチップは、開発時にマップのエイリアスを知る必要がある場 合 (Web コントロールのプロパティを設定するときにマップ エイリアスを指定する必要があるなど ) に便利です。 マップ名を右クリックし、[マップ エイリアスの設定] を選択することによって、マップ エイリア スを変更できます。 レイヤの表示 レイヤ ツリーに表示される各レイヤの横のチェック ボックスをクリックすると、レイヤの表示/非 表示を切り替えることができます。 レイヤの順序の変更 レイヤの順序を変更するには、レイヤを選択し、[上へ] または [下へ] のツールバー ボタンをク リックします。レイヤを上下にドラッグして、リスト内での位置を変更することもできます。 ドラッグ アンド ドロップ操作を伴う、以下の特殊なケースがあります。 • • レイヤをグループ レイヤ内に移動するには、レイヤをそのグループにドラッグします。 新しいラベル ソースをラベル レイヤに追加するには、レイヤをそのラベル レイヤにドラッグ します。 レイヤをグループ内に移動せず、グループ レイヤの上に配置する場合は、Shift キーを押しながら ドラッグ アンド ドロップ操作を行います。同様に、新しいラベル ソースをラベル レイヤに追加し たくない場合は、Shift キーを押しながらドラッグ アンド ドロップ操作を行います。 コンテキスト メニューの表示 レイヤ ツリー内のマップまたはレイヤそれぞれに、コンテキスト メニューが組み込まれていま す。コンテキスト メニューを表示するには、マップまたはレイヤを右クリックします。また、現 在選択しているレイヤのコンテキスト メニューを表示するには、Shift キーを押しながら F10 キー を押します。 コンテキスト メニューの項目は、指定されているレイヤの種類によって異なります。特に、以下 の事項に注意してください。 444 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ • レイヤにスタイル オーバーライドを追加するには、コンテキスト メニューを表示し、[スタイ ル オーバーライドの追加] を選択します。各レイヤにはズーム範囲が異なる複数のスタイル オーバーライドを追加できます。これにより、マップを拡大表示したときに、ポイントが大き く表示され、道路の幅が広く表示されるようにマップを設定できます。 スタイル オーバーライドは、シームレス ラスタ レイヤにも追加できます。スタイル オーバー ライドが強調表示されている場合に、[表示/非表示] タブから [ラスタ イメージ スタイル] ダイ アログを利用することができます。 • レイヤ ツリー内の項目の名前を変更するには、項目を右クリックし、[名前変更] を選択しま す。F2 キーを押して、選択した項目の名前を変更することもできます。 これらの方法でレイ ヤの名前を変更しても、元のテーブルの名前は変更されません。名前変更操作は、レイヤ ツ リーに表示されるテキストを変更するだけです。ワークスペースを保存すると、必要な情報が ワークスペース ファイルに格納されます。 レイヤ ツリーからレイヤを削除するには、削除する項目を右クリックして [削除] を選択しま す。Del キーを押して、レイヤを削除することもできます。 デフォルトでは、レイヤをマップに追加した時点では、レイヤが選択可能な状態になっていま す。これは、レイヤ管理ウィンドウの [オプション] タブの [選択可能] チェック ボックスで制 御されます (450 ページの「オプション」を参照)。特定のレイヤだけを選択可能にし、それ以 外のすべてのレイヤを選択不可として設定することもできます。多数のレイヤを含んだマップ で、特定のレイヤのフィーチャだけを選択可能にしたい場合などに活用できます。特定のレイ ヤを選択可能として指定するには、以下の手順に従います。 a. レイヤ管理ウィンドウで目的のレイヤ名を右クリックし、コンテキスト メニューを表示し ます。 b. [このレイヤを唯一選択可能なレイヤにする] を選択します。この 1 つのマップ レイヤの フィーチャだけが選択可能な状態になります。つまり、任意の選択ツールを使ってマップ 上のオブジェクトを選択できます。それ以外のすべてのマップ レイヤは選択不可になりま す。 • • レイヤ管理ウィンドウのタブ レイヤ ツリーの下にあるレイヤ管理ウィンドウのタブは、マップおよびマップ内の各レイヤに適 用できる追加設定とコントロールを提供します。各タブで、マップ設定とレイヤ設定を制御しま す。表示されるタブは、レイヤ ツリーでマップまたはレイヤのどちらが強調表示されているか、 および強調表示されているレイヤの種類によって異なります。たとえば、レイヤ ツリーでマップ が強調表示されている場合は、マップのタブが表示され、レイヤが強調表示されている場合は、 レイヤのタブが表示されます。主題図レイヤ、ラベル レイヤ、または経緯度線レイヤが強調表示 されている場合は、それらのレイヤに固有のタブが表示されます。各タブのオプションについて は、以下で説明します。 マップの設定 レイヤ ツリーでマップを選択すると、[ビュー]、[編集]、[ツール]、[スタイル]、[座標系]、[範囲] の各タブが利用可能になります。 開発者ガイド 445 レイヤの管理 ビュー マップの全体的な外観を制御できます。ズーム レベル、縮尺、中心点、および回転角度 (度単位) を設定できます。[適用] ボタンをクリックすると、設定が適用されます。 注意 ラスタ再投影の場合は、このタブで回転角度を設定し、[ラスタ再投影] タブで再投影のオ ン/オフを切り替えます。448 ページの「ラスタ再投影」を参照してください。 編集 [編集] タブのオプションを使用すると、特定のマップ編集タスクを制御できます。たとえば、オブ ジェクトの描画 (アプリケーションで描画ツールを使用する場合)、オブジェクトのサイズ変更、オ ブジェクト ノードの移動と削除などで使用するスタイルを制御できます。 各スタイル ボックスでは、アプリケーションで使用する描画ツールのデフォルト スタイルを指定 できます。ボックスをクリックすると、対応するスタイル ダイアログ ボックスが表示されます。 選択した設定はワークスペースに保存されます。描画ツールを使用するアプリケーションでユー ザがワークスペースを開き、マップ上にオブジェクトを描画するとき、これらのスタイル設定が 使用されます。 重複するノードを削除または移動するかどうかを指定することもできます。目的のチェック ボッ クスをオンにします。 マップの編集モードを指定します。 • • • • [なし] - マップで編集を行うことはできません。 [移動/サイズ変更可能] - オブジェクトを移動およびサイズ変更できます。 [ノード編集可能] - ノードを移動または削除できます。 [ノード追加可能] - ノードをオブジェクトに追加できます。 選択した編集モードは、マップ内のすべての編集可能レイヤに適用されます。レイヤが編集可能 かどうかを制御するには、レイヤの [オプション] タブの [編集可能] チェック ボックスをオンにし ます。 編集モードでは、マップ フィーチャのノードを有効にすることをお勧めします。レイヤ ノード ( マップ ノードではない) を強調表示し、[表示/非表示] タブのチェック ボックスをオンにします。 ラベルが編集可能かどうかを制御するには、[ラベルの編集可能] チェック ボックスをオンまたは オフにします。 編 集 モ ー ド の 使 用 例 に つ い て は、第 8 章、160 ページの「選択 (Select) ツールを使用した FeatureGeometry の編集」 を参照してください。 446 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ ツール 情報チップの表示制御、スナップ モードのアクティブ化、スナップ許容値の設定、および動的選 択ツールのアクティブ化を行うことができます。 [情報チップを表示] チェック ボックスは、選択ツールを特定のフィーチャの上に置いたときに、 そのフィーチャに関する情報をポップアップ表示するかどうかを制御します。450 ページの「オプ ション」を参照してください。 [スナップ モード] チェック ボックスをオンにすると、選択ツールなどのマップ ツールが近くにあ るノードを自動的に検索します。ノードが近くにある場合は、最も近いノードの位置を示すクロ スヘアが表示されます。たとえば、半径選択ツールを使用していて、ノード検索の中心をマップ 上のポイント フィーチャとまったく同じ位置にしたい場合は、[スナップ モード] チェック ボック スをオンにできます。スナップ モード機能は、描画ツールを提供するアプリケーションで特に重 要です。ユーザは既存のフィーチャとまったく同じ位置にフィーチャを描画しなければならない 場合が多いためです。 [スナップ許容値] 設定では、ツールが "スナップ可能な" ノードを検索する距離を指定します。ス ナップ モード機能を使用するレイヤは選択できます。たとえば、[スナップ モード] チェック ボッ クスをオンにして、特定のレイヤ内のフィーチャの近くにポインタがあるときだけにスナップ ク ロスヘアを表示したい場合があります。特定のレイヤについてスナップ モード機能のオン/オフを 切り替えるには、レイヤ ツリーでレイヤを選択し、[オプション] タブの [スナップ モード] チェッ ク ボックスをオンまたはオフにします。 [動的選択ツール] チェック ボックスは、フィーチャを直ちに選択するか (選択ツールの使用中に )、マウス ボタンを離して、選択ツールの使用を終えた後に選択するかを制御します。 [動的選択ツール] チェック ボックスをオフにすると、選択ツールの使用を終えるまでマップ上の フィーチャは実際に選択されません。たとえば、半径選択ツールの場合、半径を指定し、マウス ボタンを離すまで、フィーチャは選択されません。 [動的選択ツール] チェック ボックスをオンにすると、マウスのドラッグに合わせてフィーチャが 動的に選択または選択解除されます。たとえば、半径選択ツールの場合、マウスをドラッグして 半径を拡大するのに合わせて、より多くのフィーチャが選択されるのがわかります。 スタイル 透過性やアンチエイリアス処理のプロパティを制御するには、[スタイル] タブのオプションを使用 します。 開発者ガイド 447 レイヤの管理 • • [アンチエイリアスを使用] – 高品位の画像を低解像度で表現したときに現れる、直線、曲線、 リージョン境界線のギザギザを滑らかに見せるためのオプションです。 [アンチエイリアスを 使用] をオンにした場合、[透過性を有効化] が自動的に選択されます。[透過性を有効化] をオフ にした場合は、[アンチエイリアスを使用] も自動的にオフになります。 [透過性を有効化] – マップを画面、プリンタ、またはファイル エクスポートに出力する際、ス タイルの色やレイヤの半透明値を有効にします。 透過性を有効にした場合、透過性を調整す るためのトラックバーがスタイル ダイアログに表示されます。 このプロパティは、ラスタの透過性には影響しませんが、半透明のラスタ イメージを印刷する には [透過性を有効化] をオンにしておく必要があります。 注意: 透過性やアンチエイリアス処理を有効にして高品位のマップをレンダリングすると、レン ダリング速度が低下する場合があります。この影響は、3 つ以上の透過レイヤを含んだマッ プで特に顕著に現れます。 アンチエイリアスと透過性の詳細については、456 ページの「GDI+ による透過性とアンチエイリ アスを用いたレンダリングの拡張」を参照してください。 座標系 マップの座標系が表示され、座標系を変更できます。 座標系を変更するには、以下の手順に従います。 1. [座標系] ボタンをクリックして、[座標系の選択] ダイアログ ボックスを表示します。 2. リストから座標系を選択し、[OK] をクリックします。 範囲 マップの場合、このタブには、現在のマップ ビューの範囲が表示されます。[マップ全体の表示] ボタンをクリックすると、マップ全体が表示されます。 ラスタ再投影 [ラスタ再投影] タブでは、マップ内のラスタ レイヤおよびベクトル レイヤの再投影の設定を指定 することができます。 ラスタ レイヤとベクトル レイヤ両方の再投影を制御できます。ラスタ レイヤまたはベクトル レイ ヤのいずれかをマップに追加した場合は、その新しいレイヤを現在のマップ ウィンドウの投影法 に再投影することができます。 ベクトル レイヤとラスタ レイヤが混在するマップ ウィンドウの投影法を変更した場合は、ラスタ レイヤとベクトル レイヤ両方すべてを新しいマップ ウィンドウの投影法に再投影することができ ます。 これらの設定は、MapXtreme API にも適用されます。詳細については、『開発者リファレンス』で MapInfo.Mapping.FeatureViewer クラスの RasterReprojection プロパティおよび RasterReprojectionResampling プロパティを参照してください。 448 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ ラスタ再投影の有効/無効を切り替えるには、[ラスタ再投影] チェック ボックスを使用します。ラ スタ再投影を有効にするには、チェック ボックスをオンにします。ラスタ再投影を無効にするに は、チェック ボックスをオフにします。ラスタ再投影は、デフォルトでは無効です。つまり、ラ スタ レイヤをマップに追加しても、再投影は実行されません。 ラスタ再投影の実行方法を指定するには、[再投影方法] の設定を使用します。次のいずれかを選択 します。 • • [最適化して使用] – イメージのラスタ再投影は、ソースイメージ空間への変換後にターゲット の長方形の外観によって決定されます。ターゲットの長方形が ”厳密な” 長方形である場 合、つまり、上下の 2 辺が X 軸に平行し、左右の 2 辺が Y 軸に平行している場合、標準的な Windows 関数を使ってソース イメージが両方向に拡大されます。イメージが厳密な長方形テス トに不合格の場合、再投影は、指定された再サンプリング法を使用して実行されます。 [常に使用] – ラスタ再投影は常に実行されます。MapXtreme は、正確な数式に基づいてイメー ジの座標を計算し、3 次おりたたみ内挿法または最近隣内挿法のいずれかを使用してピクセル の再サンプリングが実行されます。 [再投影再サンプリング法] の設定では、再投影されたラスタ イメージに対する再サンプリング法 を指定します。 再サンプリングとは、本来は連続階調で表現されるべき明暗が不連続な一連のピクセル値として 表現されているとき、ソース イメージに基づき、ラスタ イメージのピクセル値を復元 (通常は、 イメージ センサの瞬間視野によってカバーされるグラウンド オブジェクト上の点の明るさに対し て比例的に復元) する手法のことです。 ターゲット イメージのピクセル値を計算する方法として、3 次おりたたみ内挿法と最近隣内挿法の 2 つの再サンプリング法があります。以下のいずれかを選択します。 • • 1. 開発者ガイド [3 次おりたたみ内挿法] は、その識別能力により、ピクセル値の最善の"復元" を提供します。3 次おりたたみ内挿法では、ターゲット イメージのピクセルは、ソース イメージの基本ピクセ ルを中心とする 4x4 の正方格子内のピクセル値に基づいて計算されます。基本ピクセルの座標 は、特殊な最適化手順に基づいて、ターゲット イメージのすべてのピクセルに対して計算され ます。次に、ピクセルは、基本ピクセルの座標に基づいて重みが付けられます。通常、航空画 像や衛星ラスタ画像には、イメージ品質が優れている 3 次おりたたみ内挿法をお勧めします。1 [最近隣内挿法] では、再投影されたイメージのピクセル値がソース イメージの基本ピクセル値 で置き換えられます。この再サンプリング法は、3 次おりたたみ内挿法よりレンダリング時間 は短縮されますが、精度が落ちる可能性があります。一般に、ラスタ マップ、グリッド、およ びスキャンされたマップの再サンプリングには、結果を短時間で取得できる最近隣内挿法をお 勧めします。 MapXtreme で使用されている 3 次おりたたみ内挿法 のアルゴリズムは、S.K.Park および R.A.Schowengerdt 共著『Computervision, Graphics and Image Processing』(1983、Volume 23、 258 ~ 272 ページ) に基づいてい ます。 449 レイヤの管理 ラスタ再投影の回転角度を変更するには、[ビュー] タブで回転角度を指定し、[適用] をクリックし ます。446 ページの「ビュー」を参照してください。 レイヤの設定 レイヤ ツリー内のマップ レイヤ ノードをクリックすると、レイヤ管理ウィンドウに以下のタブが 表示されます。 表示/非表示 [表示] チェック ボックスをオンにすると、マップ レイヤが表示可能になります。レイヤ ツリーで 対象レイヤの横のチェック ボックスをオンにしても同じ効果が得られます。 レイヤを表示するズーム範囲または縮尺範囲を指定するには、[範囲内で表示] チェック ボックス をオンにします。ズーム範囲を選択した場合は、最小ズームと最大ズームをマイル単位で指定し ます。これにより、レイヤはこのズーム範囲内で表示されます。縮尺範囲を選択した場合は、近 接の縮尺と最遠の縮尺を指定します。これにより、レイヤはこの縮尺範囲内で表示されます。 マップ レイヤ上で対応するオプションを選択することによって、ノード、中心点、線方向などを 表示することもできます。ノードは、ラインや折れ線やポリゴンのセグメントを定義するポイン トです。中心点は、マップ オブジェクトの中心です。線方向とは、その線が描画された方向をい います (道路レイヤで道順を示すためなどに使用されます)。マップ フィーチャを編集したい場合 は、これらの要素を表示してください。[編集可能] チェック ボックスは、[オプション] タブにあ ります。 オプション このタブにある以下の各チェック ボックスを使用すると、フィーチャ レイヤの編集とカスタマイ ズが簡単に行えるようになります。 • • • • • • [選択可能] - このチェック ボックスをオンにすると、[ツール] メニュー コマンドまたはツール バーの各選択ツールを使用してレイヤ内のオブジェクトを 選択できます。選択の対象から外す レイヤについては、[選択可能] チェック ボックスをオフにします。 [編集可能] - このチェック ボックスをオンにすると、レイヤが編集可能になります。 [描画ツールでこのレイヤにフィーチャを追加] - 描画ツールを提供するアプリケーションで使 用するワークスペースを準備し、その描画ツールを使用してレイヤ内に新しいフィーチャを作 成できるようにするには、このチェック ボックスをオンにします。 [情報チップを表示] - 選択したレイヤ内のマップ オブジェクトに情報チップを表示するには、 このチェック ボックスをオンにします。情報チップのテキストは、[情報チップの式] フィール ドで指定した式の結果で構成されます。たとえば、式がテーブル内のフィールドである場合、 情報チップはそのフィールドの値で構成されます。式がテーブル内のフィールド情報を使用す る計算式である場合、情報チップはその計算の結果で構成されます。 [スナップ モード] - 特定のレイヤについてスナップ モード機能のオン/オフを切り替えるには、 レイヤ ツリーでレイヤを選択し、このチェック ボックスをオンまたはオフにします。 [情報チップの式] – レイヤの情報チップに表示する情報チップを制御します。テーブル内の先 頭フィールド以外も表示できます。第 11 章: 「式の作成」を参照してください。 [オプション] タブの設定は、レイヤの表示/非表示の影響を受けません。[オプション] タブの設定 は、レイヤが現在表示されているかどうかに関係なく、確認できます。 450 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ 範囲 レイヤの場合、このタブには、選択されているレイヤの範囲が表示されます。[レイヤ全体の表示] ボタンをクリックすると、レイヤ全体が表示されます。[デフォルトの領域を表示] をクリックする と、レイヤのデフォルト ビューが表示されます。 情報 選択されているレイヤに関する情報を表示します。テーブルの名前とパス、テーブルの種類 (MapInfo テーブルなど)、および座標系が示されます。 主題図レイヤの設定 主題図レイヤをクリックすると、レイヤ管理ウィンドウに以下のタブが表示されます。 表示/非表示 主題図レイヤを選択したとき、選択した主題図の表示は [表示/非表示] タブのオプションによって 制御されます。[表示] チェック ボックスをオンにすると、主題図レイヤが表示されます。オフに すると、主題図レイヤは表示されません。 主題図を表示するズーム範囲または縮尺範囲を指定するには、[範囲内で表示] チェック ボックス をオンにします。ズーム範囲を選択した場合は、最小ズームと最大ズームの距離を指定します。 これにより、主題図はこのズーム範囲内で表示されます。縮尺範囲を選択した場合は、近接の縮 尺と最遠の縮尺を指定します。これにより、主題図はこの縮尺範囲内で表示されます。 主題図 主題図の種類と、その値を取得するための式を指定します。主題図を変更することもできます。 スタイルまたは凡例を変更するには、[主題図の変更] をクリックします。 ラベル レイヤの設定 レイヤ ツリーでラベル レイヤをクリックすると、レイヤ管理ウィンドウの下部に [表示/非表示] タ ブが表示されます。ラベル レイヤを展開してラベル ソースを表示すると、[自動ラベル作成機能 ]、[スタイル]、[テキスト]、[位置]、および [ルール] の各タブが表示されます。これらのタブを使 用して、ラベル ソース内のラベルの外観と内容を制御します。 表示/非表示 ラベル レイヤを選択したとき、ラベルの表示は [表示/非表示] タブのオプションによって制御され ます。[表示] チェック ボックスをオンにすると、ラベルが表示されます。オフにすると、ラベル は表示されません。 ラベルを表示するズーム範囲または縮尺範囲を指定するには、[範囲内で表示] チェック ボックス をオンにします。ズーム範囲を選択した場合は、最小ズームと最大ズームの距離を指定します。 これにより、ラベルはこのズーム範囲内で表示されます。ズーム範囲を指定する場合、最大値は 指定した値を含みません。つまり、レイヤはマップのズームが最大値よりも小さい場合にだけ表 示されます。したがって、ズームの最大値を 5000 マイルに設定し、マップを 5000 マイルちょうど にズームした場合、レイヤは表示されません。 開発者ガイド 451 レイヤの管理 縮尺範囲を選択した場合は、近接の縮尺と最遠の縮尺を指定します。これにより、ラベルはこの 縮尺範囲内で表示されます。 ラベルをデフォルトの状態に戻すには、[ラベルの変更をクリア] をクリックします。このボタンを クリックすると、ラベル ツールを使って手動で追加された各ラベルが削除され、ラベルが元の位 置に復元されます。 自動ラベル作成機能 自動ラベルを作成し、その表示を管理できます。マップの自動ラベルを生成するには、[ラベルを 自動で作成] チェック ボックスをオンにします。自動ラベルを表示するズーム範囲または縮尺範囲 を指定するには、[範囲内で表示] チェック ボックスをオンにします。ズーム範囲を選択した場合 は、最小ズームと最大ズームの距離を指定します。縮尺範囲を選択した場合は、近接の縮尺と最 遠の縮尺を指定します。これにより、自動ラベルはこの縮尺範囲内で表示されます。 スタイル ラベル テキストとラベルの線のスタイルを制御します。ラベル テキストの場合、[テキスト スタ イル] ボックスを使用して [テキスト スタイル] ダイアログ ボックスを開きます。ラベルのフォン ト、色、背景、およびその他のテキスト効果を指定できます。ラベルの線の場合、[ライン スタイ ル] ボックスを使用して [ライン スタイル] ダイアログ ボックスを表示します。このダイアログで は、ラベルの線のスタイルを設定できます。[ラベルの線] グループで、ラベルの線をなしにする か、シンプルな線または矢印付きの線を使用するかを選択します。 注意 ラベルの線は、湾曲ラベルには対応していません。 MapXtreme は、MapInfo Professional で 作成されたラベルの線、またはラベルの線がカスタマイズされたラベル ツールを使用して 作成されている場合は、これを読み込むことができます。461 ページの「湾曲ラベル」を参 照してください。 テキスト テーブル内のフィールドまたは派生情報からラベル テキストを作成するための式を指定できま す。 位置 このタブの設定を使用して、ラベルの方向、オフセット、および回転角度を設定します。 ラベルの方向とは、ラベルのアンカー ポイントに対する相対的な位置です。いずれかのボタンを クリックして方向を選択します。 452 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ ラベルのオフセットとは、ラベルとアンカー ポイントの間の距離 (ピクセル単位) です。 ラベルの回転角度とは、ラベルを描画する角度です。回転角度には以下の 3 つの設定があります。 • • • 1 つのセグメントに対して平行 - 高速道路などのライン フィーチャにラベルを付ける場合、各 ラベルが最も近い高速道路セグメントに対して平行に描画されるようにしたいときは、このオ プションを選択します。 セグメントに沿ってラベルを曲線化 - 高速道路などのライン フィーチャにラベルを付ける場 合、ラベルのテキストが高速道路の形状に沿って表示されるようにしたいときは (つまり、湾 曲ラベルを使用するには)、このオプションを選択します。レイヤ管理ウィンドウの [スタイル] タブでアンチエイリアス処理を有効にすると、湾曲ラベルをより美しく描画することができま す。詳細については、461 ページの「湾曲ラベル」を参照してください。 角度の指定 – ラベルの角度を度単位で指定します。たとえば、すべてのラベルが水平に描画さ れるようにするには、ゼロを指定します。 ルール マップでラベルを表示するための特定の条件を設定できます。 [ 重複テキストを許可 ] "Portland, OR"、"Portland, ME" など、異なるオブジェクトに重複するラベ ルを表示する場合は、このチェック ボックスをオンにします。このオプションは、道路マップで 道路セグメントに個別にラベルを描画するときも使用します。 [ テキストのオーバーラップを許可 ] ラベルを別のラベルの上に描画する場合は、このチェック ボックスをオンにします。マップ上で優先度の高いラベルの上に重なるラベルは表示されませ ん。 [ 部分的にラベル付け ] 中心点がマップ ウィンドウに表示されない折れ線およびオブジェクトにラ ベルを描画する場合は、このチェック ボックスをオンにします。 開発者ガイド 453 レイヤの管理 [最大ラベル数] 表示するラベルの最大数を指定します。たとえば、最も突出したデータ (人口が最 大、収入が最大、成長率が最大など) がテーブルの先頭になるようにデータを並べ替えるものとし ます。このようなデータの上位 100 レコードのみを表示するには、[最大ラベル数] ボックスに 100 を入力します。100 レコードより下のレコードにはラベルが表示されないため、表示される 100 ラ ベルはマップ上でより目立ちます。 [ ラベルの優先度の式 ] この式フィールドはオプションです。この式フィールドを空にした場合、 1 つのラベル ソース内のフィーチャは予期しない方法でラベル付けされます。たとえば、一部の小 都市にはラベルが付けられ、一部の大都市にはスペースの余裕がないためにラベルが付けられな い場合があります。式を指定した場合 (数値式である必要があります)、マップの表示部分にある各 フィーチャについて式が計算され、大きな値を持つフィーチャに対して高いラベル付け優先度が 与えられます。式を指定するには、[設定] ボタンをクリックします。 たとえば、都市を表すポイント フィーチャを含む WorldCapitals レイヤのラベルを設定するとしま す。人口の多い都市には、高いラベル付け優先度を割り当てます。この場合、次のようなラベル 付けの式を指定します。 cap_pop cap_pop フィールドは州都を表します。cap_pop のラベルの優先度の式を指定するとき、人口の多 い都市に高いラベル付け優先度が割り当てられるように指定します。その結果、人口の多い都市 に優先的にラベルが付けられ、それ以外の都市にはスペースに余裕があるときにだけラベルが付 けられます。 [ テーブルの優先度の式 ] この式フィールドはオプションです。ラベル レイヤには複数のラベル ソースを含めることができます。たとえば、World Countries (世界の国々) のラベル セットを表すラ ベル ソースと、World Capitals (各国の首都) のラベル セットを表すラベル ソースを使用できます。 デフォルトでは、リストの最上位にあるラベル ソースが最も高い優先度を持ちます。ラベル ソー スに高い優先度を割り当てたい場合は、そのラベル ソースをリストの上位に移動するか (レイヤ管 理ウィンドウ内のラベル ソースのリスト)、ラベル ソースごとにテーブルの優先度の式を指定でき ます。 た と え ば、World Countries ラ ベ ル ソ ースにテーブルの優先度の式として 10 を指定し、World Capitals ラベル ソースにテーブルの優先度の式として 5 を指定した場合、国のラベルは首都のラベ ルより優先度が高くなります。 グループ レイヤの設定 レイヤ管理ウィンドウでグループ レイヤ ノードを強調表示すると、[表示/非表示] タブが表示され ます。ここでは、グループ内のすべてのレイヤに適用される表示/非表示の設定を制御します。 グループ内の各レイヤに異なる表示/非表示の設定を適用するには、グループ レイヤの下に表示さ れるレイヤを強調表示し、表示される [表示/非表示] タブを変更します。 スタイル オーバーライドの設定 レイヤ管理ウィンドウでスタイル オーバーライド レイヤを強調表示すると、[表示/非表示] タブが 表示されます。ここでは、スタイル オーバーライドの表示/非表示と、ズーム範囲を制御します。 表示されている [スタイル] ボタンを使用すると、レイヤのエリア、ライン、シンボル、およびテ キストのスタイルを設定できます。 454 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ [標準] と [重ね合わせ] のいずれかの描画モードを選択します。[標準] 描画モードは、スタイル オーバーライドを使用してレイヤを描画します。[重ね合わせ] は、レイヤの上にスタイル オー バーライドを描画します。 経緯度線レイヤの設定 経緯度線レイヤをクリックすると、レイヤ管理ウィンドウの下部に、以下のタブが表示されま す。 表示/非表示 レイヤの表示/非表示、および選択したレイヤの表示内のズーム範囲または縮尺を制御します。 ラインとラベルのプロパティ 緯度と経度の主要な線とそれ以外の線について、表示/非表示、スタイル、ラベルを制御します。 ライン間隔 緯度と経度の主要な線とそれ以外の線について、間隔 (インターバル) 設定の自動またはカスタム を制御します。カスタムの場合は、度 (デフォルト)、フィート、またはメートルで間隔を指定でき ます。 開発者ガイド 455 ワークスペース マネージャの機能の使用 範囲 経緯度線が作成される緯度と経度の範囲 (北、南、東、西) を制御できます。このタブの設定は、[ ライン間隔] タブで [カスタム] が選択されている場合だけ選択できます。 このタブで変更を加えた場合は、[範囲を設定] をクリックして変更を有効にしてください。 経緯度線の詳細については、464 ページの「経緯度線レイヤ」を参照してください。 ワークスペース マネージャの機能の使用 ここでは、ワークスペース マネージャの機能の一部を適用してマップ描画機能を拡張する方法を 説明します。次のトピックで構成されます。 • • • • 「GDI+ による透過性とアンチエイリアスを用いたレンダリングの拡張」 「半透明効果の作成」 「湾曲ラベル」 「経緯度線レイヤ」 GDI+ による透過性とアンチエイリアスを用いたレンダリングの拡張 Microsoft Windows GDI+ は Windows XP または Windows Server 2003 オペレーティング システムに含 まれる機能で、2 次元のベクトル グラフィックスやイメージ、およびタイポグラフィを可能にしま す。GDI+ によって新しい機能が追加され、また既存の機能が最適化されるため、Windows の 456 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ Graphics Device Interface (GDI)、すなわち旧バージョンの Windows に含まれるグラフィック デバイ ス インターフェイスの機能が強化されます。MapXtreme の GDI+ レンダリング機能を利用するこ とで、半透明のラベル、主題図、レイヤを作成できます。また、アンチエイリアスも適用できる ため、高解像度レンダリングを低い解像度で表示するときに、直線と曲線の縁やリージョンの境 界線がぎざぎざになるのを防ぎ、滑らかにすることができます。 GDI+ レンダリングは MapInfo.Mapping.DrawingAttributes と MapInfo.Mapping.LegendDrawing の属性 クラスに含まれる 2 つの新しいプロパティ、EnableTranslucency および SmoothingMode を使って、 API で有効にすることができます。また、ワークスペース マネージャのレイヤ管理ウィンドウの [ スタイル] タブを使ってこれらのプロパティを有効にすることもできます。 注意: アンチエイリアスは透過性が有効な場合のみ使用できます。これらはいずれもワークス ペース マネージャのユーザ インターフェイスを使って設定するか、プログラムから設定し ます。[アンチエイリアスを使用] をオンにした場合、[透過性を有効化] が自動的に選択され ます。[透過性を有効化] をオフにした場合は、[アンチエイリアスを使用] も自動的にオフに なります。 次のマップは、一般道路と高速道路におけるラベルの透過性とアンチエイリアスの効果を示して います。アンチエイリアスが有効になっているため、リージョンの境界線や折れ線が滑らかに表 示されていることがわかります。 GDI+ で拡張される前のレンダリング:GDI+ で拡張された後のレンダリング 開発者ガイド 457 ワークスペース マネージャの機能の使用 すべてのスタイル ダイアログ (ライン スタイル、エリア スタイル、シンボル スタイル、テキスト スタイルなど) にある透過性のトラックバーでは、ボックスに数値を選択して、0 から 100 までの パーセンテージ値を設定できます。ただし、このトラックバーは透過性が有効になっていなけれ ば使用できません。 色の透過性をプログラムから変更するには、System.Drawing.Color.FromArgb() メソッドを使用しま す。このメソッドでは、適用する色のアルファ値を指定できます (GDI+ では、アルファ チャネル は透過性情報のために予約済みのピクセル カラー データに含まれます)。詳細については、.NET のドキュメント ( msdn2.microsoft.com/en-us/library/system.drawing.color.fromargb.aspx) を参照してください。 透過性はすべての色でサポートされており、透過性が有効か無効かにかかわらず、ツールは正し く機能します。[透過性を有効化] のオプションは、半透明のラスタ イメージの表示やエクスポー トには影響しませんが、印刷する場合は有効にしておく必要があります。 注意: 透過性やアンチエイリアス処理を有効にして高品位のマップをレンダリングすると、レン ダリング速度が低下する場合があります。この影響は、3 つ以上の透過レイヤを含んだマッ プで特に顕著に現れます。 半透明効果の作成 マップ フィーチャの色、ラベルの色、または主題図レイヤのスプレッド スタイルの色に半透明効 果を適用すると、マップの他のフィーチャがその色の下に透けて見えるようになります。 マップに半透明効果を適用する方法 次のマップには、半透明な都市境界領域が含まれています。“Watervliet” というラベルの付いた 領域の一部がオーバーラップしており、ラベルの領域の中でオーバーラップされていない部分 ( “Watervliet” の最初の 2 文字の部分) とされている部分の表示が異なっていることがわかります。 このラベル自身も、マップの他の部分に対して半透明に置かれています。 458 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ レイヤに半透明効果を追加するには、レイヤの元のスタイルを変更するために、スタイルのオー バーライドを使用します。 注意: プログラム上でオーバーライド スタイル修飾子を重ね合わせる (OverrideType = AddNew) と、最初にフィーチャのスタイルが描画されます。重ね合わせる方のスタイルが半透明な ので、フィーチャもその下から透けて見えます。 1. ワークスペース マネージャのレイヤ管理ウィンドウのレイヤ ツリーで、"root" ノードを選択し ます (このノードはマップに対応します)。[スタイル] タブで、[透過性を有効化] を選択しま す。 2. 透過性を追加するレイヤを選択し、それをリストの一番上に移動してから、スタイル オーバー ライドを追加します。 3. スタイル オーバーライドに対する [表示/非表示] タブで、そのレイヤのオブジェクトに固有の スタイル ボタンをクリックします。この例の場合は、[領域のスタイル] ボタンをクリックしま す。 開発者ガイド 459 ワークスペース マネージャの機能の使用 [領域のスタイル] ダイアログが表示されます。 4. 透過性トラックバーを使用して、適用する透過性のレベルを選択します。色ごとに、異なる透 過性レベルを選択できます。 ラベルに半透明効果を適用する方法 以前の例でも、ウォーターマークによく似た半透明のラベルが表示されていました。半透明の都 市境界領域で表示をオフにすると、ラベルは次のように表示されます。 この例のように、マップの上に半透明のラベルを追加するには、以下のように操作します。 460 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ 1. ワークスペース マネージャのレイヤ管理ウィンドウのレイヤ ツリーで、"root" ノードを選択し ます (このノードはマップに対応します)。[スタイル] タブで、[透過性を有効化] を選択しま す。 2. レイヤ管理ウィンドウでラベル ソースを選択し、[スタイル] タブに移動します。 3. [テキスト スタイル] ボタンをクリックして、[テキスト スタイル] ダイアログを表示します。 4. 透過性トラックバーを使用して、ラベルの色に適用する透過性のレベルを選択します。上の例 では、フォアグラウンドのテキストの透過性が 80% に設定されています。 主題図に半透明効果を適用する方法 主題図マップには、半透明効果を適用できます。次の例は、都市境界図レイヤに適用されたレン ジ主題図を表しています。このレイヤは、他のレイヤに重ねて配置されています。 透過性を有効にした場合、主題図の開始範囲と終了範囲 (Bin) に対して透過値を選択することで、 色を自動的に変化させることができます。これにより、主題図の開始 Bin と終了 Bin の間にも、自 動的に透過値が適用されます。たとえば、前出のマップの主題図では、開始 Bin には透過値75% ( 灰色) が、終了 Bin には透過値 50% (赤色) が適用されています。この主題図には 3 つの Bin が存在 するため、中間の Bin には自動的に透過値 63% (50 と 75の間で均等に配分) が適用されます。 湾曲ラベル 湾曲ラベルとは、ラインの湾曲に沿って表示されるラベルのことです。湾曲ラベルを使うこと で、道路や河川など、ラインから構成されるマップ フィーチャの外観を美しくすることができま す。 湾曲ラベルをワークスペース マネージャで作成するには、ラベル レイヤを選択し、[位置] タブで [ セグメントに沿ってラベルを曲線化] を選択します。API を介する湾曲ラベルのレンダリングの詳 細については、『MapXtreme 開発者リファレンス』の ILayout インターフェイスのセクションを参 照してください。 開発者ガイド 461 ワークスペース マネージャの機能の使用 MapXtreme は、マップ内のすべての孤および折れ線レコードに対する湾曲ラベルを、湾曲してい ないラベルと同じように作成しようとします。例えば道路マップでは、道路がいくつもの折れ線 や長い折れ線で作成されている場合があります。どの湾曲ラベルを作成し、それをどこに表示す るかは、折れ線の長さと数、湾曲ラベルを作成するかどうかを決定するルール、およびラベル作 成オプションの選択の、すべての要因によって変わってきます。 レイヤ データ内の折れ線や弧のセグメントの中には、ラベル名のエントリを含まないものもあり ます。その場合、MapXtreme ではセグメントのラベルを表示できません。 MapXtreme で湾曲ラベルを表示できるかどうかは、以下の多数のルールによって決定します。 • • • • • • • • • • • • MapXtreme では、TrueType フォントを使用した湾曲ラベルだけを描画できます。TrueType 以外 のフォントを選択した場合、同等の TrueType フォントが代わりに使用されるため、選択したラ ベルが予想どおりに表示されない場合があります。また、TrueType 以外を使用した水平ラベル を湾曲ラベルに変更した場合、フォントが置き換えられるために、変更後のラベルの表示が変 わる可能性があります。 ラベル文字列の部分が、ラベルを作成する弧や折れ線の長さに合っている必要があります。 合っていない場合、MapXtreme は、ラベルが長すぎると判断し、ラベルを破棄します。 折れ線のぎざぎざがひどいと、MapXtreme で湾曲ラベルを描画できない場合があります。ただ し、これは線の曲率によって変わります。 道路のセグメントはまっすぐに見えても、ラベルが湾曲する場合があります。その理由は、道 路セグメントの折れ線データに、そのままのズーム レベルでは表示されない湾曲が含まれるか らです。表示上ではわからない湾曲であっても、ラベルは道路の湾曲に従って作成されます。 マップを十分に近い距離まで拡大してみれば、道路の湾曲が表示されるはずです。 自分自身に向けて湾曲しているラベルは破棄され、表示されません。 湾曲ラベルも、湾曲していないラベルも、オーバーラップの検出、重複テキスト、セグメント の部分的なラベル付けのルールは同じです。これらの各ルールによって、ラベルがどのよう に、いつ表示されるかが変わります。 湾曲ラベルは [ラベル] ツールを使用して、弧や折れ線に沿ったどのポイントでも作成できま す。 湾曲ラベルを他のラベルと同じようにドラッグすることはできません。ただし、[ラベル] ツー ルを使用して位置を変更することは可能です。 湾曲ラベルには、[ラベルの線] コントロールは使用できません。 湾曲ラベルと非湾曲ラベルは、ワークスペースのレイヤに保持されます。 湾曲ラベルに下線を付けることはできません。 湾曲ラベルは透過性やアンチエイリアスが有効かどうかにかかわらず、常に滑らかに表示され ます。 湾曲ラベルの双方向文字列のサポート 湾曲ラベルは右から左に記述する言語でもサポートされます。Windows に付属している Uniscribe ライブラリのサポートが追加されました。このライブラリでは、コンテキスト グリフのシェーピ ングおよびヘブライ語やアラビア語などの双方向スクリプトの並び替えを行います。このメソッ ドにより、複雑なスクリプトを使用して文字列を解析し、別々のまとまりに分割することで、表 示用に並べ替えることができます。 462 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ MapInfo Professional で作成された湾曲ラベル MapInfo Professional で使用可能な湾曲ラベルの表示の設定は、.MWS ワークスペースに保存して MapXtreme に読み込むことができます。MapInfo Professional で行われた湾曲ラベルの位置の変更も .MWS ワークスペースに保存して MapXtreme に読み込むことができます。以下に、MapXtreme に 読み込むことができる表示の設定と位置の変更について説明します。 • • • • MapXtreme は、ワークスペース マネージャでの湾曲ラベルのラベルの線の作成には対応してい ませんが、MapInfo Professional で作成されたラベルの線、またはカスタマイズされたラベル ツールを使用して作成されたラベルの線を読み込むことはできます。 MapXtreme は、ラインの端点のカスタム (ユーザ定義の) 位置を含むラベルについては引出し線 を読み込むことができます。たとえば、MapInfo Professional でラベルの端点を移動してワーク スペース (.MWS) に保存すると、その端点は、MapXtreme でワークスペースを開いたときに意 図したとおりに位置付けられます。MapXtreme は、カスタムのラインの終端の読み込みと保存 は行いますが、その作成はサポートしていません。 MapInfo Professional で作成されて MWS に保存された湾曲ラベルは、MapXtreme でも同じ位置 に表示されます。 MapInfo Professional で新しい場所にドラッグされたラベルは、MapXtreme では湾曲ラベルとし て表示されることがあります。ラベルの変更が .MWS ワークスペースに保存され、そのワーク スペースが MapXtreme で開かれたときに、湾曲ラベル オプションが有効になっている場合、 ラベルは湾曲ラベルとして表示されます。ただし、MapInfo Professional でラベルがドラッグさ れてから、ワークスペースに保存される前に回転された場合、MapXtreme はラベルを湾曲化し ません。これは、MapXtreme は、湾曲ラベルの設定よりも、MapInfo Professional が変更したラ ベルの角度を優先するためです。 湾曲ラベルの作成 曲線に沿ってラベルを配置するには 1. ワークスペース マネージャで、ラベルを変更するマップを開きます。 2. 変更対象のラベルを含んだレイヤ ソースを強調表示します。 3. ラベルが表示可能であることを確認します。 4. [位置] タブをクリックします。湾曲に沿ってラベルを表示するには、回転のセクションで [セ グメントに沿ってラベルを曲線化] を選択します。 開発者ガイド 463 ワークスペース マネージャの機能の使用 5. 必要であれば、[位置] タブで次の方向ボタンを押し、ラベルのアンカー ポイントに対する相対 位置を設定します。 左ボタン: 湾曲ラベルは、弧/折れ線の開始位置に左揃えで配置されます。 中央: 湾曲ラベルは、弧/折れ線の中間点に配置されます。 右ボタン: 湾曲ラベルは、弧/折れ線の終端位置に右揃えで配置されます。 注意 ラベルの配置には、折れ線の長さが影響します。折れ線が長いほど、想定したとおりに ラベルが表示されます。 湾曲ラベルの再配置 湾曲ラベルの位置を変更するには、メイン ツールバーにあるラベル ツールを使用します。変更対 象となるラベル ソースの [位置] タブで、[セグメントに沿ってラベルを曲線化] オプションがオン になっていることを確認してください。 1. ラベルを移動するレイヤを一覧から選択します。 2. [オプション] タブの [選択可能] チェック ボックスをオンにします。 3. 湾曲ラベルを移動するラベル ソースを選択します。 4. メイン ツールバーの (ラベル ツール) をクリックします。 5. ラベルの移動先の線をクリックします。 6. ラベルが目的の位置に配置されるまで、ラベルの新しい場所をクリックします。 注意 選択したセグメントにラベル名が関連付けられていない場合、ラベルは表示されませ ん。 経緯度線レイヤ 経緯度線はマップに重ね合わせ、一定の間隔 (5 度ごと、15 度ごとなど) で表示されるグリッド (緯 度と経度の線) です。基準の枠組みを確立するときに使用します。 464 MapXtreme 2008 v7.0.0 第 24 章 : ワークスペース マネージャ 多くの点で、経緯度線は他のレイヤとまったく同じように機能しますが、 以下の点で他の種類の レイヤとは異なります。 • • • 経緯度線レイヤを他の種類のレイヤのように編集することはできない。つまり、新しいフィー チャを追加できない。 経緯度線にラベル スタイルや位置を設定することは可能だが、経緯度線レイヤにラベル レイ ヤを作成することはできない。 経緯度線レイヤに主題図レイヤを作成することはできない。 経緯度線レイヤの追加 経緯度線はレイヤ管理ウィンドウから直接追加できます (マップ ノードを右クリックしてコンテキ スト メニューを使います)。 デフォルトでは、経緯度線の間隔と範囲は、マップ ウィンドウのズームとサイズによって決まり ます。したがって、経緯度線レイヤをマップに追加すると、経緯度線はズーム レベルに関係なく 表示されます。 経緯度線レイヤの管理 経緯度線レイヤを追加した後、レイヤ管理ウィンドウから以下のさまざまな方法を使ってレイヤ を管理およびカスタマイズすることができます。 • • • • • • • 経緯度線レイヤの表示/非表示、およびズーム/縮尺の設定の制御 主要な経緯度線とそれ以外の経緯度線の間隔の表示と設定 経緯度線のラベルや線の表示/非表示およびスタイルの制御 経緯度線の範囲 (東、西、南、北) の指定 (度、フィート、またはメートルで) レイヤ管理ウィンドウ内でのレイヤの順番の上下移動 経緯度線レイヤの削除 (コンテキスト メニューを使う方法でのみ可能) 複数の経緯度線レイヤおよびグループ レイヤの作成 詳細については、455 ページの「経緯度線レイヤの設定」を参照してください。経緯度線レイヤは 次のように経緯度線アイコンで示されます。 開発者ガイド 465 ワークスペース マネージャの機能の使用 466 MapXtreme 2008 v7.0.0 25 GeoDictionary マネージャ の使用 GeoDictionary マネージャは、マッピング アプリケーションで使用できるよう に MapXtreme に用意されているユーティリティです。この章では、このツー ルの使用方法について説明します。 この章の構成 「GeoDictionary マネージャの使用」 . . . . . . . . . . . . . . . . . . . . . . . . . . 「GeoDictionary マネージャの変更点」 . . . . . . . . . . . . . . . . . . . . . . . . 「GeoDictionary マネージャのユーザ インターフェイス」. . . . . . . . 「GeoDictionary ファイル」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 468 468 472 GeoDictionary マネージャの変更点 GeoDictionary マネージャの使用 GeoDictionary マネージャ アプリケーションは、GeoDictionary ファイルの操作をサポートするよう に設計されています。GeoDictionary は、自動データバインド時にアプリケーションから比較でき る MapInfo のテーブルに関する登録情報を含む XML ファイルです。GeoDictionary には、比較でき る、または比較する MapInfo のテーブルだけを登録します。 アプリケーションで使用する .tab ファイルをすべて GeoDictionary に登録する必要はありません。 不要なファイルを登録すると、オーバーヘッドが発生します。登録が必要なのは、比較対象とす るテーブルだけです。 GeoDictionary マネージャの変更点 MapXtreme の GeoDictionary マネージャは、MapX、および MapXtreme の旧バージョンに含まれて いたユーティリティに似ています。最大の違いは、基本となるファイル (*.dct) が XML ファイルに なり、テキスト エディタまたは XML エディタで編集できるようになったことです。 GeoDictionary マネージャのユーザ インターフェイス ここでは、GeoDictionary マネージャのユーザ インターフェイスについて説明します。 GeoDictionary マネージャの実行 レイヤを手動で登録するときに GeoDictionary マネージャを実行するには、以下の手順に従いま す。 • 468 [スタート] > [すべてのプログラム] > [MapInfo] > [MapXtreme] > [GeoDictionary マネージャ] をク リックします。 GeoDictionary マネージャが表示されます。最後に開いていたファイルが起動時に再読み込 みされます。 MapXtreme 2008 v7.0.0 第 25 章 : GeoDictionary マネージャの使用 要素 GeoDictionary 説明 [GeoDictionary] 編集ボックスには、現在の管理対象の GeoDictionary のフル パスが表示されます。編集ボックスの右にあるボタンをクリックすると、 別 の GeoDictionary を選択して管理できます。GeoDictionary のバイナリ ファイルと XML ファイルの両方を開くことができますが、保存されるのは XML 形式だけです。 登 録 さ れ て い る [登録されているテーブル] リスト ボックスには、GeoDictionary に登録され テーブル ているすべてのテーブルのフレンドリ名のリストが表示されます。登録を 抹消、またはプロパティを変更するには、テーブルを強調表示します。 テーブルをダブルクリックすると、プロパティを編集できる [プロパティ] ダイアログ ボックスが開きます。 登録 [登録] ボタンをクリックすると、[ファイルの種類] コンボ ボックスが "MapInfo テーブル (*.tab)" に設定された状態で標準の [ファイルを開く] ダ イアログ ボックスが開きます。ファイル ピッカーでテーブルを選択する と、そのテーブルの [テーブルのプロパティ] ダイアログ ボックスが開きま す。[ファイルを開く] ダイアログ ボックスでファイルを複数選択した場合 は、テーブルごとに [プロパティ] ダイアログ ボックスが開きます。 登録抹消 このボタンをクリックすると、選択したテーブルが GeoDictionary から削除 されます。Shift キーを押しながらクリックすると、登録を抹消するテーブ ルを複数選択できます。[登録抹消] ボタンをクリックしても、ファイルは ディスクから削除されません。 プロパティ [プロパティ] ボタンをクリックすると、選択されているテーブルの [テーブ ルのプロパティ] ダイアログ ボックスが開きます。この後の [テーブルのプ ロパティ] ダイアログ ボックスの説明を参照してください。 開発者ガイド 469 GeoDictionary マネージャのユーザ インターフェイス 要素 説明 新規作成 [新規作成] ボタンをクリックすると、画面上のフィールドの内容が消去さ れ、新 し い GeoDictionary ファイルを作成できます。この GeoDictionary ファイルを閉じようとすると、変更内容を保存するかどうかの確認が求め られます。 保存 [保存] ボタンをクリックすると、現在のファイルが、ファイルを開いたと きの形式にかかわらず XML 形式で保存されます。 別名で保存 [別名で保存] ボタンをクリックすると、現在のファイルを別の名前で、ま たは別の場所に保存できます。 終了 [ 終 了] ボ タ ン をクリックすると、アプリケーションが終了します。 GeoDictionary ファイルを変更した場合は、変更内容を保存するかどうかの 確認が求められます。 [テーブルのプロパティ] ダイアログ ボックスを使用して、比較するテーブルのプロパティを設定 します。[テーブルのプロパティ] ダイアログ ボックスを開くには、[プロパティ] ボタンをクリッ クするか、[登録されているテーブル] リストで任意のテーブル名をダブルクリックします。 470 MapXtreme 2008 v7.0.0 第 25 章 : GeoDictionary マネージャの使用 要素 説明 MapInfo テーブル MapInfo のテーブルが GeoDictionary と同じディレクトリにある場 合はそのファイル名、それ以外の場合は相対パス名が表示される 読み取り専用の編集ボックスです。ファイルが別のドライブまた はボリュームにある場合は、フル パスが表示されます。 概要 このフィールドでは、テーブルのフレンドリ名を変更できます。 .TAB ファイルの Description タグ、または Description タグが見つ からなかった場合はファイル名がデフォルトで表示されますが、 名前は変更できます。GeoDictionary マネージャでの概要の変更は GeoDictionary に保存されるだけで、テーブル自体には反映されま せん。このため、CD-ROM 上のデータなど読み取り専用データを GeoDictionary マネージャで簡単に使用できます。 一致率 このフィールドには、最初は GeoDictionary のデフォルト値が挿入 されます。この値を変更すると、特定のテーブルについて値を変 更できます。値は 1 ~ 100 の間である必要があります。 フィールド情報 このリスト ボックスには、テーブル内のすべてのインデックス付 きフィールドのリストが表示されます。特定のフィールドのボッ クスがオンになっている場合、比較処理時にそのフィールドが検 索されます。 検索対象の調整に使用する このフィールドでは、特定のインデックスで一意ではないデータ テーブル との完全一致を判別するための調整テーブルを設定できます。 US Counties などの一部のテーブルには、一意ではないインデック ス付きフィールドがあります。この場合、データとの完全一致を 判別するために調整テーブルが必要です。テーブルに一意ではな いインデックス付きフィールドがある場合は、一意のエントリを 見つけるために比較に使用するテーブルをこのフィールドで指定 します。 このテーブルが属する関連 このリスト ボックスには、この特定のテーブルが含まれる特定の マップ ワークスペース、GeoSet、またはその他のファイルが表示されま す。 追加 GeoSet、ワークスペース、または特定の Tab ファイルに関連付け るその他のファイルを選択できる標準のファイル ピッカーが表示 されます。1 つ以上のファイルを選択すると、関連するマップの リストに追加されます。Shift キーまたは Control キーを押しなが らクリックすると、複数のファイルを選択できます。 削除 選択されている Geoset、ワークスペース、またはその他のファイ ル名を、関連付けられているマップのリストから削除します。 開発者ガイド 471 GeoDictionary ファイル GeoDictionary ファイル GeoDictionary ファイル (*.dct) は、GeoDictionary マネージャを使用せずに手動で変更できます。 XML を理解し、簡単に記述できる場合は、この方法が便利です。.dct ファイルは純粋な XML で す。 サンプルの .dct file GeoDictionary ファイルのサンプル GeoDic_US.dct を次に示します。このファイルは、構造の例とし て示す簡単な GeoDictionary です。 <?xml version="1.0" encoding="Windows-1252" standalone="yes"?> <!--GeoDictionary file--> <GeoDictionary> <DefaultMatchThreshold>80</DefaultMatchThreshold> <MatchTables> <MatchTable> <TablePath>US_CNTY.TAB</TablePath> <TableDescription>US county boundary</TableDescription> <RefineTableName>USA.TAB</RefineTableName> <MatchThreshold>90</MatchThreshold> <AssociatedMaps> <AssociatedMap>USA.GST</AssociatedMap> </AssociatedMaps> <MatchFields> <MatchField> <FieldName>County</FieldName> </MatchField> <MatchField> <FieldName>Fips_code</FieldName> </MatchField> </MatchFields> </MatchTable> </MatchTables> </GeoDictionary> 472 MapXtreme 2008 v7.0.0 第 25 章 : GeoDictionary マネージャの使用 構造内の各要素は、次の表に示す GeoDictionary マネージャの個々のフィールドとコントロールに 対応します。 XML 要素 [テーブルのプロパティ] ダ イアログ ボックスの フィールド 説明 GeoDictionary なし。 ファイルのルート要素。 DefaultMatchThreshold なし。 特定のテーブルの MatchThreshold が定義されてい ない場合の比較のしきい値。 この値は、GeoDictionary マネージャを使用して設 定できません。 MatchTables なし。 登録された MatchTable のコンテナ要素。[登録され ているテーブル] リストの項目ごとに 1 つの MatchTable 要素が必要です。 MatchTable MapInfo テーブル 比較する各テーブルのファイル名。 TablePath MapInfo テーブル 各 MatchTable の相対パス。 TableDescription [概要] フィールド、および MatchTable のフレンドリ名。 メイン ダイアログ ボック スの [登録されているテー ブル] リストに表示される 名前 RefineTableName 検索対象 の調整に使用す 比較の調整に使用する関連テーブル。 るテーブル MatchThreshold 一致率 AssociatedMaps、 AssociatedMap このテー ブルが属する関 この特定のテーブルが含まれる特定のワークス 連マップ ペースおよび GeoSet。 MatchFields なし。 MatchField、FieldName [フ ィ ー ル ド 情 報] リスト リスト ボックスで、自動比較とバインド時の検索 ボックス 対象として選択された各項目。 開発者ガイド この MatchTable の比較のしきい値。指定がない場 合は DefaultMatchThreshold が使用されます。 MatchField 要素と FieldName 要素のコンテナ。 473 GeoDictionary ファイル 474 MapXtreme 2008 v7.0.0 MapXtreme への移行 この付録では、従来の MapX のユーザ向けに MapXtreme の .NET ベースのオブ ジェクト モデルについて説明し、それが MapX のアーキテクチャとどのよう に違うかを示します。 この付録の構成 「MapXtreme のオブジェクト モデルと MapX の比較」. . . . . . . . . . 476 A MapXtreme のオブジェクト モデルと MapX の比較 従来の Windows 用の MapX と MapXtreme を使用したことがあれば、MapXtreme の動作に類似点と 相違点があることに気付くでしょう。このセクションでは、MapXtreme と以前のバージョンの API の間の主な相違点について説明します。 各オブジェクト モデルに固有の相違点 現在、MapX からの Map オブジェクトは、3 または 4 つのクラスで記述されています。Map には、 どのように表示されているかに関係なく、レイヤ、対象領域 (ビュー)、Adornments、Legends が含 まれます。MapControl は Map オブジェクトを持ち、Map および Map に関連するコントロールとし て機能します。Windows Forms (デスクトップ) アプリケーションと ASP.NET (web) アプリケーショ ンの両方に対して、MapControl が存在します。MapExport クラスは、ファイルまたはストリームに Map をエクスポートできます。Session には、Map、Selection、および Table のコレクションが含ま れます。現在、シンボル凡例スケールが完全にサポートされています。ラベル レイヤを使用する と、ラベルの位置をより高度に制御できます。グループ レイヤでは、レイヤ階層内で多数のレイ ヤを 1 つのものとして扱うことができます。 MapX データセットの概念は、MapInfo.Data 名前空間の柔軟なオプションに置き換えられました。 MapXtreme では、データ アクセスに ADO.NET を使用します。ADO.NET は、非常に類似性の高い コードによって多彩なデータ形式にアクセス可能にすることにより、データ ソース間の移行を容 易にしています。データベース テーブルに対する前方アクセスおよび後方アクセスのために、よ り多彩なカーソルが追加されています。 MapXtreme は、テーブル中心のデータ モデルを使用します。以前のバージョンの API では、マッ プはレイヤで構成されていましたが、特定のテーブル クラスは存在しませんでした。MapXtreme オブジェクト モデルでは、テーブルは、データへのアクセスで中心的に使用されるオブジェクト です。Session.Catalog は、テーブルのオープンと列挙に使用されます。レイヤはテーブルを参照で きますが、テーブルに固有のすべてのメソッドが Layer からテーブルに移されました。また、 MapXtreme では検索がレイヤではなくテーブルに対して行われます。 レンジ主題図と個別値主題図など、スタイルを修飾する Thematics は、もはや独自のレイヤを使用 しません。主題図などの以前のモデルは独立したレイヤを独占し、マップの他のレイヤとは独立 して機能していしました。オブジェクト主題図は引き続き独自のレイヤを持っており、現在は、 主題図の基盤となる元のマップ オブジェクトとは独立に、ユーザが選択する任意の方法で表示で きます。 ジオメトリは、オブジェクトのプロパティに対してより深いアクセスを持つ階層モデルに変更さ れています。また、スタイルは、階層内で表現されています。 多数のマップ ツールが追加され、使用できるようになりました。拡張性と機能性が向上したこと により、カスタマイズされたツールをより簡単に開発できるようになりました。また、拡張性の 高い Web アプリケーションで使用するためのツールが揃っています。 Web アプリケーションのために、MapXBroker と MapXServer はもう必要ありません。その代わ り、MapXtreme は、標準 COM+ を使用して Session オブジェクトをプールします。 アプリケーションの状態は、シリアライゼーションと ASP.NET 状態サーバを介して管理されま す。状態管理とシリアライザーションの詳細については、「第 6 章: 「状態管理について」」を参 照してください。 476 MapXtreme 2008 v7.0.0 付録 A: MapXtreme への移行 次の表に、MapX 5.0 のオブジェクト モデルと、それに相当する MapXtreme の最新のオブジェクト モデルを示します。MapXtreme のように多機能な製品のアーキテクチャが変更されている場合、 このような対応関係は大まかなものであることに注意してください。 MapX 5.0MapX 5.0 AffineTransform MapXtreme AffineTransform 変更不可 (未設定)。CoordSysFactory.CreateAffineTransform を使用して作成し ます。 AllFeaturesConstraint Annotation 廃止されました。新しい Adornments クラスを使用します。MapControl に、 Control から派生した修飾が含まれます。 Annotations 廃止されました。 BindLayer 廃止されました。代替として Table.AddColumns() 引数を使用します。 BitmapSymbol BitmapPointStyle BitmapSymbols BoundsConstraint CoordSys CoordSys。 変更不可 (未設定)。CoordSysFactory を使用して作成します。 Dataset 廃止されました。 代替: • • • • • • 式フィールド: Table.AddColumns() を使用して式フィールドを作成できま す。 手動データ バインド (動的または静的): Table.AddColumns() で、ADO.NET DataTable を指定する TableInfoClient を使用して開いた Table を使用しま す。 自動データ バインド: Geodictionary 機能により処理されます。 ADO.NET 以外の外部データ XY バインド: TableInfo.SpatialSchema プロパティに SpatialSchemaXY を適 用します。 PointRef バインド: TableInfo.SpatialSchema プロパティに SpatialSchemaPointRef を適用します。 RowValues: MIDataReader、MIScrollableReader。「MICommand」を参照してく ださい。 Refresh: Table.RefreshColumns() Datasets 開発者ガイド 廃止されました。「Dataset」を参照してください。 477 MapX 5.0MapX 5.0 Datum MapXtreme Datum 変更不可 (未設定)。CoordSysFactory.CreateDatum() を使用して作成します。 Feature ジオメトリ、スタイル、およびキー情報が Feature になります。 Features 「Feature」を参照してください。 FeaturesConstraint FeatureFactory テーブル レベルのオブジェクト処理 • • Buffer: 1 つのフィーチャの場合、Geometry レベルにあります (FeatureGeometry.Buffer)。複数のフィーチャの場合、 FeatureProcessor.Buffer を使用します。 Combine: 1 つのフィーチャの場合、Geometry レベルにあります (FeatureGeometry.Combine)。複数のフィーチャの場合、 FeatureProcessor.Buffer を使用します。 Intersect: 1 つのフィーチャの場合、Geometry レベルにあります (FeatureGeometry.Intersect)。複数のフィーチャの場合、 FeatureProcessor.Intersect を使用します。 Field Fields Find Find FindFeature FindResult FindMatch FindCloseMatch、FindAddressRange FindMatches FindCloseMatchEnumerator、FindAddressRangeEnumerator FindResult FindResult Geoset 廃止されました。類似する機能: MapLoader Geoset 廃止されました。 MapXtreme で Geoset が開かれます。 Graphic 廃止されました。 IndividualValueCategory IndividualValueThemeBin IndividualValueCategories ModifierThemeBins Label LabelLayer、LabelSource Label LabelLayer、LabelSource 478 MapXtreme 2008 v7.0.0 付録 A: MapXtreme への移行 MapX 5.0MapX 5.0 MapXtreme LabelProperties LabelProperties Layer UserDrawLayer、LabelLayer、FeatureLayer、ObjectThemeLayer、GroupLayer... • • • • • AutoLabel: 廃止されました。同様の処理を行うには、 LabelSource.DefaultLabelProperties.Enabled プロパティを true に設定しま す。 Begin/EndAccess: 相当するものがありません。 Bounds: FeatureLayer.Bounds • • • ClearCustomLabels: 相当するものがありません。 ClippedBounds: 廃止されました。Map.SetView() を使用してください。 CoordSys • Datasets: 廃止されました。レイヤに Table が含まれています (FeatureLayer.Table)。 DeleteFeature: 同様の処理を行うには、MICommand を使用して行を削除し ます。 DrawLabelsAfter: この概念は廃止されました。同様の処理を行うには、各 レイヤの後で LabelLayer インスタンスを使用します。この方法の問題点 は、各 LabelLayer でそれぞれのラベル キャッシュが破棄されるため、レ イヤ間でラベルが相互作用しなくなることのみです。 Editable: FeatureLayer.Editable • • • • 開発者ガイド AddFeature: 同様の処理を行うには、MICommand を使用して挿入操作を行 う際にジオメトリ フィールドに Geometry をバインドします。 AllFeatures FeatureIDFromFeatureName: 同様の処理を行うには、MICommand を使用し て SQL コマンドを実行します。 479 MapX 5.0MapX 5.0 Layer (続き) MapXtreme • Find: Find • • • GetDrillDownFeaturesByID: 相当するものがありません。 GetFeatureByID: 相当する機能は、MICommand を使用したキーのカーソル です。 Invalidate: IMapLayer.Invalidate • • • • KeyField: 廃止されました。相当する機能は MICommand です。 LabelAtPoint LabelProperties: LabelSource.DefaultLabelProperties Labels • • Name: FeatureLayer.Name または Alias NoFeatures • • • • • • • • OverrideStyle: 相当する機能は、FeatureLayer.Modifiers コレクションです。 Pack: 相当する機能は、FeatureLayer.Table.Pack です。 PredominantFeatureType:MISpatialColumnInfo.PredominantObjectType Table.TableInfo.ColumnInfos プロパティからフィールドを取得できます。 Refresh: キャッシュをフラッシュします。Equivalent: Table.Refresh() Search: 相当する機能は、MICommand です。ただし、結果に含まれるのは フィーチャ キーだけではありません。 SearchAtPoint: 簡単に置き換えられる機能はありません。 SearchWithinDistance: 簡単に置き換えられる機能はありません。 SearchWithinRectangle: 簡単に置き換えられる機能はありません。 SearchWithinFeature: 簡単に置き換えられる機能はありません。 Selectable: FeatureLayer.Selectable • • • • Selection: Session.Sessions コレクションの Selection クラス。 ShowCentroids: FeatureLayer.ShowCentroids ShowLineDirection: FeatureLayer.ShowLineDirection ShowNodes: FeatureLayer.ShowNodes • • • Style: 現在相当する機能は、FeatureLayer.Modifiers コレクションです。 SupportsPack: Table.SupportsPack Type: IMapLayer.Type • • • • • UpdateFeature: 同様の処理を行うには MICommand を使用します。 Visible: IMapLayer.Enabled IMapLayer.Visible も検討します。 ZoomLayer: IMapLayer.ZoomRangeEnabled ZoomMax: IMapLayer.ZoomRange.End ZoomMin: IMapLayer.ZoomRange.Start • • Layers Layers • • • LayerInfo 480 AnimationLayer に相当する機能: GroupLayer および BackingStoreState.Off InsertionLayer に相当する機能: AddMapTool.InsertionLayer Selections: Session オブジェクトに同じ機能があります。 廃止されました。相当する機能は TableInfo です。 MapXtreme 2008 v7.0.0 付録 A: MapXtreme への移行 MapX 5.0MapX 5.0 MapXtreme Legend Legend LegendText LegendRow LegendTexts LegendRows 開発者ガイド 481 MapX 5.0MapX 5.0 Map MapXtreme Map は、Map と MapControl という 2 つのエンティティに分割されました。 MapControl には、System.Windows.Forms.Control に適用できる機能が含まれま す。これは WinForm に埋め込み可能なオブジェクトです。 Map には、表示方法に関係なく (WinForm でもエクスポートでも)、実際の マッピング機能が含まれます。 次に、以前の Map クラスのプロパティ/メソッドが MapXtreme モデルでどの ように扱われているかを示します。 • Annotations: 廃止されました。 CenterX/Y: Map.Center ConvertCoord: DisplayTransform.ToDisplay()、DisplayTransform.FromDisplay() • • • • • • CreateCustomTool: MapTool から継承するか、マウスを使って選択線を描 画する機能を実現する Custom* ツールを使用します。 CurrentTool: MapTools.LeftButtonTool、MapTools.MiddleButtonTool、 MapTools.RightButtonTool。MapControl.MapTools プロパティを使って MapTools にアクセスできます。 Datasets: 廃止されました。テーブルには MICatalog を使ってアクセスでき ます。 Dataset: 廃止されました。 DatasetGeoField: 廃止されました。Map.Dataset を参照してください。 DatasetTheme: 廃止されました。Map.Dataset を参照してください。 DefaultStyle • • • • • 482 DisplayCoordSys: Map.GetDisplayCoordSys() Distance: CoordSys.Distance() DynamicSelectionSupport: MapTools.DynamicSelectionModeSelectMapTool.DynamicSelectionEnabled EditableLabels • ExportMap: MapExport クラス。さまざまなオプションを使ってマップをエ クスポートできます。 ExportSelection: MapExport.ExportSelection • • • • • • • • FeatureEditMode 列挙子: miEditModeFeature -> MapTools.NodeMode = false miEditModeNode -> MapTools.NodeMode = true miMoveDuplicateNodes -> MapTools.MoveDuplicateNodes miDeleteDuplicateNodes -> MapTools.DeleteDuplicateNodes miEditModeAddNode -> MapTools.AddNodeMode FeatureFactory: FeatureProcessor GeoDictionary: Geodictionary • Geoset: 廃止されました。 MapXtreme 2008 v7.0.0 付録 A: MapXtreme への移行 MapX 5.0MapX 5.0 Map (続き) MapXtreme • • • • Geosets: 廃止されました。 GeosetWidth hWnd InfotipPopupDelay • • • InfotipSupport: 相当するものがありません。 IsPointVisible Layers: Layers • • • • • • • • • • • MapPaperHeight/Width: PaperSize (MapExport.ExportSize を使用) MapScreenHeight/Width: MapControl.Size、Map.Size MapUnit: 表示座標系の CoordSys.Units。 MatchNumericFields: GeoDictionary 機能 MatchThreshold: GeoDictionary 機能 MaxSearchTime: GeoDictionary 機能 MilitaryGridReferenceToPoint: CoordSys.MilitaryGridToPoint() MilitaryGridReferenceFromPoint: CoordSys.PointToMilitaryGrid() Mouseicon: MapControl.Cursor MousePointer: MapControl.Cursor MouseWheelSupport: MapControl.MouseWheelSupport.MouseWheelBehavior • NumericCoordSys: 廃止されました。各 Geometry が独自に CoordSys を持つ ようになりました。座標を持つものはすべて座標系を持ちます。 Pan PanAnimationLayer PreferCompactLegends PrintMap: Map.Draw() PropertyPage RedrawInterval: Map.IncrementalDraw.Interval Refresh ReuseEquivalentOnRestore Rotation: Map.Rotation SaveMapAsGeoset SearchPath SelectionStyle: Selection.Style SetSize SnapToNodeSupport SnapTolerance: MapTools.SnapTolerance Title: Adornments TitleText Version WaitCursorEnabled Zoom ZoomTo • • • • • • • • • • • • • • • • • • • • • MultivarCategory 開発者ガイド MultiVariableThemeCategory 483 MapX 5.0MapX 5.0 MapXtreme MultivarCategories MultiVariableThemeCategories NotesQueryInfo 廃止されました。 NotesViewInfo 廃止されました。 OCIQueryInfo 廃止されました。 ODBCQueryInfo 廃止されました。 Parts 相当する機能があります。 Point DPoint Points 廃止されました。 RangeCategory RangedThemeBin RangeCategories ModifierThemeBins Rectangle DRect ResolveObject MatchResolver ResolveObjects MatchResolver コレクション RowValue MICommand RowValues MICommand Selection Selection SourceRow SourceRow SourceRows SourceRows コレクション State Style Theme ObjectTheme、FeatureStyleModifier Themes 廃止されました。Themes の機能は、ObjectThemeLayer (ObjectThemes に対応) または Layer の Modifiers コレクション (FeatureStyleModifier に対応) に含まれ ています。 ThemeProperties 廃止されました。プロパティはテーマ クラス自体に含まれています。 Title Adornments 484 MapXtreme 2008 v7.0.0 付録 A: MapXtreme への移行 MapX 5.0MapX 5.0 MapXtreme Variable MIParameter。式の中でバインドする場合には、MICommand.Parameters プロ パティを利用してコマンド内で使用される変数を定義できます。 Variable MIParameterCollection 開発者ガイド 485 486 MapXtreme 2008 v7.0.0 MapXtreme アプリケー ションを作成および展開す る方法 この付録は、MapXtreme アプリケーションを簡単に作成、パッケージ化、およ び展開する方法を示すチュートリアルとして使用できます。このチュートリア ルを終了すると、適切にインプリメントされたマッピング アプリケーション を開発、パッケージ化、および展開するすべてのステップを実行したことにな ります。 このチュートリアルは、読者が Visual Studio をインストール済みで、その使用 方法を理解していることを前提に作成されています。Visual Studio .NET につい てわからない点がある場合は、Microsoft MSDN Web サイトに多くの情報が掲 載されていますのでご覧ください。msdn.microsoft.com/developerscenter/ を参照 してください。また、MapXtreme がインストールされていることも必要です。 このマニュアルに記載されているコード例は、Visual Basic を使用してインプ リメントされています。多くのサンプル アプリケーションでは、C# .NET サン プルも提供されています。 この付録の構成 「MapXtreme サンプルのカスタマイズ」 . . . . . . . . . . . . . . . . . . . . . . 488 「デスクトップ アプリケーションの作成」 . . . . . . . . . . . . . . . . . . . . 488 「Web アプリケーションの作成」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 B デスクトップ アプリケーションの作成 MapXtreme サンプルのカスタマイズ この付録には、次の 2 つのチュートリアルが含まれています。 • • 「デスクトップ アプリケーションの作成」 「Web アプリケーションの作成」 この 2 つのチュートリアルを進めることで、MapXtreme デスクトップ アプリケーションと Web サ イトのカスタマイズ方法を学び、展開の準備をすることができます。 デスクトップ アプリケーションの作成 このデスクトップ アプリケーションは、MapXtreme に付属する主題図サンプル アプリケーション の 1 つを基に作成します。このサンプル アプリケーションは、既に使用可能なマッピング アプリ ケーションです。簡単な変更を加えるだけで、自分の目的に合わせてカスタマイズできます。こ のチュートリアルで解説する変更方法を基本にすれば、どのようなデスクトップ MapXtreme プロ ジェクトもカスタマイズすることができます。MapXtreme に付属しているすべてのサンプル アプ リケーションは、製品に含まれているマップ アプリケーション テンプレートから作成されていま す。詳細については、「45 ページの「Visual Studio でのアプリケーションの作成」」を参照してく ださい。 サンプル アプリケーションの実行 まずは ThemeLegend アプリケーションを実行して、どのように表示されるかを確認しましょう。 1. Visual Studio で、[ファイル] > [開く] > [プロジェクト/ソリューション] を選択し、ThemeLegend という名前のサンプル アプリケーションに対応するプロジェクトを開きます。このプロジェク トのデフォルトのパスは次のとおりです。 C:\Program Files\MapInfo\MapXtreme\7.x.x\Samples\VisualStudio<2005 または 2008>\Desktop\ Features\ThemeLegend\vb\ThemeLegendVB.vbproj (ここで、x は使用する MapXtreme のバージョン番号です。) 2. [デバッグ] > [デバッグ開始] を選択するか、F5 を押して、アプリケーションを実行します。 488 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 アメリカ合衆国の標準的地図が表示されます。これは、各州の土地面積に基づく主題図を表して います。大きな州ほど濃い青色で表示され、小さな州は薄く表示されます。凡例には、その色が 表す土地面積の範囲が示されます。 このアプリケーションに付属するツールを使って、いくつか基本的な機能を実行できます。テー ブルを開くことや、特定のリージョンの拡大または縮小、マップ上のリージョンの選択、マップ の移動を行えます。さらに、[レイヤの管理] を使用して、各レイヤに特定の設定を適用することも できます。アプリケーションの動作方法や、ユーザへの表示内容を確認するために、ツールを実 際に使用してみてください。 3. それが終わったら、アクティブな Form1 ウィンドウを閉じ、アプリケーションを終了して、デ ザイン モードに戻ります。 アプリケーションの変更 次に、サンプル アプリケーションのカスタマイズ方法を説明するために、ThemeLegend コードに いくつか変更を加えます。このアプリケーションの次の要素を変更します。 • • • • • • データ ソース レンジの数 (Bin) レンジの種類 レンジの色 凡例の位置 ツールバー 1. Visual Studio で、カーソルをソリューション エクスプローラに移動し、MapForm1.vb を右ク リックします。[コードの表示] を選択して、コード ページを表示します。 デザイン モードで MapForm1.vb を表示している場合には、フォーム上の任意の場所を右ク リックして [コードの表示] を選択します。 注意 開発者ガイド このチュートリアルで説明するサンプル アプリケーションはすべて、MapXtreme ディスト リビューション CD に含まれています。参照されている行番号は、各自のインストールに おけるコードと、完全には一致しない場合があります。 489 デスクトップ アプリケーションの作成 2. 新しいタブが追加され、アプリケーション コードが表示されます。スクロールしながらコード ページに目を通し、コードを確認してください。アプリケーションの処理の多くは、Form1() クラスで実行されていることに注意してください。ここでは、このクラスに変更を加えます。 3. 主題図の基本となるデータ ソースを変更します。それには、アプリケーションで使用するテー ブルの名前を変更し、別の FeatureLayer を指定する必要があります。次の変更を加えます。 • 185 行目で、テーブル名を usa.tab から mexico.tab に変更します。 USA のマップではなく、メキシコのマップが読み込まれます。 • 193 行目で、FeatureLayer を usa から mexico に変更します。 4. 以下の図で、コードの変更箇所を赤い四角で囲んで示しています。 5. [デバッグ] > [デバッグ開始] を選択して (または F5 を押して)、アプリケーションを実行し、変 更を確認します。作業が終わったら、Form1 ウィンドウを閉じます。 同じ種類の主題図が、メキシコのデータを使用して作成されます。テーブルの名前と FeatureLayer を変更するだけで、この主題図に適合する任意のデータ ソースを指定することができます。 490 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 次は、主題図自体に変更を加えます。RangedTheme コンストラクタに渡すパラメータを操作する ことで、主題図の計算方法と表示方法を変更できます。 6. コード内で、RangedTheme という語を強調表示にして、F1 を押します (194 行目)。画面に、 RangedTheme に関するヘルプ トピックが表示されます。このヘルプ トピックに目を通せば、 各パラメータがコンストラクタに渡されたときにどのような機能をするかがわかります。 7. ここでは、主題図のレンジ (Bin) の数を増やします。196 行目で、Bin の数を 5 から 8 に変更し ます (Bin とは、最大値と最小値で構成されるレンジを意味します。主題図では、色分けの目 的に合わせて近似値をグループ化するために使用されます)。 8. 次に、レンジの配分方法を変更します。配分方法によって、レンジの計算方法が指定されま す。196 行目で、EqualCountPerRange を EqualRangeSize に変更します。EqualRangeSize の配分方法では、各レンジに含まれる値の数が等しくなります。 9. 次の図で、コードの変更箇所を赤い四角で囲んで示しています。 10. [デバッグ] > [デバッグ開始] を選択して (または F5 を押して)、変更したアプリケーションをビ ルドし、実行します。主題図 Bin の数が増え、配分方法が変わったことがわかります。作業が 終わったら、Form1 ウィンドウを閉じます。 開発者ガイド 491 デスクトップ アプリケーションの作成 次に、レンジの色を変更します。色を変更する方法は、2 つあります。各 Bin に特定の色を設定す る方法と、最初と最後の Bin に色を設定する方法です。ここでは、最初の Bin と 2 番目の Bin の間 で色が段階的に変化するように色分けします。現在、コードでは白から青の範囲で色が変化する ように指定されています。これを、青から赤の範囲に変更しましょう。 11. レンジの色を変更するには、フィル スタイルの色を編集する必要があります。コードを表示し て、次の変更を加えます。 • 最初の Bin の色を変更するには、206 行目で、WhiteFillStyle を BlueFillStyle に変 更します。 • 2 番目の Bin の色を変更するには、216 行目で、BlueFillStyle を RedFillStyle に変 更します。 その中間にあるすべての Bin が、青と赤の中間の色で色分けされます。 12. 次の図で、コードの変更箇所を赤い四角で囲んで示しています。 492 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 13. [デバッグ] > [デバッグ開始] を選択して (または F5 を押して)、変更したアプリケーションをビ ルドし、実行します。新しい設定を反映して、マップの色が変わります。作業が終わったら、 Form1 ウィンドウを閉じます。 多くの変更を加えたため、凡例でマップの一部が隠れてしまっています。次に、マップ全体が表 示されるように凡例を移動します。移動ツールを使ってマップを移動することもできますが、移 動による変更は一時的なものです。移動後のマップ位置は、アプリケーションが実行されている 間しか保持されません。ここでは、凡例の位置をプログラム上で変更します。 開発者ガイド 493 デスクトップ アプリケーションの作成 14. コード ページを表示して、凡例の位置に次の変更を加えます。 • 233 行目で、"mapControl1.Size.Width - legend.Size.Width" を "0" に変更しま す。 凡例の位置の X 座標が、フレームの左側に変更されます。Y 座標はそのままにします。 15. 次の図で、コードの変更箇所を赤い四角で囲んで示しています。 16. [デバッグ] > [デバッグ開始] を選択して (または F5 を押して)、アプリケーションをビルドし、 実行します。凡例の位置が変わったことがわかります。作業が終わったら、Form1 ウィンドウ を閉じます。 494 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 最後の変更は、ツールバーにラベル ツールを追加することです。 17. Visual Studio で、MapForm1.vb の [デザイン] タブをクリックして、[デザイン] ページを前面に 表示します。 18. [メニューとツール バー] ツールボックスから [ToolStrip] を選択し、ラベル ツールを追加する MapControl をクリックします。分割ボタンが表示されます。 19. 分割ボタンの下矢印をクリックし、ボタンのリストから [LabelToolStripButton] を選択します。 ラ ベ ル ツ ー ル が フ ォ ー ム の右上隅に表示され、[ プロパティ] mapControl1 に割り当てられます。 開発者ガイド ウィンドウで自動的に 495 デスクトップ アプリケーションの作成 このように、サンプルを基にして独自のカスタマイズを加えることができます。簡単に独自の データに置き換えたり、主題図を修正したり、ツールを加えたりできます。この主題図マップに は、他にも次のような変更を加えることができます。 • • • データ ソース (テーブル) の別のフィールドを使用して、主題図が別の値 (たとえば人口など) に基づくようにする。凡例を必ず更新し、変更を反映してください。 別の主題図と凡例を追加する。 別のツールを追加する。 リリース モードでのビルド 変更が終わったら、すぐにリリース ビルドを実行できます。リリース ビルドとは、顧客向けまた は 内部ユーザ向けにリリースするアプリケーションのビルドです。リリース ビルドを実行するに は、以下の手順に従います。 1. [ビルド] > [構成マネージャ] を選択します。 2. [アクティブ ソリューション構成] ドロップダウン リストで、ビルド タイプを [Release] に変更 します。 3. [構成マネージャ] ダイアログ ボックスの [閉じる] をクリックします。 4. ソリューション エクスプローラで ThemeLegendVB プロジェクトを右クリックし、[ビルド] を 選択します。 終わったら、「497 ページの「デスクトップ アプリケーションのパッケージ化」」を参照してくだ さい。 496 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 デスクトップ アプリケーションのパッケージ化 このセクションでは、デスクトップ アプリケーションをパッケージ化する方法を示します。パッ ケージとは、ソフトウェア製品に必要なファイルとディレクトリをまとめたものです。製品は CDROM や DVD-ROM などの配布メディアに転送できるように、1 つ以上のパッケージとしてビルド する必要があります。デスクトップ アプリケーションのパッケージを構成する Setup.exe ファイル に、デスクトップ アプリケーションのインストールと実行に必要なすべてのファイルが含まれま す。 MapXtreme で は、こ の プ ロ セ ス が可能なかぎり簡単化されています。Visual Studio の機能と MapXtreme の自動化機能を使用することで、正しいマージ モジュールがパッケージに含まれま す。マージ モジュール (MSM) は、コンポーネントのインストールに必要なファイル、リソース、 レジストリ エントリ、セットアップ ロジックを 1 つに格納したパッケージです。MSM のリストは 52 ページの「アプリケーションの配布」に示されており、ここでは、MapXtreme のランタイム イ ンストーラおよび有効なオプションについても説明されています。 セットアップ プロジェクトの作成 まず、ソリューションのセットアップ プロジェクトを作成する必要があります。そのセットアッ プ プロジェクトを使って、Setup.exe ファイルを作成します。 1. ソリューション エクスプローラで、ソリューションの名前をクリックして強調表示し、[ファ イル] > [新しいプロジェクトの追加] を選択します。[新しいプロジェクトの追加] ダイアログ ボックスが表示されます。 2. [プロジェクトの種類] リストで、[その他のプロジェクトの種類] を展開し、[セットアップと配 置] をクリックします。 3. [Visual Studio にインストールされたテンプレート] から、[セットアップ プロジェクト] をク リックします。 4. セットアップ プロジェクトの名前と場所を入力して、[OK] をクリックします。Visual Studio に、新しいセットアップ ファイルのファイル システムが表示されます。 開発者ガイド 497 デスクトップ アプリケーションの作成 5. 次に、データ ファイルを追加する必要があります。ソリューション エクスプローラで、セッ トアップ プロジェクトを右クリックし、メニューから [追加] > [ファイル] を選択します。 6. [追加] > [ファイル] ダイアログ ボックスで、[ファイルの種類] ボックスのドロップダウン リス トから [すべてのファイル] を選択し、データ ファイルの場所に移動します。 7. セットアップ プロジェクトに追加する必要のあるファイルをすべて選択します。 8. [開く] をクリックします。ファイルは、ソリューション エクスプローラの ThemeLegendVB プ ロジェクトの下に追加されます。 9. セットアップ プロジェクトに追加するファイルが別のパスにもある場合は、手順 5 ~ 8 を繰り 返します。 注意 このアプリケーションを別のマシンに展開する場合は、開発コンピュータと展開先コン ピュータでデータの絶対パスが一致している必要があります。 セットアップ ファイルが書き込まれるパスを表示または変更するには、次のようにします。 1. セットアップ プロジェクトを右クリックし、メニューから [プロパティ] を選択します。 2. [セットアップ プロパティ ページ] で、[出力ファイル名] を変更できます。ここでは、セット アップ ファイルに組み込む構成 (デバッグまたはリリース) も選択します。 ビルドしたアプリケーションを Windowsの [スタート] メニューに配置する場合は、[ファイル シス テム] タブで [ユーザーのプログラム メニュー] メニューを右クリックし、[新しいショートカット の作成] メニューをクリックして、必要に応じて名前とプロパティを設定します。または、[スター ト] メニュー上の指定した位置 (サブメニュー内など) にプログラムを配置するためのスクリプトを 記述することもできます。 同様に、ユーザのデスクトップにショートカットを配置するには、[新しいショートカットの作成] メニューをクリックし、必要に応じて名前とプロパティを設定します。または、ショートカット を作成してユーザのデスクトップに配置するためのスクリプトを記述できます。 ライセンス ファイルの追加 次に、アプリケーションにデスクトップ ライセンス ファイル (MapXtremeDesktop.lic) を追加し、 ユーザがアプリケーションを利用できるようにする必要があります。「34 ページの「展開用のラ ンタイム ライセンス」」を参照してください。 ここでは、ライセンス ファイルの追加方法を説明するために、パッケージに試用ライセンスを含 めることにします。1実際のアプリケーションをパッケージ化する際には、ランタイム ライセンス を追加する必要があります。 1. Visual Studio インターフェイスで、[ファイル システム (Setup)] タブをクリックします。 2. [アプリケーション フォルダ] アイコンを右クリックし、[追加] > [ファイル] を選択します。 3. [ファイルの追加] ダイアログ ボックスで、C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x を開き、MapXtremeTrial.lic を選択します。[開く] をクリックし ます。 ファイルがセットアップ プロジェクトに追加され、他のアプリケーション ファイルと共にアプリ ケーション フォルダにインストールされます。 1. 498 展開用のパッケージを作成するには、SDK または MapXtreme のランタイム インストールに MapXtremeTrial.lic が付属している必要があります。評価バージョンの MapXtreme でセットアップ プロ ジェクトを作成することはできません。 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 オプションのステップ: ワークスペース マネージャと GeoDictionary マネージャの追加 必要であれば、顧客が使用できるように、パッケージに MapXtreme のユーティリティであるワー クスペース マネージャと GeoDictionary マネージャを含めることができます。「498 ページの「ラ イセンス ファイルの追加」」の指示に従ってください。MapXtreme のインストール フォルダ にあ る WorkspaceManager.exe および GeoDictionaryManager.exe を MapXtreme.lic にあわせて置き換えま す。 セットアップ プロジェクトのビルド セットアップ プロジェクトをビルドすると、データ、コンパイル済みのコード、プロジェクトに 必要な MSM がすべて含まれた Setup.exe ファイルが作成されます。このセットアップ プロジェク トは、MapXtreme ソリューションの一部となります。 セットアップ プロジェクトのビルドが終了したら、ソリューションをビルドします。ソリュー ション全体をビルドすると、マッピング アプリケーションがコンパイルされてビルドされた後、 インストール用の Setup.exe ファイルがビルドされます。これで、パッケージが完成し、展開の準 備が整いました。 デスクトップ アプリケーションの展開 デスクトップ アプリケーションがビルドされ、展開用のすべてのコンポーネントがパッケージ化 されました。そこで、これを実用ワークステーションに配置します。 アプリケーションを展開するには、作成した Setup.exe ファイルをエンド ユーザに配布する必要が あります。ファイルを配布できるように、Setup.exe ファイルを CD-ROM または DVD-ROM にコ ピーします。ユーザが各自のコンピュータ上で Setup.exe 実行ファイルを起動してインストールを 開始し、指示に従ってインストールを実行します。これですべて終了です。 Web アプリケーションの作成 この チ ュ ー ト リ ア ル で は、MapXtreme に付属する Thematics Web サンプルを基にします。 MapXtreme Web サンプルは、Visual Studio Web サイト プロジェクトです。これには完全に動作する Web アプリケーションが含まれ、アプリケーションをサポートするためのデータが事前に読み込 まれます。また、状態管理が処理されます。 サンプル Web アプリケーションの実行 まずは Thematics Web サンプルを実行して、どのように表示されるかを確認しましょう。 1. Visual Studio で、[ファイル] > [開く] > [Web サイト] を選択し、ThematicsVB サンプルのフォル ダ を 開 き ま す。こ の フ ォ ル ダ の デ フ ォ ル ト の パ ス は、C:\Program Files\MapInfo\MapXtreme\7.x.x\Samples\Web\Features\Thematics\ThematicsVB です (ここで、x は使 用する MapXtreme のリリース番号です)。 2. [デバッグ] > [デバッグ開始] を選択します (または F5 を押してサンプルをデバッグ モードで実 行します)。 開発者ガイド 499 Web アプリケーションの作成 Thematics サンプルの Web サイト プロジェクトは、背景の世界地図、適用されるさまざまな主題図 をリストするプルダウン メニュー、MS Access テーブルの属性フィールド、および主題図を適用す る [Apply] ボタンで構成されています。Web ページには、MapXtreme Web テンプレートに含まれる 標準のツール ボタン (拡大、縮小、中心、移動) が表示されます。さらにこのアプリケーションに はレイヤ管理機能もあり、表示するレイヤを設定し、現在のマップのズーム レベルを表示できま す。 詳細については、「78 ページの「MapXtreme Web アプリケーションのコンポーネント」」を参照 してください。 終わったら、Web ページを閉じます。ただし、プロジェクトは開いたままにしてください。 500 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 アプリケーションの変更 このサンプル アプリケーションを変更するために、分離コード ページである WebForm1.aspx.vb を 見てみましょう。この分離コード ページのコードは、Web フォームの HTML を表示するコードで す。 注意 この Thematics サンプル Web サイトの設計は、もう 1 つのデスクトップ サンプル アプリ ケーションとは大きく異なっています。最も重要な違いは、この Web サンプルがデータ テーブル名およびデータ フィールド名と強く関連付けられている点です。このような項目 は、デスクトップ サンプルのときのように簡単に変更することはできません。 分離コード ページで、単純な主題図プロパティをいくつか作成し、色分けを行います。この変更 によって、ユーザが主題図を実行したときの表示が変わります。変更を加えるメソッドは、244 行 目の CreateThemeOrModifier メソッドです。最初に変更するのは、Dot Density 主題図です。表示方 法を変更します。 1. Visual Studio で、カーソルをソリューション エクスプローラに移動し、WebForm1.aspx を右ク リックします。[コードの表示] を選択し、分離コード ページ WebForm1.aspx.vb を表示します。 デザイン モードで WebForm1.aspx を表示している場合には、フォーム上の任意の場所を右ク リックして [コードの表示] を選択します。 注意 このチュートリアルで説明するサンプル アプリケーションはすべて、MapXtreme ディスト リビューション CD に含まれています。参照されている行番号は、各自のインストールに おけるコードと、完全には一致しない場合があります。 スクロールしながらコード ページに目を通し、コードを確認してください。 2. 次の変更を加えます。 • • ?ThemeAndModifierTypes.DotDensityTheme Case ステートメントの下、285 行目で、 Color.Purple を Color.DarkGreen に変更します。 これによって、アプリケーションの実行時、Dot Density 主題図を選択したときのドットの 表示色が変わります。 ?286 行目で、ValuePerDot プロパティを 2000000 から 5000000 に変更します。 これにより、人口に基づいて表示されるドットの数が変わります。その結果、ドットの数 が減ります。 次の図に、コードの変更箇所を赤い四角で囲んで示します。 開発者ガイド 501 Web アプリケーションの作成 3. [デバッグ] > [デバッグ開始] を選択して (または F5 を押して)、Web サイトをビルドし、実行し ます。ブラウザにページが表示された後で、[DotDensityTheme] 主題図を選択して、[Pop_1994] をオンにします。 地図上のドットの色が、濃い緑になります。 もう 1 つ、簡単な変更を加えましょう。この変更は、Range 主題図が対象です。 4. 次の変更を加えます。 • • 502 ThemeAndModifierTypes.RangedTheme Case ステートメントの下、273 行目で、Bin の個数の パラメータを 5 から 8 にします。 これによって、主題図のデータ Bin の数が変更されます。 同じ行、273 行目で、Bin の配分方法を EqualCountPerRange から NaturalBreak に変更しま す。 これにより、データをデータ Bin に配分する方法が変更されます。 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 5. [デバッグ] > [デバッグ開始] を選択して (または F5 を押して)、新しい変更を反映した Web アプ リケーションをビルドし、実行します。ページが表示されたら、[RangedTheme] を選択して、 [Pop_1994] をオンにします。 データ Bin を増やしたこと (色分け) で主題図がどのように変化したか、新しいデータ配分方法に 基づいて主題図上の国の色がどのように変化したかを確認してください。 このように、このサンプル Web サイトの表示に単純な変更を加えることは比較的簡単です。これ 以外にこのサンプルに加えられる変更としては、次のようなものがあります。 • • 開発者ガイド ?Web ページのレイアウトの変更。コントロールの移動など。 ?Web ページのスタイルの変更。色やフォントなど。 503 Web アプリケーションの作成 状態管理について Web アプリケーション サンプルをカスタマイズする際には、アプリケーションの要素を変更する だけでなく、状態管理のベスト プラクティスも考えてビルドする必要があります。Web 環境にお けるアプリケーションとユーザの状態処理は複雑であるため、MapXtreme がこれをどのように処 理するかについて理解し、各自の開発の中でこの概念をどのように適用するかについて検討する 必要があります。Web サイトの状態管理については、「第 6 章: 「状態管理について」」を参照し てください。 ベスト プラクティスの点から見ると、このサンプルでは、マップおよび設定の事前読み込みワー クスペースを使用し、アプリケーションとユーザの状態を手動で管理し、プールされたセッショ ン オブジェクトを使用することで、アプリケーションが複数の要求を効率的に処理できます。 また、ユーザが初めての要求を行っているかどうかを検出するように設計されています。それが 初めての要求である場合、アプリケーションは初期状態で表示されます。ユーザがアプリケー ションに再アクセスしている場合は、各ユーザの個別の設定が保持されます。このサンプルは複 数のユーザとセッション オブジェクトを共有しているため (プールと呼ばれる)、セッションが初 期状態にあるか ("クリーン")、別のユーザの変更が含まれているか ("ダーティ") が検出されます。 すべてのユーザの設定を個別に保持するために、このサンプルでは Session.State を Manual に設定 します。MapXtreme Session 状態が自動的に保存される Web アプリケーションでは、Session.State は HttpSessionState に設定されます。つまり、セッション全体が HTTP Session に保存されます。こ の場合、状態が自動的に保存されますが、保存対象が選別されないため、パフォーマンスが低下 します。セッション全体が保存されます。 リリース モード向けの構成 変更が終わったら、すぐにリリース ビルドを実行できます。 ASP.NET 2.0 で注意すべき重要な点は、Visual Studio 2005/2008 には Web サイト プロジェクトのコ ンパイルに関する機能がまったくないことです。従来の ASP.NET 1.1 と Visual Studio .NET では、 分離コードのソース コードと Web フォームをビルドし、コンパイル済みコードを出力ディレクト リに出力できました。Visual Studio 2005/2008 では、コンパイルに関するすべての機能が切り離さ れ、ASP.NET プラットフォームに移管されています。Visual Studio 2005/2008 のビルド コマンドで 実行されるのは、Web サイトの構成の検証のみです。 デバッグを実行せずに、パッケージ化のために Web サイト プロジェクトを構成するには、Web サ イト プロジェクトの Web.config ファイルの構成設定を変更します。Web.config ファイル内で、 XML 要素 "compilation" (27 行目) を探し、属性値を "debug" から "false" に変更します。変更後、次 のようになります。 <compilation defaultLanguage="vb" debug="false"> この設定により、すべてのソース コードをリリース モードでビルドするように、ASP.NET コンパ イラに指定されます。 アプリケーションをビルドするには、ソリューション エクスプローラで ThematicsVB プロジェク トを右クリックし、[Web サイトのビルド] を選択します。 504 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 Web アプリケーションのパッケージ化 Web アプリケーションのパッケージの作成は、デスクトップ アプリケーションのパッケージの作 成に似ています。 Web セットアップ プロジェクトの作成 最初に、ソリューションに Web セットアップ プロジェクトを追加します。Web セットアップ プロ ジェクトを作成するには、次の手順を実行します。 1. ソリューション エクスプローラで、ソリューションを右クリックし、[追加] > [新しいプロジェ クト] を選択します。[新しいプロジェクトの追加] ダイアログ ボックスが表示されます。 2. [プロジェクトの種類] リストで、[その他のプロジェクトの種類] を展開し、[セットアップと配 置] をクリックします。 3. [セットアップ/配置プロジェクト] で、[Web セットアップ プロジェクト] を選択します。[OK] をクリックします。Web セットアップ アプリケーション プロジェクトが作成されます。 次に、ソリューションのどの部分を含むかを指定します。 4. ソリューション エクスプローラで、新しく作成した Web セットアップ プロジェクトを右ク リックし、[追加] > [プロジェクト出力] を選択します。[プロジェクト出力グループの追加] ダ イアログ ボックスが表示されます。 5. [コンテンツ ファイル] をクリックし、[OK] をクリックします。 アプリケーション内の Web ページは、デスクトップ アプリケーションにおける実行ファイ ルとは異なり、HTML ファイルとして生成されるため、コンテンツ ファイルを含める必要 があります。 開発者ガイド 505 Web アプリケーションの作成 6. Web サイトのデプロイメントを自分で作成する場合は、MSM を手動で追加する必要がありま す。詳細については、「57 ページの「Web サイトの展開」」を参照してください。 7. 次に、実稼働サーバにデータを格納する必要があります。実稼働サーバにデータをコピーする か、独立したインストーラでインストールすることができます。 8. Web セットアップ プロジェクトに対する Visual Studio の [ファイル システム] ウィンドウで、 Web アプリケーションのフォルダを右クリックし、[プロパティ] ウィンドウを表示します。仮 想ディレクトリの名前を ThematicsWeb_7_0 に変更します。これにより、対象コンピュータ上 の仮想ディレクトリが指定されます。 ライセンス ファイルの追加 MapXtreme Web アプリケーションをパッケージ化する際には、ユーザがすべてのマップを利用で きるように、有効な MapXtremeWeb.lic が必要になります。展開ライセンスの詳細については、 「34 ページの「展開用のランタイム ライセンス」」を参照してください。この例では、使用する MapXtreme のバージョンに付属しているトライアル ライセンスを使用します。1 506 MapXtreme 2008 v7.0.0 付録 B: MapXtreme アプリケーションを作成および展開する方法 1. 最初に、ライセンス ファイルの保存場所を作成します。MapXtreme 試用ライセンスのパスを MapXtreme インストール フォルダに複製する必要があります。このパスは以下のとおりです。 C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x. [ファイル システム] ウィンドウで、[対象コンピュータ上のファイル システム] を右クリック し、[特別なフォルダの追加] > [共通ファイル フォルダ] を選択します。 2. [共通ファイル フォルダ] を右クリックして、[追加] > [フォルダ] を選択します。フォルダの名 前を "MapInfo" に変更します。 3. パスの最後のフォルダを右クリックし、[追加] > [フォルダ] を選択して、以降のフォルダを作 成します。フォルダの構造に従って、新しく作成したフォルダの名前を変更します。完成した ファイル ツリーは、次の図のようになります。 4. 7.x.x フォルダを右クリックし、[追加] > [ファイル] を選択します。MapXtreme 試用ライセンス ファイル (MapXtremeTrial.lic) を探して、それを 7.x.x フォルダに追加します。MapXtreme 試用 ライセンス ファイルは、C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x に置かれてい ます。 Web セットアップ プロジェクトのビルド これで、Web セットアップ プロジェクトをビルドする準備ができました。 1. [ビルド] > [バッチ ビルド] を選択します。[バッチ ビルド] ダイアログ ボックスが表示されま す。 2. Web サイト プロジェクトのリリース構成を探し、対応する [ビルド] チェック ボックスをオン にします。 3. [ビルド] をクリックします。 ビルドが完了したら、Windows エクスプローラを使用して、Web セットアップ プロジェクトの Release ディレクトリを開いてください。Setup.exe ファイルまたは setup.msi ファイルが作成されて います。このファイルを展開に使用します。 Web アプリケーションの展開 Web 展開では、Web サイトをホスティングする組織が Setup.exe ファイルを実稼働サーバで実行す る必要があります。開発サーバから実稼働サーバに Setup ファイルを転送した後、実稼働サーバに インストールする必要があります。小規模な組織の場合、開発者が展開も行うことがあります。 大規模な組織では、管理者が展開を行う場合があります。その後で、ユーザがインターネット ブ 1. 開発者ガイド 展開用のパッケージを作成するには、SDK または MapXtreme のランタイム インストールに MapXtremeTrial.lic が付属している必要があります。評価バージョンの MapXtreme でセットアップ プロ ジェクトを作成することはできません。 507 Web アプリケーションの作成 ラウザに URL を入力し、サイトにアクセスできるようになります。さまざまなインストーラ、 データのアクセス、プロキシ サーバ、権限の詳細については、「52 ページの「アプリケーション の配布」」を参照してください。 このチュートリアルでは、読者が開発者として展開を行うものと仮定します。実稼働サーバに は、.NET Framework v.2.0 以上と、MapXtreme がインストールされている必要があります。 実 稼働 サ ーバ に アプ リ ケー シ ョ ンを インストールしてライセンス ファイルを追加したら、 Web.config ファイルを修正して、事前読み込みワークスペースがローカル マシンで参照されるよ うにします。 Web サイトを展開すると、セットアップ アプリケーションによって、IIS に必要な仮想ディレクト リが作成され、必要な他のすべてのコンポーネントが適切な場所に配置されます。このアプリ ケーションの場合、ライセンス ファイルは Program Files\Common Files\MapInfo\MapXtreme\7.x.x ディレクトリに置かれます。 Web サ イ ト が 実 行 さ れ て い る こ とを確認するには、ブラウザを起動し、URL として http://<ProductionServerMachine>/ThematicsWeb_7_0/ を入力します。この URL には、アプリケー ションをパッケージ化する際に指定した仮想ディレクトリを使用して、実稼働サーバ上の Web ア プリケーションの場所を指定する必要があります。 インストールの完了後、コマンド プロンプトで iisreset を実行することにより、コンピュータ上の IIS サーバを再起動する必要があります。または、アプリケーションが割り当てられているアプリ ケーション プールをリサイクルします。 508 MapXtreme 2008 v7.0.0 C カスタマイズ MapXtreme この付録では、カスタマイズできる MapXtreme のクラス、インターフェイ ス、およびその他の要素の例を示します。 この付録の構成 「カスタマイズ可能なクラス」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「ワークスペース マネージャ機能拡張」 . . . . . . . . . . . . . . . . . . . . . . 「アプリケーション データ ファイルの場所」 . . . . . . . . . . . . . . . . . 「略語ファイルの検索」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 517 522 524 カスタマイズ可能なクラス 以下のクラスは、容易にサブクラス化できるように設計されており、開発のニーズに合わせてカ スタムのサブクラスを作成できます。 • • • • • • • • • • 「MapInfo.Data.Provider 名前空間」 「ADO.NET」 「Engine.CustomProperties」 「FeatureStyleModifier または FeatureOverrideStyleModifier」 「UserDrawLayer」 「Windows.Controls」 「ツール」 「スタイル」 「GmlFeatureCollection」 「WorkSpacePersistence および WorkSpaceLoader」 MapInfo.Data.Provider 名前空間 MapXtreme は、MapXtreme がそのままでは理解できない形式のデータにアクセスするための拡張 可能データ プロバイダ モデルを提供しています。このモデルの作成にはかなりの量の作業が必要 となるため、MapXtreme が提供する他のデータ アクセス方法では不十分である場合のみ、作成す ることをお勧めします。このモデルについては、「付録 E、533 ページの「拡張可能データ プロバ イダ」」を参照してください。 ADO.NET 上述の拡張可能データ プロバイダ モデルを用いて独自のデータ プロバイダをインプリメントする 前に、MapInfo.Data.TableInfoAdoNet クラスの使用を検討してください。このクラスを使用する と、専用のデータ ソースが提供されていない、マップ作成不可のデータにアクセスすることがで きます。詳細については、『開発者リファレンス』を参照してください。 Engine.CustomProperties CustomProperties クラスを使用して、オブジェクトに独自の情報を追加します。CustomProperties で 情報を追加できるオブジェクトは、FeatureCollection、FeatureStyleModifer、GmlFeatureCollection、 GroupLayer、IFeatureCollection、IMapLayer、ISession、LabelModifier、LabelSource、Legend、 LegendFrame、Map、MapLayer、MapTool、MultiFeatureCollection、Session.PooledSession、お よ び Table です。Add メソッドを使用して、情報を追加し、 Item メソッドを使用して、情報を取得しま す。CustomProperties は、どのタイプでも使用できます。 注意 MapXtreme オブジェクトを直接 CustomProperties コレクションに追加しないでください。追 加すると、シリアライゼーション中にエラーが発生します。代わりに、Alias を追加しま す。たとえば、Map を CustomProperties に追加せず、 代わりに Map.Alias を追加します。 CustomProperties を使用して、プロパティを追加および取得する方法の例を次に示します。 510 MapXtreme 2008 v7.0.0 付録 C: カスタマイズ MapXtreme Public Shared Sub MapInfo_Engine_CustomProperties() Dim bag As CustomProperties = New CustomProperties bag.Add("One", 1) bag.Add("DateNow", DateTime.Now) Dim i As Integer = CType(bag("One"), Integer) Dim ts As DateTime = CType(bag("DateNow"), DateTime) End Sub 検索 検索機能のカスタマイズについては、任意の方法で検索を行うために使用できるクラスがいくつ かあります。QueryFilter クラスを使用すると、SQL クエリで使用できるカスタムの "where" 句を作 成できます。QueryDefinition クラスを使用すると、実行するカスタムの SQL クエリを定義できま す。SearchResultProcessor を使用すると、クエリの結果の後処理を設定できます。 これらのクラスの使用例については、MapXtreme のインストール先ディレクトリ下の Samples ディ レクトリにあるサンプル アプリケーション Search を参照してください (デフォルトのインストール 先は C:\Program Files\MapInfo\MapXtreme\7.x\Samples\Desktop\Features\Search)。 QueryFilter IQueryFilter インターフェイスは、すべてのクエリ フィルタがサポートする必要のあるインター フェイスを定義します。QueryFilter を使用して QueryDefinition の "where" 句の全体または一部を定 義します。 QueryDefinition QueryDefinition クラスは、検索によって実行するクエリを定義します。QueryDefinition は、フィル タ (IQueryFilter)、Columns、および OrderBy で構成されます。Columns を指定しなかった場合は、 "*" が使用されます。 ISearchResultProcessor または SearchResultProcessor SearchResultProcessor は、検索結果に対する後処理を実行して選択する行を絞り込む ISearchResultProcessor インターフェイスをインプリメントします。 FeatureStyleModifier または FeatureOverrideStyleModifier FeatureStyleModifier または FeatureOverrideStyleModifier から派生して独自の FeatureStyleModifier を 作成し、レイヤの外観を変更できます。これらのクラスを使用して、特定のレイヤにあるオブ ジェクトの特定の FeatureStyle の変更を指定します。 次の例では、1990 年から 2000 年の間に人口が減少した場合に USA.TAB のリージョンを赤に設定 する修飾子を作成しています。 using MapInfo.Mapping; using MapInfo.Styles; using System.Drawing; internal class UsaPopulationDecreasedModifier : MapInfo.Mapping.FeatureStyleModifier 開発者ガイド 511 { public UsaPopulationDecreasedModifier() : base(null, null) { // use 2 columns for expressions Expressions = new string[] { I18N.Wrap( "Pop_1990",I18N.WrapType.Column), I18N.Wrap("Pop_2000",I18N.WrapType.Column) }; } // called during draw events protected override System.Boolean Modify(MapInfo.Styles.FeatureStyleStack styles, object[] values) { // compares the values from each column if ( double.Parse(values[0].ToString()) > double.Parse(values[1].ToString()) ) { // if population decreased, color the region red CompositeStyle style = styles.Current; if (style.AreaStyle.Interior is SimpleInterior) { ((SimpleInterior)style.AreaStyle.Interior).ForeColor = Color.Red; // modifies the region return true; } } // does not modify the region return false; } } UserDrawLayer UserDrawLayer クラスを使用して、マップにカスタム レイヤを描画します。このレイヤには、カス タマイズしたロゴ、ポイントの透過オーバーレイなど、任意のものを追加できます。このクラス を使用するには、新しいクラスを派生し、描画メソッドをオーバーロードします。この方法を次 のサンプル コードに示します。 C# の例: using using using using System.Runtime.Serialization; System; System.Drawing; MapInfo.Mapping; [Serializable] class MyUserDrawLayer : UserDrawLayer { // Call the base class constructor with name and alias. public MyUserDrawLayer(string Name, string Alias) : base(Name, Alias) {} 512 MapXtreme 2008 v7.0.0 付録 C: カスタマイズ MapXtreme // Override the abstract Draw method to draw a rectangle. public override void Draw(System.Drawing.Rectangle ClientRect, System.Drawing.Rectangle UpdateRect, Graphics graphics) { // Create a pen. Pen blackPen = new Pen(Color.Black, 3); // Create location and size of rectangle. float x = 10.0F; float y = 10.0F; float width = 200.0F; float height = 200.0F; // Draw rectangle to screen. graphics.DrawRectangle(blackPen, x, y, width, height); } } MapXtreme で は VB バ ー ジョンの UserDrawLayer サンプル アプリケーションも ..\MapInfo\MapXtreme\7.x.x\Samples\Desktop\Features フォルダに用意しています。 Windows.Controls Windows.Controls 名前空間内の多くのクラスは、サブクラス化し、カスタムの動作をインプリメン トできます。この方法で LayerControl をカスタマイズする 2 つの例を以下に示します。 MapInfo.Windows.Controls.PropertiesUserControl LayerControl にカスタム タブを追加する場合は、PropertiesUserControl をサブクラス化したクラス を作成します。次に、LayerControl の GetLayerTypeControls() メソッドと SetLayerTypeControls() メ ソッドを呼び出して、他のタブ クラスのコレクションにクラスを追加します。例については、 MapXtreme のインストール先ディレクトリ下の Samples\Features ディレクトリにあるサンプル アプ リケ ー シ ョ ン を 参 照 し て く だ さい。LayerControl サンプル アプリケーションの MapBackgroundControl.cs ファイルに、PropertiesUserControl をサブクラス化した MapBackgroundControl クラスがあります。 MapInfo.Windows.Controls.LayerNodeHelper およびそのすべてのサブクラス LayerNodeHelper クラスは、LayerControl のレイヤ ツリー内の外観と動作を制御します。これらの ヘルパ クラスは、たとえばユーザが削除できるレイヤを示します。ILayerNodeHelper インターフェ イスのプロパティでレイヤ ノードの外観または動作を十分に制御できない場合、たとえばユーザ が一部のマップ レイヤを削除できるというロジックをテーブルごとに適用したい場合は、任意の ヘルパ クラスをサブクラス化し、適切なメソッドをオーバーライドし、そのオーバーライドした メソッドでレイヤごとのロジックを実行できます。次に、LayerControl.SetLayerTypeHelper メソッ ドを呼び出してヘルパ クラスを使用できます。 デフォルトでは、ユーザが GroupLayer を削除すると確認のダイアログ ボックスが表示されます。 た だ し、GroupLayer が 完 全 に 空 の場合は、確認のダイアログ ボックスが表示されずに空の GroupLayer が削除されます (LabelLayer も同様)。GroupLayer が空の場合でも確認のダイアログ ボックスが表示されるようにするには、GroupLayerNodeHelper から派生するクラスを作成し、 IsRemovalConfirmed メソッドをオーバーライドします。この方法を次のサンプル コードに示しま す。 開発者ガイド 513 using System; using MapInfo.Windows.Controls; namespace MapInfo.Samples.LayerControl { public class CustomLayerNodeHelper : GroupLayerNodeHelper { public CustomLayerNodeHelper() { } public override bool IsRemovalConfirmed(object obj) { return true; } } } ア プ リ ケー シ ョ ン で こ の ヘ ル パ ク ラ スを使用するには、次のような構文で LayerControl の SetLayerTypeHelper メソッドを呼び出します。 layerControlDlg.LayerControl.SetLayerTypeHelper( typeof(GroupLayer), new CustomLayerNodeHelper() ); LayerNodeHelper のサブクラスは以下のとおりです。 • • • • • • • • • • • • • MapNodeHelper MapLayerNodeHelper GroupLayerNodeHelper LabelLayerNodeHelper LabelSourceNodeHelper LabelModifierNodeHelper FeatureStyleModifierNodeHelper RangedThemeNodeHelper DotDensityThemeNodeHelper IndividualValueThemeNodeHelper PieThemeNodeHelper BarThemeNodeHelper GradSymbolThemeNodeHelper ツール ツールは、既存のツールをサブクラス化するか、カスタム (Custom) のベース ツールにコードを追 加してカスタマイズできます。デスクトップ ツールの詳細については、「第 8 章、135 ページの 「デスクトップ アプリケーション、コントロール、ダイアログ、ツール」 」を参照してくださ い。Web ツールについては、「第 5 章、77 ページの「Web アプリケーション、コントロール、お よびツール」 」を参照してください。 514 MapXtreme 2008 v7.0.0 付録 C: カスタマイズ MapXtreme スタイル 以下のクラスを使用して、オブジェクトに適用するスタイルのコレクションにカスタマイズを追 加できます。 BitmapPointStyleRepository BitmapPointStyleRepository クラスを使用すると、現在のすべてのビットマップ ポイント スタイル をループ処理し、指定したディレクトリから新しいビットマップ イメージを追加できます。 Refresh() メソッドを使用すると、任意の新しいビットマップ イメージを、すべてのイメージが含 ま れ る リ ポ ジ ト リ に 追 加 で き ま す。BitmapPointStyles に使用するイメージのコレクションを C:\MyData\MyBitmapImages というディレクトリから再読み込みする方法を次のサンプル コードに 示します。 using MapInfo.Styles; StyleRepository styleRepository = Session.Current.StyleRepository; BitmapPointStyleRepository bmpPointStyleRepository = styleRepository.BitmapPointStyleRepository; bmpPointStyleRepository.Reload("C:\MyData\MyBitmapImages"); InteriorStyleRepository InteriorStyleRepositor クラスを使用すると、現在のすべての内部スタイルをループ処理し、指定し たディレクトリから新しい内部スタイルの新しいビットマップ イメージを追加できます。リー ジ ョ ン の 塗 り つ ぶ し に 使 用 す る 内 部 パ タ ー ン の 現 在 の セ ッ ト に 追 加 す る に は、 AppendBitmapPattern() メソッドを使用します。新しい BMP イメージを InteriorStyleRepository に追 加する方法を次のサンプル コードに示します。 using MapInfo.Styles; StyleRepository styleRepository = Session.Current.StyleRepository; InteriorStyleRepository interiorStyleRepository = styleRepository.InteriorStyleRepository; // AppendBitmapPattern returns the zero-based index of the pattern in // the repository.The index returned may be used to // retrieve a SimpleInterior style using the repository indexer. int index = interiorStyleRepository.AppendBitmapPattern( "C:\MyImages\trees.bmp" ); if (index >= 0) { SimpleInterior style = (SimpleInterior)interiorStyleRepository[index]; } LineStyleRepository LineStyleRepository クラスを使用すると、現在のすべてのライン スタイルをループ処理し、新しい ライン スタイルを追加することができます。(Reload() メソッドを使用して、新しいファイルをリ ポジ ト リ に 追 加 す る こ と が で きます。C:\MyData ディレクトリにある PEN ファイルから、 SimpleLineStyles に使用するライン スタイル パターンのコレクションを再読み込みする方法を次の サンプル コードに示します。 開発者ガイド 515 using MapInfo.Styles; StyleRepository styleRepository = Session.Current.StyleRepository; LineStyleRepository lineStyleRepository = styleRepository.LineStyleRepository; lineStyleRepository.Reload("C:\MyData\MyLineStyles.PEN"); VectorPointStyleRepository VectorPointStyleRepository クラスを使用すると、現在のすべてのベクトル シンボルをループ処理 し、指定したファイルから新しいベクトル シンボルを追加できます。独自のシンボル セットを作 成するには、MapBasic の「シンボル作成機能」アプリケーションを使用する必要があります。ベ クトル シンボル セットを変更したら、Reload() メソッドを使用してシンボル セットをリポジトリ に読み込みます。C:\MyData ディレクトリにある FNT ファイルから、SimpleVectorPointStyles のコ レクションを再読み込みする方法を次のサンプル コードに示します。 using MapInfo.Styles; StyleRepository styleRepository = Session.Current.StyleRepository; VectorPointStyleRepository vecPointStyleRepository = styleRepository.VectorPointStyleRepository; vecPointStyleRepository.Reload("C:\MyData\MyVectorSymbols.FNT"); GmlFeatureCollection GmlFeatureCollection クラスを使用して、XML ファイルからフィーチャをインポートします。マッ プにフィーチャを追加するには、FeatureCollection オブジェクトを作成し、このオブジェクトに追 加する FeatureObject を作成します。その後、FeatureCollection をテーブルに挿入できます。 WorkSpacePersistence および WorkSpaceLoader WorkSpaceLoader をサブクラス化することで、アプリケーションで保存された追加情報を使用中の 永続的なファイルに保持できます。開発者は、永続的な XML ファイルに保存したいすべての情報 をアプリケーションに書き込ませます。これは、UserData ノードの下に情報を追加することに よって行われます。WorkSpacePersistence クラスが永続的なファイルを書き込みを行っており、こ のノード内に何らかのコンテンツがある場合、コンテンツの書き込みは自動的に行われます。 WorkSpaceLoader クラス、またはこのクラスの派生クラスのいずれかは、UserData ノードの子に含 まれるすべてのデータを読み込みます。この例を次に示します。 using MapInfo.Persistence; class myWorkSpaceLoader : WorkSpaceLoader { public myWorkSpaceLoader(string fileName): base(fileName) { // empty } override public void Load() { // called parent Load() method. base.Load(); 516 MapXtreme 2008 v7.0.0 付録 C: カスタマイズ MapXtreme XmlNode userData = this.UserDataXmlNode; foreach (XmlNode childNode in userData.ChildNodes) { string text = childNode.Name; text = childNode.InnerText; // user can do their own load stuff here } } } ワークスペース マネージャ機能拡張 MapXtreme のワークスペース作成ツールであるワークスペース マネージャは、ワークスペースの 作成を容易にするための新しいメニュー コマンド、ツール、およびタブ ウィンドウを追加して拡 張することができます。 ワークスペース マネージャの機能とユーザ インターフェイスの詳細については、「第 24 章: 「ワークスペース マネージャ」」を参照してください。 ワークスペース マネージャ機能拡張は、ワークスペース マネージャの機能を拡張するために記述 された .NET アセンブリです。多くの場合、MapXtreme API を用いて、ワークスペース マネージャ には公開されていないオブジェクト モデルの機能を追加することにより、これらのアセンブリを 作成します。 たとえば、メニュー項目、ツール、タブ ウィンドウをさらに追加したり、変更イベントに反応さ せたりすることができます。レイヤ管理も拡張可能です。ワークスペース マネージャと同様の方 法で、新しい機能をメニューに追加することができます。 機能拡張の作成を終えたら、ワークスペース マネージャの更新されたメニュー ストリップに新し く追加された [機能拡張] メニューを使用してそれを読み込みます。ワークスペース マネージャの 起動時に自動的に読み込むこともできます。 作成すると便利なワークスペース マネージャ機能拡張の例としては、ソート機能付きのテーブル ブラウザ、カスタム主題図テンプレート、オブジェクトの作成および編集用の新しいツールなど が挙げられます。 ワークスペース機能拡張の作成 MapXtreme には、ワークスペース マネージャにユーザが独自の機能を追加できるようにするため のインターフェイスを定義する、MapInfo.WorkspaceManager.Extension.dll というアセンブリが提供 されています。 public interface IWorkspaceManagerExtension { string Name { get; } string Version { 開発者ガイド 517 ワークスペース マネージャ機能拡張 get; } bool HasPropertiesDialog { get; } void ShowPropertiesDialog(IWin32Window owner); IWorkspaceManagerNotifications Load(IWorkspaceManager callback); void Unload(); } 機能拡張を作成するには、IWorkspaceManagerExtension インターフェイスをインプリメントするク ラスを、少なくとも 1 つ含むアセンブリを作成します。このクラスは、引数のないコンストラクタ を持つ必要があります。 Load メソッド IWorkspaceManagerExtension の主要なメソッドは、次のメソッドです。 IWorkspaceManagerNotifications Load(IWorkspaceManager callback); このメソッドは、IWorkspaceManagerExtension クラスが作成された後に呼び出されます。このメ ソッドに引き渡されるのは、IWorkspaceManager をインプリメントするオブジェクトのインスタン スです。これによりこのクラスは、ワークスペース マネージャを逆に呼び出して、メニュー、 ツールストリップ、タブコントロールなどのユーザ インターフェイス要素にアクセスしたり、 ワークスペースの読み込みや保存などのコマンドを実行したりすることができるようになりま す。 public interface IWorkspaceManager { bool NewWorkspace(); bool LoadWorkspace(string filename); void SaveWorkspace(string filename); void MarkWorkspaceChanged(); bool HasWorkspaceChanged(); string LoadedWorkspaceFileName{get;} int AddMapTab(MapInfo.Mapping.Map map); int FindMapTab(MapInfo.Mapping.Map map); int AddLegendTab(MapInfo.Mapping.Legends.Legend legend); int FindLegendTab(MapInfo.Mapping.Legends.Legend legend); void RemoveTab(int tab); Microsoft.Win32.RegistryKey GetRegistryKey(); MapInfo.Windows.Controls.MapControl MapControl{get;} MapInfo.Windows.Controls.MapControl GetMapControlFromTab(int tab); MapInfo.Windows.Controls.LegendControl GetLegendControlFromTab(int tab); MapInfo.Windows.Controls.LayerControl LayerControl{get;} 518 MapXtreme 2008 v7.0.0 付録 C: カスタマイズ MapXtreme System.Windows.Forms.Form MainForm{get;} System.Windows.Forms.MenuStrip Menu{get;} System.Windows.Forms.ToolStrip FileToolStrip{get;} System.Windows.Forms.ToolStrip MapToolStrip{get;} System.Windows.Forms.ToolStrip ToolsToolStrip{get;} System.Windows.Forms.StatusStrip StatusStrip{get;} System.Windows.Forms.TabControl MainTabControl{get;} ContextMenuStrip MapContextMenu{get;} ContextMenuStrip LegendContextMenu{get;} ContextMenuStrip GenericTabContextMenu{get;} } イベント処理 機能拡張において、ワークスペース マネージャからのイベント通知を受け取る必要がある場合 は、IWorkspaceManagerNotifications インターフェイスをインプリメントし、Load() メソッドでそれ を返すクラスを追加します。ワークスペース マネージャは、ワークスペースが作成、読み込み、 または保存された場合に、このクラスを呼び出します。 public interface IWorkspaceManagerNotifications { void OnNewWorkspace(); void OnWorkspaceLoaded(WorkSpaceLoader workspaceLoader, string filename); void OnWorkspaceSaving(WorkSpacePersistence workspacePersistence, string filename); void OnWorkspaceSaved(string filename); void OnLayerControlDialog(MapInfo.Windows.Dialogs.LayerControlDlg dlg); } 機能拡張の読み込み ワークスペース マネージャ機能拡張は、[機能拡張] > [Load 機能拡張の読み込み] により、読み込 むことができます。アセンブリの場所を指定することのできる [開く] ダイアログが表示されま す。 読み込み済みの機能拡張と読み込まれていない機能拡張を確認するには、[機能拡張マネージャ] ダ イアログを使用します。このダイアログは、[機能拡張] > [機能拡張マネージャ] により表示するこ とができます。プロパティ ダイアログが存在する場合は、このダイアログから表示することがで きます。 メモリ内にあるアセンブリからの機能拡張の読み込み 機能拡張は、自動的に読み込むこともできます。ワークスペース マネージャは起動時に、読み込 む機能拡張を 2 か所で検索します。 まず、現 在 の AppDomain に 既に読み込まれているすべてのアセンブリをスキャンして、 IWorkspaceManager をインプリメントする種類のものが存在するかを調べます。これは高度な使用 方法であり、SessionEventHandler (「168 ページの「ISessionEventHandler」」を参照してください) にもワークスペース マネージャ機能拡張が含まれている場合のみ、この機能を使用します。 開発者ガイド 519 ワークスペース マネージャ機能拡張 次にワークスペース マネージャは、WorkspaceManager.exe が格納されているのと同じサンプル デ ィ レ クト リ に あ る Extensions というフォルダを検索します。アセンブリは、 <my_extension>.WorkspaceManagerExtension.dll という名前でなければなりません。この デ ィ レ クト リ に あ る す べ て の 機 能 拡 張アセンブリは、ワークスペース マネージャと同じ AppDomain に読み込まれます。 機能拡張の読み込みのためのコマンド ライン引数 ワークスペース マネージャが読み込む機能拡張を検索する場所を、コマンド ラインによって制御 することも可能です。 /LoadExtensions=[All|Folder|None] 各値の意味は、以下の通りです。 All を指定すると、読み込み済みのアセンブリを検索し、Extensions フォルダを検索します。 Folder を指定すると、Extensions フォルダのみを検索し、読み込み済みのアセンブリをス キップします。 None を指定すると、機能拡張の自動読み込みを行いません。 機能拡張のアンロード 機能拡張は、ユーザによって、または、ワークスペース マネージャが終了するときにアンロード することができます。機能拡張は、追加したメニュー、ツールバー、タブ ウィンドウなどを削除 し、できる限り多くのリソースを解放するように設計する必要があります。ワークスペース マ ネージャを閉じると、機能拡張アセンブリは AppDomain からアンロードされます。 機能拡張の例 起動時に、以前使用していたワークスペースを読み込むワークスペース マネージャの機能拡張の 例を次に示します。 using MapInfo.WorkspaceManager.Extension; using System.Windows.Forms; using System; public class LoadLastWorkspaceExtension : IWorkspaceManagerExtension { private string _name; private IWorkspaceManager _callback; private LoadLastWorkspaceExtension() { _name = "Load Last Workspace Extension"; } public string Name { get { return _name; } } public string Version 520 MapXtreme 2008 v7.0.0 付録 C: カスタマイズ MapXtreme { get { return "0.57"; } } // this get called when extension is first loaded // use it to hook up and UI like menu items, toolbars, etc public IWorkspaceManagerNotifications Load(IWorkspaceManager callback) { _callback = callback; Microsoft.Win32.RegistryKey key = _callback.GetRegistryKey(); string s = (string)key.GetValue("RecentFiles"); if (s != null && s.Length > 0) { try { string[] files = s.Split('|'); callback.LoadWorkspace(files[0]); } catch { } } key.Close(); return null; // returning because we donÅft need the notifications } public void Unload() { // nothing to clean up } public bool HasPropertiesDialog { get { return false; } } public void ShowPropertiesDialog(IWin32Window owner) { throw new NotImplementedException(); } } 開発者ガイド 521 ワークスペース マネージャ機能拡張 アプリケーション データ ファイルの場所 MapXtreme のアプリケーションでは、以下のファイルに格納されているデータが使用されます。 ファイルの種類 ファイル名 略語ファイル MAPINFOW.ABB ペン ファイル MAPINFOW.PEN 投影法ファイル MapInfoCoordinateSystemSet.xml ベクトル シンボル ファイル MapInfow.fnt カスタム シンボル ディレクトリ CustSymb Nadcon のファイル *.las、*.los jgd2000 のファイル jgd2000.* MapXtreme のアプリケーションでは、デフォルトで以下のディレクトリにあるデータ ファイルが 検索されます。 • • • C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x - MapXtreme のインストーラによってこ れらのファイルが配置されるディレクトリです。 アプリケーションがあるディレクトリ - Windows アプリケーションの場合、.exe ファイルがあ るディレクトリです。Web アプリケーションの場合、Web.config ファイルがあるディレクトリ です。 MapInfo.CoreEngine アセンブリ フォルダ - このディレクトリは、アプリケーションによって検 索される最後のディレクトリです。 上記の場所に対応するディレクトリのリストは、ISessions.AppDataPaths プロパティを使用して取 得します。このプロパティは、文字列の配列としてリストを返します。プログラムによってこの リストに追加することはできませんが、アプリケーションの構成ファイルでカスタム セクション を定義して追加することはできます。この方法を次のサンプル コードに示します。追加パスを定 義する順序によって、検索の順序が決まります。また、カスタムの場所は、上記のデフォルトの 場所の前に検索されます。 <SpecialPath> タグの例を次に示します。 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="MapInfo.CoreEngine" type="MapInfo.Engine.ConfigSectionHandler, MapInfo.CoreEngine, Version=6.8.0.536, Culture=neutral, PublicKeyToken=93e298a0f6b95eb1" /> </configSections> <MapInfo.CoreEngine> <ApplicationDataPaths> <SpecialPath> 522 MapXtreme 2008 v7.0.0 付録 C: カスタマイズ MapXtreme <LocalApplicationData>YourCorporation\Your Application<\LocalApplicationData> <\SpecialPath> </ApplicationDataPaths> </MapInfo.CoreEngine> </configuration> こ の 例 で は、MapXtreme は、C:\Documents and Settings\username\Application Data\Your Corporation\Your Application\CustSymb などのフォルダでカスタム シンボルを検索します。 <SpecialPath> 要素にはフォルダ名 CustSymb を含めないように注意してください。含めた場合、こ のパスは ...\Your Application\CustMapXtreme 2008\CustSymb\CustSymb と解釈されます。"CustSymb" が重複しているので、この指定は正しくありません。 アプリケーション データが .NET Framework の特別なシステム フォルダからの相対パスにある場合 は、<SpecialPath> 構文を使用します。たとえば、"My Documents" ディレクトリの下の MyAppData というディレクトリにアプリケーション データがある場合、構成ファイルのエントリは次のよう になります。 <Personal>MyAppData</Personal> ここで "Personal" は、My Documents Environment.SpecialFolder 列挙体の値です。 ディレクトリを表す、.NET Framework の 上記の構成要素内の各要素についての説明を以下に示します。 <configSections> カスタム セクションのハンドラを宣言する場所です。この例では、アセンブリ MapInfo.CoreEngine で定義されている ConfigSectionHandler クラスで構成ファイルの MapInfo.CoreEngine セクションが 解析されます。 <MapInfo.CoreEngine> このセクションには、MapInfo.CoreEngine アセンブリの設定があります。具体的には、アプリケー ション データの検索パスです。 <ApplicationDataPaths> このセクションでは、MapXtreme でアプリケーション データ ファイルの検索に使用される追加パ スを定義します。 <Path> アプリケーション データのフル パスがわかっている場合に使用する要素です。 <SpecialPath> アプリケーション データが、既知のシステム フォルダからの相対パスにある場合にこの構文を使 用します。たとえば、My Documents ディレクトリの下の MyAppData というディレクトリにアプリ ケーション データがある場合、構成ファイルのエントリは <Personal>MyAppData</Personal> とします。ここで "Personal" は、My Documents ディレク トリを表す Environment.SpecialFolder 列挙型の値です。Environment.SpecialFolder 内の任意の列挙値 を使用して、構成ファイルでアプリケーション データのパスを定義できます。 開発者ガイド 523 略語ファイルの検索 略語ファイルの検索 略語ファイルをデータに合わせてカスタマイズすると、検索処理の効率を上げることができま す。詳細については、「第 14 章、283 ページの「Find 処理の調整」 」を参照してください。 524 MapXtreme 2008 v7.0.0 MapInfo ワークスペース について MapXtreme は、移動したり共有で使用したりでき、MapInfo コードスペースの 定義を使用するワークスペース形式を備えています。この付録では、その定 義、機能、および使用について説明します。 MapInfo コードスペースの定義の 詳細については、「付録 H: 「MapInfo コードスペースの定義」」を参照して ください。 この付録の構成 「MapInfo ワークスペースとは」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 「ワークスペースの構造」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 D MapInfo ワークスペースとは MapXtreme では、作成するマップを、移動したり共有で使用したりできる XML ベースのワークス ペース (拡張子 .MWS) として保持できます。ワークスペースとして保持すると、作業環境にかかわ らず、MapInfo 製品を使用している他のユーザとマップを共有できます。 現在、MapXtreme Java、MapX、または MapInfo Professional を使用するユーザは以下の異なるファ イル形式でマップを保持しています。 • • • MapXtreme Java のマップはマップ定義ファイル (.MDF ファイル) として保存されます。 MapX のマップは Geoset (.GST ファイル) として保存されます。 MapInfo Professional のマップはワークスペース (.WOR ファイル) として保存されます。 個々の MapInfo 製品のユーザは、これらのファイルを使用してマップを共有していました。 MapInfo Professional のワークスペースには、ブラウザ ウィンドウとレイアウト ウィンドウ、グラ フ、凡例、およびプリンタ設定が含まれる場合もあります。 すべての MapInfo 製品で共有できるファイル形式が求められてきました。MapXtreme で採用され た新しい MapInfo XML ベースのワークスペースは、今後リリースされるすべての MapInfo 製品で 採用される予定です。XML は、ロケールやネットワーク間でワークスペースを共有するために必 要な移動可能性と相互運用性を備えています。 MapXtreme では、名前付き接続を作成し、新しいワークスペースを共有する優先パスを定義でき ます。名前付き接続を使用すると、別のドライブとパスの情報や、共有の設備にあるデータへの 特定のデータベース接続を指定できます。別々のコンピュータで作業しているユーザは、それぞ れの環境に基づいて名前付き接続のパスを設定し、他のユーザが作成したワークスペースを使用 できます。パスは絶対パスでも相対パスでもかまいませんが、ファイル名は含めません。名前付 き接続を使用して、URI、WMS、ローカル接続、および RDBMS (ODBC、OCI、または JDBC を使 用) へのパスを確立できます。ユーザが後で名前付き接続を含むワークスペースを取得したら、正 しいパスを定義して、ワークスペースで参照されているデータを検索できます。 MXP_MapDataSource_1_4.xsd は、名前付き接続の定義に使用する XML ファイルの形式を指定する 完全な XML スキーマ ファイルです。ワークスペースおよび名前付き接続を定義する XML スキー マ (.XSD) は、MapXtreme に用意されています。スキーマ ファイルには、ワークスペース構造を理 解し、使用するのに役立つコメントがあります。スキーマ ファイルは、メモ帳など任意のテキス ト表示ツールを使用して表示できますが、より強力な XML の表示および編集用ツールを使用する ことをお勧めします。 XML ドキュメントではテキストの識別子を使用しており、また可能な場合は XML 標準化組織に よって定められている識別子を使用しています。ただし、XML は拡張可能であり、ドキュメント の作成者が、ドキュメント内で使用するデータの意味をわかりやすくするために識別子を追加で きるようになっています。これらの識別子が Pitney Bowes Business Insight の定義に従った名前にな るように、識別子は MapInfo コードスペースで指定しています。MapInfo コードスペースの識別子 については、「付録 H: 「MapInfo コードスペースの定義」」を参照してください。 ワークスペースの作成およびワークスペース マネージャの使用の詳細については、「第 24 章: 「ワークスペース マネージャ」」を参照してください。 注意 526 MapInfo Professional で作成したワークスペースは MapXtreme で使用できません。MapX の Geoset は MapXtreme で読み取れます。 MapXtreme 2008 v7.0.0 付録 D: MapInfo ワークスペースについて ワークスペースの構造 ワークスペースの構造を理解するため、ワークスペースとその XML コードについて説明します。 MapXtreme のインストール先ディレクトリ下の Sample ディレクトリにある World.MWS ワークス ペースを使用します。ここでは、ワークスペース内の 5 種類のデータのうち、4 種類について説明 します。 1. ヘッダーでは、バージョン タイプや作成日などの基本的なファイル情報を定義します。 2. 接続セクションでは、ワークスペースに含まれる個々のファイルの場所を定義します。名前付 き接続の情報もここで定義します。 3. データソース定義セクションでは、ワークスペース内のデータの TAB ファイルのソースを指定 します。 4. マップ定義セクションでは、ラベルの詳細、ズーム範囲、使用する色など、ワークスペースに 関連するレイヤ、主題図、およびラベルの機能を定義します。 5. ユーザ データセクションには、アプリケーションが独自のデータを保持できます。ユーザ データは "ワイルドカード" の要素です。スキーマによって検証されないので、任意の内容を入 力できます。 ヘッダー セクション ファイルの先頭には、XML ファイルのヘッダー情報が必須です。ここでは、ファイルが準拠する XML のバージョン、エンコーディング、およびファイルがスタンドアロンかどうかを定義しま す。ファイルの最上位の要素は Workspace 要素です。ここでは、ファイルのバージョン、日付、お よび XML 名前空間の定義の属性を指定します。 注意 MapXtreme でワークスペースの保持用にサポートされているエンコーディングは UTF-8 で す。 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <WorkSpace version="MXP_WorkSpace_1_0" date="2004-02-03T14:00:00" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.mapinfo.com/mxp"> 接続セクション 接続 (ConnectionSet) セクションでは、ワークスペースを使用するのに必要なデータベース接続、 ファイル接続、および WMS 接続を定義します。現在サポートされているデータベース接続は、 MS Windows ODBC 接続、Oracle C インターフェイス (OCI) 接続、および JDBC ドライバ接続で す。ファイル接続は、ファイルのパスを示します。これらの接続の例を次に示します。これらの 接続は、サンプルのワークスペースにはなく、単にデータベース接続とファイル接続の例を示す ものです。 <ConnectionSet> <FileConnection dbType="file"> <ConnectionName>mts_data_japanese</ConnectionName> <FilePath>\\servername\DIR\AP\DATA\TestScripts\Japanese </FilePath> </FileConnection> <DBConnection dbType="xy"> <ConnectionName>Project_xy_ids_informix_9.3</ConnectionName> 開発者ガイド 527 ワークスペースの構造 <ODBCConnectionString>Driver={INFORMIX 3.81 32 BIT}; UID=privateuser;PWD=privateuser;DATABASE=xy; HOST=HOST;SRVR=Project_ds;SERV=1800;PRO=onsoctcp; CLOC=en_US.CP1252;DLOC=en_US.CP1252;VMB=0;CURB=0; OPT=;SCUR=0;ICUR=0;OAC=1;OPTOFC=0;RKC=0;ODTYP=0;DDFP=0; DNL=0;RCWC=0 </ODBCConnectionString> </DBConnection> <DBConnection dbType="oracle"> <ConnectionName>Server_japanese_oracle_9i_release_2 </ConnectionName> <OCIConnectionString>SRVR=INTL;UID=USER;PWD=USER;SCROLL=NO </OCIConnectionString> </DBConnection> <DBConnection dbType="oracle"> <ConnectionName>SERVER_oracle_9i_release_1</ConnectionName> <OCIConnectionString>SRVR=SERVER;UID=USER;PWD=USER </OCIConnectionString> </DBConnection> <DBConnection dbType="sqlserver"> <ConnectionName>server_sqlserver2000_server</ConnectionName> <ODBCConnectionString>DRIVER={SQL Server}; DATABASE=QADB;Server=Server;UID=User;PWD=user; QuotedID=No;Trusted_Connection=No;Network=DBMSN; Address=Server,1433</ODBCConnectionString> </DBConnection> <DBConnection dbType="informix"> <ConnectionName>spyro_ius_9.2_hpux</ConnectionName> <ODBCConnectionString>Driver={INFORMIX 3.81 32 BIT}; UID=user;PWD=user;DATABASE=thedb;HOST=host; SRVR=server_ds;SERV=1800;PRO=onsoctcp;CLOC=en_US.CP1252; DLOC=en_US.CP1252;VMB=0;CURB=0;OPT=;SCUR=0;ICUR=0; OAC=1;OPTOFC=0;RKC=0;ODTYP=0;DDFP=0;DNL=0; RCWC=0</ODBCConnectionString> </DBConnection> </ConnectionSet> データソース定義セクション データソース定義 (DataSourceDefinitionSet) セクションでは、各接続先で取得するデータ ファイル (TAB ファイルなど) およびデータベース テーブルを定義します。取得するデータを表すメタ デー タを含めることもできます。 <DataSourceDefinitionSet> <DBDataSourceDefinition id="id1" readOnly="false"> <DataSourceName>alias_Line_ontario_oracle_9i_rel </DataSourceName> <ConnectionMember> <ConnectionName>ontario_oracle_9i_release_1</ConnectionName> </ConnectionMember> <DBQuery> <Query>select * from us_hiway_extra</Query> 528 MapXtreme 2008 v7.0.0 付録 D: MapInfo ワークスペースについて </DBQuery> <DBDataSourceMetadata> <FeatureGeometryAttribute srsName="mapinfo:coordsys 1,62"> OBJECT </FeatureGeometryAttribute> <KeyAttributes /> </DBDataSourceMetadata> </DBDataSourceDefinition> <TABFileDataSourceDefinition id="id2" readOnly="false"> <DataSourceName>alias_Line_us_hiway_extra</DataSourceName> <FileName>FeatureLayerBuilder\us_hiway_extra.tab</FileName> </TABFileDataSourceDefinition> <DBDataSourceDefinition id="id3" readOnly="false"> <DataSourceName>alias_Point_ontario_oracle_9i_re </DataSourceName> <ConnectionMember> <ConnectionName>ontario_oracle_9i_release_1</ConnectionName> </ConnectionMember> <DBQuery> <Query>select * from usa_caps_extra</Query> </DBQuery> <DBDataSourceMetadata> <FeatureGeometryAttribute srsName="mapinfo:coordsys 1,62"> OBJECT </FeatureGeometryAttribute> <KeyAttributes /> </DBDataSourceMetadata> </DBDataSourceDefinition> <TABFileDataSourceDefinition id="id4" readOnly="false"> <DataSourceName>alias_Point_usa_caps_extra</DataSourceName> <FileName>FeatureLayerBuilder\usa_caps_extra.tab</FileName> </TABFileDataSourceDefinition> <DBDataSourceDefinition id="id5" readOnly="false"> <DataSourceName>alias_Region_ontario_oracle_9i_r </DataSourceName> <ConnectionMember> <ConnectionName>ontario_oracle_9i_release_1</ConnectionName> </ConnectionMember> <DBQuery> <Query>select * from usa_extra</Query> </DBQuery> <DBDataSourceMetadata> <FeatureGeometryAttribute srsName="mapinfo:coordsys 1,104"> OBJECT </FeatureGeometryAttribute> <KeyAttributes /> </DBDataSourceMetadata> </DBDataSourceDefinition> <TABFileDataSourceDefinition id="id6" readOnly="false"> <DataSourceName>alias_Region_usa_extra</DataSourceName> <FileName>FeatureLayerBuilder\usa_extra.tab</FileName> </TABFileDataSourceDefinition> </DataSourceDefinitionSet> ... 開発者ガイド 529 ワークスペースの構造 マップ定義セクション マップ定義 (MapDefinitionSet) セクションでは、1 つ以上のマップとそのマップを構成するレイヤ を定義します。マップには、それぞれイメージのサイズ、ズームと中心の設定、レンダリング時 のマップの座標系などの表示条件があります。 <MapDefinitionSet> <MapDefinition id="id7" name="tab_map__632140027761992151" alias="alias_tab_map__632140027761992151"> <DisplayConditions> <MapSize uom="mapinfo:imagesize pixel"> <ImageWidth>600</ImageWidth> <ImageHeight>400</ImageHeight> </MapSize> <ZoomAndCenter> <MapZoom uom="mapinfo:length mi">3000</MapZoom> <gml:Point srsName="mapinfo:coordsys 1,62"> <gml:coordinates>-79.771366,38.003251000000006 </gml:coordinates> </gml:Point> </ZoomAndCenter> <DisplayCoordSys> <SRSName>mapinfo:coordsys 1,62</SRSName> </DisplayCoordSys> <ResizeMethod>preserveZoom</ResizeMethod> <RasterConditions dither="halfTone" trueColor="true" optimizeRasterLayers="screen" optimizeVectorLayers="screen" /> </DisplayConditions> <LayerList> <FeatureLayer id="id8" name="Tab_Point_632140027762460886" alias="alias_Tab_Point_632140027762460886" volatile="unknown"> <DataSourceRef ref="id4" /> </FeatureLayer> <FeatureLayer id="id9" name="Tab_Line_632140027764492071" alias="alias_Tab_Line_632140027764492071" volatile="unknown"> <DataSourceRef ref="id2" /> </FeatureLayer> <FeatureLayer id="id10" name="Tab_Region_632140027764960806" alias="alias_Tab_Region_632140027764960806" volatile="unknown"> <DataSourceRef ref="id6" /> </FeatureLayer> </LayerList> <MapLegendSet /> </MapDefinition> <MapDefinition id="id11" name="ontario_oracle_9i_release_1__632140027766054521" alias="alias_ontario_oracle_9i_release_1__632140027766054521"> <DisplayConditions> <MapSize uom="mapinfo:imagesize pixel"> 530 MapXtreme 2008 v7.0.0 付録 D: MapInfo ワークスペースについて <ImageWidth>600</ImageWidth> <ImageHeight>400</ImageHeight> </MapSize> <ZoomAndCenter> <MapZoom uom="mapinfo:length mi">3000</MapZoom> <gml:Point srsName="mapinfo:coordsys 1,62"> <gml:coordinates>-79.771366,38.003251000000006 </gml:coordinates> </gml:Point> </ZoomAndCenter> <DisplayCoordSys> <SRSName>mapinfo:coordsys 1,62</SRSName> </DisplayCoordSys> <ResizeMethod>preserveZoom</ResizeMethod> <RasterConditions dither="halfTone" trueColor="true" optimizeRasterLayers="screen" optimizeVectorLayers="screen" /> </DisplayConditions> <LayerList> <FeatureLayer id="id12" name="oracle_usa_caps_extra_632140027766054521" alias="alias_oracle_usa_caps_extra_632140027766054521" volatile="unknown"> <DataSourceRef ref="id3" /> </FeatureLayer> <FeatureLayer id="id13" name="oracle_us_hiway_extra_632140027768398196" alias="alias_oracle_us_hiway_extra_632140027768398196" volatile="unknown"> <DataSourceRef ref="id1" /> </FeatureLayer> <FeatureLayer id="id14" name="oracle_usa_extra_632140027768866931" alias="alias_oracle_usa_extra_632140027768866931" volatile="unknown"> <DataSourceRef ref="id5" /> </FeatureLayer> </LayerList> <MapLegendSet /> </MapDefinition> </MapDefinitionSet> レイヤのリストには、このマップに設定されているラベルのプロパティが含まれます。プロパ ティには、ラベルがあるレイヤ、ラベルのファイル ソース、ラベルを表示する範囲などのラベル の表示ルール、ラベルのフォントとサイズのプロパティ (必要な場合)、ラベルの文字制限、引き出 し線、ラベルの位置設定 (必要な場合)、およびラベルの配置や向きが含まれます。 開発者ガイド 531 ワークスペースの構造 .GST からプログラムによる .MWS ワークスペースの作成 MapX では、Map.SaveMapAsGeoset メソッドを使用して既存のマップから Geoset を作成します。 ユーザは、プログラムによってそれぞれのワークスペースを保存し、次に示すコードを使用して ワークスペース マネージャでワークスペースを表示できます。 注意 ユーザがマップをワークスペースとして保存するには、1 つ以上のレイヤを含むマップを開 いている必要があります。 // Reads a MapX geoset, writes a MapXtreme workspace. using MapInfo.Persistence; using MapInfo.Mapping; . . . MapLoader MapLoader = MapLoader.CreateFromFile("my.gst"); MapExport MapExport = new MapExport(); MapExport.Map.Load(MapLoader); WorkSpacePersistence wsp = new WorkSpacePersistence(); wsp.Save("c:\\temp\\newwork.mws"); 532 MapXtreme 2008 v7.0.0 拡張可能データ プロバイ ダ この付録では、MapXtreme の拡張可能データ プロバイダのアーキテクチャ と、MapXtreme においてそのままではアクセスできない空間データに対し、拡 張可能データ プロバイダを作成する方法について説明します。 この付録の構成 「はじめに」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 「拡張可能データ プロバイダの概要」 . . . . . . . . . . . . . . . . . . . . . . . . 534 「はじめに」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536 「必須コンポーネント」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538 「オプションの基本構築ブロック: ベース クラス、ヘルパ、ユーティ リティ」540 「サンプル: COTW (Center of the World) データ プロバイダ」 . . . . . 541 「オプションのインターフェイス」 . . . . . . . . . . . . . . . . . . . . . . . . . . 543 「データ プロバイダの作成とテスト」 . . . . . . . . . . . . . . . . . . . . . . . . 544 「SpatiaLite サンプル データ プロバイダ」 . . . . . . . . . . . . . . . . . . . . . 546 「高度なトピックと重要な検討事項」 . . . . . . . . . . . . . . . . . . . . . . . . 547 E 拡張可能データ プロバイダの概要 はじめに MapXtreme では、MapXtreme でサポートされていないデータ形式にアクセスするためにインプリ メントすることのできる、拡張可能データ プロバイダ モデルが提供されています。このモデル は、必須およびオプションのインターフェイス、抽象ベース クラスの基本構築ブロック、および ユーティリティで構成されます。 MapXtreme のデータ プロバイダ モデルの拡張は、作成およびテストを担当する人々が多大な責任 を負うことが求められる、困難な作業です。ほとんどの MapXtreme ユーザにとっては、既存の空 間 デ ー タ 形 式 用 の MapXtreme デ ー タ プロバイダ、ま たは、非空間データ用の Microsoft の ADO.NET で十分に要求を満たすことができます。MapXtreme のデータ アクセス方法に関する詳細 については、「第 10 章: 「データでの作業」」を参照してください。 MapXtreme データ モデルでは満たすことのできないデータ アクセス要件が存在する場合は、以下 に記載するインターフェイスと指針を用いて、データ モデルを拡張する必要があります。 MapXtreme の拡張可能データ プロバイダ インターフェイスは、MapXtreme のオブジェクト モデル の中の MapInfo.Data.Provider 名 前空間の下に整理されています。MapInfo.Data および MapInfo.Data.Common 名前空間の中のクラスが、これらのインターフェイスをサポートします。 MapXtreme の拡張可能データ プロバイダは現在、テーブルのオープン、テーブルの内容と関連す るメタデータの読み出し、複数の手法を用いたテーブル内容の検索、および挿入、更新、削除操 作によるテーブル内容の変更をサポートします。 拡張可能データ プロバイダの概要 MapXtreme 内の Catalog は、内部データ プロバイダ アーキテクチャとともに作成されます。拡張 可能データ プロバイダ モデルは、以下の図が示すように、.NET インターフェイスの集合によって この内部アーキテクチャを公開するためのものです。 534 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ データ プロバイダの仕組みと、その作成方法を理解するための中心的な概念がいくつか存在しま す。以下の図は、MapXtreme データ アクセス エンジンの、いくつかの主要なインターフェイスと 既存コンポーネントの間の関係を示すものです。拡張可能データ プロバイダのコンポーネント は、太枠で囲まれた薄紫色で示されています。 データ プロバイダ データ プロバイダは、アプリケーションとデータ ソースを結びつける役割を果たし、アプリケー ションで使用するデータにアクセスするためのメカニズムを提供します。 MapXtreme の拡張可能データ プロバイダは、インターフェイスのコレクションであり、任意の データ ソースからの任意のデータ形式のデータへのアクセスを可能とします。データと、表示、 クエリ、編集、分析などの MapXtreme の機能との間の接続を提供する MapXtreme データ プロバイ ダを拡張しています。 データ プロバイダという語は、拡張機能インターフェイスの特定のインプリメントを指すもので す。たとえば、MapXtreme には、(SQLite に基づく) SpatiaLite データベースにアクセスするための データ プロバイダ インプリメントが含まれています。データ プロバイダ インプリメントの基礎と なる IDataProvider という拡張可能インターフェイスのデータ プロバイダ コレクションに、イン ターフェイスがあります。 データ ソース データ ソースとは、データベース管理システム、Web サービス、またはその他のエンジンやソフ トウェア API のことで、データと、データの記述、クエリ、操作、関連付けなどを行うデータ ア クセス機能を公開します。 データ ソースの例としては、マップ データをフィーチャのコレクションとして返す WFS サーバが あります。WFS サーバは、フィーチャ タイプをテーブルとして公開することのできる、データ ソースです。サービスの URL や、認証のためのその他のプロパティによって、データ プロバイダ がデータ ソースにアクセスする方法が定義されます。この情報を、データ ソース定義と呼びま す。 開発者ガイド 535 はじめに ほとんどのデータ プロバイダ インプリメントにデータ ソースが含まれますが、データ ソースの概 念は必須ではありません。ファイル ベースの形式に対するデータ プロバイダには、テーブル モデ ルのみが含まれる場合もあります。MapInfo テーブルと ESRI Shapefiles は、データ ソースへの接続 を必要としないデータ プロバイダの例です。 テーブル テーブルは、同じスキーマ (またはフィールドの集合) を持つフィーチャの集合です。テーブル に、ジオメトリ プロパティは必須ではありませんが、データ プロバイダを作成する場合には、 テーブルのうちのいくつかにジオメトリ プロパティが存在することになるでしょう。MapXtreme において、ジオメトリ データは、テーブル上のフィールドとして、文字列や数値などの簡単な データ型のフィールドと同じように扱われます。 テーブルは、テーブル内に含まれるデータを記述するためのメタデータを公開し、そのデータを クエリしたり編集したりするためのアクセスを提供します。テーブル内のすべてのフィーチャ は、データ プロバイダがキーを使用して一意に識別できる必要があります。MapXtreme ではキー を、選択や結果セット、また、編集操作のために使用します。 カーソル カーソルとは、フィーチャの集合を列挙するオブジェクトのことです。MapXtreme は、テーブル に対して検索メソッドの 1 つを呼び出すことにより、データ プロバイダからのフィーチャをリク エストします。テーブルは、カーソルを返します。このカーソルを用いて MapXtreme は、指定さ れた条件を満たすフィーチャを列挙することができます。カーソルによって返されたフィーチャ は、一時的なものです。つまり、現在のフィーチャから取得したデータは、カーソルが開いてい て、その現在のレコード上に配置されている間のみ有効であるとみなされます。(次のフィーチャ へと移動したり、カーソルを閉じたりすることにより) カーソルの位置が変わると、そのフィー チャにはもうアクセスできないとみなされます。堅牢かつ拡張性のあるデータ プロバイダをイン プリメントするには、カーソル モデルのこの一時的な性質を利用し、特に FeatureGeometry オブ ジェクトを返す場合に、メモリを再利用する必要があります。 フィーチャ アクセサは、キーによってフィーチャにアクセスするために使用される、特殊な種類 のカーソルです。MapXtreme において、キーによって 1 つ以上のフィーチャにアクセスする必要 がある場合には必ず、まずフィーチャ アクセサをリクエストし、それに対してフィーチャをリク エストします。上述のカーソルの一時的な性質は、フィーチャ アクセサにも当てはまります。 はじめに さて、MapXtreme のデータ プロバイダ モデルを拡張しようと決めた場合、どこから作業を開始す ればよいのでしょうか? 準備作業 まずこの付録全体とインプリメント例に目を通し、その概念とそれらの相互関係をしっかりと理 解しておくことをお勧めします。作業を開始する準備ができたら、作業に関連する要件を十分に 把握するために、まずは非常に簡単なデータ プロバイダを作成します。最終的には拡張可能な データ プロバイダが必要である場合でも、必須の要素のみを使用して基本的なデータ プロバイダ を作成することにより、データ モデルを深く理解することができます。 536 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ 必要最小限の要素については、「「必須コンポーネント」」のセクションを参照してください。 「「拡張可能データ プロバイダの概要」」をよく読んで、さまざまなインターフェイスの相互関 係と、MapXtreme のデータ アクセス モデルとの関係を理解しておきます。提供されている「「サ ンプル: COTW (Center of the World) データ プロバイダ」」を参照して、基本データ プロバイダのイ ンプリメント方法を理解し、MapXtreme サンプルのソース コードによってインストールされた、 完全な機能を実現したデータ プロバイダである「「SpatiaLite サンプル データ プロバイダ」」を 参照してください。 また、SDK に提供されているオプションの基本構築ブロックについても学習し、何が既にインプ リメントされているのかを把握しておくことをお勧めします。「「オプションの基本構築ブロッ ク: ベース クラス、ヘルパ、ユーティリティ」」を参照してください。 データ プロバイダを作成する際にはまず、データ プロバイダにおいてデータ ソースを使用するか どうかを決定する必要があります。すべてのデータ プロバイダに、この種類のモデルが存在する わけではなく、これが必須であるというわけでもありません。単なるテーブルベースの場合もあ ります。データ ソースとは、同一の接続によって複数のフィーチャ (またはテーブル) の集合にア クセスするために通信する、任意のサービスまたはデータベースのことです。データベース サー バは、必ずデータ ソースとして公開されるのに対し、データベースのテーブルはテーブルとして 公開されます。WFS サーバは、データ ソースとしてモデル化されるのに対し、WFS サーバが公開 する FeatureType は、テーブルとしてモデル化されます。ADO.NET DataSet は、データ ソースとし て公開することができますが、そこに含まれる DataTable はテーブルとして公開されます。Excel スプレッドシートは、選択範囲がさまざまなテーブルとして公開された、データ ソースとして公 開されるでしょう。ASCII テキスト ファイルや、フィーチャの集合を 1 つだけ含むことのできる その他のファイル形式のように、データ モデルがより簡単なものである場合は、おそらくデータ ソースは必要なく、データ プロバイダをテーブル モデルのみの簡単なモデルにすることができま す。データが非常に複雑な場合でも、データ ソース モデルが必要でない場合があります。たとえ ば、ファイルベースのデータ形式の中には、州や省、またはその他の何らかの規則に基づき、複 数のファイルに分割してフィーチャを格納するものがあります。このような場合には、テーブル ベースのデータ プロバイダとなり、データ ソースは必要ありません。 より詳細な情報 拡張 可 能 デ ー タ プ ロバイダのアーキテクチャを構成するインターフェイスは、 MapInfo.Data.Provider および MapInfo.Data 名前空間に定義されています。『MapXtreme リファレン ス ガイド』の MapInfo.Data.Provider 名前空間も参考にすることをお勧めします。 開発者ガイド 537 必須コンポーネント 必須コンポーネント 基本データ プロバイダを作成するには、以下のコンポーネントをインプリメントする必要があり ます。これらのクラスは、テーブルのオープン、テーブルの内容と関連するメタデータの読み出 し、テーブル内容の検索など、基本的なデータ アクセス操作をサポートします。 これらのインターフェイスのインプリメント方法に関するヒントや指針については、完全で堅牢 なプロバイダ インプリメントである「「SpatiaLite サンプル データ プロバイダ」」を参照してく ださい。 IDataProvider インターフェイス IDataProvider インターフェイスは、カスタム データ プロバイダ インプリメントの基礎となりま す。このプロバイダが対象とするテーブル形式をオープンするための機能を公開します。また、 これらのテーブルを管理するデータ ソースに関連する機能も公開します。データ ソースを使用し ないデータ プロバイダを作成することもできるため、IDataSource インターフェイスのインプリメ ントは、オプションの作業となります。このクラスは通常、シングルトンのインスタンスとして 定義します。 ITableDefinition インターフェイス ITableDefinition インターフェイスは、拡張可能データ プロバイダと、MapXtreme のパブリック API Table モデルの間の主要なリンクとなります。特定のデータ プロバイダ用に ITable をインスタンス 化するために必要となるプロパティを提供します。このインターフェイスをインプリメントする クラスは、テーブルを開くために MapXtreme のユーザが入力する情報を識別します。MapXtreme Catalog は、OpenTable メソッドのオーバーロードをいくつか提供し、データ プロバイダのユーザ 538 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ が ITable からテーブルをインスタンス化できるようにしています。OpenTable が呼び出された後に は、ITableMetadata、ICursor、IFeature など、他のすべてのインターフェイスはユーザから隠蔽さ れ、MapXtreme の内部で使用されます。 また、このインターフェイスは通常、ワークスペース ファイルに書き出しておくべき情報でもあ ります。詳細については、「550 ページの「永続化プロバイダ」」を参照してください。 ITable インターフェイス ITable インターフェイスは、MapXtreme がマップにおいて読み、 クエリし、表示することのでき る情報の基本コンテナである Table 用のインターフェイスを定義します。ITable のメソッドには、 SearchAll、SearchByEnvelope (対象領域)、SearchByKey などがあります。テーブルは、フィーチャ の単一のコレクションであり、すべてのフィーチャは同じ構造 (スキーマ) を持つ必要がありま す。 ITableMetaData インターフェイス ITableMetaData インターフェイスは、開いているテーブルのプロパティやサポート機能に関する重 要な情報を伝達するために使用します。その情報としては、フィールドやそのデータ型、テーブ ルに含まれるジオメトリのタイプ、編集操作をサポートするかどうかなどがあります。 テーブル メタデータは、テーブルのスキーマをフィールド定義のコレクションとして公開しま す。フィールドは、IColumn および IGeometryColumn インターフェイスによって公開されます。 FeatureGeometry オブジェクトを返すフィールドはすべて、IGeometryColumn として公開する必要が あります。.IGeometryColumn を使用することにより、プロバイダが、挿入および更新操作中に返 したり受け付けたりするジオメトリ値において Z および M 次元をサポートするかどうかを示すこ ともできます。データ プロバイダのほとんどのインプリメントにおいて、MapXtreme 検索リクエ ストと、基盤にあるプロバイダ インプリメントとの間の情報の送受を支援するために、IColumn および IGeometryColumn のカスタム インプリメントが含まれます。 ICursor インターフェイス ICursor インターフェイスは、IFeature オブジェクトを返す IEnumerator です。ITable に対する検索 リクエストが発行された場合、その結果はフィーチャへのアクセスを提供する ICursor となりま す。カーソルが返すフィーチャは、カーソルの状態が変化しない間だけ有効な、一時的なもので ある可能性があります。次のレコード (フィーチャ) へとカーソルを進めると、現在のレコードの 新しい値に更新された、同じフィーチャ オブジェクトが返される場合があります。堅牢なデータ プロバイダをインプリメントするには、このメモリ再利用の動作を利用する必要があります。 検索リクエストでは、テーブルが公開する属性 (フィールド) のサブセットが要求される場合があ ります。カーソルが返すフィーチャは、検索において要求されたフィールドの構造に一致するも のでなければなりません。 IFeatureAccessor インターフェイス IFeatureAccessor は、テーブルからキーによってフィーチャをフェッチするために使用します。指 定されたキーで識別されるフィーチャを返す、FetchByKey という公開された 1 つの主要なメソッ ドを持ちます。データ プロバイダが返す各フィーチャは、キーを含む必要があります。キーの定 義と内容は、データ プロバイダによって決定されます。MapXtreme が、FetchByKey リクエストま たは編集操作のために、データ プロバイダにキーを返すと、データ プロバイダは正しいレコード を識別するためにそのキー値を使用します。IFeatureAccessor インターフェイスでは、MapXtreme 開発者ガイド 539 オプションの基本構築ブロック : ベース クラス、ヘルパ、ユーティリティ による呼び出しの集合を 1 つにまとめる方法を提供しています。これにより、必要ならばデータ プロバイダは、コマンドを用意しておき、キー値のみをバインドして、FetchByKey の各呼び出し を実行することができます。 オプションの基本構築ブロック: ベース クラス、ヘルパ、ユーティリ ティ MapXtreme の拡張可能データ プロバイダは、現状ではサポートされていない形式のデータにアク セスするためにインプリメントすることのできる、インターフェイスのコレクションです。 MapXtreme では、すぐにインプリメントを開始できるように、さまざまなユーティリティ、サン プル、および指針を提供しています。これらは、ほとんどのユーザが使用することのできる共通 のインプリメントです。これらに目を通すことにより、以下の項目について理解することができ ます。 • • • 「抽象ベース クラス」 「ユーティリティ クラス」 「キーのインプリメント」 非常に簡単なインプリメントを作成する場合でも、作業を開始する前に、ここで何が提供されて いるかを理解しておくとよいでしょう。その一部が既に作成されているかもしれないからです。 抽象ベース クラス 多くのインターフェイスに対し、抽象ベース クラスが提供されています。抽象ベース クラスは、 インターフェイスのデフォルト インプリメントを処理することを目的としています。これによ り、ユーザは必要な部分のみをインプリメントすればよいことになります。 たとえば、IDataProvider は、OpenDataSource メソッドと、2 種類の OpenTable メソッド (データ ソースを使用するものと使用しないもの) を提供します。データ ソースを使用する場合は、 OpenDataSource と、データ ソースを使用する OpenTable をインプリメントする必要があります。 データ ソースを使用しない場合は、データ ソースを使用しない OpenTable のみをインプリメント すればよいことになります。 IDataProvider の抽象ベース クラスには、これらのメソッドのデフォルト インプリメントがあり、 それらのメソッドがサポートされていないことを示しています。これらのメソッドには、"virtual" という修飾子がついているため、どれに対してオーバーライドするインプリメントを作成するか を決め、必要な部分のみを作成します。 ユーティリティ クラス SimpleFeature データ プロバイダの基本的な目的は、フィーチャにアクセスすることです。通常、フィーチャは テーブル内の行です。空間フィーチャは、ジオメトリ、スタイル、キー、および属性で記述され ています。 IFeature インターフェイスをインプリメントする、SimpleFeature というユーティリティ クラスが提 供 さ れ てい ま す。メ タ デ ー タ (SimpleFeatureMetdata) 定義の関係と、Feature への Attribute (AttributeValues) のリストが、識別するキー (IKey) 値とともにインプリメントされています。 SimpleFeature クラスは、ほとんどのデータ プロバイダで使用されます。 540 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ SimpleFeature では、FeatureChangedEventHandler イベントの管理もインプリメントされています。 SimpleFeature については、MapInfo.Data.Common 名前空間の下に記載されています。 ジオメトリおよび座標系の OGC 変換 MapXtreme 拡張可能 データ プロバイダには、OGC ジオメトリ (OpenGIS? Simple Features Interface Standard) と MapXtreme ジオメトリの間の変換処理を支援するユーティリティがあります。これに は、PostGIS、mySQL、SQL Server 2008 など、いくつかの空間データ システムが利用する OGC の WKT (Well-Known Text) および WKB (Well-Known Binary) が含まれます。WKT とは、空間リファレ ンス システムの標準テキスト表現のことです。WKB は、ジオメトリの標準バイナリ表現です。 これらのユーティリティは、MapInfo.OGC 名前空間に含まれています。WKT および WKB 用の データ リーダーとライタをインプリメントし、ビッグ エンディアンとリトル エンディアンの両方 のバイト オーダをサポートします。 キーのインプリメント MapXtreme データ プロバイダがアクセスするデータの要件は、すべてのフィーチャにキーが存在 することです。この SDK には、整数キーと文字列キーという、2 つの一般的なキー インプリメン トが提供されています。 扱うデータが整数または文字列ベースである場合は、IKey インターフェイスからキーをインプリ メントする必要はなく、このキー インプリメントのうちの 1 つを使用することができます。 サンプル: COTW (Center of the World) データ プロバイダ "Center of the World" データ プロバイダは、データ プロバイダ インプリメントを組み立てる方法を 示すことを目的とした、非常に簡単な例です。このデータ プロバイダでは、経度/緯度 (0,0) の空間 ポイントを含む 1 行からなるテーブルを管理しています。 新しい拡張可能データ プロバイダをインプリメントするにはまず、IDataProvider をインプリメン トするクラスを作成します。このクラスは、シングルトンのインスタンスとしてインプリメント す る 必 要 が あ り ま す。そう す る ことにより、このクラスに対するすべての参照 ( たとえば、 ITableDefinition や IDataSourceDefinition からの参照) が、同一のインスタンスへと一意に解決されま す。以下に、サンプル インプリメントの最初の部分を示します。 using System; using MapInfo.Engine; using MapInfo.Data.Provider; namespace COTW { public sealed class COTWDataProvider : { private static string PROVIDER_NAME = "Center of the World Sample Extensible Data Provider for MapXtreme"; private static COTWDataProvider m_singleton = null; private COTWDataProvider(string name) 開発者ガイド 541 サンプル : COTW (Center of the World) データ プロバイダ : base(name) { } public static COTWDataProvider GetInstance() { if (m_singleton == null) m_singleton = new COTWDataProvider(PROVIDER_NAME); return m_singleton; } } } このクラスは、IDataProvider そのものではなく、AbstractDataProvider を拡張したものであることに 注意してください。「「オプションの基本構築ブロック: ベース クラス、ヘルパ、ユーティリ ティ」」で述べたように、抽象ベース クラスは、可能な限り適切なデフォルト インプリメントを 提供することを目的とする、基本構築ブロックとして提供されています。IDataProvider の場合、こ の 抽 象 クラ ス は、name プ ロ パ テ ィを管理し、NotImplementedException をスローする OpenDataSource および OpenTable メソッドのデフォルト インプリメントを含みます。これにより ユーザは、何が関連しているかを把握し、それだけをインプリメントすることにより、簡潔なイ ンプリメントを作成することができます。 定義するテーブルの構造は固定であるため、必要となる ITableDefinition のインプリメントはそれ ほど多くありません。意味のある例とするために、テーブル定義において、ポイントに使用する ための外部指定ラベルとして使用することのできる文字列値を受け取ることにします。完全なイ ンプリメントは、以下のようになります。 using System; using MapInfo.Data.Provider; namespace COTW { public sealed class COTWTableDefinition : AbstractTableDefinition { private string m_label; public COTWTableDefinition(string label) : base() { if (label == null) throw new ArgumentNullException("label"); m_label = label; } public override IDataProvider DataProvider { get { return COTWDataProvider.GetInstance(); } } public string Label { get { 542 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ return m_label; } } } } ここでも、インターフェイスを直接使用するのではなく、抽象ベース クラスを使用しました。抽 象ベ ー ス ク ラ ス を 使 用 することにより、この場合は、インターフェイスにおける DataSourceDefinition および CustomMetadata プロパティのデフォルトのままでよい部分について は、まったく気にしなくてよいことになります。DataProvider プロパティが、先ほどインプリメン トしたシングルトンの COTWDataProvider インスタンスを参照する方法に着目してください。この 例では、独自の新しいプロパティも導入されています。 オプションのインターフェイス MapXtreme 拡張可能データ プロバイダ モデルには、以下のようなデータにアクセスする場合のさ らなる機能を提供する、オプションのインターフェイスがあります。 • • • IDataSource IDataSourceDefinition ITableModifyProcessor IDataSource IDataSource インターフェイスは、Catalog.OpenTable において、新しいテーブルを特定のデータ ソースに関連付けるために使用します。データ ソースを使用しないデータ プロバイダを作成する こともできるため、これはオプションとなります。 データ ソースは、関連する IDataSourceDefinition を含む ITableDefinition が開かれるとき、または、 Catalog.DataSources.OpenDataSource メソッドによって直接、インスタンス化されます。抽出された IDataSourceDefinition は、IDataProvider.OpenDataSource に引き渡され、データ ソースに接続し、関 連する IDataSource インスタンスを返すために使用されます。 IDataSourceDefinition DataSourceDefinition は、データへのアクセスにデータ ソースを使用する場合のみ必要となりま す。データ ソースをインスタンス化するためにユーザが入力する情報が含まれています。データ ソースを使用しない場合は、TableDefinition のみを用意すればテーブルを開くことができます。 開かれるテーブルの処理において、データ ソースへの接続を確立するために、DataSourceDefinition プ ロ パ テ ィ か ら IDataSourceDefinition が抽出され、OpenDataSource (IDataSourceDefinition, CustomProperties) へと引き渡されます。 DataSourceDefinition をインプリメントする際には、System.Object.Equals(object) メソッドをオー バーライドする有効なインプリメントを作成する必要があります。 開発者ガイド 543 データ プロバイダの作成とテスト ITableModifyProcessor テーブル メタデータは、Insert、Update、または Delete 操作がサポートされているかどうかを示し ます。上記のいずれかの操作がサポートされている場合は、ITableModifyProcessor のインプリメン トを用意する必要があります。特定の挿入、更新、および削除メソッドのインプリメントは、対 応する個々のメタデータ プロパティに従って作成する必要があります。あるデータ プロバイダ は、たとえば挿入操作のみをサポートするかもしれません。MapXtreme で提供されている ASCII データ プロバイダは、挿入操作のみをサポートし、更新または削除操作をサポートしないデータ プロバイダの 1 例です。 ITable インターフェイスにも、ReadOnly というプロパティがあることに注意してください。この プロパティは、新たな制御レベルを加えるものであり、これによってテーブルが読み取り専用で あることを示すことができます。データ プロバイダが完全にインプリメントされたモディファイ プロセッサを提供していても、十分なアクセス権限がない場合や、データ ファイルが読み取り専 用メディア上にある場合など、他の理由によってテーブルが読み取り専用となる場合がありま す。データ プロバイダは事前にこれらの条件を確認し、テーブル全体を読み取り専用とするか、 または、個々のテーブル メタデータ プロパティによって読み取り専用とすることができます。 データ プロバイダの作成とテスト データ プロバイダの作成は複雑な作業であり、作成したデータ プロバイダ コードを呼び出すのは ほとんどが MapXtreme であるため、そのデバッグも困難です。段階的にデータ プロバイダを作成 し、インプリメントした部分のみをテストしながら作業を進めていくことをお勧めします。この 作業をうまく進めるために、インプリメントしたい部分のみに対応するコードを記述することの できるサンプル プロジェクトから開始するとよいかもしれません。データ プロバイダの拡張に伴 い、このサンプルを拡張していくことができます。ただし、これを直接データ プロバイダ プロ ジェクトに含めてはいけません。Visual Studio では、単一のソリューションの中に複数のプロジェ クトを作成することが可能です。 データ プロバイダ モデルの中にデータ ソースがある場合は、そこから作業を開始するのがよいで し ょ う。IDataSourceDefinition お よび IDataSource のインプリメントを作成し、 Catalog.DataSources.OpenDataSource メソッドを使用して、MapXtreme がデータ プロバイダを呼び出 し、そのデータ ソース オブジェクトを DataSources コレクションに入れることができるかどうかを 確認します。 このテーブル モデルの最初の目標は、テーブルを開き、テーブルのメタデータを表示することに なります。これならば、検索やカーソルに関する、これよりもかなり複雑なコードを記述するこ となく、作成しテストすることができます。ITableDefinition、ITable、および ITableMetadata のイン プリメントの作成が必要です。最初は、NotImplementedException をスローするように、検索およ び変更インターフェイスをインプリメントします。テスト アプリケーションでは、テーブル定義 クラスのインスタンスを作成して内容を設定し、この定義を引数として Catalog.OpenTable を呼び 出すことによりテーブルをインスタンス化し、テーブルの TableInfo プロパティに設定された フィールド定義を確認します。フィールド定義は、テーブル メタデータが MapXtreme に引き渡し た情報を正確に反映していなければなりません。その情報としては、適切な座標系、データの上 下限値、ジオメトリ フィールドのデフォルト ビューなどがあります。 データ プロバイダの作成およびテストにおける次の作業は、非常に簡単な検索ロジックと、カー ソル インプリメントを追加することです。テスト アプリケーションに、次のような簡単なコード のブロックを追加します。 544 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ Table table = catalog.OpenTable(myTableDefinition, "MyTable"); foreach (Feature feature in table) { // inspect the feature, write out values to the console, etc... } このコードを動作させるには、ITable.SearchAll メソッドをインプリメントし、カーソル インプリ メントを作成する必要があります。また、キー インプリメントを作成する必要があります。上記 のコード例で返されるフィーチャは、キーに対する適切な値を反映するものでなければなりませ ん (ただし、値は文字列にシリアライズされます)。 この基本レベルのコードを動作させることができれば、データ プロバイダのマップにおけるテス トを開始することができます。ここでは、スタイルが正しいかなど、期待通りのジオメトリが返 されているかどうかを視覚的に確認することができます。事前に SearchByEnvelope のインプリメ ントが一部必要になります。ここでは areaOfInterest 引数は無視し、まずはデータの状態を確認す ることのみを目的として、すべてのレコードを返します。すべてのリクエストに対してすべての フィーチャを取得するため、パフォーマンスは低くなります。マウスをマップ上で移動させるた びに MapXtreme が情報チップを表示しようとするのを防ぐために、レイヤ上の情報チップのプロ パティをオフにしておくとよいでしょう。情報チップは、マウスが存在するポイント周辺の小さ な領域 areaOfInterest とともにデータ プロバイダの階層をたどって呼び出しを行います。これに加 えて、すべてのテーブル フィーチャを返していたのでは、パフォーマンスは非常に低くなってし まいます。また、フィーチャ アクセサをインプリメントするまでは、選択や結果セットの機能を テストすることはできません。 先に進む前に、SearchByEnvelope メソッドのサポートを追加する必要があります。これを追加すれ ば、マップのレンダリングに必要なフィーチャのみを MapXtreme に返すことができるようになる ため、データ プロバイダの大まかなパフォーマンスを把握することができます。情報チップの設 定をオンに戻し、情報チップ式にさまざまな値を設定して、 MapXtreme に正しいデータが引き渡 されているかどうかを確認することもできるようになります。パフォーマンスが思わしくなけれ ば、さらに複雑にする前に、ここで一度設計を評価し、調整するとよいでしょう。 次の大きな関門は、フィーチャ アクセサ インターフェイスのインプリメントです。このインター フェイスをテストする最も簡単な方法は、結果セット フィーチャ コレクションを作成し、フィー チャを列挙することです。内部的には、結果セット フィーチャ コレクションは、検索条件を満た すレコードのキーをキャッシュし、結果セットにアクセスする際にはフィーチャ アクセサを使用 します。 これらすべての部分を動作させることができれば、データ プロバイダの作成における最も困難な 作業のうちの最大の部分を終えたことになります。次に作成したいのは、永続化プロバイダで す。これにより、作成した定義を MapXtreme ワークスペース ファイルに永続化することができま す。ここでは、新しいワークスペース マネージャ拡張機能に着目し、ワークスペース マネージャ 機能拡張の追加を検討するとよいでしょう。この機能拡張は、テーブルを定義するためのユーザ インターフェイスを提供し、永続化プロバイダ機能拡張に結合することができます。これによ り、ワークスペースを設定および作成し、データ プロバイダの永続的なコンテンツとともにワー クスペースを読み出すこともできるようになります。 ここまでは、簡単なデスクトップ アプリケーション環境に限定してデータ プロバイダのテストを 実施することをお勧めします。永続化をインプリメントしたら、Web ベースの展開について検討 してみるとよいでしょう。これには、テーブル、カタログ全体、またはセッションが、複数の ユーザ リクエストにわたってシリアライズできるように、シリアライゼーションのサポートが必 要になります。 開発者ガイド 545 SpatiaLite サンプル データ プロバイダ SpatiaLite サンプル データ プロバイダ 拡張可能データ プロバイダ SDK には、拡張可能データ プロバイダ アーキテクチャの多くの機能 を 実 現 した、デ ー タ プ ロ バ イ ダ のサンプル インプリメントが含まれています。 MapInfo.SpatiaLite.sln は、SQLite3 Ado.Net データ プロバイダを使用して、基盤となる SQLite3 デー タベースへの接続を確立し、MapXtreme アプリケーションにおいてテーブルを開く、Visual Studio ソリューションです。 このサンプル インプリメントは、セッション初期化時のカスタム コードの自動読み込みや、ワー クスペース マネージャの機能の拡張など、MapXtreme のその他の拡張可能な側面も示すものと な っ て い ま す。こ の サ ン プ ル は、MapXtreme インストール ディレクトリの下の \Samples\DataProviders フォルダにあります。 注意 コンパイルすると実行可能なアプリケーションとなる、MapXtreme の他のサンプル アプリ ケーションとは異なり、このサンプル インプリメントは .NET アセンブリを生成します。 こ の サ ン プ ル 作 成 の 目 的 は、動 作 す る ア プ リ ケ ー シ ョ ン を 作 成 す る こ と よ り も、 MapXtreme の拡張性オプションを示すことにあったためです。 MapInfo.SpatiaLite.sln は、次の 2 つのプロジェクトから構成されます。 • • SpatiaLite データ プロバイダ SpatiaLite ワークスペース マネージャ機能拡張 SpatiaLite データ プロバイダ機能拡張 このプロジェクトのコードは、MapXtreme 拡張可能データ プロバイダのクラスおよびインター フェイスを拡張して、SpatiaLite テーブルのオープン、レコードの挿入/更新/削除、テーブルの検 索、スタイルの変更、SQLite3 データベースへの新しいテーブルのインポートが可能な SpatiaLite データ プロバイダを作成する方法を示します。より効率的にコーディングを行うために、抽象 ベース クラスを使用しています。どのクラスおよびインターフェイスを拡張したかという詳細に ついては、サンプルに付属している Readme.rtf を参照してください。 コンパイル時に、SpatiaLite データ プロバイダ プロジェクトは、メイン データ プロバイダ インプ リメントとして動作する MapInfo.SpatiaLite.DataProvider.SessionEventHandler.dll というアセンブリ と、MapXtreme 起動時にデータ プロバイダの自動読み込みを可能とする セッション イベント ハン ドラを作成します。 SpatiaLite データ プロバイダ アセンブリには、永続化プロバイダのインプリメントも含まれていま す。永続化プロバイダは、データ プロバイダのオプションのコンポーネントですが、便利なもの です。永続化プロバイダにより、MapXtreme がそのままでは MapInfo ワークスペース (.MWS) に読 み書きすることのできない SpatiaLite テーブルおよびデータ ソース定義が可能となります。「550 ページの「永続化プロバイダ」」を参照してください。 SpatiaLite データ プロバイダにおける ISessionEventHandler のインプリメントも、オプションですが 便 利 な コ ン ポ ー ネ ン ト で す。こ れ を データ プロバイダ アセンブリに含めることにより、 MapXtreme 起動時にデータ プロバイダを自動読み込みすることができるようになります。つま り、MapXtreme セッションの初期化後、直ちに MapXtreme アプリケーションに SpatiaLite テーブル 定義を読み込み、使用可能とすることができます。 SessionEventHandler は、データ プロバイダの拡張機能に固有のものではありません。セッション 起動時に必要となる任意のカスタム コードを読み込むために、使用することができます。この機 能を利用して、カスタム SpatiaLite テーブルおよびデータ ソース定義を永続化しています。他のカ 546 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ スタム コードにこれを使用するには、アセンブリに SessionEventHandler.dll という接尾辞を付け、 MapXtreme がこれを認識するように \Common Files\MapInfo\MapXtreme\7.0.0\SessionEventHandlers に配 置 す る 必 要 が あ り ま す。こ の詳細については、「第 9 章、168 ページの 「ISessionEventHandler」 」を参照してください。 SpatiaLite ワークスペース マネージャ機能拡張 MapXtreme におけるもう 1 つの主要な拡張点は、ワークスペース マネージャの機能を拡張可能と したことです。SpatiaLite データ プロバイダ サンプルに含まれている SpatiaLite ワークスペース マ ネージャ機能拡張プロジェクトが、その例です。このプロジェクトでは、ワークスペース マネー ジャを拡張して、SpatiaLite メニュー、ダイアログ、およびデータベースに接続してテーブルを開 くためのコードを提供します。 このプロジェクトをコンパイルすると、WorkspaceManagerExtension DLL という接尾辞の付いたア センブリが生成されます。このアセンブリは、SpatiaLite データベース用のテーブル定義を提供す る SpatiaLite データ プロバイダに依存します。 ワークスペース マネージャ機能拡張は、ワークスペースの作成や保存に伴って必要となる任意の 機能を含むことができます。これらについては、「付録 C: 「カスタマイズMapXtreme」」を参照 してください。 高度なトピックと重要な検討事項 このセクションでは、拡張可能データ プロバイダの設計や作成において、検討すべきさまざまな トピックを取り上げます。 • • • • • • • • 「ジオメトリの作成」 「座標系」 「スタイル」 「例外処理」 「永続化プロバイダ」 「シリアライゼーション」 「認証」 「スレッド セーフ機能」 ジオメトリの作成 サー ド パ ー テ ィ の 空 間 形 式 を サポートする拡張可能データ プロバイダでは、その形式と MapXtreme FeatureGeometry 形式の間で空間データを変換する必要があります。カーソルやフィー チャ アクセサから取得した IFeature オブジェクトの値として、FeatureGeometry オブジェクトが返 されます。それらが含むフィーチャおよびジオメトリ オブジェクトは、一時的なものです。 MapXtreme は、カーソルが開いており、現在のフィーチャの上に存在する間だけ、これらのオブ ジェクトが有効であるとみなします。そのため、非常に堅牢で拡張性のあるデータ プロバイダ イ ンプリメントでは、カーソルまたはフィーチャ アクセサの存続期間にわたって、同じフィーチャ とフィーチャ ジオメトリ オブジェクトを再利用しようと試みます。 開発者ガイド 547 高度なトピックと重要な検討事項 1 度作成された後、現在のフィーチャに対応して継続的に更新されるジオメトリのことを、“一時 的な” ジオメトリと呼びます。MapXtreme のジオメトリ モデルには、ジオメトリのこのような使 用を可能とする、コンストラクタとメソッド シグネチャがあります。MultiPoint、MultiCurve、お よび MultiPolygon オブジェクトを最初に作成した後、新しいフィーチャに対する変更を加えるた めに、これらの既存のインスタンスに対してジオメトリ エディタ インターフェイスを使用するこ とができます。MultiCurve および MultiPoygon オブジェクトに対しては、Clear メソッドを使用し てジオメトリを空にしてから、それぞれ AddCurve または AddPolygon を使用してジオメトリを再 定義することができます。MultiPoint オブジェクトに対しては、ReplaceAll メソッドを使用して再 定義することができます。また、入力配列を使用するコンストラクタ シグネチャと Add/Replace メ ソッドは、オプションのサイズ指定をサポートし、単一配列のインスタンスも効率よく再利用で きるようにしています。 OGC 変換コードは、上述の方法で動作します。WKB と WKT のパースに使用する内部のバイト配 列は再利用され、必要に応じてサイズが大きくなります。データが適切なジオメトリ メソッド (AddPolygon など) に引き渡されるとき、入力配列の方が引き渡されたデータよりも大きい可能性 があるため、配列サイズに対応するフォームが使用されます。 複数のポリゴンからなる MultiPolygon オブジェクトに対し、MapXtreme は通常、いずれかのポリ ゴ ン の 間に 内 側 / 外 側 の 相 互 関 係があるかどうかを調べます。たとえば、ドーナツ型の MultiPolygon インスタンスは、外側のポリゴンと、カッターとして解釈される 2 つめの内側ポリゴ ンからなり、2 つで論理的に単一のジオメトリを構成している場合があります。ジオメトリ コード は、デフォルトでは何の仮定も行いません。編集が終了した時点ですべての構成ポリゴンを解析 し、上述のような関係が存在するかどうかを検索します。変換されるサード パーティの空間形式 において、既にこのような関係がわかっており、ポリゴンを正しい順序 (外側のポリゴンの直後に その内側にあるポリゴン) で追加することができるならば、MapXtreme がすべてのポリゴンを再度 解析するという負荷の高い処理を行う必要はありません。MultiPolygon クラスのオーバーロードさ れた EditingComplete メソッドを使用し、withinSpecified 引数として “true” を指定することによ り、この操作を抑制することができます。 この処理には、多大な時間がかかる可能性があります。1 つのノードを移動すると、内側のポリゴ ンが突然外側のポリゴンになってしまう可能性がある、対話型の編集操作には、これが必要にな ります。データ プロバイダでは通常、ジオメトリを作成するたびにこのような負荷の高い処理が 必要になることはない形式で、データが格納されていることが既にわかっています。 ジオメトリの数が多い場合、またはノード数の多い複雑なジオメトリである場合には、このよう なジオメトリ オプションを理解し利用することが、パフォーマンスの高いデータ プロバイダをイ ンプリメントするために必須となります。 座標系 MapXtreme のジオメトリ フィールドは、同じ座標系の FeatureGeometry オブジェクトを返す必要が あります。異なるフィールドやテーブルでは、異なる座標系を使用しているかもしれませんが、 テーブルのある 1 つのフィールドから返されるジオメトリ値はすべて同じ座標系を使用し、テーブ ルのメタデータが IGeometryColumn.CoordSys プロパティによって提供する座標系と一致しなけれ ばなりません。 ほとんどのデータ プロバイダでは、データとともに格納および管理されているメタデータによっ て座標系を判断します。しかし、その情報が存在しない場合は、データ プロバイダはテーブルの 定義の一部として座標系を指定するようにユーザに要求することができます。 548 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ 座標系は、Session.CoordSysFactory プロパティから使用可能な CoordSysFactory インスタンスによっ て作成することができます。データ プロバイダが返すすべての FeatureGeometry オブジェクトに対 し、新しい座標系オブジェクトを作成する必要はありません。IGeometryColumn インターフェイス が返す座標系オブジェクトは、各 FeatureGeometry オブジェクトによって直接参照することができ ます。挿入および更新操作のためにデータ プロバイダに引き渡される FeatureGeometry オブジェク トは、データ プロバイダに引き渡される前に MapXtreme によってフィールドの座標系に変換され ます。 スタイル MapXtreme の拡張可能データ プロバイダ モデルは、次の 2 つの方法でフィーチャ ジオメトリのス タイルをサポートします。 • • テーブル内のすべてのフィーチャに適用されるスタイル プロパティ フィーチャごとのスタイル情報を含む、スタイル属性フィールド 拡張可能データ プロバイダ テーブルから開かれた MapInfo.Data.Table に、少なくとも 1 つのジオメ トリ フィールド (マップ作成可能テーブル) が存在する場合、そこにはスタイル フィールドがあり ます。そのフィールドには、拡張可能データ プロバイダ テーブルのスタイル フィールドから取得 した デ ー タ か、そ れ が 存 在 し な い場合は、データ プロバイダ テーブルの IGeometryColumn.DefaultStyle プロパティで指定されるデフォルト スタイルのデータが設定されま す。 ITableMetadata.Columns スタイル情報は、MapInfo.Data.Provider.ITableMetadata インターフェイスで提供されるフィールド定 義によって受け渡しされます。スタイル属性フィールドは、ITableMetadata.Columns の IColumn イ ンスタンスであり、その DataType プロパティには MIDbType.Style という値が設定されています。 スタイル属性フィールドは、テーブル内の複数のフィーチャに異なるスタイル値が含まれる可能 性がある場合のみ、必要となります。 IGeometryColumn.DefaultStyle テーブルの 1 つのフィーチャ ジオメトリ フィールドの中のオブジェクトをレンダリングする際 に、単一のスタイルを一様に適用したい場合には、スタイル属性フィールドは不要です。この場 合に対しては、スタイル オブジェクト インスタンスを、フィーチャ ジオメトリ フィールドの DefaultStyle プロパティ (IGeometryColumn.DefaultStyle) として直接管理することができます。 スタイル フィールドが存在する場合でも、デフォルト スタイルを常に設定しておくことをお勧め します。デフォルト スタイルは、スタイル フィールドに null 値が含まれていたり、値が設定され ていなかったりした場合に、代用するスタイル属性値として使用します。デフォルト スタイルを 明示的に設定しなければ、MapXtreme には必要に応じて適用することのできる内部デフォルト ス タイルがありません。 フィーチャ ジオメトリ フィールドに対しデフォルト スタイルのみを使用する場合でも、Catalog 内で開かれた Table インスタンスに関連付けられたフィールド コレクションの中に、スタイル フィールドが表示されます。このフィールドは、null 値が設定可能で、読み取り専用です。また、 すべての値のデフォルト値は、指定されたデフォルト スタイル インスタンス値となります。 開発者ガイド 549 高度なトピックと重要な検討事項 拡張可能データ プロバイダ インプリメントにおいて、複数のジオメトリ フィールドや、複数のス タイル フィールド データ構成を定義してはいけないという明示的な規則はありませんが、メタ データ モデルは、スタイル フィールドのジオメトリ フィールドへの明示的な関連付けをサポート しません。マップ レイヤをレンダリングする場合、そのレイヤを処理するテーブルには、単一の ジオメトリ フィールドが存在し、それに隣接するスタイル フィールドはあっても 1 つだけとい う、暗黙の仮定があります。同様に、モデルでは、拡張可能データ プロバイダにおいて、隣接す るジオメトリ フィールドが存在しないスタイル フィールドを含むテーブルを定義することが許可 されていますが、そのようなテーブルは、現時点では正しくキャッシュされず、また、他の形式 にエクスポートすることもできない可能性があります。 例外処理 データ プロバイダにおける例外処理は非常に重要です。データ プロバイダは通常、ファイル ハン ドルやデータベース接続などのシステム リソースを扱うことになります。通常コードや例外コー ドの流れにおいて、これらのリソースをきちんとクリーンアップしなければ、リークが生じ、時 間の経過とともにアプリケーションの異常動作やメモリ リークにつながる恐れがあります。この ような問題は、プールされたセッションを利用する Web アプリケーションにおいて多く見られま す。メモリ リークによって、最終的にはシステムがシャットダウンしたり、リークした接続の解 放を待つ複数のプロセスがハングしたりする場合があります。 スローする例外は、Microsoft が「例外処理のベストプラクティス」で規定する、標準的な .NET の 慣 習 に 従 う 必 要 が あ り ま す。カ ス タ ム 例 外 を ス ロ ー す る 場 合 は、 Data.Provider.DataProviderException クラスを使用します。必要ならば、追加の動作を提供するため にこのクラスをサブクラス化することができます。 例外処理は、データ プロバイダのリソースの外部化を検討するよい機会でもあります。リソース ファイルの中の文字列やビットマップなどのリソースを適切に把握することにより、データ プロ バイダを他の言語向けにローカライズすることができます。SpatiaLite データ プロバイダのサンプ ルでは、例外処理用にリソース文字列を処理するためのリファレンス インプリメントが提供され ています(プロジェクトの中の Resources.cs ファイルを参照してください)。 永続化プロバイダ MapXtreme は、データ アクセス情報 ITableDefinitions および IDataSourceDefinitions の、MapXtreme の XML ベースのワークスペース (.MWS) への保存をサポートします。これは、拡張可能データ プ ロバイダのオプションのコンポーネントであり、ワークスペースを他のユーザと共有したり、後 にその情報を再利用したりする必要がある場合に、利用することができます。 拡張可能データ プ ロ バイダに永続化サポートを追加する最も簡単な方法は、 MapInfo.Data.Provider.IMxpPersistenceProvider インターフェイスをインプリメントする永続化プロバ イダ クラスを作成することです。 より高度な永続化プロバイダを作成する場合は、作成されたワークスペース ファイルの XML 検証 をサポートするためのスキーマを提供することを検討してください。MapXtreme は、ワークス ペース XML を自動的に検証することはしないため、明示的にこの機能が必要である場合のみ、こ れを作成します。 550 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ 永続化プロバイダを独自のアセンブリとして作成することを検討してもよいでしょう。プロバイ ダは、拡張可能データ プロバイダの他のコンポーネントとは独立して、事前に読み込まれる場合 があります。プロバイダ アセンブリならば、明示的に必要になったときにデータ プロバイダを読 み込むように制御することにより、他のコンポーネントの読み込みを先送りすることができま す。 永続化プロバイダの使用方法 永続化プロバイダは、Catalog の PersistenceProviderCollection の中で管理されます。このコレクショ ンは、セッション起動時に MapXtreme がデフォルトの場所のアセンブリの中に、永続化プロバイ ダが含まれているかどうかを検索する際に、自動的に初期化される場合があります。デフォルト の場所は、\Program Files\Common Files\MapInfo\MapXtreme\7.0.0\SessionEventHandlers です。プロバ イダを、PersistenceProviderCollection の Add および AddFromFolder メソッドを使用して、プログラ ムによって PersistenceProviderCollection に追加することもできます。 セッション コンテキストを MapInfo.Persistence.WorkspacePersistence クラスによって MapInfo ワー クスペース ファイル (.MWS) に保存するとき、拡張可能データ プロバイダから開かれたテーブル がカタログの中に存在するかどうかを PersistenceProviderCollection に問い合わせます。そのデータ プロバイダに対する永続化プロバイダが存在する場合は、その永続化プロバイダを用いて、拡張 可能テーブル情報をワークスペースに永続化します。同様に、ワークスペースが読み込まれると きには、使用可能な永続化プロバイダのコレクションの中から、拡張可能データ プロバイダ テー ブルに関連付けられたワークスペース ファイルの中のカスタム タグを理解することのできるデー タ プロバイダを検索します。 永続化プロバイダのインプリメント PersistenceProviderCollection.AddFromFolder メソッドで永続化プロバイダ クラスを読み込むには、 このクラスに引数のないパブリックのコンストラクタ シグネチャが存在する必要があります。こ のメ ソ ッ ド は、MapXtreme のセッション初期化時に内部で使用されるものと同じです。 PersistenceProviderCollection.Add メソッドをプログラムで使用するために、新しいコンストラクタ シグネチャを追加することができます。 MapXtreme では、ユーザが永続化プロバイダ クラスをインプリメントするための開始点として、 AbstractMxpPersistenceProvider という抽象ベース クラスを提供しています。 永続化プロバイダにおいて用意する必要のあるものとして、その永続化プロバイダに対してサ ポートされているデータ プロバイダ、(XML タグ用の) エンティティ名、およびスキーマ名前空間 が 存 在 す る か ど う か を 確 認 す る メ ソ ッ ド が あ り ま す。こ れ ら の メ ソ ッ ド と し て、 IMxpPersistenceProvider インターフェイスに含まれる 3 つの問い合わせメソッドをインプリメント します。 SupportsDataProvider() は、指 定 された IDataProvider に対する ITableDefinition および IDataSourceDefinition 構造体を管理するプロバイダを特定するために使用します。一般的に、永続 化プロバイダは、単一のデータ プロバイダをサポートするように作成されるため、このメソッド のインプリメントは通常、指定された IDataProvider がそのデータ プロバイダ クラスのインスタン スであるかどうかを確認するだけの簡単なものとなります。 SupportsSchemaNamespace と SupportsEntityName は互いに連携して、ワークスペースの永続化解除 時に、拡張可能データ プロバイダ コンテンツに対して特定された名前空間とタグ名をサポートす る永続化プロバイダを特定します。たとえば、ワークスペース ファイルを読んでいくと、拡張可 能データ プロバイダに対する以下のようなコンテンツが現れます。 開発者ガイド 551 高度なトピックと重要な検討事項 <sample:SampleTableDefinition xmlns:sample="http://sample/sample"> <sample:TableName>test</sample:TableName> </sample:SampleTableDefinition> XMLNode オブジェクト参照は、外側のタグに対して取得されます。NamespaceURI プロパティ ("sample") は SupportsSchemaNamespace に引き渡され、LocalName プロパティ ("SampleTableDefinition") は SupportsEntityName に引き渡されて、両者をサポートする永続化プロバ イダが特定されます。抽象クラスで提供されているコンストラクタ シグネチャも、これらのメ ソッドのデフォルト インプリメントをサポートします。 AbstractMxpPersistenceProvider には、IMxpPersistenceProvider.Schema のデフォルト インプリメント とともに動作して、アセンブリ内に組み込みリソースとして添付されている .xsd スキーマ ファイ ルへの XMLSchema 参照を返すコンストラクタ シグネチャがあります。詳細については、『開発 者リファレンス』を参照してください。 IMxpPersistenceProvider のその他のメソッドは、データ ソースおよびテーブル定義の読み取り/書き 込みを行うものです。データ ソースを使用しないデータ プロバイダでは、テーブル定義に対する 読み取り/書き込みメソッドのみをインプリメントします。データ ソースが存在する場合は、デー タ ソース定義を永続化する必要があります。その処理は、MapXtreme が行います。ユーザは、 テーブルに固有のテーブル定義プロパティの永続化のみを考えればよいことになります。 読み取りメソッドには、拡張可能コンテンツに対する XML タグへの XmlElement ハンドルが含ま れます。データ ソースとテーブル定義のコンポーネントは、その要素内の子ノードとして管理さ れます。上記の SampleTableDefinition の例に続くインプリメント コードは以下のようになります。 ITableDefinition td = null; if (node.LocalName.Equals("SampleTableDefinition") && node.NamespaceURI("http://sample/sample")) { string tableName = null; foreach (XmlNode childNode in node.ChildNodes) { if (childNode.LocalName.Equals("TableName") && childNode.NamespaceURI.Equals("http://sample/sample")) { tableName = childNode.InnerText; } } td = new SampleTableDefinition(tableName); } 書き込みメソッドでは、ワークスペース XML に挿入する XmlElement を作成する必要がありま す。これらの要素は、XML ドキュメント インスタンスにバインドされるため、永続化される拡張 可 能 デ ー タ プ ロ バ イ ダ 定 義 イ ン タ ー フェイスとともに、XmlDocument が引き渡されます。 DataSourceDefinition の書き込みメソッドでは、XmlDocument がメソッド引数として直接引き渡さ れるのに対し、TableDefinition の書き込みメソッドでは、XmlDocument が IMxpPersistenceServices 引数の Document メンバとして引き渡されることに注意してください。 XmlElement outerTag = xmlDocument.CreateElement("sample", "SampleTableDefinition", "http://sample/sample"); XmlElement innerTag = xmlDocument.CreateElement("sample", "TableName", "http://sample/sample"); innerTag.InnerText = "test"; outerTag.AppendChild(elNode); 552 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ 詳細な情報および例については、『開発者リファレンス ガイド』、「「SpatiaLite サンプル データ プロバイダ」」、および『MapXtreme Code Exchange』にあるその他のデータ プロバイダ例を参照 してください。 シリアライゼーション シリアライゼーションとは、オブジェクトを永久に保存したり、有効期間の間メモリに保持した りするために、オブジェクトをデータ ストリームに変換するプロセスです。このプロセスは、 MapXtreme Web アプリケーションやマルチスレッド デスクトップ アプリケーションにおいてオブ ジェクトを維持する上で、不可欠です。 シリアライゼーションをしなければ、たとえばセッション中にオブジェクトに対する Web リクエ ストが生じるたびに、オブジェクトを再作成しなければならなくなります。 シリアライズされたオブジェクトに対するリクエストが生じると、オブジェクトはデシリアライ ズされ (データ ストリームから復元すること)、変更が加えられます。MapXtreme のシリアライ ゼーション アルゴリズムは、(他のシリアライゼーション アルゴリズムとは異なり) オブジェクト のコピーを作成しません。したがって、デシリアライズされるオブジェクトは 1 回しか作成されま せん。 Web アプリケーションやマルチスレッド デスクトップ アプリケーションの状態管理を適切に行う ために、アプリケーション開発者が MapXtreme Table インスタンスを直接、または、すべてのテー ブルのコレクションを含む MapXtreme Catalog のシリアライゼーションによって、シリアライズし なければならない場合がよくあります。テーブルの種類がサポートされていない場合は、アプリ ケーション開発者はその制約下で、テーブルと、それらの Catalog の全体的な状態を明示的に管理 する方法を考案しなければなりません。このため、拡張可能 データ プロバイダの開発者には、作 成したプロバイダのシリアライゼーションをサポートし、MapXtreme の Table シリアライゼーショ ン ワークフローに適切に統合することをお勧めします。 シリアライズが必要なプロバイダ インプリメントのコンポーネント MapXtreme ではテーブルを、永続的なものか一時的なものかで区別します。永続的なテーブル は、その定義と構造のみをシリアライズすれば、デシアライズ時に正しく再作成することができ ます。一時的なテーブルでは、これに加えて、データをシリアライズする必要があります。拡張 可能データ プロバイダのテーブルは、永続的なテーブルであるとみなされるため、全体的なシリ アライゼーション作業は軽減されますが、それでも複数のプロバイダ クラスをシリアライズする 必要があります。 データ ソースの概念をサポートするプロバイダの場合は、IDataSourceDefinition および IDataSource インターフェイスをインプリメントするクラスが、両方ともシリアライズ可能でなければなりま せん。データ ソースをサポートするか否かにかかわらず、すべてのプロバイダは、ITableDefinition および ITable インターフェイスをインプリメントするクラスのシリアライゼーションもサポートす る 必 要 が あ り ま す。ま た、デ シ ア ラ イ ゼ ー シ ョ ン が 正 し く 行 わ れ る よ う に す る た め に、 ITableDefinition および IDataSourceDefinition インターフェイスは、Equals メソッドの有効なオー バーライドを提供する必要があります。 ITableMetadata をインプリメントするクラスは、明示的にシリアライズ可能である必要はありませ んが、シリアライズ可能にしておく方が望ましいことを示す理由がいくつかあります。シリアラ イズ可能でない場合、それらのテーブルおよびデータ ソース インスタンスのデシリアライゼー ションでは、それらを再作成しなければならない場合があり、メタデータの再取得は、パフォー マンスの観点から負荷が高い可能性があります。 開発者ガイド 553 高度なトピックと重要な検討事項 シリアライゼーション作業を支援するために、拡張可能データ プロバイダ API では、これらの各 インターフェイスのシリアライズ可能な抽象ベース クラスを提供しています。デフォルト インプ リメントで管理される関連プロパティについても、シリアライゼーションのサポートが提供され ています。 クラスのシリアライズ方法 .NET では、System.Runtime.Serialization 名前空間の ISerializable インターフェイスのインプリメン トと、クラス定義への [Serializable] 属性の適用を組み合わせることにより、クラスをシリアライズ 可能にします。プロバイダの開発者は、インプリメントの作成において、.NET シリアライゼー ションに関する一般的な指針に従ってかまいませんが、特に提供されている抽象ベース クラスか ら派生させたクラスを作成する場合には、両方を適用することを強くお勧めします。 シリアライゼーションをサポートしない場合の注意点 ソリューションのコンポーネントとしてプロバイダを使用するアプリケーション開発者に対し、 より適切で広範囲なサポートを提供できるように、拡張可能データ プロバイダにおいて、シリア ライゼーションをサポートすることを推奨します。しかし、プロバイダ インプリメントにおいて シリアライゼーションをサポートしなければならないという厳格な要件があるわけではありませ ん。実際、このサポートを提供することが基本的に困難であるか、信頼性が低いことを示す、正 当な理由が存在する場合もあります。 アプリケーション開発者は、.NET リフレクション API を使用して、プロバイダがシリアライゼー ションをサポートしているようだということを確認することはできますが、状態管理を必要とす るアプリケーションに、どのようにしてそのプロバイダを正しく使用するかという点について は、必要な情報がすべて提供されているとは限りません。このようなソリューションのコンポー ネントとして、そのプロバイダ インプリメントを使用することができるか、どのようにして使用 するのかという具体的な情報を記載した、ドキュメントを作成することを強くお勧めします。 シリアライゼーションと依存関係 MapXtreme 拡張可能データ プロバイダには、必須および推奨クラスの間に存在する、多くの依存 関係があります。ITableDefinition には、IDataSourceDefinition プロパティがあります。IDataSource にも IDataSourceDefinition があり、ITable には IDataSource、ITableMetadata、および ITableDefinition プロパティがあります。 通常は、参照が共有される可能性のあるプロパティは、シリアライズする必要はないかもしれま せん。たとえば、ITableDefinition の IDataSourceDefinition プロパティは、複数のテーブルを開くた めに再利用されるデータ ソース定義である場合があります。ITableDefinition をインプリメントす るクラスのシリアライゼーションに、これを含める必要はありません。ITable の IDataSource およ び ITableDefinition プロパティにも同じことがいえます。 定義プロパティは、参照を共有するために後で上書きされる場合でも、シリアライズに含めるこ とをお勧めします。 テ ー ブ ル の デ ー タ ソ ー ス の シ リ ア ラ イズは、MapXtreme が自動的に行うため、ITable 内の IDataSource 参照はシリアライズしてはいけません。 共有オブジェクト参照は、MapXtreme が提供するシリアライゼーション ロジックによって再確立 されます。拡張可能データ プロバイダ API には、中核となる MapXtreme データ アクセス エンジ ンがこの作業を実施するために必要な仕組みが含まれています。具体的な例としては、以下のも のがあります。 554 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ • • IDataProvider インターフェイスの ReAssociate メソッド ITableDefinition インターフェイスの設定可能な DataSourceDefinition プロパティ シリアライゼーションのインプリメント クラスは、[Serializable] 属性を付与するか、System.Runtime.Serialization.ISerializable インターフェ イスをインプリメントすることにより、シリアライズします。これらの両方を行うことをお勧め します。ISerializable.GetObjectData メソッドをインプリメントする必要があり、このメソッドはパ ブリックでなければなりません。 public void GetObjectData(SerializationInfo info, StreamingContext context) 抽象ベース クラスを派生させたクラスでは、このシグネチャに override キーワードを付け加え、 インプリメントの最初の行では、管理するコンポーネントのシリアライゼーションをベース クラ スにデリゲートする必要があります。たとえば、次のようになります。 base.GetObjectData(info, context); インスタンス内のその他のシリアライズ可能なメンバは、文字列キーとメンバ値を引数として SerializationInfo 型の引数である info の AddValue メソッドを呼び出すことにより、info へとシリア ライズします。たとえば、次のようになります。 info.AddValue("TableName", _tableName); デシリアライゼーションのインプリメント デシリアライゼーションをサポートするには、上記の GetObjectData と引数が同じである protected のデシリアライゼーション コンストラクタを用意します。たとえば、次のようになります。 protected COTWTableDefinition(SerializationInfo info, StreamingContext ctxt) 抽象ベース クラスを派生させたクラスである場合には、このコンストラクタは、管理するコン ポーネントのデシリアライゼーションをベース クラスにデリゲートする必要があります。たとえ ば、次のようになります。 protected COTWTableDefinition(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt) このコンストラクタ内で、クラス インスタンスは、SerializationInfo 型の引数である info の “get” メソッドを使用して値を取得することにより、メンバ変数に値を代入します。たとえば、上記の GetObjectData の例でシリアライズした TableName 値をデシリアライズするコードは、以下のよう になります。 _tableName = info.GetString("TableName"); シリアライゼーションに関連するメソッドについては、少なくとも部分的には、インプリメント するクラスがシールド クラスであるか否かによって、オーバーライドのサポートやメソッド属性 などに関する推奨が異なります。FxCop のようなコード解析ツールを使用すると、適切な推奨を得 るための有効な支援を得ることができます。 詳細な情報および例については、『MapXtreme 開発者リファレンス (オンライン ヘルプ)』、この 付録の中の「「SpatiaLite サンプル データ プロバイダ」」、および『MapXtreme Code Exchange』 にあるその他のデータ プロバイダの例を参照してください。 開発者ガイド 555 高度なトピックと重要な検討事項 認証 データ プロバイダの多くは、データ ソースまたはテーブルを開く際に認証を必要とします。デー タ ソースやテーブルでは、認証の詳細がセキュリティの下に格納されており、一般からアクセス 可能な共有ワークスペース ファイルから使用することはできません。 OpenDataSource および OpenTable の処理の実行時認証をサポートするために、MapXtreme 拡張可能 データ プロバイダ モデルでは、IDataProviderCallback という新しいインターフェイスを提供してい ます。このインターフェイスでは、データ ソースやテーブル定義に何かが不足しており、データ ソースやテーブルを開くことができない場合の解決策として、拡張可能データ プロバイダが使用 することのできるユーザ定義のコールバック メソッドをサポートします。 最も簡単なインプリメントとしては、カスタム データ プロバイダのクライアント コードに、 IDataProviderCallback インターフェイスをインプリメントし、データ ソースまたはテーブルを直接 開くために使用される IDataSourceDefinition および ITableDefinition コールバック メソッドのインプ リメントを提供するクラスを用意することになります。 し か し、ほ と ん ど の ユ ー ザ は、IDataProviderCallback の初期化を含む別個のアセンブリを、 MapXtreme Session の初期化の一環として読み込むことが必要になるでしょう。「第 9 章、168 ページの「ISessionEventHandler」 」を参照してください。デフォルト ワークスペースの読み込み 時にデータ ソースまたはテーブル定義を解決しようとする場合は、これが必要になります。たと えば、Web ベースのアプリケーションでは、コールバックのセッション初期化のサポートが必要 になります。 データ プロバイダ コールバックの使用方法 コールバッ ク メ ソッド の呼び 出しは、データ プロバイダのインプリメントで処理します。 MapXtreme は、コールバック メソッドのコレクションのサポートを管理し、定義されたインター フェイスによってこれをデータ プロバイダに渡します。MapXtreme が、IDataProviderCallback のい ずれかを呼び出すことはありません。 IDataProviderCallback イ ン ス タ ンスは、MapXtreme Session Catalog の中の DataProviderCallbacksCollection によって管理されます。このコールバック コレクションのコレク ションは、コールバック オブジェクトを System.Type に関連付け、各 Type の関連付けごとに複数 のコールバックをサポートします。DataProviderCallbacksCollection の管理には、いくつかの方法が あります。Session 初期化時 (SessionEventHandler/DataProvider の読み込みのセクションを参照して ください)、アプリケーション初期化時、および、非常に簡単な使用方法として、クライアント ア プリケーションからの OpenTable への明示的な呼び出しの直前に管理する方法があります。 MapXtreme は、Session Catalog に対し、OpenDataSource または OpenTable メソッドに関連付けられ た コ ー ルバ ッ ク を ク エ リ し、コ レ ク ションへの参照をデータ プロバイダに提供します。 IDataProvider インターフェイスは、OpenDataSource および OpenTable 操作時、IDataProviderCallback の コ レ ク シ ョ ン を 列 挙 す る IEnumerator への参照をサポートします。OpenDataSource または OpenTable の失敗が、入力される DataSourceDefinition または TableDefinition の変更によって解決可 能である場合は、DataProvider クラスは、OpenDataSource または OpenTable の失敗の解決に必要と なる適切なロジックをインプリメントするために、IEnumerator が参照する任意のコールバックを 使用することができます。あるいは、DataProvider では、設計的に不十分な定義オブジェクトを補 完するための、有名な手法をインプリメントすることもできます。 コールバックの典型的な例は、デスクトップ アプリケーション環境において、OpenDataSource コールバックが、ユーザにダイアログを表示し、データ プロバイダに対する有効なユーザ名とパ スワードの組み合わせの入力を求めることにより、認証を解決するというものです。 556 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ データ プロバイダ コールバックのインプリメント IDataProviderCallback インターフェイスでは、IDataSourceDefinition と ITableDefinition の両方のデー タ プロバイダ定義型のデータを変更するための、メソッド シグネチャが定義されています。 IDataProviderCallback をインプリメントするクラスは、OpenDataSource/OpenTable 要件を満たすた めに、定義オブジェクトの実行時更新を行うメソッドの適切なインプリメントを提供する必要が あります。 また、正しい対処方法を判断するための、さらなる実行時状態情報をコールバックに提供するた めに、コールバック メソッドで IDataProviderCallbackInfo インターフェイスを定義することもでき ます。IDataProviderCallbackInfo は、単なるマーカー インターフェイスであり、コールバックに提 供する情報の性質を定義することはしません。一般的なインプリメントには、実行時例外や状態 列挙体属性が含まれます。 MapInfo.Data.Provider 名前空間には、データ プロバイダ インプリメンタやクライアント アプリ ケーションで使用することのできる、標準的なインプリメントがあります。DataProviderCallback クラスは、デリゲートベースのコールバック ハーネスをインプリメントし、クライアント コード において拡張可能データ プロバイダ アセンブリの外部のコールバック メソッドを割り当てること ができるようにしています。DataProviderCallbackExceptionInfo クラスは、System.Exception 参照を 保持するものとして IDataProviderCallbackInfo をインプリメントしており、 DataProviderCallbackCollection は、IDataProviderCallback の ICollection をインプリメントしていま す。 以下は、認証を解決するコールバック シナリオのインプリメント方法を示す例です。 // Create a method to handle the OpenDataSource InvalidCredentials state // Implements IDataProviderCallback.Callback signature public static IDataSourceDefinition InvalidCredentialsCb( IDataSourceDefinition dsd, IDataProviderCallbackInfo info) { // Implementation details are specific to the Data Provider, specifically, to the appropriate IDataSourceDefinition implementation DataProviderCallbackExceptionInfo pcinfo = info as DataProviderCallbackExceptionInfo; if (pcinfo != null) { if (pcinfo.Exception == /* invalid credentials */) { // Example: present user dialog string newpwd = GetPasswordFromUser(); // Example: create new EDP implementation specific DataSourceDefinition // with updated password credentials return new EDPDataSourceDefinition(newpwd); } } } // MXT/EDP client code { // Create a callback harness and assign the callback method DataProviderCallback cb = new DataProviderCallback(); cb.DataSourceDefinitionCallback = InvalidCredentialsCb; 開発者ガイド 557 高度なトピックと重要な検討事項 // Associate the IDataProviderCallback with the EDP definition data type Session.Current.Catalog.DataProviderCallbacksCollection.AddProviderCallba ck( typeof(EDPDataSourceDefinition), cb); // Create an initially invalid Data Source Definition EDPDataSourceDefinition dsd = new EDPDataSourceDefinition("badpassword"); // open table EDPTableDefinition tableDef = new EDPTableDefinition (dsd); Table t = Session.Current.Catalog.OpenTable(tableDef, "TESTTABLE"); } データ プロバイダにおける IDataProviderCallback の使用のインプリメント IDataProvider の OpenDataSource および OpenTable メソッドには、IDataProviderCallback インスタン スの列挙子があります。この列挙子は、Catalog によって自動的に提供されます。 DataProvider のインプリメントでは、OpenDataSource または OpenTable 操作を完了するために、必 要ならばコールバックを列挙し、呼び出す必要があります。 DataProvider のインプリメントでは、有効なオープン データ ソースが作成されていることを確認 するために、たとえば以下のように処理が進行します。 public override IDataSource OpenDataSource( IDataSourceDefinition definition, CustomProperties customProperties, IEnumerator<IDataProviderCallback> callbacks) { EDPDataSourceDefinition dsDef = definition as EDPDataSourceDefinition; if (dsDef == null) { // invalid definition // throw exception } EDPDataSourceDefinition tmpDsDef = dsDef; EDPDataSource ds = null; bool needDS = true; while (needDS) { needDS = false; DataProviderCallbackExceptionInfo cbinfo = null; try { // Data Source ctor will fail if data source definition is invalid, e.g., invalid credentials ds = new EDPDataSource (tmpDsDef, customProperties); } catch (Exception e) { 558 MapXtreme 2008 v7.0.0 付録 E: 拡張可能データ プロバイダ cbinfo = new DataProviderCallbackExceptionInfo(e); } if (ds == null && callbacks != null) { while (!needDS && callbacks.MoveNext()) { // callback will return null if it is unable to modify the // the definition appropriate for a retry attempt // Example: User selected cancel from a credential input dialog tmpDsDef = callbacks.Current.Callback(dsDef, cbinfo) as EDPDataSourceDefinition; if (tmpDsDef != null) { needDS = true; } } // while (!needDS and callbacks.MoveNext()) } // if (ds == null && callbacks != null) if (!needDS && cbinfo != null) { throw cbinfo.Exception; } } // while(needDS) return ds; } スレッド セーフ機能 MapXtreme はスレッド セーフです。つまり、予期せぬ副作用を生じることなく、異なるスレッド が同時に異なるセッション、カタログ、テーブル、マップなどにアクセスすることができます。 MapXtreme オブジェクトはマルチスレッド対応ではなく、マップ、テーブル、カタログなどの同 一のインスタンスを、複数のスレッドから同時にアクセスすることはできません。少なくとも データ プロバイダが Web 環境に展開される可能性がある場合には、データ プロバイダのインプリ メントにおいて、このモデルに従う必要があります。 一般的に、グローバル変数やシングルトンのオブジェクトなどに依存しない限り、コードはス レッド セーフであるはずです。スレッド ローカル ストレージの使用にも依存しないことをお勧め します。ASP.NET は、リクエストの実行スレッドを実際に変更する可能性があるためです。これ らの指針に従ってデータ プロバイダを作成すれば、コード内の同期ロックを完全になくすことは できなくても、多数挿入する必要はなくなります。同期ロックは、ソリューションの拡張性を妨 げる可能性があります。しかしアクセスする実際のデータにおいて、同期が不可避であるか、ま たは望ましい場合があります。たとえば、データ プロバイダが Excel スプレッドシートのデータを 公開する場合、スプレッドシートは、異なるスレッド (または異なるプロセス) による読み出し操 作は許可する一方で、編集操作はできないようにロックされる可能性があります。このようなシ ナリオに対しては、データ プロバイダの作成方法を検討することが重要になります。カーソル、 開発者ガイド 559 高度なトピックと重要な検討事項 フィーチャ アクセサ、およびモディファイ プロセッサはすべて、必要に応じてデータに対するあ る種類のロックを暗黙的に想定します。ただし、アクティブなカーソル、フィーチャ アクセサ、 およびモディファイ プロセッサが存在しない場合は、基盤にあるデータ ファイル (存在する場合) を開いたままにしてはいけません。 IDataProvider は唯一の例外であり、これはシングルトンとしてインプリメントすることをお勧めし ます。このインターフェイスは、ファクトリ インターフェイスであり、状態を持ってはいけませ ん (つまり、静的な INSTANCE プロパティ以外のクラス メンバ変数は存在しません)。MapXtreme がデータ ソースやテーブルを開くためにデータ プロバイダを呼び出すには、定義オブジェクトが データ プロバイダを参照する必要があります。このメカニズムを実現するために、インスタンス 化可能なクラスが必要ですが、シングルトンのクラスでまったく問題ありません。 ユーザーは、接続をキャッシュし、できればデータ ソースやテーブル オブジェクトもキャッシュ して、OpenTable または OpenDataSource の呼び出し時にそれらを再利用したいと考えるかもしれま せん。決してこれを行わないことを、強く推奨します。MapXtreme は、Catalog にデータ ソースお よびテーブルのコレクションを提供し、ITableDefinition および IDataSourceDefinition クラスで提供 された Equals ロジックによって、正しいインスタンスを検索し、再利用します。これにより、ク ロス スレッドやマルチスレッドの状態に陥ることを防ぎます。ADO.NET データ プロバイダな ど、基盤にあるデータ アクセス技術では、データ ベース接続をキャッシュし、再利用しているか もしれません。そのアーキテクチャは、マルチスレッド環境における正しい動作を保証するもの であるため、問題ありません。 560 MapXtreme 2008 v7.0.0 F MapXtreme アプリケー ションからの印刷 この付録では、MapXtreme 開発プロジェクトから、最良のマップ イメージを 印刷する方法について説明します。最初に、印刷機能の概要といくつかのヒン トについて説明し、次に、MapXtreme アプリケーションの印刷時に発生する 可能性がある問題のトラブルシューティングについて説明します。 この付録の構成 「概要」. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「MapXtreme の印刷オプションについて」 . . . . . . . . . . . . . . . . . . . . 「アプリケーションへの印刷のインプリメント」 . . . . . . . . . . . . . . 「印刷に関する一般的なヒント」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「これまでに知られている印刷に関する問題の対処方法」 . . . . . . 562 562 566 568 571 MapXtreme の印刷オプションについて 概要 MapXtreme 開発アプリケーションからの印刷は、通常は、ごく簡単です。しかし、多様な印刷デ バイスの広がりに伴い、デバイス固有の問題が発生します。そこで、開発者には、ユーザによる 印刷をカスタマイズするために、さまざまな機能が提供されています。これらのオプションは、 印刷するマップと使用するデバイスに応じて印刷を最適化するように設計されています。各種プ リンタおよびプロッタのニーズや差異に合わせて、それぞれ異なる設定値が設計されています。 MapXtreme では、次の操作を実行できます。 • • • • • • マップの印刷 - MapPrintDocument クラスを使用します。 凡例の印刷 - LegendPrintDocument クラスを使用します。 デバイスへの直接出力または拡張メタファイル (EMF) を使用する出力。 異なるサイズのマップの印刷。 透過色や透過レイヤを含むマップの印刷。 詳細については、「564 ページの「GDI+ による透過性とアンチエリアシング」」を参照し てください。 透過ラスタ イメージの印刷。 透過ラスタ イメージを印刷するには、EnableTranslucency を有効にする必要があります。詳 細については、「564 ページの「GDI+ による透過性とアンチエリアシング」」を参照して ください。 MapXtreme では、次の操作は実行できません。 • • • • 印刷オプション ダイアログ ボックスの使用。 レイアウトの印刷。 レイアウトは、マップ内の凡例を印刷する上で重要です。この制約に対処する方法につい ては、「568 ページの「マップ内に凡例を印刷する」」を参照してください。 複数ページのマップの印刷。 マップが複数のページにわたる場合、先頭のページのみ印刷されます。 プログラムを通じてのファイルへの出力。 こ の 機 能 を イ ン プ リ メ ン ト す るには、Microsoft.NET 2.0 Framework System.Printing.PrinterSettings クラスを使用する必要があります。 MapXtreme ア プ リ ケ ー シ ョ ン の 印 刷を処理するクラスは、Microsoft.NET 2.0 Framework System.Drawing.PrintDocument クラスから派生したクラスであり、その機能を継承しています。デ バイスの出力制御は、Microsoft.NET 2.0 Framework の System.Printing.PrinterSettings クラスおよび System.Printing.PageSettings クラスによって管理されます。MapInfo.Printing.MapPrintDocument クラ スはマップを印刷するものであり、MapInfo.Printing.LegendPrintDocument は凡例の印刷に使用され ます。 MapXtreme の印刷オプションについて MapXtreme アプリケーションからマップまたは凡例を印刷する場合は、ユーザに以下の印刷オプ ションを提供できます。ユーザがこれらの設定を制御できるためには、この機能を、アプリケー ションの印刷ダイアログ ボックスに組み込む必要があります。これらのオプションの変更を特に 許可しない場合は、デフォルト設定が使用されます。これらの設定値はプログラムを使用して調 整することもできます。 562 MapXtreme 2008 v7.0.0 付録 F: MapXtreme アプリケーションからの印刷 印刷サイズ MapXtreme は、マップを異なるサイズで印刷するオプションを備えています。マップを印刷する サイズを変更するには、MapPrintDocument.MapPrintSize プロパティを、MapPrintSize 列挙体の中の 1 つの値に設定します。その値は次のとおりです。 ページの大きさに合わせる このオプションはデフォルト値であり、縦横比を変更せずに、ページに収まるように拡大縮小し てマップを印刷します。 MapPrintDocument.MapPrintSize=MapPrintSize.FitPage ページ全体 ページ全体に収まるようにようにマップを印刷します。縦横比が保持されないため、マップが歪 むことがあります。 MapPrintDocument.MapPrintSize=MapPrintSize.FillPage 現在のマップ サイズ マップを元のサイズで印刷します。問題なく印刷できることもありますが、印刷されるページよ りマップが大きい場合、はみ出た部分は失われます。 MapPrintDocument.MapPrintSize=MapPrintSize.MapSize 注意 以下のプロパティは、MapInfo.Printing.MapPrintDocument MapInfo.Printing.LegendPrintDocument クラスで共通です。 クラスおよび 透過ラスタの特殊処理 これによって、アプリケーションは、透過ピクセルの表示とラスタ イメージの印刷を内部で管理 できます。画面上では、透過イメージは、ラスタ操作 (ROP) を使用して透過ピクセルを処理する ことによってレンダリングされます。この方法は、印刷時には、動作することもあれば動作しな いこともあります。それは、MapXtreme では、異なる方法を使用して、印刷時の透過に関連する 方法を決定するためです。特定の印刷ドライバが ROP を正しく処理するかどうかを判断し、それ に応じて値を true または false に設定する必要があります。多くの印刷環境では、この値は true に設定する必要があります。画面に描画する場合、この値は通常 false に設定されます。 この値を設定するには、DrawingAttributes.SpecialTransparentRasterHandling を使 用します。この値を true (デフォルト) に設定すると、アプリケーション内部で印刷を管理できま す。 注意 この設定は、ベクトル レイヤの印刷には影響しません。 透過ベクトルの特殊処理 これによって、アプリケーションは、印刷時の透過ベクトルのフィル パターンを内部で管理でき ま す。こ の 機 能 を 有 効 ま た は 無 効 に す る に は、 DrawingAttributes.SpecialTransparentVectorHandling を使用します。これを true に設定すると、MapXtreme は、透過フィル パターンまたは透過ビットマップ シンボルを印刷する ときに特殊な処理を実行できます。この設定は、通常、印刷で使用されます。透過フィル パター ンおよび透過ビットマップ シンボルの印刷を印刷デバイスに処理させる場合は、これを false に 設定します。どのフィル パターンがビットマップで、どのフィル パターンがベクトルであるかの 詳細については、「570 ページの「フィル パターンの使用時に印刷を高速化する」」を参照してく ださい。 開発者ガイド 563 MapXtreme の印刷オプションについて 可能な場合ラスタ データを True Color で表示 プリンタによっては、24 ビット (True Color) イメージがサポートされません。MapXtreme は、これ に 対 処 す る 内 部 機 能 を 備 え て い ま す。こ の 機 能 を 有 効 ま た は 無 効 に す る に は、 DrawingAttributes.TrueColorRaster を使用します。 これを true (デフォルト) に設定すると、24 ビット (True Color) を使用してラスタ イメージおよび グリッド イメージを印刷できます。これは、イメージが 24 ビットで、プリンタが 256 色 (8 ビット ) 以上をサポートする場合に可能です。プリンタが 24 ビット イメージをサポートしない場合は、 この属性を false として設定し、DitherMethod で指定されるディザリングを使用して、256 色の みでラスタ イメージをレンダリングします。この値を false に設定して 24 ビット イメージを印 刷した場合、イメージは非常に劣化して印刷されます。この属性を false に設定する場合は、 ディザリング方法も設定する必要があります (以下を参照)。 GDI+ による透過性とアンチエリアシング MapXtreme の GDI+ レンダリング機能を利用することで、半透明のライン、ラベル、レイヤを作成 できます。また、アンチエリアシングも適用できるため、高解像度レンダリングを低い解像度で 表示するときに、直線と曲線の縁や塗りつぶしエリアの外周がぎざぎざになるのを防ぎ、なめら かにすることができます。 MapPrintDocument または LegendPrintDocument を使用してマップや凡例を印刷すると、自動的に DrawingAttributes.EnableTranslucency プロパティが Map.DrawingAttributes の値に設定され、 DrawingAttributes.SmoothingMode プロパティが Legend.DrawingAttributes の値に設定されます。この プロパティは、初期化後にユーザが独自の値に設定できます。これにより、この 2 つの表示オプ ションは明示的に設定しなくても、マップまたは凡例から引き継がれます。 EnableTranslucency: マップを画面、プリンタ、またはファイル エクスポートに出力する際に、 スタイルの色やレイヤの透過値を取得、または適用するかどうかを設定します。このプロパティ が false の場合、スタイル (Color.A など) およびレイヤ (MapLayer.Alpha など) の透過値は無視され ま す。代 わ り に、255 と い う値が使用されます。このプロパティは、ラスタ透過度 (RasterStyle.Alpha など) には影響しません。透過ラスタを印刷するには、EnableTranslucency を有効 にする必要があります。ただしこれは、画面への表示やエクスポートには必要ありません。この プロパティを false に 設 定 すると、DrawingAttributes.SmoothingMode が自動的に SmoothingMode.None に設定されます。つまり、透過性を有効にしなければ、アンチエリアシング を使用できません。 SmoothingMode: マップのレンダリング品質を取得、または設定します。このプロパティでは、 MapInfo.Mapping.SmoothingMode 列挙体のメンバが指定されます。デフォルト値は SmoothingMode.None です。SmoothingMode により、直線、曲線、塗りつぶしエリアの外周にス ムージング (アンチエリアシングとも呼ばれます) を使用するかどうかを指定します。このプロパ ティを SmoothingMode.AntiAlias に設定すると、 MapInfo.Mapping.DrawingAttributes.EnableTranslucency が自動的に true に設定されます。つまり、ア ンチエリアシングを使用する際には必ず透過が有効になります。 EnableTranslucency を false に設定すると、SmoothingMode が None 以外の場合、自動的に None に設 定されます。SmoothingMode を AntiAlias に設定すると、EnableTranslucency が true 以外の場合、自 動 的 に true に 設 定 さ れ ま す。EnableTranslucency が true のとき、透過性を維持したまま SmoothingMode を None と AntiAlias に切り替えることができます。 564 MapXtreme 2008 v7.0.0 付録 F: MapXtreme アプリケーションからの印刷 MapStyleControl クラス MapStyleControl (MapInfo.Windows.Controls 名前空間) は、デスクトップ LayerControl のタブに表示 可能なコントロールです。ユーザはこのコントロールを使用して、マップのスタイルやレンダリ ング オプション (アンチエイリアス処理、透過性など) を設定できます。 ディザリング方法 ディザリングとは、色深度が減少する場合に、イメージの外観を維持するために、ピクセルを電 子的にブレンドする技法です。24 ビット イメージを 256 色に変換する場合には、ディザリング方 法を選択します。 • • ハーフトーン ディザリング。イメージの中のコントラストが高い要素間で色の一連のハーフ トーンの差異を計算して、スムーズな色の遷移を作成します。表示、印刷、およびエクスポー トの各オプションで、このオプションがデフォルトで選択されます。 誤差拡散ディザリング。コントラスト色の間で中間色を計算し、その中間色に向かって均等に ブレンドするように、周囲のピクセルを色分けします。 DrawingAttributes.RasterDitherMethod プロパティを使用して、この値を設定します。こ れを、DitherMethod 列挙体の値に設定できます。 例: mapPrintDocument.DrawingAttributes.RasterDitherMethod = MapInfo.Mapping.DitherMethod.HalfTone; ポリゴンの穴の特殊処理 MapXtreme アプリケーションでは、さまざまな個別のピースを使用し、それを結合することに よって、複雑なポリゴン オブジェクトを描画できます。ポリゴンを穴や島と共に印刷する場合、 各部が適切に一致せず、重なり合ったり、ギャップが生じたりすることがあります。この不適切 な動作に対処して、ポリゴンを適切に表示および印刷するための、内部プログラミング機能があ ります。この機能を利用するには、DrawingAttributes.SpecialPolygonHoleHandling プ ロパティの値を true に設定します。画面に描画する場合、この値は false に設定します。 パターンのスケール この設定によって、非透過ビットマップ フィル パターンを画面に表示されているままの状態で印 刷したり、プリンタ ドライバに、フィル パターンのレンダリングを詳細に制御させたりできま す。この値は、DrawingAttributes.ScaleBitmapPatterns で設定します。この値が true の場合、ビットマップ フィル パターンは拡大され、プリンタと画面の解像度の差が補正されま す。false の場合、パターンはスケールされず、プリンタ ドライバによってフィル パターンがス ケールされます。プリンタ ドライバでフィル パターンをスケールできる場合は、この値を false に設定します。プリンタ ドライバでフィル パターンをスケールできない場合は、印刷出力が小さ く表示されたり、塗りつぶされたような状態で出力されることを回避するために、この値を true に設定します。どのフィル パターンがビットマップで、どのフィル パターンがベクトルであるか の詳細については、「570 ページの「フィル パターンの使用時に印刷を高速化する」」を参照して ください。 開発者ガイド 565 アプリケーションへの印刷のインプリメント このプロパティが true に設定されている場合、プリンタ ドライバではパターンがスケールされ るが、画面ではパターンがスケールされないため、印刷プレビューと印刷されたドキュメントが 同じに見えないことがあります。画面には正しく表示されていなくても、印刷は正しく行われま す。 注意 フィル パターンに背景色がある場合、これは非透過と見なされます。一方、背景色がない 場合は透過フィルと見なされ、このプロパティの値にかかわらず、常にスケールされま す。 デバイスへの直接出力 こ の オ プ シ ョ ン を 使 用 す る と、イ メ ー ジ を プ リ ン タ に 直 接 印 刷 で き ま す。こ の 値 は、 PrintMethod.Direct で設定します。 拡張メタファイル (EMF) を使用する出力 イメージをプリンタに送る前に、イメージの拡張メタファイルを生成するには、このオプション を使用します。このオプションは、現在のプリンタ技術を利用してスプール サイズを小さくし、 品質を損なうことなく短時間でファイルを出力します。この値は、PrintMethod.Emf で設定し ます。 アプリケーションへの印刷のインプリメント MapXtreme 内の印刷用の名前空間には、マップの印刷を支援する一連のクラスが含まれていま す。これらのクラスを使用して、接続されている印刷デバイスへの、マップの基本的な印刷を処 理します。 ダイアログおよびプリンタ制御ダイアログにアクセスするには、MapPrinting クラスを使用しま す。アプリケーションに対して 1 つの MapPrinting オブジェクトを割り当て、印刷/印刷プレビュー /ページ設定で同じインスタンスを使用することが重要です。 Setup a MapPrinting and assign a map: this.mapPrinting = new MapPrinting(); this.mapPrinting.Map = this.mapControl1.Map; マップを印刷するサンプル コードを次に示します。 this.mapPrinting.ShowDialog = true; this.mapPrinting.Print(); マップの印刷プレビューを表示するサンプル コードを次に示します。 this.mapPrinting.PrintPreview(); [ページ設定] ダイアログを表示するサンプル コードを次に示します。 this.mapPrinting.PageSettingsDialog(); 566 MapXtreme 2008 v7.0.0 付録 F: MapXtreme アプリケーションからの印刷 メインの印刷クラスに含まれる PrintDocument を通じて、プリンタ設定にアクセスできます。派生 クラスには独自のマッピング ニーズをサポートする設定とオプションが追加されているため、 MapPrinting オブジェクトのクラスを取得し、これを派生クラスに再キャストする必要がありま す。 mapPrinting = new MapPrinting(); mapPrinting.Map = mapControl1.Map; MapPrintDocument mapPrintDocument = mapPrinting.PrintDocument as MapPrintDocument; if (mapPrintDocument != null) { // here are some examples of how to set print options // Set these based on your needs mapPrintDocument.DrawingAttributes.SpecialTransparentRasterHandling = true; mapPrintDocument.PrintMethod = PrintMethod.Direct; // and set other properties of mapPrintDocument } マップ印刷オプションを変更する UI は用意されていません。ダイアログでは、システム プリンタ の設定のみ変更できます。ユーザに追加のオプションを提供するには、独自の UI を提供して、 MapPrintDocument の プ ロ パ テ ィ を設定する必要があります (DrawingAttributes、PrintMethod、 PrintSize など)。 PrintDocument では、印刷プロセスにアクセスしたり、印刷イベントが発生したときのコールバッ クを追加することもできます。たとえば、各印刷ページに、ロゴやその他のグラフィックスを追 加するものとします。 C# の例 mapPrinting = new MapPrinting(); mapPrinting.Map = mapControl1.Map; mapPrinting.PrintDocument.PrintPage += new PrintPageEventHandler(mapPrintDocument1_PrintPage); private void mapPrintDocument1_PrintPage(object sender, PrintPageEventArgs e) { // add customization for each page (ie; title, page #, etc.) Graphics g = e.Graphics; } VB の例 mapPrinting = New MapPrinting() mapPrinting.Map = mapControl1.Map AddHandler mapPrinting.PrintDocument.PrintPage, AddressOf mapPrintDocument1_PrintPage Private Sub mapPrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) ' add customization for each page (ie; title, page #, etc.) Dim g As Graphics = e.Graphics End Sub 開発者ガイド 567 印刷に関する一般的なヒント この方法を使用すると、グラフィックス オブジェクトにアクセスし、使用できる任意のグラ フィックス ルーチンを使用して、さらにグラフィックスやテキストを印刷できます。 印刷に関する一般的なヒント 注意 MapInfo 社では、特に 1 種類のプリンタ/プロッタをお勧めできませんし、お勧めすること もありません。また、特定のプリンタが常に動作することを確認することもありません。 出力に影響する要素が多すぎて、お勧めすることができないのです。 以下に示すヒントは、当社のユーザが報告してきた、印刷に関する一般的な問題とその対処方法 から成るナレッジベースの抜粋です。 印刷に関する問題のトラブルシューティングを行う場合は、まず、MapXtreme のリリースにパッ チがある場合はこれをダウンロードおよびインストールし、プリンタとオペレーティング システ ムに適した最新のプリンタ ドライバを使用することが重要です。例外については、このマニュア ルに記載します。 PrintPage イベントをオーバーロードする方法 .NET 印刷 API は、PrintPage イベントをオーバーロードするメカニズムを備えています。これを使 用すると、各印刷ページをカスタマイズできます。たとえば、タイトル、ページ番号、ロゴなど を追加できます。 このためには、PrintPageEventHandler をインプリメントする必要があります。以下にコードの例を 示します。 this.mapPrinting = new MapPrinting(); this.mapPrinting.Map = this.mapControl1.Map; this.mapPrinting.PrintDocument.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.mapPrintDocument1_Prin tPage); private void mapPrintDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // TODO - add your code here to alter the printed page } マップ内に凡例を印刷する このセクションの先頭で説明したように、MapXtreme では、レイアウトの印刷はサポートされま せん。マップ内に凡例を印刷するには、凡例を修飾としてマップに追加する必要があります。以 下にこのサンプル コードを示します。 //create cartographic legend MapInfo.Mapping.Legends.Legend legend = mapControl1.Map.Legends.CreateLegend(new System.Drawing.Size(5, 5)); legend.Border = true; MapInfo.Mapping.LayerType[] normalLyr = new MapInfo.Mapping.LayerType[1]; normalLyr[0] = MapInfo.Mapping.LayerType.Normal; 568 MapXtreme 2008 v7.0.0 付録 F: MapXtreme アプリケーションからの印刷 MapInfo.Mapping.IMapLayerFilter filter = MapInfo.Mapping.MapLayerFilterFactory.FilterByLayerType(normalLyr); MapInfo.Mapping.Legends.LegendFrame frame; foreach(MapInfo.Mapping.FeatureLayer ftrLayer in mapControl2.Map.Layers.GetMapLayerEnumerator(filter)) { frame = MapInfo.Mapping.Legends.LegendFrameFactory.CreateCartographicLegendFrame( ftrLayer); legend.Frames.Append(frame); } //set legend location on the map System.Drawing.Point pt = new System.Drawing.Point(220, 200); pt.X = mapControl2.Size.Width - legend.Size.Width; pt.Y = mapControl2.Size.Height - legend.Size.Height; legend.Location = pt; //append legend as map adornment mapControl1.Map.Adornments.Append(legend); mapPrinting.print (); 古いドライバは動作し、新しいドライバは動作しない 古いドライバが動作し、新しいドライバが動作しない場合、判別がつかなければ、古いドライバ を使用します。 HP 755 ドライバに関するヒント このプロッタ モデルによる印刷が困難な場合は、代わりに、HP 650C (C2859B) のプロッタ ドライ バを使用してみてください。プリンタやプロッタ モデルに関して問題が生じた場合、類似のモデ ルが存在するのであれば、類似のモデルのドライバを代わりに使用することで、多くの場合、問 題が解決されます。たとえば、HP 8500 DN Color LaserJet のプリンタ ドライバに、HP8550 Color LaserJet ドライバを使用できます。 効果的なパターンのスケールに関するヒント 印刷する場合は、使用しているプリンタ ドライバの種類を確認します。多くの PCL6 ドライバと 一部の HPGL ドライバは、フィル パターンのスケールを処理する機能を備えており、この機能を 制御できます。そのスケール機能をオフにすると、印刷イメージと、モニタ上に表示されるイ メージが異なる可能性があります。当社のスケール機能は、マップおよび凡例の印刷要件を適切 に満たすように拡張されているため、ドライバのスケール オプションはオフにして、当社のス ケール機能を使用することをお勧めします。当社のパターン スケール オプションをオンにするに は、アプリケーション内でパターンのスケールを有効にします (「565 ページの「パターンのス ケール」」を参照 )。次に、当社のスケール機能を無効にして、どちらがよいかを確認します。テ ストの結果、当社のスケール機能の方が、画面の表示にほぼ一致するカラー出力が得られます。 開発者ガイド 569 印刷に関する一般的なヒント LanguageLevel 2 または 3 を使用して PostScript ドライバに印刷している場合、一部の Microsoft ド ライバは、パターンのスケールをサポートしないことがわかっています。この場合は、当社のス ケール機能は正しく動作しない可能性があります。Microsoft 社では、ドライバの言語レベルを LanguageLevel 1 にリセットして、この制約を取り除くことを推奨しました。この条件には、いく つかの例外があることがわかりました。Windows 2000 および Windows NT では、いくつかの HP Laser Jet および Color Laser Jet PostScript ドライバは、当社のスケール オプションを使用して、正し く印刷できます。 フィル パターンの使用時に印刷を高速化する [AreaStyle] ダイアログ ボックス内の先頭の 6 個のフィル パターン ( 塗りつぶしの後 ) は Windows の標準であり、印刷が高速に行われる傾向があります。これらのフィル パターンはベクトル ベー スです。残りのパターンは、MapXtreme に付属しているビットマップです。フィル パターンを選 択するときに、この点に考慮してください。 1 1 高速で印刷するには、このフィル パターンを使用します。 さらに印刷速度を向上する 印刷速度を改善したい場合、プリンタに [ はやい ]、[ 標準 ]、[ きれい ] などの印刷の品質に関する オプションがあれば、[ はやい ] を選択することをお勧めします。この場合、出力の解像度は低下 します。 ディスク容量に問題がある 拡張メタファイル オプションを使用して印刷する場合は特に、一時ディスク容量が十分にあるこ とを確認します。ディスク上に、レイヤ化されたビットマップが作成されます。 グローバルに印刷する : ローカル スプール ! 印刷ジョブは、プロッタではなくローカルにスプール1 してください、これによって、プリンタで はなくコンピュータが出力をラスタ化するため、効率的です。 570 MapXtreme 2008 v7.0.0 付録 F: MapXtreme アプリケーションからの印刷 1 1 [ 印刷ドキュメントをスプールし、プログラムの印刷処理を高速に行う ] をクリッ クし、[ 全ページ文のデータをスプールしてから、印刷データをプリンタに送る ] を クリックします。 1. ローカルな印刷ジョブのスプールを設定するには、[スタート] > [設定] > [コントロール パネル] > [プリンタ] を選択します。 2. プリンタを右クリックし、メニューの [プロパティ] を選択し、プリンタのプロパティを表示し ます。 3. [詳細設定] タブをクリックし、詳細なプロパティ オプションを表示します。 注意 コンピュータの管理権限を持っていない場合は、スプール オプションを使用できない 可能性があります。この変更を行うには、IT 部門に連絡してください。 4. [OK] をクリックして、変更を保存します。 これまでに知られている印刷に関する問題の対処方法 アプリケーションによる印刷やプロットに影響する要素は数多く存在するものであり、MapXtreme アプリケーションも例外ではありません。MapXtreme は、プリンタ ドライバを備えていません。 現在の Windows オペレーティング システムにインストールされている既存のドライバを使用しま す。ここでは、ユーザやパートナーによって発見された具体的なプリンタ/プロッタの問題につい て説明します。これらの情報は、ユーザをサポートする開発者をサポートする目的で提供されて います。 1. 開発者ガイド スプールとは、プリンタが処理できる状態になるまで、印刷ドキュメントのデータをメモリまたはファイ ルに格納するプロセスです。 571 これまでに知られている印刷に関する問題の対処方法 プラットフォームに依存しない問題 これらの問題は、特に明記されていないかぎり、オペレーティング システムやハードウェア/ソフ トウェアにかかわらず発生します。以下の中から自分が扱っている問題を見つけて、対処方法を 参照してください。 ハッチ パターンが黒いポリゴンとして印刷される プリンタ/プロッタ: HP Designjet Series プロッタ 問題: ハッチ パターンが含まれるマップを印刷すると、黒の塗りつぶしとして表示される部分があ る。 対処法: Hewlett Packard 社によれば、新しい HP プリンタ ドライバ (4.63) は、Windows 以外の標準 ハッチ パターンを正しく処理します。新しい HP 4.63 ドライバをダウンロードおよびインストール して、この問題に対処することをお勧めします。 印刷時にハッチ パターンが圧縮される オペレーティング システム: WindowsNT 4.0/2000 プリンタ/プロッタ: HP LaserJet Series (HP LaserJet 4050 Series PCL 6 でテスト) 問題: MapInfo ハッチ パターン ([AreaStyle] ダイアログ ボックスの先頭の 6 パターン以外のパター ン) を使用すると、パターンが非常に圧縮されることがあります。これは、パターンがビットマッ プで、高いプリンタ解像度で描画されることが原因です。標準の Windows パターンでは、このよ うな問題は生じません。プリンタ解像度が、圧縮の程度に影響します。 対処法: [縮尺パターン] (WYSIWYG) という新しい出力設定を持つ一部のプリンタ ドライバでは、 パターンを正しくスケールできます。当社でテストした HP プリンタの場合、[印刷設定] > [印刷品 質] > [詳細設定] オプションを選択すると、このオプションを使用できます。 フィル パターンのスケールが 2 度にわたって実行されてしまうため、ユーザはドライバまたは当 社のスケール機能をオフにする必要があります。両方のスケールを試して、自分に適したスケー ルを見つけてください。 プラットフォーム固有の問題 これらの問題は、特に明記されていないかぎり、特定のオペレーティング システムやハードウェ アに関係します。これらの問題は、オペレーティング システムで分類されています。 HP 500、800、5000 DesignJet プロッタを使用してラスタを印刷するときに、2 ~ 4 cm ごとに印刷出力が繰り返される この問題に対処するには、2 つの方法が考えられます。まず最初に、ドライバ レベルまたはプリン タ レベルから、プリンタをローカルにスプールします。 注意 この問題を解決するには、プリンタおよびプリンタ ドライバに対して、読み取り/書き込み の権限を持っている必要があります。 この問題を解決するには、ドライバのプロパティの中で、高度な隠し設定を変更します。 ベクトル オーバーレイでラスタを印刷するときに、 2 ~ 4 cm ごとに印刷を繰り返すことを回避す るには、次の操作を行います。 572 MapXtreme 2008 v7.0.0 付録 F: MapXtreme アプリケーションからの印刷 1. [コントロール パネル] でプリンタ ドライバのプロパティを見つけます。この設定を表示するに は、プリンタ アイコンを右クリックし、[プロパティ] を選択します。 2. [詳細設定] タブをクリックします。以下のオプションを選択します。 • • [Avoid out of memory] オプションを選択します。 Windows 2000 または Windows XP オペレーティング システムを使用している場合は、100% の倍率を選択します。 3. このダイアログ ボックスで、[標準の設定] ボタンをクリックします。 4. このダイアログ ボックスで、[バージョン情報] ボタンをクリックします。そのドライバの [ バージョン情報] ダイアログ ボックスが表示されます。 5. キーボードの F8 キーを押したまま、[OK] ボタンをクリックします。[Special Options] ダイアロ グ ボックスが表示されます。 6. [Enable SpoolSmart] チェック ボックスをオフにして、[OK] をクリックします。 注意 このドライバ オプション ボックスの設定を変更する場合は、必要に応じて元に戻せるよう に、元の値を書き留めておいてください。これらは HP サポート エンジニア用に作成され たものであり、汎用ではありません。 これらの設定を Quick Set として保存し、ラスタ ファイルを印刷するたびに実行できます。 1. HP プリンタ ドライバに移動し、ドライバ設定にアクセスします。オペレーティング システム に基づいて、次のいずれかの方法を使用します。 • Windows NT 4.0 を使用している場合 - Windows デスクトップから、[スタート] > [設定] > [プ リンタ] を選択します。適切なプロッタ ドライバのアイコンを右クリックし、[ドキュメン トの既定値] を選択します。 • Windows 2000/XP を使用している場合 (クラシック表示) - Windows デスクトップから、[ス タート] > [設定] > [プリンタ] を選択します。適切なプロッタ ドライバのアイコンを右ク リックし、[印刷設定] を選択します。 2. 隠しメニューで、目的の値を設定します。 開発者ガイド 573 これまでに知られている印刷に関する問題の対処方法 3. [Quick Sets] ボックスに、選択した設定の名前 ("Raster Print Settings" など) を入力し、[保存] を クリックします。現在のすべてのドライバ設定 (用紙の種類、隠しメニュー設定など) は、 Quick Sets 名として保存されます。プリンタ ドライバはこの設定を記憶しており、将来の印刷 ジョブで使用できます。 同じ設定を使用して後でラスタ マップを印刷するには 1. [印刷] コマンドを選択して、[印刷] ダイアログ ボックスを表示します。 2. [プロパティ] ボタンを選択します。[プロパティ] ダイアログ ボックスが表示されます。 3. [Quick Sets] ドロップダウン リストに、入力した名前 (この例の場合は "Raster Print Settings") が 表示されていることを確認し、[OK] をクリックします。[印刷] ダイアログ ボックスが再表示 されます。 4. [OK] をクリックして印刷します。 注意 Quick Sets の特殊設定が必要ない場合は、この設定をデフォルトのマシン設定に戻してくだ さい。 HP Designjet プリンタ (ドライバ 5.31 または 5.32) で印刷できない このドライバを使用しようとすると、次のいずれかが発生します。 • • [Maximum Performance] オプションを選択すると、メモリ エラーに関するメッセージが表示さ れ、イメージの一部だけが印刷されます。 [Avoid out of memory] オプションを選択すると、コンピュータがクラッシュし、ハード ディス クの空き領域の不足を示すメッセージと、仮想メモリの不足を示すメッセージが表示されま す。 この問題の対処方法は、上記の問題の対処方法に似ています。[Special Options] ダイアログ ボック スは同じです。 1. プログラムを使用して、次の印刷オプションを設定します。 MapPrintDocument mapPrintDocument = this.mapPrinting.PrintDocument as MapPrintDocument; mapPrintDocument.PrintMethod = PrintMethod.Direct; mapPrintDocument.DrawingAttributes.SpecialTransparentVectorHandling = true; mapPrintDocument.DrawingAttributes.SpecialTransparentRasterHandling = false; mapPrintDocument.DrawingAttributes.TrueColorRaster = true;. 2. [コントロール パネル] の [プリンタ] または [プリンタと FAX] を選択し、印刷先のプリンタを 見つけます。 3. プリンタを右クリックし、[プロパティ] ボックスが表示されます。 オプションを選択します。[プロパティ] ダイアログ 4. [バージョン情報] ボタンをクリックし、このプリンタ ドライバの [バージョン情報] ダイアログ ボックスを表示します。 5. キーボードの F8 キーを押したまま、[OK] ボタンをクリックします。[Special Options] ダイアロ グ ボックスが表示されます。 6. [Enable SpoolSmart] チェック ボックスをオフにします。 574 MapXtreme 2008 v7.0.0 G スタイルのルックアップ この付録には、フィル パターン、ライン スタイル、ベクトル シンボル、カス タム ビットマップ シンボルなど、サポートされているスタイルのルックアッ プ テーブルが含まれています。スタイルの説明およびその使用方法の詳細に ついては、「第 16 章: 「マップのスタイル設定」」を参照してください。 この付録の構成 「フィル パターン」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「ライン スタイル」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「ベクトル シンボル」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「カスタム シンボル」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「MapXtreme アイコン」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 590 591 595 597 フィル パターン MapXtreme フィル パターン (MapXtreme プログラミング API の内部スタイルとも呼ばれています) の一覧を次の表に示します。各フィル パターンには、インデックス番号とパターン番号が関連付 けられています。インデックス番号は、InteriorStyleRepository オブジェクトをプログラムでアクセ スするときに使用され、パターン番号は、フィル パターンを説明する内部的な名前に相当しま す。 詳しい説明を以下に示します。 フィル パターン グラフィカルなフィル パターン自体。 インデックス番号 ゼロを基点とするインデックス。フィル パターンを表す内部スタイルを InteriorStyleRepository か ら取得するときに使用されます。 パターン番号 フィル パターンを表す数値の識別子。内部スタイル オブジェクトを作成するときに使用できます。 これはあくまでも内部的な番号であり、プログラムを通じて InteriorStyleRepository にアクセスする ときには使用できません。ただし、MapXtreme ワークスペース ファイル (.mws) 内でフィル パター ンを指定するときに使用されます。 インデックス番号の指定方法 フィル パターンの表に示されているように、フィル パターンのインデックスは、1 ~ 172 の範囲 です (インデックス番号の列)。他の MapInfo 製品 (MapInfo Professional、MapBasic など) でも、1 を 基点とするこのインデックス方式が使用されます。ただし、MapXtreme API では、0 を基点とする インデックスを使用する InteriorStyleRepository オブジェクトを通じて、フィル パターン (内部スタ イル オブジェクトとも呼ばれます) が取得されます。 特に、InteriorStyleRepository オブジェクトを使用すると、0 を基点として、0 ~ 172 の範囲を持つ インデックス方式を使用して、使用できるすべての内部スタイル オブジェクトをループ処理でき ます。つまり、実際には 173 の内部スタイル オブジェクトを選択できます。しかし、インデック ス 0 とインデックス 1 の内部スタイル オブジェクトは同一です。要素 0 および要素 1 のオブジェ クトは、以下の理由から、同じでなければなりません。 まず、InteriorStyleRepository クラス自体の、0 を基点とする固有のインデックス機能に対応する必 要があります。つまり、InteriorStyleRepository クラスでは、その IList から要素を取得するのに、0 を基点とするインデックス アクセスのみ許可しています (IList は、nteriorStyleRepository クラスが インプリメントしている標準の .NET インターフェイスです)。 576 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ 次に、0 を基点とするインデックス方式は、パターン番号の列に示されている 1 を基点とするイン デックス方式と、同期している必要があります。そのため、フィル パターンは、インデックス範 囲 1 ~ 172 の 172 個のみが存在します。そのインデックス要素の定義を指定するために、プログラ ム可能なインデックス 0 のフィル パターンが追加されました。 注意 先頭の 8 個のフィル パターンは、インデックス番号とパターン番号が同じです。それ以降 のパターン番号は、対応するインデックス番号より、常に 3 だけ大きい値です (このため、 パターン番号の最後の値は 175 で、インデックス番号の最後の値は 172 です)。これは、間 違いではありません。172 個の一意なフィル パターンが存在します。表に漏れはありませ ん。 フィル パターンと対応するインデックス番号およびパターン番号 フィル パターン インデックス番号 パターン番号 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 12 ( なし ) 開発者ガイド 577 フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 578 インデックス番号 パターン番号 10 13 11 14 12 15 13 16 14 17 15 19 16 18 17 20 18 21 19 22 20 23 21 24 22 25 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 開発者ガイド インデックス番号 パターン番号 23 26 24 27 25 28 26 29 27 30 28 31 29 32 30 33 31 34 32 35 33 36 34 37 35 38 36 39 579 フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 580 インデックス番号 パターン番号 37 40 38 41 39 42 40 43 41 44 42 45 43 46 44 47 45 48 46 49 47 50 48 51 49 52 50 53 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 開発者ガイド インデックス番号 パターン番号 51 54 52 55 53 56 54 57 55 58 56 59 57 60 58 61 59 62 60 63 61 64 62 65 63 66 64 67 581 フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 582 インデックス番号 パターン番号 65 68 66 69 67 70 68 71 69 72 70 73 71 74 72 75 73 76 74 77 75 78 76 79 77 80 78 81 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 開発者ガイド インデックス番号 パターン番号 79 82 80 83 81 84 82 85 83 86 84 87 85 88 86 89 87 90 88 91 89 92 90 93 91 94 92 95 583 フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 584 インデックス番号 パターン番号 93 96 94 97 95 98 96 99 97 100 98 101 99 102 100 103 101 104 102 105 103 106 104 107 105 108 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 開発者ガイド インデックス番号 パターン番号 106 109 107 110 108 111 109 112 110 113 111 114 112 115 113 116 114 117 115 118 116 119 117 120 118 121 585 フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 586 インデックス番号 パターン番号 119 122 120 123 121 124 122 125 123 126 124 127 125 128 126 129 127 130 128 131 129 132 130 133 131 134 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 開発者ガイド インデックス番号 パターン番号 132 135 133 136 134 137 135 138 136 139 137 140 138 141 139 142 140 143 141 144 142 145 143 146 144 147 587 フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 588 インデックス番号 パターン番号 145 148 146 149 147 150 148 151 149 152 150 153 151 154 152 155 153 156 154 157 155 158 156 159 157 160 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン 開発者ガイド インデックス番号 パターン番号 158 161 159 162 160 163 161 164 162 165 163 166 164 167 165 168 166 169 167 170 168 171 169 172 170 173 589 ライン スタイル フィル パターンと対応するインデックス番号およびパターン番号 (続き) フィル パターン インデックス番号 パターン番号 171 174 172 175 ライン スタイル 590 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ ベクトル シンボル MapXtreme のインストール プロセスの中で、10 種類の MapInfo 固有の TrueType フォントが自動的 にインストールされます。これらのフォントによって、Weather (天気)、Real Estate (不動産)、 Transportation (輸送) など、さまざまな分野の記号シンボルが提供されます。記号の番号は Unicode 文字値です。これは Unicode 文字コード ブロックの最初の範囲に含まれているため、番号の割り 当ては ASCII 文字セットでも共通しています。 MapInfo Arrows MapInfo Cartographic 開発者ガイド 591 ベクトル シンボル MapInfo Miscellaneous MapInfo Oil & Gas MapInfo Shields 592 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ MapInfo Real Estate Map Symbols MapInfo Symbols MapInfo 3.0 互換シンボル 開発者ガイド 593 ベクトル シンボル MapInfo Transportation MapInfo Weather 594 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ カスタム シンボル 以下のシンボルは、C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x\CustSymb にあります。 各イメージのファイル拡張子は .BMP です。 これらのシンボルは、MapInfo.Styles 名前空間内の BitmapPointStyleRepository コレクション クラス を通じて、プログラムによってアクセスできます。 独自のビットマップ イメージを作成し、それを CustSymb ディレクトリに追加できます。作成する イメージのサイズには事実上制限はありません。ただし、MapXtreme で表示できるかどうかは、 利用可能なメモリ量によります。イメージは四角形である必要はなく、最大 24 ビットの色深度を 設 定 で き ま す。イ メ ー ジ を 自 然 な 幅 と 高 さ で 表 示 す る に は、イ メ ー ジ の そ れ ぞ れ の BitmapPointStyle オブジェクト内で、ブール型の "NativeSize" プロパティを true に設定する必要があ AMBU1-32 AMBU-64 BADG1-32 BADG2-32 BANK1-32 BANK2-32 BANK-64 BOOK1-32 BUILDINGS CAMP1-32 CAR1-32 CAUT1-32 CHUR1-32 COMP1-32 FARM1-32 FAST1-32 FIRE1-32 FIRE-64 FOOD-64 GLOB1-32 GOLF1-32 HOSP1-32 HOUS1-32 HOUS2-32 HOUS3-32 HOUS-64 HYDR1-32 INTE1-32 LITE1-32 LITE2-32 MAIL1-32 MBOX1-32 MBOX2-32 MOSQ1-32 ONEW1-32 ONEW2-32 開発者ガイド 595 ベクトル シンボル PENC1-32 596 PIN1-32 PIN2-32 PIN3-32 PIN4-32 PIN5-32 (CYAN) (RED) (YELLOW) (GREEN) (BLUE) PIN6-32 PINB-64 PING-64 PINGY-64 PINR-64 POLI1-32 (PURPLE) (BLUE) (GREEN) (GRAY) (RED) RAIL1-32 RAIL2-32 RAIL3-32 RAIL-64 RED-CAR REST1-32 STAT1-32 STOP1-32 SYNA1-32 TARG1-32 TAXI1-32 TEMP1-32 TOWE1-32 TOWE2-32 TRAF1-32 TRUC1-32 TRUC2-32 TRUC-64 YIEL1-32 YIEL2-32 MapXtreme 2008 v7.0.0 付録 G: スタイルのルックアップ MapXtreme アイコン 以下のサムネールの一覧は、 MapXtreme ベースのアプリケーションで使用できるツールバー アイ コンのコレクションです。これらは、MapXtreme インストール フォルダの \Samples\Icons フォルダ にインストールされます。各 .PNG には、大 (24x24 ピクセル)、小 (16x16 ピクセル) の 2 つの形式 があります。 ADD_NODE ADORNMENT ARC ARROW ASSIGN_TARGET CLIP_MODE CLIP_REGION CLOSE_ALL COPY CREATE_DRIVE_REG CROSSHAIR CUT DRAG_HANDLE ELLIPSE FIND_ADDRESS GEOCODE_USE_SRV GRABBER GRAPH_SELECT HELP HOT_LINK INFO INVERTSELECT LABEL LAYERS LEGEND LINE LINE_STYLE MB_12 MB_6 MB_7 MB_8 NEW_BROWSER NEW_DOC NEW_GRAPHER NEW_LAYOUT NEW_MAPPER NEW_REDISTRICTER ODBC_DISCONNECT ODBC_MAPPABLE ODBC_OPEN ODBC_REFRESH ODBC_SYMBOL ODBC_UNLINK OPENWFS OPENWMS OPEN_FILE OPEN_WOR PASTE POLYGON POLYGON_STYLE POLYLINE PRINT PRINT_PDF RECT RESHAPE ROUND_RECT RULER RUN SAVE_FILE SAVE_WIN 開発者ガイド 597 ベクトル シンボル SAVE_WOR SCALEBAR SEARCH_BDY SEARCH_POLYGON SEARCH_RADIUS SEARCH_RECT SET_TARGET_MAP STATISTICS SYMBOL SYMBOL_STYLE TEXT TEXT_STYLE UNDO UNSELECT_ALL WEB_SERVICE_PREF WINDOW_FRAME WRENCH ZOOM_IN ZOOM_OUT ZOOM_QUESTION 598 MapXtreme 2008 v7.0.0 MapInfo コードスペース の定義 MapInfo コードスペースは、MapInfo のマップやワークスペースの作成時に使 用する定義と標準のリストです。これらの定義は、MapXtreme を使用するとき に参照できます。当社のコードスペースの定義を、一般的に使用されている EPSG (European Petroleum Survey Group) という別のコードスペースと比較して み て く だ さ い。こ の コ ー ド ス ペ ー ス は、EPSG の Web サイト http://www.epsg.org/ からダウンロードできます。 この付録の構成 「MapInfo コードスペースの定義」 . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 H MapInfo コードスペースの定義 現在の MapInfo コードスペースを次の表に示します。これらの定義によって、XML ベースのマッ プ ドキュメントでこのコードスペースを使用し、srsName などの共通の値を参照できます。たとえ ば、ポイント ジオメトリは次のように定義できます。 <gml:Point srsName="mapinfo:coordsys 1,74"> ...</gml:Point> NjǾÇÕ <gml:Point srsName="epsg:4269"> ...</gml:Point> MapInfo コードスペースの定義 位置 1 カテゴリ coordsys pen 位置 2 位置 3 位置 4 説明および例 CoordSys フ ァ イ ル* リファレンス座標系。 [1-255] 簡単な Mapinfo のペン パターン。デ フォルトの MapInfo MapInfow.pen の定 義に基づく番号 [1-255]。確立された すべてのルールに従います。 例: mapinfo:coordsys 1,74 例: mapinfo:pen 46 brush [1-8, 12-175] 簡単な Mapinfo のブラシ パターンの番 号 [1-8, 12-175] (注意: 9 ~ 11 は予約さ れています。) デフォルトの MapInfo のビットマップ定義に基づきます。 例: mapinfo:brush 17 length in | ft | yd | mi mm | cm | m | km | sft | nmi | li | ch | rd | pt | twip | pica | deg pt= 1/72 in pica = 12 pt twip = 1/20 pt 1 deg = (pi/180) * 6370997 m = 69.09329 mi (大円 に基づく) imagesize pixel 長さの単位。 インチ | フィート | ヤード | マイル | および ミリメートル | センチメートル | メー トル | キロメートル | および survey フィート | 海里 | および リンク | チェイン | ロッド | ポイント | twip | pica | 度をサポートします。 例: mapinfo:length m mapinfo:length pt mapinfo:length deg イメージ サイズの非ライン単位。 例: mapinfo:imagesize pixel 600 MapXtreme 2008 v7.0.0 付録 H: MapInfo コードスペースの定義 MapInfo コードスペースの定義 (続き) 位置 1 カテゴリ 位置 2 位置 3 位置 4 type 説明および例 データ型。 boolean 例: mapinfo:type boolean byte 例: mapinfo:type byte date 例: mapinfo:type date datetime 例: mapinfo:type datetime time 例: mapinfo:type time decimal [|(n n)|] n.m n は合計 桁数、 m は小数 点以下の 桁 数 (m<=n)。 最小値 (オプション)。 最大値 (オプション)。 精度 (オプション)。 例: mapinfo:type decimal (100 -- すべて d>100 mapinfo:type decimal 100) -- すべて d<100 mapinfo:type decimal [200 300] -- すべて 200<=d<=300。 mapinfo:type decimal 10.7 -- 合計 10 桁 以内 (小数点以下が 7 桁なので小数点 の左側 3 桁) の 10 進数。 mapinfo:type decimal [200 300] 10.7 -上記 2 例の組み合わせ。 double [|(n n)|] 例: mapinfo:type double (0 150) float [|(n n)|] 例: mapinfo:type float 30.25] int [|(n n)|] 例: mapinfo:type int [0 180] short [|(n n)|] 例: mapinfo:type short string n char 開発者ガイド 最大長 n (オプション)。 例: mapinfo:type string 256 例: mapinfo:type char 601 MapInfo コードスペースの定義 (続き) カテゴリ 位置 1 位置 2 operators 位置 3 位置 4 説明および例 スカラーの属性比較演算子、ジオメト リ演算子、またはブール演算子。 eq | neq | lt | gt | lteq | gteq バイナリ スカラー値演算子。 in | not_in スカラー値 in/not_in、スカラー値の列 挙。 例: value in {2, 50, 88, 95} 例: mapinfo:op eq value not_in {“NY”, “NJ”} 例: mapinfo:op in mapinfo:op not_in between not_between | スカラー値が、そのスカラー値の型の 順序関係に基づき 2 つのスカラー値の 間にあります。例: value between {5, 25} value not_between 30may2000} {1may2000, 例: mapinfo:op between mapinfo:op not_between like | not_like 文字列値が RHS パターンと一致しま す。RHS パターンの形式は、データ ソースに固有の場合があります。例: lastname like "Jo%" (Oracle のワイルド カード文字 "%" を使用)。 例: mapinfo:op like mapinfo:op not_like intersects フィーチャ ジオメトリ fg が指定の Polygon と交差します。 例: mapinfo:op intersects 602 MapXtreme 2008 v7.0.0 付録 H: MapInfo コードスペースの定義 MapInfo コードスペースの定義 (続き) 位置 1 カテゴリ operators (続き) mbr_intersects 位置 2 位置 3 位置 4 説明および例 フィーチャ ジオメトリ (fg) の mbr (最 小外接四角形) が、指定の Polygon の mbr と交差します。 例: mapinfo:op mbr_intersects contains フィーチャ ジオメトリ (fg) が指定の Point を含みます。フィーチャ ジオメ トリ (fg) が指定の Polygon に含まれま す。 例: mapinfo:op contains contains_centroid フィーチャ ジオメトリ (fg) が指定の Polygon の中心点を含みます。フィー チャ ジオメトリ (fg) の中心点が指定 の Polygon に含まれます。 例: mapinfo:op contains_centroid and ブール型の値 and。 例: mapinfo:op and or ブール型の値 or。 例: mapinfo:op or 開発者ガイド 603 MapInfo コードスペースの定義 (続き) 位置 1 カテゴリ 位置 2 area 位置 3 位置 4 説明および例 面積の単位。 sq acre | a | ha | perch | rood in | ft | yd | mi | mm | cm | m | km | sft | nmi | li | ch | rd | pt | twip | pica | degree 平方ライン単位。 例: mapinfo:area sq mi 定義済みの面積の単位。 例: mapinfo:area acre a = ア ー ル (10m x10m の面積) ha = ヘ ク タ ー ル (100m x 100m の 面積) perch = 272.25 平 方フィート (1 平 方 ロ ッ ド、1 ロッドは 16.5 フィート) rood = 40 perch (1/4 エーカー) time angle msec | sec | min | hr | day | week | month | year 時間の単位。ミリ秒 | 秒 | 分 | 時間 | 日 | 週 | 月 | 年。 deg | rad 角度の単位。度 | ラジアン。 例: mapinfo:time hr 例: mapinfo:angle rad temp K|F|C 温度の単位。ケルビン | 華氏 | 摂氏。 例: mapinfo:temp C * MapXtreme の座標系情報は、C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x 内の MapInfoCoordinateSystemSet.xml にあります。 604 MapXtreme 2008 v7.0.0 I 座標系の要素 この付録では、座標系システムの要素について、サポートする測地系、楕円、 変換などを詳しく説明します。 この付録の構成 「投影法とそのパラメータ」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「投影法の測地系」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「測地系の変換」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「カスタム測地系」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 「National Transformation v.2 (NTv2)」 . . . . . . . . . . . . . . . . . . . . . . . . . 「座標系と投影法に関する情報」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606 610 622 622 627 630 投影法とそのパラメータ 606 標準緯線 2 X X X 正距方位図法 X X X X Cassini-Soldner X X X X 正積円筒図法 X X X Double Stereographic X X X エッカート IV 図法 X X X エッカート VI 図法 X X X 正矩円錐図法 X X X ガル図法 X X X Hotine Oblique Mercator 図法 X X X X ランベルト正積方位図法 X X X X ランベルト等角円錐図法 X X X X 経度-緯度 X メルカトル X X X ミラー X X X モルワイデ X X X New Zealand Map Grid X X X Polyconic X X X 地域別メルカトル図法 X X X ロビンソン図法 X X X サンソン図法 X X X X X レンジ 標準緯線 1 X 擬似偏北距離 元の緯度 X 擬似偏東距離 元の経度 X 比率因数 単位 Albers Equal-Area Conic 方位 Datum 次の表に、各投影法に適用できるパラメータを、MapInfoCoordinateSystemSet.xml 内の関連する座 標 系 の 行に 示 さ れ て い る 順 序 で 示 し ます。このファイルは、C:\Program Files\Common Files\MapInfo\MapXtreme\7.x.x にあります。 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X MapXtreme 2008 v7.0.0 X X X X 横メルカトル X X X X X X X X X X X X レンジ Swiss Oblique Mercator 擬似偏北距離 X 擬似偏東距離 X 比率因数 元の緯度 X 方位 元の経度 X 標準緯線 2 単位 平射図法 標準緯線 1 Datum 付録 I: 座標系の要素 投影法 投影法は、座標系で使用する方程式です。MapInfo で使用される投影法と、 MapInfoCoordinateSystemSet.xml で投影法を識別するための番号を次の表に示します。 番号 投影法 9 Albers Equal-Area Conic 28 正距方位図法 (すべての緯度原点) 5 正距方位図法 (極地のみ) 30 Cassini-Soldner 2 正積円筒図法 31 Double Stereographic 14 エッカート IV 図法 15 エッカート VI 図法 6 正距円錐図法 (Simple Conic) 17 ガル図法 7 Hotine Oblique Mercator 図法 4 ランベルト正積方位図法 (極地のみ) 29 ランベルト正積方位図法 3 ランベルト等角円錐図法 19 ランベルト等角円錐図法 (1972 年にベルギーについて修正) 1 経度/緯度 10 メルカトル 開発者ガイド 607 番号 投影法 11 ミラー円筒図法 13 モルワイデ 18 New Zealand Map Grid 27 Polyconic 26 地域別メルカトル図法 12 ロビンソン図法 16 サンソン図法 20 平射図法 25 Swiss Oblique Mercator 8 横メルカトル図法 (ガウス?クルーガー図法) 21 横メルカトル図法 (デンマーク システム用改訂版 34 Jylland-Fyn) 22 横メルカトル図法 (デンマーク システム用改訂版 34 Sjaelland) 23 横メルカトル図法 (デンマーク システム用改訂版 34/45 Bornholm) 24 横メルカトル図法 (フィンランド KKJ 用改訂版) たとえば、経度/緯度投影法は MapInfoCoordinateSystemSet.xml で次のように示されています。 <GeographicCRS> <srsName>Longitude / Latitude (Porto Santo 1936)</srsName> <srsID> <code>coordsys 1,94</code> <codeSpace>mapinfo</codeSpace> <remarks>Longitude / Latitude (v 6.0 and later projections)</remarks> </srsID> <usesEllipsoidalCS/> <usesGeodeticDatum/> </GeographicCRS> 上記の MapInfoCoordinateSystemSet.xml の基本投影法番号は、定数値の追加により変更されている 場合があります。有効な値とその意味を次の表に示します。 608 MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 定数 意味 パラメータ 1000 アフィン変換を使用 座標系の標準パラメータの後ろにアフィン変換単 位の指定子および係数が表示されます。 2000 バインドを明示的に使用 座標系の標準パラメータの後ろにバインドが表示 されます。 3000 アフィン変換と境界の両方を使用 システムのパラメータ、アフィン パラメータ、境 界の順で表示されます。 例: たとえば、横メルカトル図法に基づいたシンプルな座標系と NAD 1983 測地系を使用するとしま す。MapInfoCoordinateSystemSet.xml ファイルには以下の行が示されています。 <ProjectedCRS> <srsName>UTM Zone 1 (NAD 83)</srsName> <srsID> <code>coordsys 8,33,7,-177,0,0.9996,500000,0</code> <codeSpace>mapinfo</codeSpace> <remarks>Universal Transverse Mercator </remarks> </srsID> <baseCRS/> <definedByConversion/> <usesCartesianCS/> </ProjectedCRS> 上記に基づいた座標系の他に、次のパラメータでアフィン変換を指定する必要もあります。 Units=meters; A=0.5; B=-0.866; C=0; D=0.866; E=0.5; and F=0. この場合は、MapInfoCoordinateSystemSet.xml ファイルで以下の行を指定します。 <ProjectedCRS> <srsName>UTM Zone 1 (NAD 83)- rotated 60 degrees</srsName> <srsID> <code>coordsys 8,33,7,-177,0,0.9996,500000,0, 7, 0.5, 0.866, 0, 0.866, 0.5, 0 </code> <codeSpace>mapinfo</codeSpace> <remarks>Universal Transverse Mercator</remarks> </srsID> <baseCRS/> <definedByConversion/> <usesCartesianCS/> </ProjectedCRS> また、座標系を (x1, y1, x2, y2)=(-500000, 0, 500000, 1000000) にバインドするには、以下の行を指定 します。 <ProjectedCRS> <srsName>UTM Zone 1 (NAD 83)- bounded</srsName> <srsID> 開発者ガイド 609 投影法の測地系 <code>coordsys 8,33,7,-177,0,0.9996,500000,0, -500000, 0, 500000, 1000000 </code> <codeSpace>mapinfo</codeSpace> <remarks>Universal Transverse Mercator </remarks> </srsID> <baseCRS/> <definedByConversion/> <usesCartesianCS/> </ProjectedCRS> 座標系に両方の変更点を適用してカスタマイズするには、以下の行を指定します。 <ProjectedCRS> <srsName>UTM Zone 1 (NAD 83)</srsName> <srsID> <code>coordsys 8,33,7,-177,0,0.9996,500000,0, 7, 0.5, 0.866, 0, 0.866, 0.5, 0, -500000, 0, 500000, 1000000 </code> <codeSpace>mapinfo</codeSpace> <remarks>Universal Transverse Mercator </remarks> </srsID> <baseCRS/> <definedByConversion/> <usesCartesianCS/> </ProjectedCRS> 投影法の測地系 測地系は、準拠楕円体を地球上の特定の点に結び付けることによって構築されています。各測地 系の詳細を以下の表に示します。 • • • • MapInfoCoordinateSystemSet.xml ファイルで測地系を識別するための番号。 測地系の名前 測地系が通常使用されるマップ。 測地系の準拠楕円体 Datum 番号 610 領域マップ 楕円体 1 Adindan エ チ オ ピ ア、マ リ、セ ネ ガ Clarke 1880 ル、スーダン 2 Afgooye ソマリア 1007 AGD 66, 7 パラメータ オーストラリア、オーストラ Australian National リア首都特別地域 1008 AGD 66, 7 パラメータ オーストラリア、タスマニア Australian National 州 Krassovsky MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 Datum 番号 領域マップ 楕円体 1009 AGD 66, 7 パラメータ オーストラリア、ビクトリア Australian National 州/ニューサウスウェールズ州 1006 AGD 84, 7 パラメータ オーストラリア Australian National 3 Ain el Abd 1970 バーレーン諸島 International 118 American Samoa 米サモア諸島 Clarke 1866 4 Anna 1 Astro 1965 ココス諸島 Australian National 119 Antigua Island Astro 1943 アンティグア、リーワード諸 Clarke 1880 島 5 Arc 1950 ボ ツ ワ ナ、レ ソ ト、マ ラ ウ Clarke 1880 イ、 スワジランド、ザイール、ザ ンビア、 ジンバブエ 6 Arc 1960 ケニア、タンザニア Clarke 1880 7 Ascension Island 1958 アセンション島 International 9 Astro B4 Sorol Atoll ターン島 International 8 Astro Beacon "E" 硫黄島 International 10 Astro DOS 71/4 セント ヘレナ島 International 11 Astronomic Station 1952 マーカス島 International 151 ATS77 (Average System 1977) 12 Australian Geodetic 1966 (AGD オーストラリアおよびタスマ Australian National 66 - 3 パラメータ) ニア島 13 Australian Geodetic 1984 (AGD オーストラリアおよびタスマ Australian National 84 - 3 パラメータ) ニア島 1006 Australia-National-AGD84 7 パ オーストラリア ラメータ Australian National 1007 Australia (A.C.T.AGD66 7 パラ オーストラリア メータ) Australian National 1008 Australia (Tasmania AGD66 7- タスマニア param) Australian National 開発者ガイド Terrestrial カナダ ATS77 611 投影法の測地系 Datum 番号 612 領域マップ 楕円体 1009 Australia (Victoria/NSW ビクトリア州、ニューサウス Australian National AGD66 7-param) ウェールズ州 151 Average Terrestrial System 1977 (ATS77) 120 Ayabelle Lighthouse ジブチ Clarke 1880 110 ベルギー ベルギー International 14 Bellevue (IGN) エフェテ島、エロマンガ島 International 15 Bermuda 1957 バーミューダ諸島 Clarke 1866 16 Bogota Observatory コロンビア International 121 Bukit Rimpah バンカ島、ビリトン島 (インドネシア) Bessel 1841 17 Campo Inchauspe アルゼンチン International 18 Canton Astro 1966 フェニックス諸島 International 19 Cape 南アフリカ Clarke 1880 20 Cape Canaveral フロリダ、バハマ諸島 Clarke 1866 1005 Cape, 7 パラメータ 南アフリカ WGS 84 21 Carthage チュニジア Clarke 1880 22 Chatham 1971 チャタム諸島 (ニュージーラ International ンド) 23 Chua Astro パラグアイ International 122 Co-Ordinate System 1937 of エストニア Estonia Bessel 1841 24 Corrego Alegre ブラジル International 123 Dabola ギニア Clarke 1880 124 Deception Island デセプション島、南極 Clarke 1880 1000 Deutsches (DHDN) 25 Djakarta (Batavia) スマトラ島 (インドネシア) Bessel 1841 26 DOS 1968 ギゾ島 (ニュージョージア島) International Hauptdreicksnetz ドイツ Bessel MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 Datum 番号 領域マップ 楕円体 27 Easter Island 1967 イースター島 International 115 EUREF 89 ヨーロッパ GRS 80 28 European 1950 (ED 50) オーストリア、ベルギー、デ International ンマーク、フィンランド、フ ランス、ドイツ、ジブラルタ ル、ギリシャ、イタリア、ル クセンブルグ、オランダ、ノ ルウェー、ポルトガル、スペ イン、スウェーデン、スイス 29 European 1979 (ED 79) オ ー ス ト リ ア、フ ィ ン ラ ン International ド、オランダ、ノルウェー、 スペイン、スウェーデン、ス イス 108 European 1987 (ED 87) ヨーロッパ 125 Fort Thomas 1955 ネビス島、 セントキッツ島、 Clarke 1880 リーワード諸島 30 Gandajika Base モルディブ共和国 International 116 GDA 94 オーストラリア GRS 80 32 測地基準系 1967 (GRS 67) 全世界 GRS 67 33 測地基準系 1980 (GRS 80) 全世界 GRS 80 126 Graciosa Base SW 1948 フ ァ イ ア ル 島、グ ラ シ オ ザ International 1924 島、ピコ島、サンジョルジェ 島、テルセイラ島 ( アゾレス 諸島) 34 Guam 1963 グアム諸島 Clarke 1866 35 GUX 1 Astro ガダルカナル島 International 150 Hartbeesthoek 94 南アフリカ WGS 84 127 Herat North アフガニスタン International 1924 128 Hermannskogel ユーゴスラビア (1990 年以前 Bessel 1841 )、スロベニア、クロアチア、 ボスニア ヘルツェゴビナ、セ ルビア 36 Hito XVIII 1963 チリ南部 (南緯 53 度周辺) 開発者ガイド International International 613 投影法の測地系 Datum 番号 614 領域マップ 楕円体 37 Hjorsey 1955 アイスランド International 38 Hong Kong 1963 香港 International 1004 Hungarian Datum (HD 72) ハンガリー GRS 67 39 Hu-Tzu-Shan 台湾 International 40 Indian タイ、ベトナム Everest 1830) (インド 41 Indian バングラディシュ、インド、 Everest 1830) ネパール (インド 129 Indian パキスタン Everest (パキスタ ン) 130 Indian 1954 タイ Everest 1830) (インド 131 Indian 1960 ベトナム Everest 1830) (インド 132 Indian 1975 タイ Everest 1830) (インド 133 Indonesian 1974 インドネシア Indonesian 1974 42 Ireland 1965 アイルランド Modified Airy 134 ISTS 061 Astro 1968 サウスジョージア島 International 1924 43 ISTS 073 Astro 1969 ジエゴ ガルシア International 152 Japanese Geodetic Datum 2000 日本 (JGD2000) GRS80 44 Johnston Island 1961 ジョンストン島 International 45 Kandawala スリランカ Everest 1830) 46 Kerguelen Island Kerguelen Island International 47 Kertau 1948 西マレーシア、シンガポール Everest ( 西マレー シアとシンガポー ル 1948) 135 Kusaie Astro 1951 カロリン諸島、ミクロネシア International 1924 連邦 (インド MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 Datum 番号 領域マップ 楕円体 48 L.C.5 Astro ケイマンブラック島 Clarke 1866 136 Leigon ガーナ Clarke 1880 49 Liberia 1964 リベリア Clarke 1880 113 Lisboa (DLx) ポルトガル International 50 Luzon フィリピン (ミンダナオ島を Clarke 1866 除く) 51 Luzon ミンダナオ島 Clarke 1866 52 Mahe 1971 マエ島 Clarke 1880 53 Marco Astro サルベージ諸島 International 54 Massawa エリトリア (エチオピア) Bessel 1841 114 Melrica 1973 (D73) ポルトガル International 55 Merchich モロッコ Clarke 1880 56 Midway Astro 1961 ミッドウェー島 International 57 Minna ナイジェリア Clarke 1880 137 Montserrat Island Astro 1958 モンセラト、リーワード諸島 Clarke 1880 138 M'Poraloko ガボン Clarke 1880 58 Nahrwan マシラ島 (オマーン) Clarke 1880 59 Nahrwan アラブ首長国連邦 Clarke 1880 60 Nahrwan サウジアラビア Clarke 1880 61 Naparima, BWI トリタニタード トバコ International 109 オランダ オランダ Bessel 117 New Zealand Geodetic Datum ニュージーランド 2000 (NZGD2000 49) GRS 80 31 New Zealand Geodetic Datum ニュージーランド 1949 (NZGD 49) International 1010 (New Zealand (NZGD49 7- ニュージーランド parameter) International 開発者ガイド 615 投影法の測地系 番号 616 Datum 領域マップ 楕円体 62 North American 1927 (NAD 27) US本土 Clarke 1866 63 North American 1927 (NAD 27) アラスカ Clarke 1866 64 North American 1927 (NAD 27) バハマ諸島 (サンサルバドル Clarke 1866 島を除く) 65 North American 1927 (NAD 27) サンサルバドル島 66 North American 1927 (NAD 27) カナダ (ニューファンドラン Clarke 1866 ド島を含む) 67 North American 1927 (NAD 27) パナマ運河地帯 68 North American 1927 (NAD 27) カリブ海 (タークス カイコス Clarke 1866 諸島) 69 North American 1927 (NAD 27) 中央アメリカ ( ベリーズ、コ Clarke 1866 スタリカ、エルサルバドル、 グアテマラ、ホンジュラス、 ニカラグア) 70 North American 1927 (NAD 27) キューバ Clarke 1866 71 North American 1927 (NAD 27) グリーンランド (ヘイズ半島) Clarke 1866 72 North American 1927 (NAD 27) メキシコ Clarke 1866 73 North American 1927 (NAD 27) ミシガン (アメリカ合衆国平 Modified 1866 面座標系 1927 でのみ使用) 74 North American 1983 (NAD 83) アラスカ、カナダ、中央アメ GRS 80 リカ、US 本土、メキシコ 139 North Sahara 1959 アルジェリア 107 Nouvelle Triangulation フランス Francaise (NTF) Greenwich Prime Meridian Clarke 1866 Clarke 1866 Clarke Clarke 1880 Modified 1880 Clarke MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 Datum 番号 領域マップ 楕円体 1002 Nouvelle Triangulation フランス Francaise (NTF) Paris Prime Meridian Modified 1880 111 NWGL 10 全世界 WGS 72 75 Observatorio 1966 コルボ島、フロレス島 ( アゾ International レス諸島) 140 Observatorio 1939 76 Old Egyptian エジプト Helmert 1906 77 Old Hawaiian ハワイ Clarke 1866 97 OldTokyo 日本、韓国、沖縄 Bessel 1841 78 オマーン オマーン Clarke 1880 79 Ordnance Survey of Great Britain 1936 イ ン グ ラ ン ド、マ ン 島、ス Airy コットランド、シェトランド 諸島、ウェールズ 80 Pico de las Nieves カナリア諸島 International 81 Pitcairn Astro 1967 ピトケアン島 International 141 Point 58 ブルキナファン、ニジェール Clarke 1880 142 Pointe Noire 1948 コンゴ Clarke 1880 157 Popular Visualization 全世界 P o p u l a r Visualization 143 Porto Santo 1936 ポルトサント島、マディラ諸 International 1924 島 1000 Potsdam ドイツ 82 Provisional 1956 36 Provisional South Chilean 1963 チリ南部 (南緯 53 度周辺) International 83 Puerto Rico プエルトリコ、バージン諸島 Clarke 1866 1001 Pulkovo 1942 ドイツ Krassovsky 1012 PZ90 ロシア PZ90 開発者ガイド Clarke Meteorologico コルボ島、フロレス島 ( アゾ International 1924 レス諸島) South Bessel American ボ リ ビ ア、チ リ、コ ロ ン ビ International ア、エクアドル、ガイアナ、 ペルー、ベネズエラ 617 投影法の測地系 Datum 番号 618 領域マップ 楕円体 84 Qatar National カタール International 85 Qornoq 南グリーンランド International 1000 Rauenberg ドイツ Bessel 86 Reunion マスカリン諸島 International 112 Rikets Triangulering 1990 (RT 90) スウェーデン Bessel 1011 Rikets Triangulering 1990 (RT 90)、7 パラメータ スウェーデン Bessel 87 Rome 1940 サルジニア島 International 88 Santo (DOS) エスピリトサント島 International 89 S?o Braz サンミゲル島、サンタマリア International 島 (アゾレス諸島) 90 Sapper Hill 1943 イーストフォークランド島 International 91 Schwarzeck ナミビア Modified 1841 144 Selvagem Grande 1938 サルベージ諸島 International 1924 145 Sierra Leone 1960 シエラレオネ Clarke 1880 146 S-JTSK チェコ共和国 Bessel 1841 1013 SK42 ロシア PZ90 1024 SK95 ロシア PZ90 92 South American 1969 アルゼンチン、ボリビア、ブ South ラジル、チリ、コロンビア、 1969 エクアドル、ガイアナ、 パラグアイ、ペルー、ベネズ エラ トリタニタード トバコ 93 South Asia シンガポール 94 Southeast Base ポルトサント島、マディラ諸 International 島 Bessel American Modified 1960 Fischer MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 Datum 番号 領域マップ 楕円体 95 Southwest Base フ ァ イ ア ル 島、グ ラ シ オ ザ International 島、ピコ島、サンジョルジェ 島、テルセイラ島 ( アゾレス 諸島) 1003 Switzerland (CH 1903) スイス Bessel 147 Tananarive Observatory 1925 マダガスカル International 1924 96 Timbalai 1948 ブルネイ、東マレーシア ( サ Everest 1830) ラワク、サバ) 1015 Tokyo 日本 Bessel 1841 98 Tristan Astro 1968 トリスタン ダ クーニャ International 99 Viti Levu 1916 ビチレブ島 (フィジー諸島) Clarke 1880 148 Voirol 1874 チェニジア/アルジェリア Clarke 1880 149 Voirol 1960 アルジェリア Clarke 1880 100 Wake-Eniwetok 1960 マーシャル諸島 Hough 101 World Geodetic System 1960 全世界 (WGS 60) WGS 60 102 World Geodetic System 1966 全世界 (WGS 66) WGS 66 103 World Geodetic System 1972 全世界 (WGS 72) WGS 72 104 World Geodetic System 1984 全世界 (WGS 84) WGS 84 105 Yacare ウルグアイ International 106 Zanderij スリナム International 開発者ガイド (インド 619 投影法の測地系 単位 次の表に、利用できる座標系の単位と、MapInfoCoordinateSystemSet.xml ファイルでその単位を識 別する際に使用する番号を示します。 番号 単位 6 センチメートル 31 チェイン 3 フィート* 2 インチ 1 キロメートル 30 リンク 7 メートル 0 マイル 5 ミリメートル 9 海里† 32 ロッド 8 US Survey フィート (アメリカ合衆国平面座標系 1927 で使用)‡ 4 ヤード * 1 フィート = 30.48 cm † 1 海里 = 1,852 m ‡ US Survey フィート = 12/39.37 メートルまたは約 30.48006 cm 座標系の原点 原点とはすべての座標の参照元となるポイントのことで、経度/緯度で指定します。特定の座標系 について、その正確性が最も向上する位置を原点として選択します。原点を北の方向へ移動させ ると、Y の値が大きくなります。東へ移動すると X 値が大きくなります。これらの座標値は、通 常、北距および東距と呼ばれます。 横メルカトル投影法の場合、原点の経度は中心子午線になります。横メルカトル投影法では、 中 心子午線に接するように地球に円筒をかぶせます。したがって、投影法マップの縮尺は中央子午 線周辺については正確になります。 Hotine Oblique Mercator 投影法では、赤道または経線以外の大円を指定する必要があります。 MapInfo でこの作業を行うには、楕円体上でポイントを 1 つ指定してから、そのポイントからの方 向を指定します。そのポイントが座標系の原点となります。 620 MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 標準緯線 (円錐図法) 円錐投影法では、2 本の緯線に交差するように円錐を地球にかぶせます。この 2 本の緯線が標準緯 線です。1 つは投影ゾーンの北、1 つは南にあります。1 本の標準緯線を使用する場合は、同じ緯 線を 2 回指定します。両方とも緯度で表されます。 Oblique Azimuth (Hotine Oblique Mercator) ポイントと方向 (円弧) を使用して大円 (Hotine Oblique Mercator) を指定するとき、その方向は Oblique Azimuth と呼ばれ角度で表されます。 比率因数 (横メルカトル図法) 比率因数は円筒座標に適用され、東西の境界のひずみを軽減しながらマップ中央のひずみを補正 します。この比率因数によって円筒が地球内部に潜り込み、円筒と地表は 2 本の線で交差します。 この線上での縮尺は正確です。 比率因数が 1:25000 などの比率で表されていることもあります。通常、これは縮尺と呼ばれます。 比率因数と縮尺の関係は次のとおりです。 比率因数 = 1 - 縮尺 この場合、比率因数は 1-(1/25000)、つまり 0.99996 になります。 擬似偏北距離および擬似偏東距離 負の値が存在しなければ、座標の計算は比較的簡単です。アメリカ合衆国平面座標およびユニー バーサル横メルカトル図法の座標の計算に伴う煩雑さを軽減するには、一般的には、北距および 東距に対して測定オフセットを追加します。これらのオフセットは、疑似偏北距離および疑似偏 東距離と呼ばれ、 角度ではなく座標単位で表されます。(座標単位は Units パラメータで指定しま す。) レンジ (方位図法) レンジは、地球上のどれくらいの範囲を表示するかを角度で指定します。指定できる値は 1 ~ 180 です。90 を指定すると半球体、つまり地球の半分が表示されます。180 を指定すると地球全体が表 示されますが、ほとんどの部分にゆがみが生じます。 多円錐図法 以下の説明は、『Map Projections - A Working Manual』(USGS Professional Paper 1395、John P. Snyder 著) からの抜粋です。 多円錐図法は、一般的には American Polyconic in Europe と呼ばれており、マップ上の各緯線が、そ れぞれの緯線に接するように地球にかぶせられた各円錐を展開したものと同じになります。つま り、1 つの円錐しか使用しない一般的な円錐図法とは異なり、この図法では多数の円錐が関連して います。 多円錐図法は正積でも等角でもありません。ただし、中心子午線周辺については、ゆがみもなく 縮尺も正確です。緯線の縮尺は正確ですが、緯線と交差する経線については中央から離れるに 従って引き伸ばされます。したがって、正角 (正しい角度) という点についてはそれ以外はどの緯 線も標準にはなりません。ただし、中心子午線上の角度は正確です。中心子午線周辺では、ゆが みはかなり少なくなっています。 開発者ガイド 621 測地系の変換 これは広い領域を対象とした投影法ではありません。広範囲にわたる経線をマッピングすると、 使用されている変換アルゴリズムが破綻します。たとえば、WORLD.TAB サンプル テーブルを多 円錐図法で投影すると、異常な形状になります。 測地系の変換 MapInfo では、Molodensky (3 パラメータ) と Bursa-Wolf (7-parameter) が使用して測地系の座標系を 変換していました。この 2 つは、ある測地系の座標を他の測地系の座標に変換するための一般的な 方法です。 NAD 83 測地系の導入後、NADCON (North American Datum CONversion) と呼ばれるプログラムが NOAA により開発されました。NAD 27 と NAD 83 間で座標を変換するための非常に特殊なプログ ラムです。この特殊な作業を行うため、NADCON は Molodensky に比べるとかなり細かなところま で正確に変換されます。Molodensky では最小単位が 10 ~ 30 メートルだったのに比べ、NADCON の最小単位は約 0.1 メートルです。米国の 国勢調査局を含め、ほとんどの米政府機関が NADCON を標準で採用しており NAD 27 と NAD 83 間での変換を行っています。 NADCON の対象領域内 (米国、プエルトリコ、バージン諸島) にある座標を NAD 27 と NAD 83 間 で変換する場合、MapInfo 4.1.2 以降では NADCON アルゴリズムが使用されています。座標がこれ らの領域外にある場合、NAD 27 または NAD 83 以外の測地系を使用している場合は、Molodensky または Bursa-Wolfe を使用して変換が行われます。 必要なファイル アクセスが異なるため、NADCON 変換は Molodensky よりも若干速度が遅くなっ て い ます。NADCON 変 換を オ フ にす る必要がある場合は、*.las ファイルと *.los ファイルを MapXtreme プログラムまたは MapXtreme の Common ディレクトリから削除します。 カスタム測地系 測地系とは、地球の形状と方向を数学的に表記したものです。地球の形状は均一ではありませ ん。このため、測地系にはさまざまな種類が多数あり、世界のさまざまな地域でその地域に合っ た測地系が使われています。これらの測地系は、特定の領域の地表をなるべく正確に表すための 基準を提供します。 地球の座標系は、それぞれに対応した測地系を使って地球の地表になるべく近づけるようにして います。2 つの座標系が異なる測地系を使用している場合、ある座標系の座標を他の座標系に変換 するときに、Pitney Bowes Business Insight のマッピング製品では測地系変換を実行する必要があり ます。 Pitney Bowes Business Insight では Bursa-Wolfe 測地系変換が採用されています。この精度は 一般的に 10 メートル以内です。(2 つの座標系が同じ測地系を使用している場合、測地系の変換は 行われません。したがって、変換の精度は 0.1 メートル以内になります。) カスタム測地系の定義 座標系のほとんどが、Pitney Bowes Business Insight であらかじめ定義された測地系のいずれかを使 用しています。この測地系の一覧は、この付録に記載されています。この一覧にない測地系を使 用する必要がある場合、かつ測地系の数学的パラメータについて理解している場合は、カスタム 測地系を使用して座標系を定義できます。測地系を定義するための情報を以下に示します。 622 MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 • 1 つの楕円体 (回転楕円体)。短軸が中心となる楕円体で、3D 表面を形成します。楕円体は、長 短軸の長さ (メートル単位) と平坦化の角度で表されます。なお、長短軸は "a"、平坦化は "f" で表されます。MapInfo では、40 を超える楕円体が事前に定義されています。事前定義された 楕円体の一覧については、以下の表を参照してください。 3 つの移動パラメータ。楕円体をそれぞれの軸に沿って移動する距離 (メートル単位) を指定し ます。これらのパラメータは、通常、dX、dY、および dZ で表されます。DX、DY、DZ また は u、v、w で表されていることもあります。 3 つの回転パラメータ。楕円体をそれぞれの軸を中心として回転させる角度 (秒単位) を指定し ます。これらのパラメータは、通常、EX、EY、および EZ で表されます。eX、eY、eZ または e、y、w で表されていることもあります。 比率矯正因数。楕円体のサイズの調整量 (100 万分の 1 単位) を指定します。このパラメータは m で表されます。k で表されることもあります。 本初子午線の経度 (グリニッジからの東の度数)。本初子午線は、地球上のどの位置に経度 0x を 割り当てるかを指定します。測地系のほとんどが、グリニッジを通る子午線を本初子午線とし て使用しています。したがって、このパラメータは通常は 0 です。ただし、他の子午線を本初 子午線として採用している測地系もあります。たとえば、NTF Datum の本初子午線は、グリ ニッジの東 2.33722917 度にあるパリを通る子午線です。座標系として NTF Datum を使用して いる場合、座標系の経度の基点はグリニッジではなくパリになります。 • • • • すべての座標系でカスタム測地系を定義することができます。測地系番号 9999 および測地系パラ メータを次の順番で指定してください。 9999, EllipsoidNumber, dX, dY, dZ, EX, EY, EZ, m, PrimeMeridian 測地系の中には、回転パラメータ、比率矯正因数、本初子午線を指定せずに、楕円体パラメータ と移動パラメータ (dX、dY、dZ) のみを指定するものがあります。この場合、測地系番号として 9999 ではなく 999 を使用すると、より簡単に定義できます。 999, EllipsoidNumber, dX, dY, dZ 楕円体番号は以下のリストから選択する必要があります。現時点では、カスタム楕円体を定義す ることはできません。このリストにない楕円体を使用する必要がある場合は、MapInfo の将来のリ リースでその楕円体を追加できるよう MapInfo Technical Support にお知らせください。 番号 a 楕円体 1/f 9 Airy 1930 6377563.396 299.3249646 13 Airy 1930 (アイルランド用改訂版 1965) 6377340.189 299.3249646 51 ATS7 77 6378135.0 298.257 2 Australian 6378160.0 298.25 10 Bessel 1841 6377397.155 299.1528128 35 Bessel 1841 (NGO 用改訂版 1948) 6377492.0176 299.15281 14 Bessel 1841 (Schwarzeck 用改訂版) 6377483.865 299.1528128 36 Clarke 1858 6378293.639 294.26068 7 Clarke 1866 6378206.4 294.9786982 開発者ガイド 623 カスタム測地系 番号 624 a 楕円体 1/f 8 Clarke 1866 (ミシガン用改訂版) 6378450.047484481 294.9786982 6 Clarke 1880 6378249.145 293.465 15 Clarke 1880 (Arc 用改訂版 1950) 6378249.145326 293.4663076 30 Clarke 1880 (IGN 用改訂版) 6378249.2 293.4660213 37 Clarke 1880 (ジャマイカ用改訂版) 6378249.136 293.46631 16 Clarke 1880 (Merchich 用改訂版) 6378249.2 293.46598 38 Clarke 1880 (パレスチナ用改訂版) 6378300.79 293.46623 39 Everest (ブルネイ、東マレーシア (サバと 6377298.556 サラワク)) 300.8017 11 Everest (インド 1830) 6377276.345 300.8017 40 Everest (インド 1956) 6377301.243 300.80174 50 Everest (パキスタン) 6377309.613 300.8017 17 Everest ( 西 マ レ ー シ ア とシンガポール 6377304.063 1948) 300.8017 48 Everest (西マレーシア 1969) 6377295.664 300.8017 18 Fischer 1960 6378166.0 298.3 19 Fischer 1960 (南アジア用改訂版) 6378155.0 298.3 20 Fischer 1968 6378150.0 298.3 21 GRS 67 6378160.0 298.247167427 0 GRS 80 6378137.0 298.257222101 5 Hayford 6378388.0 297.0 22 Helmert 1906 6378200.0 298.3 23 Hough 6378270.0 297.0 31 IAG 75 6378140.0 298.257222 41 Indonesian 6378160.0 298.247 4 International 1924 6378388.0 297.0 49 Irish (WOFO) 6377542.178 299.325 MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 番号 a 楕円体 1/f 3 Krassovsky 6378245.0 298.3 32 MERIT 83 6378137.0 298.257 33 New International 1967 6378157.5 298.25 43 NWL 10D 6378135.0 298.26 42 NWL 9D 6378145.0 298.25 44 OSU86F 6378136.2 298.25722 45 OSU91A 6378136.3 298.25722 46 Plessis 1817 6376523.0 308.64 54 Popular Visualization 6378137.0 0.0 52 PZ90 6378136.0 298.257839303 24 South American 6378160.0 298.25 12 Sphere 6370997.0 0.0 47 Struve 1860 6378297.0 294.73 34 Walbeck 6376896.0 302.78 25 War Office 6378300.583 296.0 26 WGS 60 6378165.0 298.3 27 WGS 66 6378145.0 298.25 1 WGS 72 6378135.0 298.26 28 WGS 84 6378137.0 298.257223563 WGS 84 測地系と比べ、移動パラメータと回転パラメータが楕円体の空間的な方向を示します。こ れらのパラメータの符号 (正または負) が正しいかどうかを確認することが重要です。地域の測地 系について説明するドキュメントには、通常、その地域の測地系から WGS 84 に座標を変換するた めのパラメータが記載されています (つまり、これらのパラメータは、WGS 84 から地域の測地系 が引き出されたことを前提としています)。この場合、ドキュメントに示されているとおりにパラ メータを使用できます。ただし、逆方向、つまり WGS 84 から地域の測地系に座標を変換するため のパラメータがドキュメントに記載されている場合は、移動、回転、縮尺矯正の各パラメータの 符号を逆にする必要があります。 正しい順序でパラメータを指定することも重要です。ドキュメントによっては、回転パラメータ の順序が EZ, EY, EX というように EZ が先頭になっていることがあります。この場合、カスタム測 地系を定義するときに回転パラメータの順序を逆にする必要があります。ギリシャ文字でパラ 開発者ガイド 625 カスタム測地系 メータを表現しているドキュメントでは、この点を特に見落としがちです。パラメータが w、y、e という順序で示されている場合、カスタム測地系の定義ではこの順序を逆にしなければなりませ ん。 以下に、技術文書で紹介されていることの多い、地域の測地系の定義の例を示します (LD-2)。 LD-2 楕円体: Krassovsky a 6378245.0 m f 1 / 298.3 LD-2 から WGS 84 への変換 u +24 m v ?123 m w -94 m w +0.13 y +0.25 e 0.02 m +1.1 ? 10-6 この測地系は Krassovsky 楕円体を使用しています。この楕円体番号は上記の表では 3 です。地域 の測地系から WGS 84 への変換について説明しているため、パラメータの符号を逆にする必要はあ りません。ただし、回転パラメータは w が先頭になっています。したがって、カスタム測地系の 定義ではこの順番を逆にする必要があります。 9999, 3, 24, -123, -94, -0.02, 0.25, 0.13, 1.1, 0 最後に、楕円体パラメータと移動パラメータのみを提供する LD-3 の例を示します。 LD-3 楕円体: Clarke 1880 a 6378249.145 m f 1 / 293.465 WGS 84 負の地域の測地系 LD-3 626 dX -7 m dY 36 m dZ 225 m MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 この測地系は Clarke 1880 楕円体を使用しています。この楕円体の番号は上記の表では 6 です。パ ラメータの符号を逆にする必要はありません。また、回転パラメータは存在しないので、その順 序を気にする必要もありません。この場合、カスタム測地系の定義では 9999 の代わりに 999 を使 用できます。以下の 2 つの定義は同じことを意味します。したがって、いずれか片方を使用するこ とができます。 999, 6, -7, 36, 225 9999, 6, -7, 36, 225, 0, 0, 0, 0, 0 他のカスタム測地系定義と同様、MapInfoCoordinateSystemSet.xml 行の測地系番号の代わりに、定 義のいずれかを以下のように入力します。 "Longitude / Latitude (LD-3)", 1, 999, 6, -7, 36, 225 <srsName>UTM Zone 30 (LD-3)</srsName> - <srsID> <code>coordsys 8, 999, 6, -7, 36, 225, 7, -3, 0, 0.9996, 500000, 0 </code> <codeSpace>mapinfo</codeSpace> <remarks>Universal Transverse Mercator (LD-3)</remarks> </srsID> National Transformation v.2 (NTv2) National Transformation v.2 (NTv2) は、Geomatics Canada の Geodetic Survey Division によって開発さ れたアルゴリズムおよびグリッド シフト ファイル形式です。NTv2 を使用して、NAD 27 リファレ ンス システムのデータを NAD 84 リファレンス システムのデータに変換することができます。ア ルゴリズムで使用されるグリッド シフト ファイルには、NAD 27 と NAD 83 の間の座標の差を表 す、1 つ以上の長方形のグリッドが保存されています。 National Transformation は当初、カナダの地理データを NAD 27 から NAD 84 に変換するために作成 されました。その後、オーストラリア、ニュージーランド、ドイツの測地系の変換に採用されて います。 NTv2 アルゴリズム は、これらの変換をサポートするために、MapXtreme 6.7.1 からインプリメン トされました。また、次の国のグリッド シフト ファイルが追加されています。 • • • • カナダ オーストラリア ニュージーランド ドイツ これらのファイルは、MapXtreme の Common Files フォルダに格納されています。このファイル は、デフォルトで次の場所に格納されます。 C:\Program Files\Common Files\MapInfo\MapXtreme\7.0.0 アルゴリズムとグリッド シフト ファイルだけでなく、XML 構成ファイル (NTv2.xml) もインス トールされます。これにより、NTv2 アルゴリズムを拡張して、他の測地系の変換をサポートする ことができます。構成ファイルには、新しいグリッド シフト ファイルを追加できます。また、 NTv2 アルゴリズムでの特定のグリッド シフト ファイルの使用を有効または無効にすることもで きます。NTv2.xml ファイルは MapXtreme の Common Files フォルダに格納されています。 開発者ガイド 627 National Transformation v.2 (NTv2) NTv2 アルゴリズムおよびカナダのグリッド シフト ファイルは、次の著作権の下に保護されてい ます。 ? 1995 Her Majesty the Queen in Right of Canada, represented by the Minister of Natural Resources. この後のセクションでは、各国のデータについてサポートされている変換と、構成ファイルの使 用方法について説明します。 カナダ カナダ用として、次のグリッド シフト ファイルが用意されています。 NTV2_0.GSB – NAD 1927 から NAD 1983 への変換に使用 MAY76V20.GSB – NAD 1927 (Definition 1976) から NAD 1983 への変換に使用 (オンタリオ州) これらのファイルでは、NAD 1927 測地系または NAD 1927 (Definition 1976) 測地系と NAD 1983 測 地系との間で変換が実行されます。NAD 1927 (Definition 1976) 測地系は、オンタリオ州の NAD 1927 測地系の見直しを行ったものです。 アルゴリズム、ソフトウェア、グリッド ファイル システムの詳細については、次の Geomatics Canada の Geodetic Survey Division の Web サイトからダウンロードできます。 www.geod.nrcan.gc.ca/apps/ntv2/index_e.php オーストラリア オーストラリア用として、次のグリッド シフト ファイルが用意されています。 A66_National.gsb – AGD 1966 から GDA94 への変換に使用 National_84.gsb – AGD 1984 から GDA94 への変換に使用 オーストラリア用のグリッド システム ファイルでは、AGD 1966 測地系または AGD 1984 測地系と GDA 1994 測地系との間で変換が実行されます。 変換およびグリッド シフト ファイルの詳細については、次の ICSM (Intergovernmental Committee on Surveying and Mapping) の Web サイトからダウンロードできます。 www.icsm.gov.au/icsm/gda/gdatm/ ニュージーランド ニュージーランド用として、次のグリッド シフト ファイルが用意されています。 nzgd2kgrid0005.gsb – NZGD49 測地系から NZGD2000 測地系への変換に使用 ニュージーランド用のグリッド シフト ファイルでは、NZGD49 測地系から NZGD2000 測地系への 変換が実行されます。 詳細については、次の LINZ (Land Information New Zealand) の Web サイトを参照してください。こ のサイトでは、オンライン変換も実行できます。 www.linz.govt.nz/core/surveysystem/geodeticinfo/geodeticdatums/nzgd49tonzgd2000/index.html 628 MapXtreme 2008 v7.0.0 付録 I: 座標系の要素 ドイツ ドイツ用として、次のグリッド シフト ファイルが用意されています。 BETA2007.gsb – DHDN 測地系から ETRS89 への変換に使用 詳細情報と公式なグリッド シフト ファイルのダウンロードについては、次の CRS EU (Information and Service System for European Coordinate Reference Systems) の Web サイトを参照してください。 crs.bkg.bund.de/crseu/crs/descrtrans/BeTA/de_dhdn2etrs_beta.php 構成ファイル NTv2 構成ファイル (NTv2.xml) は、編集可能な XML ファイルで、他の測地系の変換のための新し いグリッド シフト ファイルを追加したり、NTv2 での特定のグリッド シフト ファイルの使用を有 効または無効にしたりできます。 新しいグリッド シフト ファイルを追加するには、次の 3 つのパラメータを指定する必要がありま す。 • • • グリッド シフト ファイル名 変換元の測地系 変換先の測地系 測 地 系 は、さ ま ざ ま な 方 法 で 定 義 で き ま す。た と え ば、変 換 元 と 変 換 先 の 両 方 の 測 地 系 が MapXtreme で定義されている場合は、MapXtremeCoordinateSystemSet.xml ファイルでこれらの測地 系に割り当てられている数値を使用して、構成ファイルで定義できます。このニュージーランド の例では、構成ファイルの XML は次のようになります (部分的に太字になっているのは、強調す るためであって、それ以上の意味はありません)。 - <NTv2Conversion> <Description>NTv2 Conversion for New Zealand</Description> <GridFile>NZGD2KGRID0005.GSB</GridFile> <Enabled>true</Enabled> - <SourceDatum> <DatumID>1010</DatumID> </SourceDatum> - <DestinationDatum> <DatumID>117</DatumID> </DestinationDatum> </NTv2Conversion> - <NTv2Conversion> しかし、測地系を簡単に定義できない場合もあり、 測地系を定義するために、測地系のシフト値 を指定しなければならないこともあります (それらの範囲も指定しなければならないこともありま す)。たとえば、次の XML の例では、カナダの NAD 27 測地系が定義されています。ここでは、楕 円体と、x 、y、z のシフト値と、その範囲を使用して、測地系が定義されています (部分的に太 字になっているのは、強調するためであって、それ以上の意味はありません)。 - <NTv2Conversion> <Description>NAD 1927 to NAD 1983 conversion for Canada</Description> <GridFile>NTV2_0.GSB</GridFile> <Enabled>true</Enabled> - <SourceDatum> <EllipsoidID>7</EllipsoidID> 開発者ガイド 629 座標系と投影法に関する情報 <ShiftX>-8</ShiftX> <ShiftY>150.5</ShiftY> <ShiftZ>186</ShiftZ> <dShiftX>17</dShiftX> <dShiftY>19.5</dShiftY> <dShiftZ>8</dShiftZ> </SourceDatum> - <DestinationDatum> <DatumID>74</DatumID> </DestinationDatum> </NTv2Conversion> 座標系と投影法に関する情報 以下に示す最初の 3 つのドキュメントは比較的薄い小冊子です。残りの 2 つは書籍です。American Congress of Surveying and Mapping (小冊子) および U.S. Geological Survey (書籍) の住所と電話番号も 記載します。 • • • • • • • • • • American Cartographic Association。Choosing a World Map - Attributes, Distortions, Classes, Aspects。 Falls Church, VA: American Congress on Surveying and Mapping.Special Publication No. 2.1988。 American Cartographic Association。Matching the Map Projection the Need。Falls Church, VA: American Congress on Surveying and Mapping.Special Publication No. 3.1991。 American Cartographic Association。Which Map is Best?Projections for World Maps。Falls Church, VA: American Congress on Surveying and Mapping.Special Publication No. 1.1986。 John P. Snyder。Map Projections—A Working Manual。Washington: U.S.Geological Survey Professional Paper 1395。1987 John P. Snyder および Philip M. Voxland。An Album of Map Projections。Washington: U.S.Geological Survey Professional Paper 1453。1989。 問い合わせ先 American Congress on Surveying and Mapping, 5410 Grosvenor Lane, Suite 100, Bethesda, MD 20814 2212; (301) 493-0200 Earth Science Information Center, U.S.Geological Survey, 507 National Center, Reston, VA 22092; (703) 860-6045 または (800) USA-MAPS Peter H. Dana 氏。University of Texas at Austin、Department of Geography。マップ投影法、測地 系、および座標系の説明に関する Web サイト作成をサポート。これらの説明の多くで MapInfo Professional が採用されているため、この Web サイトは役に立ちます。このサイトの内容は研 究、リサーチ、教育の目的で自由に使用きますが、次の情報を必ず明記してください。 Peter H. Dana 氏。The University of Texas at Austin、Department of Geography、Geographer's Craft Project。 測地系については、次の Web サイトを参照してください。 www.colorado.edu/geography/gcraft/notes/datum/datum.html 座標系などの情報については、次の Web サイトを参照してください。 www.colorado.edu/geography/gcraft/notes/coordsys/coordsys.html マップ投影法については、次の Web サイトを参照してください。 www.colorado.edu/geography/gcraft/notes/mapproj/mapproj.html 630 MapXtreme 2008 v7.0.0 ユーザ定義のメタデータ この付録では、TableInfoServer クエリにおけるユーザ定義のメタデータのサ ポートについて説明します。 この付録の構成 「メタデータと MapCatalog」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632 「ユーザ定義のメタデータにおける TableInfoServer クエリのサポー ト」632 J ユーザ定義のメタデータにおける TableInfoServer クエリのサポート メタデータと MapCatalog 空間データベース クエリを扱う場合、クエリの結果セットに含まれる FeatureGeometry フィールド と Style フィールドの正確な定義を推測する際には、唯一 MapCatalog がメタデータのソースとして これまで使用されてきました。しかし、MapCatalog は、ソースとしての有用性、適合性、信頼性 に欠ける場合もあります。たとえば、次のようなケースが考えられます。 • • ビュー - リモートのデータベース サーバにビュー テーブルを定義する場合、対応するエントリ を MapCatalog に追加するのはデータベース管理者の役目です。これは面倒な作業になることが あります。また、コンテンツに不整合が生じる危険があります。 ストアド プロシージャ - 空間結果セットを動的に生成する可能性があるため、ストアド プロ シージャの呼び出しへの出力として生成することができる結果セットのすべてを正確に表す単 独の静的エントリを MapCatalog に追加することが不可能である場合があります。 注意 • • ストアド プロシージャ クエリは、現在 SQL Server に対してのみサポートされていま す。 複数の空間フィールドを含むテーブル - 空間データベースでは複数の空間フィールドを含む テーブルを使用できますが、現在 MapCatalog スキーマではテーブルの 1 つの空間フィールドに 対して定義されたメタデータしか許容されません。 複雑なクエリ - 複雑なクエリで参照されるベース テーブルの正確な情報が MapCatalog に含ま れていても、推論ロジックの信頼性が低くなる場合があります。その理由は次のとおりです。 • メタデータ推論ロジックで、正しいメタデータの位置を適切に特定することが難しい場合 がある (複雑な結合クエリなど)。 • ジオメトリに適用される関数のため、MapCatalog メタデータが不正確になる場合がある (座 標系の変換、ポイントのバッファ、凸含集計など)。 • 推論ロジックで、複数のベース テーブルに指定されたメタデータを適切に調整する方法が 指定されていない場合がある (UNION クエリなど)。 ユーザ定義のメタデータにおける TableInfoServer クエリのサポート MapInfo.Data.TableInfoServer クラスのプロパティを使用して、テーブルの FeatureGeometry フィー ルドと Style フィールドにメタデータを定義できます。このユーザ定義のメタデータ、つまり フィールドの説明によって、MapCatalog が存在しない場合にこれらのフィールドを識別すること ができます。 ColumnHints プロパティ TableInfoServer に追加された ColumnHints プロパティによって、ユーザはユーザ定義メタデータを 明示的に指定できます。これにより、クエリの結果セット内の FeatureGeometry フィールドと Style フィールドが適切に識別されます。このような "説明" は、MapCatalog メタデータの位置を特定で きなかった場合に完全なメタデータを取得できるようにするのが主な目的です。しかし、このよ うな "説明" は、MapCatalog メタデータのコンポーネントを選択的にオーバーライドする、潜在的 に限定的な定義としても使用できます。どちらの場合も、ユーザ定義のメタデータは決定的なも のと見なされるため、必要なときに、クエリの結果の詳細が十分に把握できている場合にのみ、 フィールドの説明を使用するように注意が必要です。 632 MapXtreme 2008 v7.0.0 付録 J: ユーザ定義のメタデータ ColumnHints プロパティは、Columns コレクションとして定義されます。このコレクションのイン スタンスを作成し、その中のそれぞれの説明について Column インスタンスを挿入すると、このコ レクションが ColumnHints プロパティに割り当てられます。たとえば、tblInfoSrvfor という名前の TableInfoServer 変数の場合は、次のようになります。 [C#] Columns hints = new Columns(); // insert Column instances into the collection to serve as hints (see below) tblInfoSrv.ColumnHints = hints; FeatureGeometry および Style 以外の種類の Column インスタンスも、説明を表す Columns コレク ションに追加できますが、現状ではこのようなフィールド定義は無視されます。 FeatureGeometry フィールド説明の適用 FeatureGeometry フィールド説明を使用して、クエリの結果内の指定されたフィールドをフィー チャ ジオメトリとして解釈するように指定できます。たとえば、空間オブジェクト (SpatialWare ST_Spatial バイナリ、または Oracle Spatial MDSYS.SDO_GEOMETRY 構造など) を含む geo という 名前の列がクエリによって返された場合、説明を作成し、それを Columns コレクション (上記の例 を参照) に追加することで、このフィールドを識別できます。 [C#] GeometryColumn geoCol = new GeometryColumn("geo"); ... hints.Add(geoCol); この コ ー ド 内 の 省 略 記 号 (...) は、説明を作成して Columns コレクションに追加する前に、 GeometryColumn イ ン ス タ ン ス の追加プロパティも設定する必要があることを示します。 FeatureGeometry 説明は、MapCatalog で得られるものと同じ情報を明示的に提供することを主な目 的としています。具体的には、次の情報です。 • • • • 座標系 FeatureGeometry 型 デフォルトのビュー デフォルトのスタイル このようなプロパティをすべて考慮して、FeatureGeometry 説明を作成すると、次のようになりま す。 [C#] CoordSysFactory cfs = new CoordSysFactory(); CoordSys cs = cfs.CreateFromMapBasicString("Earth Projection 1, 0"); GeometryColumn geo = new GeometryColumn("geo", cs); geo.PredominantGeometryType = GeometryType.Polygon; geo.DefaultView = new DRect(-74, 40, -70, 44); geo.DefaultStyle = new MapInfo.Styles.AreaStyle( new MapInfo.Styles.SimpleLineStyle(new LineWidth(2.0, MapInfo.Styles.LineWidthUnit.Pixel)), new MapInfo.Styles.SimpleInterior(10)); hints.Add(geo); 開発者ガイド 633 ユーザ定義のメタデータにおける TableInfoServer クエリのサポート 空間フィールドのデフォルトのメタデータを提供する MapCatalog エントリが存在するとわかって いる場合、特定のプロパティをオーバーライドする手段として "限定的な" 説明を使用できます。 通常、そのプロパティはデフォルト ビューやデフォルト スタイルなどのさまざまな設定プロパ ティですが、複雑なクエリの独自の要件に応じて、そのようなプロパティを任意にオーバーライ ドできます。 ColumnHints を (x,y) データ テーブルで使用することはできません。その場合、従来と同じく SpatialSchemaXY を使用する必要があります。テーブルに SpatialSchemaXY を適用すると、関連付 けられている ColumnHints がすべて無視されます。 現在、MapXtreme テーブルでは FeatureGeometry フィールドが 1 つしかサポートされないため、 Columns コレクションに含まれる FeatureGeometry フィールド定義も 1 つのみと予想できます。た だし、Columns コレクションでは、ユーザがこのフィールド定義を好きなだけ追加することは防止 されません。その場合、最終的にメタデータの定義をコンパイルする際には、各プロパティに対 して検出された最後の非限定値が優先されます。 Style フィールド説明の適用 クエリの結果のフィールドに、各フィーチャの Style インスタンス (フィーチャ内で関連付けられ ている FeatureGeometry に対応) を作成するために使用される値 (特に MapBasic スタイル文字列) が 含まれることを示す方法として、Style フィールド説明を使用できます。たとえば、クエリで MapBasic スタイル文字列を含む、mb_style という名前のフィールドが返された場合、説明を作成 して、それを次のように hints コレクション (上記の例を参照) に追加できます。 [C#] Column styleCol = new Column("mb_style", MIDbType.Style); hints.Add(styleCol); 現在、1 つのテーブルでは 1 つの Style フィールドしかサポートされないため、hints コレクション に含まれる Style フィールド定義も 1 つのみと予想できます。ただし、Columns コレクションで は、ユーザがこのフィールド定義を好きなだけ追加することは防止されません。その場合、最後 に挿入されたフィールド定義が優先されます。 hints コレクションに Style フィールド説明が必須であるわけではありません。クエリにスタイル情 報を含むフィールドが含まれていない場合。この説明は除外できます。 KeyType プロパティと KeyColumns プロパティ テーブル内の各フィーチャ (行) の固有の値を含む "キー" が、各テーブルに必要です。MapCatalog には含まれませんが、これも重要なメタデータであり、プライマリ キー定義などを参照すること によってリモート データベース テーブルに対して推測されます。 先に示したコンテンツ ソースの多くだけでなく、複合プライマリ キーのみを含むテーブルでも、 使用する一意のキーを推測することは困難です。そのような場合、TableInfo ベース クラスによっ て提供される KeyType プロパティと KeyColumns プロパティを使用して、明示的な指示を与えるこ とができます。たとえば、CUSTID という名前のフィールドを含む、顧客情報のデータベース ビューがあるとします。このフィールドには一意な null 以外の値が含まれていることがわかって います。次に示すように、このフィールドを結果の MapXtreme テーブルのキーとして使用するよ うに指定できます。 [C#] tblInfoSrv.KeyType = KeyType.Explicit; StringCollection keyColumns = new StringCollection(); 634 MapXtreme 2008 v7.0.0 付録 J: ユーザ定義のメタデータ keyColumns.Add("CUSTID"); tblInfoSrv.KeyColumns = keyColumns; この例では、StringCollection クラスは System.Collections.Specialized 名前空間に存在しています。 複合キーを使用できます。復号キーを定義するには、文字列コレクションに複数のフィールド名 を追加します。 データベース テーブルに複数の候補が含まれ、開発者が特定の候補を使用することを希望する場 合には、明示的なキー定義を使用して定義をオーバーライドすることもできます。 ワークスペースの保持 フィールド説明とキー定義を表すユーザ定義のメタデータ構造体は、ワークスペース ファイル (.mws) 内のデータ ソース定義タグで保持されます。 開発者ガイド 635 ユーザ定義のメタデータにおける TableInfoServer クエリのサポート 636 MapXtreme 2008 v7.0.0 ローカライゼーション キット ローカライゼーション キットは、ソフトウェアのテキスト要素 (エラー メッ セージ、ダイアログ/コントロールのテキスト) を、英語、日本語、および簡体 字中国語以外の言語に翻訳するための Visual Studio ソリューションです。 この付録の構成 「ローカライゼーション キット」 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 「ローカライゼーション キットの使用方法」 . . . . . . . . . . . . . . . . . . 640 「サテライト アセンブリへの秘密鍵の署名」 . . . . . . . . . . . . . . . . . . 643 K ローカライゼーション キット MapXtreme には、エラー メッセージおよびダイアログ/コントロール テキスト要素を翻訳して、そ れを各自が開発する MapXtreme ベースのアプリケーションで使用したいと考えている開発者用 に、Visual Studio ソリューションが用意されています。 "ローカライゼーション キット" には、 MapXtreme のすべての実行時コンポーネントのリソース プ ロジェクトが含まれています。ローカライゼーション キットは Visual Studio ソリューションとし て構成されているため、リソース文字列の編集やアセンブリのビルドを簡単に行えるほか、リ ソース管理処理の多くがバックグラウンドで行われます。ソリューションは、Visual Studio 2008、 Visual C# 2008 Express Edition、および MSBuild コマンド ライン ビルド ユーティリティで使用でき ます。 各プロジェクトには、翻訳用の英語リソース文字列と厳密名キー (.snk) ファイルが含まれていま す。これは、MapXtreme アプリケーションに統合可能なアセンブリにコンパイルされます。以下 の表を参照すると、自分のアプリケーション用に翻訳する必要があるプロジェクトを簡単に識別 できます。また、各プロジェクトの内容を詳しく調べることによって、翻訳が必要なリソース ファイル、あるいは文字列を限定することもできます。 LocalizationKit.sln には以下のプロジェクトが含まれています。 プロジェクト 638 説明 GeoDictionaryManager.resources GeoDictionaryManager.exe のエラー文字列およびダイアログ テキスト要素を提供します。 MapInfo.CoreEngine.resources * MapXtreme の中核を成すコンポーネント (マッピング、デー タ アクセス、フィーチャ、スタイル、主題図、空間処理など ) に関する文字列を提供します。 MapInfo.LinearReferencing.resources Z 値と M 値のサポートおよび線形参照処理に関する文字列を 提供します。 MapInfo.Ogc.resources FeatureGeometries と OGC の既知のテキストおよびバイナリ 間の変換に関する文字列を提供します。 MapInfo.Services.resources ジオコード化サービスおよびルーティング サービスの文字列 を提供します。 MapInfo.Web.resources Web アプリケーションに関連する文字列を提供します。 MapInfo.WebControls.resources Web コントロールおよび Web ツールに関連する文字列を提 供します。 MapInfo.Wfs.Server.resources WFS サーバ エラー メッセージに関連する文字列を提供しま す。 MapInfo.Windows.Dialogs.resources Web ダイアログ コントロールに関連する文字列を提供しま す。 MapInfo.Windows.resources Web コントロールに関連する文字列を提供します。 MapXtreme 2008 v7.0.0 付録 K: ローカライゼーション キット プロジェクト 説明 MapInfo.Wms.Client.resources WMS エラー メッセージに関連する文字列を提供します。 WorkspaceManager.resources WorkspaceManager.exe のエラー文字列およびダイアログ テキ スト要素を提供します。 * この名前空間に関するリソース情報については、次の表を参照してください。 リソース ファイル 用途 EllisAllTypeResources.en-US.resx データソースからの読み取りに関するエラー文 字列 EllisCommandProcessorResources.en-US.resx データソースからの読み取りに関するエラー文 字列 EllisCoordSysExceptions.en-US.resx 不正な座標系の値に関するエラー文字列 EllisCoordSysResources.en-US.resx 不正な座標系の値に関するエラー文字列 EllisDAEngineResources.en-US.resx データソースのクエリ エラーに関するエラー文 字列 EllisDBInfoResources.en-US.resx データベース エラーに関するエラー文字列 EllisDBLayerResources.en-US.resx マップ エラーに関するエラー文字列 EllisExceptions.en-US.resx 一般的なシステム エラーに関するエラー文字列 EllisExprPacketCreatorResources.en-US.resx SQL クエリに関するエラー文字列 EllisExprPacketResources.en-US.resx SQL クエリに関するエラー文字列 EllisFcnInfoServerResources.en-US.resx SQL クエリに関するエラー文字列 EllisFindResources.en-US.resx Find 操作に関する文字列 EllisGeoObjectProcessResources.en-US.resx GeoObject 操作 (ライン、ポリゴンなど) に関する エラー文字列 EllisGeoObjectResources.en-US.resx GeoObject 操作 (ライン、ポリゴンなど) に関する エラー文字列 EllisGeoResources.en-US.resx GeoDictionary およびファイルの読み込みに関す るエラー文字列 EllisGeosetResources.en-US.resx Geoset ファイルに関するエラー文字列 EllisGmlXlatResources.en-US.resx GML ファイルに関するエラー文字列 開発者ガイド 639 ローカライゼーション キットの使用方法 リソース ファイル 用途 EllisLegendResources.en-US.resx 凡例で使用する文字列 EllisMapBasicInternalFcnResources.en-US.resx MapBasic 機能に関するエラー文字列 EllisMapBasicTranslatorResources.en-US.resx MapBasic 機能に関するエラー文字列 EllisMapperResources.en-US.resx マップ操作/検索機能に関するエラー文字列 EllisMILexerResources.en-US.resx 文字列解析 (SQL、MapBasic など) 機能に関する エラー文字列 EllisMILicensingResources.en-US.resx コピー防止/ライセンス コンポーネントに関する エラー文字列 EllisMIRDBResources.en-US.resx データベース接続に関するエラー文字列 EllisMIRDBSpatialResources.en-US.resx データベース接続に関するエラー文字列 EllisMIWindowResources.en-US.resx GUI で使用する文字列 EllisProgramResources.en-US.resx ファイル操作に関するエラー文字列 EllisRasterResources.en-US.resx WMS 接続およびラスタ/グリッド イメージに関 するエラー文字列 EllisTextFileReaderResources.en-US.resx ファイル操作に関するエラー文字列 EllisThematicsResources.en-US.resx 主題図操作に関するエラー文字列 EllisUtilityResources.en-US.resx ファイル操作に関するエラー文字列および一般 的なエラー文字列 EllisXMLUtilResources.en-US.resx XML/GML 操作に関するエラー文字列 strings.en-US.resxGeneric エラー文字列、単位、座標系、測地系、楕円体 名、さまざまな GUI 文字列、WFS 文字列、シリ アライゼーション、およびラスタ エラー システム要件 Visual Studio 2008 または Visual Studio 2008 C# Express Edition。 ローカライゼーション キットの使用方法 ローカライゼーション キットは、任意の言語に翻訳可能なリソース文字列が含まれている Visual Studio 2008 ソリューションとして提供されています。Visual Studio ソリューションは、VS 2008、 Visual C# 2008 Express Edition、および MSBuild コマンド ライン ビルド ユーティリティで使用でき ます。操作は、目的の .resx ファイルを Visual Studio のリソース エディタで開き、名前と値のペア 640 MapXtreme 2008 v7.0.0 付録 K: ローカライゼーション キット を編集するだけです。1 つの .resx ファイル内の 1 行だけを翻訳することもできれば、すべてのア センブリのすべての .resx ファイル内のすべての行を翻訳することもできます。アプリケーション で必要な部分を翻訳してください。 翻訳用のファイルには、Microsoft の規則に従って、言語/ロケール識別子を使った名前が付けられ ています。たとえば、 LinearReferencing.resources プロジェクトの英語 (米国) の例外文字列は、 LinearReferencingExceptionStrings.en-US.resx というファイル内にあります。言語識別子の詳細につ いては、Microsoft .NET Framework ライブラリで System.Globalization.CultureInfo クラスを参照して ください。 ほとんどの .resx ファイルは、各プロジェクトの Resources フォルダに格納されています。Windows リソースおよび Windows.Dialog リソースは、Controls フォルダまたは Dialogs フォルダに格納され ています。 サテライト アセンブリのビルド サテライト アセンブリは、コンパイル済みのリソースのみを含む、オプションのスタンドアロン のアセンブリです。.resx 文字列の翻訳が終了すれば、サテライト アセンブリをビルドできます。 Visual Studio でプロジェクトを右クリックし、[ビルド] を選択します。bin フォルダと、アセンブリ が格納された言語/ロケール固有のフォルダが作成されます。アセンブリのファイル名は英語版の アセンブリ名にならって作られ、拡張子は .resources.dll です。たとえば、WebControls アセンブリ の名前は MapInfo.WebControls.resources.dll になります。 実行時、MapXtreme は適切な言語/ロケール リソース dll (提供されている場合) を使用し、.NET リ ソース マネージャはそのサテライト アセンブリを検索するように設定されています。ローカライ ズ アセンブリが見つからない場合は、英語版のアセンブリが代わりに使用されます。 アセンブリの署名 ローカライゼーション キットでビルドしたサテライト アセンブリは、以下のいずれかの厳密な名 前の公開鍵 (キットに含まれています) で署名されます。 • • • MapInfo.CoreEngine.Public.snk MapInfo.Ogc.Public.snk MapInfo.WebControls.Public.snk. MapInfo.CoreEngine.Public.Snk は、独自の公開鍵を持つ MapInfo.Ogc.resources および MapInfo.WebControls.resources 以外の、すべてのアセンブリの公開鍵です。これらの公開鍵でサテ ライト アセンブリに署名すると、アセンブリをテストとデバッグで使用できるようになります。 これらのアセンブリを使用して MapXtreme を実行するためには、これらをグローバル アセンブリ キャッシュ (GAC) に配置する必要があります。署名済みのアセンブリのみ、GAC に配置できま す。 サテライト アセンブリの登録 Visual Studio 2008 ソリューションから出力されたサテライト アセンブリは、そのままでは GAC に インストールしてテストできません。サテライト アセンブリをビルドし、公開鍵で署名した後、 .NET ランタイムがこのアセンブリを GAC に読み込むことができるように、登録する必要がありま す。検証をスキップするアセンブリを登録するには、各サテライト アセンブリに対して厳密名 開発者ガイド 641 ローカライゼーション キットの使用方法 ユーティリティ (sn.exe) を実行します。このコマンドは、sn.exe -Vr <assembly_name> で す。検証をスキップするように登録されると、そのサテライト アセンブリはテストできる状態に なります。 コマンド ラインからのビルド MapXtreme ローカライゼーション キットには、テスト用のサテライト アセンブリを準備するプロ セスを簡単にするために、2 つの MSBuild プロジェクト ファイルが含まれています。MSBuild プロ ジェクト ファイルは、アセンブリのビルド、署名、検証をスキップするための登録、およびグ ローバル アセンブリ キャッシュへのインストールを行います。MSBuild とその使用の詳細につい ては、MSDN の「MSBuild Reference」ページを参照してください。 MSBuild プロジェクト ファイルは、LocalizationKit.proj および LocalizationKit.Utilities.proj の 2 つで す。 LocalizationKit.proj LocalizationKit.proj のターゲットは、以下のとおりです。 build - LocalizationKit ソ リ ュ ー シ ョンをビルドし、LocalizationKit.Utilities "RegisterSkipVerifiection" ターゲットを呼び出します (デフォルト ターゲット)。 プロジェクトの rebuild - LocalizationKit ソ リ ュ ー シ ョ ンをリビルドし、LocalizationKit.Utilities プロジェクトの "RegisterSkipVerification" ターゲットを呼び出します。 clean - 出力されたサテライト アセンブリと、ビルド プロセスの中で生成された中間ファイルをす べて削除します。 LocalizationKit.Utilities.proj LocalizationKit.Utilities.proj のターゲットは、以下のとおりです。 RegisterSkipVerification - sn.exe -Vr <assembly_name> コマンドを実行することによって、検 証をスキップするサテライト アセンブリをすべて登録します (デフォルト ターゲット)。 UnregisterSkipVerification - sn.exe -Vu <assembly_name> コマンドを実行することによって、 検証をスキップするサテライト アセンブリの登録をすべて解除します。 InstallGac - gacutil.exe /I <assembly_name> /f コマンドを実行することによって、サテ ライト アセンブリをグローバル アセンブリ キャッシュにインストールします。 UninstallGac - gacutil.exe /uf <assembly_name> コマンドを実行することによって、グロー バル アセンブリ キャッシュからサテライト アセンブリをアンインストールします。 プロジェクトの構成プロパティに指定できる値は、debug (デフォルト) および release です。使用に ついては以下を参照してください。 LocalizationKit プロジェクト ファイルは、LocalizationKit.Utilities プロジェクト ファイル内のター ゲットに依存し、そのターゲットを使用します。 注意 642 Visual C# 2008 Express Edition を使用している開発者は、MSBuild と、厳密名ユーティリ ティおよびグローバル アセンブリ キャッシュ ユーティリティを格納しているディレクトリ を、システム パスに追加する必要があります。 MapXtreme 2008 v7.0.0 付録 K: ローカライゼーション キット 次のパスを使用するものとします。 MSBuild (msbuild.exe) - C:\WINDOWS\Microsoft.NET\Framework\v3.5 厳密名ユーティリティ (sn.exe) およびグローバル アセンブリ キャッシュ ユーティリティ (gacutil.exe) - C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin コマンド プロンプトの行は次のようになります。 LocalizationKit> set path=%path%;C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin 使用しているマシンによってディレクトリ パスは異なる可能性があるため、環境内の正しいパス を使用してください。 ローカライゼーション キットをビルドするには、キットの root ディレクトリで次のコマンドを実 行します。 LocalizationKit> msbuild LocalizationKit.proj /target:build /property:configuration=release このコマンドは、各サテライト アセンブリを適切な厳密名の公開鍵ファイルで署名し、検証をス キップするように登録し、グローバル アセンブリ キャッシュにインストールして、リリース バー ジョン (デバッグ情報を含まない) のサテライト アセンブリをビルドします。 このサテライト アセンブリはテストすることが可能です。 サテライト アセンブリへの秘密鍵の署名 ロー カ ラ イ ズ さ れ た ア セ ン ブ リをアプリケーションに含める準備ができたら、Pitney Bowes Business Insight による秘密鍵の署名を受ける必要があります。詳細については、テクニカル サ ポートにお問い合せください。 開発者ガイド 643 サテライト アセンブリへの秘密鍵の署名 644 MapXtreme 2008 v7.0.0 用語集 この用語集では、このガイドおよび MapInfo 製品で使用されており、理解して おく必要のある用語および MapInfo の製品やテクノロジ固有の用語について定 義しています。 L 用語 修飾 MapXtreme のマップ要素。凡例、タイトル、およびスケールバーで構成されます。 アフィン変換 回転、サイズ調整、せん断など、ジオメトリ オブジェクトの線形変換に加えて、その変換からの シフトを行います。GIS で、マップをある座標系から別の座標系に変換するために使用されます。 アンチエリアシング 高解像度レンダリングを低い解像度で表示するときに、直線と曲線の縁や塗りつぶしエリアの外 周がぎざぎざになるのを防ぎ、なめらかにします。 Cartesian 地球上には存在しない x と y 座標を使用する座標系。CAD 描画では、ボールベアリング アセンブ リ図や間取り図などのオブジェクトを登録するときにこの方法を使用します。Cartesian 座標で描 画されている図面については、ほとんどの場合、その一角の座標が 0, 0 になります。 Cartesian 座標 ジオメトリ オブジェクトの従来の表記方法。平面上の x 値および y 値によってオブジェクトが表 されます。 中心点 通常はマップ オブジェクトの中心。ほとんどの場合、マップ オブジェクトの中央、つまり、オブ ジェクトの南北の中間と東西の中間の位置にあります。ただし、中心点は必ずオブジェクト上に 配置されていなければならないため、オブジェクトの中央にこない場合もあります。たとえば、 三日月型のリージョン オブジェクトの場合、実際にはリージョンの外側がそのオブジェクトの中 央になりますが、中心点は必ずリージョンの内側に配置されています。 文字エンコード バイトから文字への変換手段。「652 ページの「UCS (Universal Character Set)」」および「652 ページ の「UTF-8 (Unicode Transformation Format-8)」」も参照してください。 クラス オブジェクト指向言語では、クラスとは、ある機能を実行するためのメソッドが格納されている オブジェクトまたはオブジェクトのセットのことをいい、意味的にはプロシージャ言語の派生型 と似ています。 コードスペース 「650 ページの「MapInfo コードスペース」」を参照してください。 凸包ポリゴン バッファ リージョン オブジェクトを作成するバッファの種類。このリージョン オブジェクトは、入力オブ ジェクトのノードに基づくポリゴンを表します。凸包ポリゴンは、すべてのポイントの周りに " ラ バー バンド " を配置する演算子と考えることができます。また、最小限のポイント数で構成され ており、すべてのポイントがポリゴンの上または内部に配置されます。凸包ポリゴン バッファで は、内角が 180 度以内である必要があります。 COM+ プール リソースを保存するために、オブジェクトが事前読み込みされてプールされる Microsoft コンポー ネントです。 646 MapXtreme 2008 v7.0.0 付録 L: 用語集 座標 Cartesian 座標系では x と y による位置、地球座標系では緯度と経度による位置。マップ上の他の位 置に対する相対的な位置を示します。地球座標系では、赤道とグリニッジ本初子午線を固定参照 ポイントとして使用できます。平面座標系では、2 次元の x と y 位置を参照ポイントからの距離で 表します。通常は、第一象限が使用されるため、すべての座標が正の数値になります。 座標系 ジオメトリ オブジェクトを数値で表すときに使用します。ジオメトリ オブジェクトのポイントは 一組の数値によって表されます。この数値がそのポイントの座標となります。地図製作では、座 標系は投影法と密接に関係しています。座標系を作成するには、投影法のパラメータに特定の値 を指定します。 データ プロバイダ アプリケーションとデータ ソースの間のブリッジであり、アプリケーションで使用するデータに アクセスするためのメカニズムを提供します。 データ バインド データ ソースとサーバ コントロールの関係。MapXtreme の DataBinding クラスには、ASP.NET サーバ コントロール内の 1 つのデータ バインド式に関する情報が格納されています。これにより、 Visual Studio の RAD ( 高速アプリケーション開発 ) デザイナが設計時にデータ バインド式を作成で きます。 小数度 度数の端数を小数で表すこと。紙の地図の多くでは、度、分、秒 (40 度 30 分 0 秒など ) で座標を表 し、分と秒の部分が端数になります。30 分は 1/2 度、30 秒は 1/2 分です。MapXtreme では、座標を 小数度 (72.558 度など ) で表しています。つまり、40 度 30 分の経度は MapXtreme では 40.5 度と表 されます。 緯度、経度、小数度 緯度と経度は、地球の表面の位置を表すときに使用する座標です。経度 (X 座標 ) は東西の位置を 示しており、本初子午線の西は負の X 値になります。緯度 (Y 座標 ) は南北の位置を示します。赤 道の南が負の Y 値です。 派生クラス 派生クラスには、そのベース クラスのすべてのフィーチャが含まれます。ただし、追加機能また は拡張機能については、そのいずれかのみが含まれます。 列挙 変数と指定できる値すべてが含まれる型。 イベント ハンドラ ページ上のオブジェクトの属性。JavaScript または VBScript で書き込むことができます。たとえ ば、ユーザがボタンをクリックしたときの動作またはリスト ボックスからテキストを選択した場 合の動作が、イベント ハンドラによって記述されます。VBScript と JavaScript の両方が、on Click や on Select などの明示的に定義されたイベント ハンドラをサポートします。また、明示的なイベ ント ハンドラに代わる関数を定義することも可能です。これらの関数は、暗黙的なイベント ハン ドラと呼ばれます。 開発者ガイド 647 Feature ジオメトリ、スタイル、および属性が格納されているテーブルの行。Feature には、通常 Table と Key が含まれており、これを使用してどの行を表しているのかを識別します。 FeatureLayer テーブルからフィーチャを表示する MapXtreme のレイヤ。たとえば、世界各国を表すリージョン オブジェクトのレイヤが FeatureLayer です。FeatureLayer を使用するには、マップの Layer コレク ションを使用してこれを Map に追加する必要があります。ネイティブの .TAB データ、リモート RDB、シームレス データ、またはラスタ データを FeatureLayer として使用できます。 Geocode テーブルやデータベースのレコードに X 座標と Y 座標に割り当てて、そのレコードをマップのオ ブジェクトとして表示できるようにする処理。 GeoDictionary テーブル (TAB ファイルのみ ) に関する情報が格納されている MapXtreme のファイル。 GeoDictionary を使用して、テーブルをどのアプリケーション データにバインドするか、自動的に 判断します。 GeoDictionary マネージャ GeoDictionary を維持管理するための MapXtreme のツール。 GIS ( 地理情報システム ) 地理的または空間的なすべての参照データを効果的に作成、操作、分析、表示するように設計さ れた、コンピュータのハードウェアとソフトウェアの集合体。 幾何学的中心点 オブジェクトの中心点 (「646 ページの「中心点」」を参照 )。オブジェクトの内部に配置する必要 はありません ( 通常は FeatureGeometry)。 GML (Geography Markup Language) マッピング固有のマークアップ言語。GML は、地理的情報の IT 活用を推進している国際機関 OGC (Open GIS Consortium) によって開発中です。 経緯度線 地球地図上に一定の間隔 (5 度ごと、15 度ごとなど ) で表示される水平線 ( 緯度 ) と垂直線 ( 経度 ) のグリッド ( 格子 )。基準の枠組みを確立するときに使用します。 グリッド 領域全体にわたるデータ値の補間。グリッドは、データが均等間隔のポイントで計測されている データ ファイルから作成されます。マップ領域全体がグリッドに変換され、各グリッド セルは値 を表します。第 18 章、343 ページの「グリッド イメージ」を参照してください。 陰影処理 仮想的な光源に従ったグリッド マップのレリーフ色分け。各グリッド セルの明るさは面に当たる 光に対応し、光源に対する方向に基づいて調整されます。 648 MapXtreme 2008 v7.0.0 付録 L: 用語集 HTML (Hypertext Markup Language) 通常のテキスト (Ascii) 言語。この言語を使用すると、さまざまなプラットフォーム上のさまざま な Web ブラウザで表示できる Web ページを作成することができます。HTML では、タグを使用し てドキュメントの構造を指定します。リンク (URL を使用 ) をサポートしており、他の Web ドキュ メントやファイルにジャンプすることもできます。 HTTP (Hypertext Transfer Protocol) Web クライアントと Web サーバ間のメッセージベースのネットワーク インターフェイス。HTTP は TCP/IP に優先します。 色調変化点 グリッドの値またはパーセントの変化によって色が変化するグリッド マップ上のポイント。第 18 章、348 ページの「グリッド イメージと色調変化点」を参照してください。 インターネット インフォメーション サービス (IIS) Microsoft 社が提供するソフトウェア サービスで、Web サイトの作成、設定、および管理をサポー トします。具体的には、FTP (File Transfer Protocol) や SMTP (Simple Mail Transfer Protocol) が IIS に 含まれます。MapXtreme で WMS サーバを実行するには、IIS で動作するようにこのサーバを設定 する必要があります。 ISession インターフェイス MapXtreme の MapInfo.Engine 名前空間インターフェイス。すべての MapXtreme アプリケーション の開始点を提供します。ISession は、MapXtreme アプリケーションに必要なリソースの初期化を管 理し、アプリケーションのインスタンスに適用できるデータおよび機能を定義します。 緯度 赤道の 0 度から北極 (+90.0 度 ) および南極 (-90.0 度 ) の 90 度までのマップ上の水平線。赤道の上下 の度数または小数度で測定し、ある地点の南北の位置を説明するときに使用します。 レイヤ MapInfo 製品のマップ表示の基本コンポーネントで、通常は複数のレイヤが重なり合わされて構成 されています。たとえば、道路データが、国や郵便番号領域のレイヤと重なり合っていることが あります。マップ ウィンドウにテーブルが表示されているときは、そのマップ ウィンドウのレイ ヤ全体にテーブルが表示されます。通常は、マップの各レイヤと、開いている 1 つのテーブルが対 応しています。 線形リファレンス 従来のリファレンス座標系に代わって使用されるリファレンス システムであり、線形フィーチャ の位置を地球上のポイントに結び付けます。線形ネットワークの一部としてマッピングできる物 理的な資産はすべて、その資産または関連した条件やイベントについて記述したデータを保持で きます。MapXtreme では、そのデータが位置の X および Y 座標と共に MultiCurve オブジェクト上 の M 値 ( 指標値 ) として格納されます。それらの M 値をさらにマッピングしたり分析したりする ことで、より適切なリソース管理を行えるようになります。第 22 章 : 「線形リファレンス」を参 照してください。 経度 北極から南極に走るマップ上の垂直線。ポイントの東西の位置を記述するときに使用します。東 西の位置は、本初子午線の 0 度から西 (-180.0 度 ) および東 (+180.0 度 ) の度数で示されます。経線 は赤道から最も離れた北極と南極で交差します。したがって、平行ではありません。 開発者ガイド 649 経度 / 緯度 MapInfo 製品のマップ上での地理オブジェクトを表すデフォルトの座標系。 MapControl フォーム上にマップを表示できるようにする MapXtreme オブジェクト。MapControl は、マップの 描画先となるウィンドウを所有します。また、マップのサイズを制御し、マップ ツールと対話し ます。MapXtreme は、MapControl のデスクトップ バージョンと Web バージョンを備えています。 MapInfo コードスペース MapInfo のマップとワークスペースの作成で一般的に使用される定義と規格のリスト。座標系の設 定、ペン、ブラシ、距離の設定とその省略形、イメージのサイズの設定、よく使用される種類と その省略形、利用できる演算子のリスト、時刻、日付、温度の単位と省略形などが含まれます。 詳細については、「付録 H: 「MapInfo コードスペースの定義」」を参照してください。 MapInfo MapCatalog 空間テーブルに関するフィールド情報を含むサーバ テーブル。第 12 章、246 ページの 「MapInfo_MapCatalog」を参照してください。 MapInfo SQL 言語 MapInfo マッピング製品で使用される SQL 構文のリファレンス。この SQL 言語は、SQL3 をベー スに設計され、空間分析を可能にする MapInfo の特殊な演算子が追加されています。 子午線 北極から南極に走る線または線の一部。経線。 名前空間 継承とは関係なくクラスを分類するための名前付けシステム。たとえば、System.Utilities.FileFinder と MyCompany.Utilties.FileFinder のように、無関係の 2 つのクラスに同じ名前が付いており、かつ 機能が異なる場合は、この 2 つのクラスを異なる名前空間に含めます。また、コンパイラによって 間違ったクラスが参照されること ( 競合 ) を防止するのにも役立ちます。 一般マップ オブジェクトが地球上に実在する位置を参照していないマップ。典型的な一般マップとしては間 取り図があります。 永続化 MapXtreme やその他の MapInfo 製品がデータを管理する方法を参照し、他の MapXtreme ユーザが、 この API を使用して作成されたマップを必ず使用できるようにします。XML ベースのワークス ペースの読み込みおよび保存に関連しており、GML の MapInfo Geometry オブジェクトを解析およ び公開します。 PointRef スキーマ マップ作成不可テーブルに適用し、そのテーブルをマップ作成可能にするための空間スキーマ。 マップ作成不可テーブルのフィールド (MatchColumn) とマップ作成可能なテーブルのフィールド (RefColumn) を照合することにより、他のテーブルの Geometry オブジェクトを参照します。テー ブルが開いている場合、そのテーブルには 読み取り専用の Geometry フィールドが格納されます。 そして、レイヤとしてそのテーブルをマップに追加することができます。 650 MapXtreme 2008 v7.0.0 付録 L: 用語集 プール パフォーマンスとスケーラビリティを向上するために共有リソースに使用します。MapXtreme Web アプリケーションでは、MapXtreme Session インスタンスを COM+ プールで使用でき、クライアン ト リクエストに対応できます。 投影法 地球上の位置を、紙の地図などの 2 次元の平面上の位置に変換する数学的モデル。マップでは球状 のオブジェクト ( 地球 ) を平面に表そうとしています。したがって、すべての投影法で誤差が生じ ます。マップの投影法では、領域、距離、形状、方向のいくつかが保持されませんが、地球儀で はこれらのすべての属性が保持されます。航海図の作成に適した投影法 ( メルカトルなど ) や、視 覚分析用地図の作成に適した投影法 ( ランベルトなどの正積投影法など ) があります。 リージョン 1 つの外側の Ring と、0 個または複数の内側の Ring ( 穴 ) で構成されている MultiPolygon。 シリアライゼーション シリアライゼーションとは、オブジェクトをデータ ストリームに変換してサーバ上に保持するプ ロセスです。このプロセスは、MapXtreme の Web アプリケーションでオブジェクトを維持するう えで不可欠です。オブジェクトが維持されなかった場合、サーバは Web リクエストごとにオブ ジェクト ( マップなど ) を再作成する必要があります。 空間スキーマ テーブルの空間機能を拡張することができるサービス。MapXtreme の空間スキーマには PointRef と XY の 2 種類があります。マップ作成不可テーブルに、マップ作成可能テーブルのフィールドを 参照するときに参照できるフィールドか、X 値と Y 値を表すフィールドのいずれかが含まれる場 合、そのスキーマを使用して Geometry フィールドが作成されます。これらのテーブルは、レイヤ としてマップに追加することができます。スキーマの種類の詳細については、この用語集の PointRef スキーマおよび XY スキーマの定義を参照してください。 状態管理 ブラウザ セッションで得られた情報の保存と復元に関する、Web アプリケーション開発の一般用 語です。 テーブル 行とフィールドの形式で整理されているデータのコレクション。MapXtreme では、マップ上に表 示するデータがテーブルに格納されています。テーブルは、ジオメトリ、スタイル、属性など、 フィーチャに関する情報を保持します。MapXtreme では、MapInfo 標準のテーブル (MapInfo .TAB)、 リレーショナル データベース管理システム (RDBMS)、dBase、MS Access、ASCII ファイル、ESRI ShapeFiles など、さまざまなソースのテーブルがサポートされています。また、ラスタ、グリッ ド、シームレス、ビュー、WMS、ADO.NET などの特殊なテーブルもあります。テーブルのタイプ は、TableInfo クラスを通じて使用できます。テーブルを開いたり閉じたりするには、Data 名前空 間の Catalog を通じて行います。「第 10 章 : 「データでの作業」」を参照してください。 タイル ハンドラ Web アプリケーションからのマップ タイルの要求を処理する HTTP ハンドラ。第 5 章、96 ページ の「MapXtreme タイル ハンドラ」を参照してください。 開発者ガイド 651 URL (Uniform Resource Locator) WWW 上の Web ページまたはファイルのアドレスが含まれるハイパーテキスト リンクまたはイ メージ マップの元のインプリメント。URL には、使用するネットワーク プロトコルに関する情報 とページまたはファイルへのパスが含まれます。たとえば、"http://www.mycompany.com/index.html" という URL は、"my company" Web サイトのインデックス ページを指しています。 UCS (Universal Character Set) Universal Character Set (UCS) は国際規格 ISO 10646 によって定義されており、他のすべての文字 セット規格のスーパーセットになっています。また、UTF-8 や UTF-16 など、文字列をバイトとし てエンコードするための方法もいくつか定義します。 UTF-8 (Unicode Transformation Format-8) Unicode 文字のオクテット (8 ビット ) ロスレス エンコード。MapXtreme は、ワークスペース保持ス キーマで示されているように UTF-8 のみをサポートします。 Web コントロール ユーザが Web サーバにリクエストを送信するために操作する、Web ページ上の要素。 WMS (Web Map Service) OGC 対応の Web サービス。マッピング アプリケーションのレイヤとして使用するマップ イメー ジを提供します。WMS サーバとクライアントをホストして OGC 対応の (1.0.0、1.1.0、または 1.1.1) WMS にアクセスする場合、MapXtreme は WMS の サーバ インプリメントを提供します。 WFS (Web Feature Service) OGC 対応の Web サービス。マッピング アプリケーションで使用する地理参照マップ フィーチャ を提供します。MapXtreme は、WMS サーバにアクセスするための WMS Basic、読み取り専用サー ビス、およびクライアントを備えています。 Web サーバ HTTP (Hypertext Transfer Protocol) と Web サーバ ソフトウェアを実行するコンピュータ システム。 Web サーバは、URL ベースの HTTP リクエストを Web ユーザのブラウザから受け取り、HTML ページをブラウザに返します。1 つ以上の Web サイトを管理することができます。たとえば、商用 サーバについては、通常は多数の Web サイトがあります。 ワークスペース XML ベースの永続的なファイル形式。このファイル形式を使用すると、MapXtreme のユーザが、 さまざまな環境で作成されたマップを共有できます。将来的にはすべての MapInfo 製品が準拠する 予定です。ワークスペース作成の詳細については、「第 24 章 : 「ワークスペース マネージャ」」を 参照してください。ワークスペースの構造の詳細については、「付録 D: 「MapInfo ワークスペース について」」を参照してください。 XY スキーマ マップ作成不可テーブルに適用し、そのテーブルをマップ作成可能にするための空間スキーマ。 テーブルには X と Y の座標値が必要です。XY スキーマはこの値にアクセスしてテーブルに Geometry フィールドを作成します。 652 MapXtreme 2008 v7.0.0 索引 シンボル .bil ファイル サポートされているラスタ形式 339 .bmp ファイル サポートされているラスタ形式 339 .dem ファイル サポートされているグリッド形式 344 .emf ファイル サポートされているラスタ形式 339 .gen ファイル サポートされているラスタ形式 339 .grc ファイル サポートされているラスタ形式 339 .grd ファイル サポートされているラスタ形式 344 .mws MapInfo ワークスペース形式 432 .NET オブジェクト モデル COM 相互運用性 136 .sid ファイル サポートされているラスタ形式 339 .TAB サポートされているテーブルの種類 185 .wmf ファイル サポートされているラスタ形式 339 A AddressCandidates クラス 358 ADO.NET サポートされているテーブルの種類 186 ADO.NET インターフェイス データの分析 219 ADO.NET のシリアライゼーション 199 ADRG サポートされているラスタ形式 339 AJAXDemo サンプル アプリケーション 94–95 AppStateManager インプリメント 121–122 開発者ガイド ASCII サポートされているテーブルの種類 185 ASP.NET AJAX 94 Web コントロール 94–95 ASP.NET アプリケーション ASP.NET テンプレートの使用 48–50 MapXtreme テンプレートがない場合の作成 51 Web コントロール 50 セッション管理 166 ASRP サポートされているラスタ形式 339 AvoidList クラス 392 B BaseGeocodeMatchCode クラス 358 BitmapPointStyleRepository クラス カスタマイズ 515 Brush スタイル リモート空間テーブル 253 C CADRG サポートされているラスタ形式 339 CalculateMissingMeasures 座標 (M) 値の決定 408 callbacks 拡張可能データ プロバイダ 556 CandidateAddress クラス ジオコード化住所 358 Cartesian 座標 定義 646 Catalog 検索メソッド 214 データ アクセス 197 データの分析 219–220 テーブル レジストリ 183 Center ツール デスクトップ 154 CIB サポートされているラスタ形式 339 653 索引 COM+ プール 定義 646 COM オブジェクト モデル .NET 相互運用性 136 CoordSys オブジェクト 作成 330 CPU 使用率 プール型の Web アプリケーション 131 CreateThemeWizard Windows ダイアログ ボックス 146–147, 149– 150 Curve 作成 326 D Data.Find 名前空間 UML 図 277 Data.Find 名前空間 概要 70 Data 名前空間 UML 図 178 概要 69 DateTime データ型 180 Date データ型 180 SQL 式 226 dBase サポートされているテーブルの種類 185 DBMS データベース リモート テーブルへのアクセス 232 空間テーブルのインポート 247 DropMeasures 座標 (M) 値の決定 408 DTED ファイル サポートされているグリッド形式 344 E ECW ファイル サポートされているラスタ形式 339 EnableTranslucency プロパティ 448, 564 Engine 名前空間 概要 70 例外クラス 175 Envinsa Location Utility Service 結果コード 358 EPSG コード MapXtreme への登録 332–335 ExecuteFeatureCollection 210 F FeatureCollection 213 FeatureGeometry 212 654 FeatureGeomety.Distance 線形リファレンス 408 FeatureLayer 定義 648 FeatureOverrideStyleModifier カスタマイズ 511 グリッド 350 FeatureStyleModifier UML 図 271 カスタマイズ 511 スタイルの変更 271 レイヤの外観の変更 511 Find クラス 返されるオブジェクト 279, 281 要件 277 G GDI+ による透過性とアンチエリアス処理 456, 458, 564 GeocodeClientFactory クラス 357 GeocodeMatchCode クラス 358 GeocodeRequest クラス 360 ジオコード リクエストの送信 357 GeocodeResponse クラス 候補住所 357 GeocodingConstraints クラス 357 Geocoding World コンポーネント 360 Geocoding 名前空間 概要 72 GeoDictionary 205 定義 648 ユーティリティ 468, 470, 472 GeoDictionaryManager 定義 648 GeoDictionary マネージャ 472 Geometry オブジェクト FeatureGeometry オブジェクトへの変換 326 Geometry クラス 320–321 Geometry 名前空間 UML 図 321 概要 70 GeoTIFF ファイル サポートされているラスタ形式 339 GIF ファイル サポートされているラスタ形式 339 GIS ( 地理情報システム ) 定義 648 GML GML (Geography Markup Language) を参照 GML (Geography Markup Language) 412 定義 648 MapXtreme 2008 v7.0.0 索引 GmlFeatureCollection クラス 516 カスタマイズ 516 Grid サポートされているテーブルの種類 187 GridInflectionCalculator クラス グリッド の色調変化値および色の計算 349 GTOPO30 ファイル サポートされているグリッド形式 344 H HTML (Hypertext Markup Language) 定義 649 HTTP (Hypertext Transfer Protocol) 定義 649 HTTP セッション 定義 106 I ICursorv インターフェイス 拡張可能データ プロバイダ 539 IDataProvider 拡張可能データ プロバイダ 538 IDataSource 拡張可能データ プロバイダ 543 IDW 逆距離加重補間クラスを参照 IFeatureAccessor インターフェイス 拡張可能データ プロバイダ 539 IInterpolator プログラミング インターフェイス 348 IIS アプリケーション ツール 132 アプリケーションのチューニング 132–133 サーバの設定 132–133 定義 649 IIS 7.0 Web アプリケーションの開発 38, 48 インストール要件 38 InProc 開発モデル 111–112 プールとの比較 111–112 InProc 型開発モデル Web アプリケーション 111, 113 定義 106 プールとの比較 111, 113 InteriorStyleRepository クラス カスタマイズ 515 ISearchResultProcessor インターフェイス 511 ISessionEventHandlers ワークスペース マネージャ機能拡張 519 開発者ガイド ISession インターフェイス UML 図 166 セッション管理 166 定義 649 isoChrone 運転時間 394 isoChronePreferences クラス 394 isoDistance 運転距離 397 isoDistancePreferences クラス 398 isogramPreferences クラス 395 ITableDefinition 拡張可能データ プロバイダ 538 ITableMetaData インターフェイス 拡張可能データ プロバイダ 539 ITable インターフェイス 拡張可能データ プロバイダ 539 IWorkspaceManagerNotifications イベント処理 519 J JavaScript Web ツール 85–86, 90, 93 JPEG2000 ファイル サポートされているラスタ形式 339 JPEG ファイル サポートされているラスタ形式 339 L LabelLayer 265 LabelModifier 266 LabelProperties 266 LabelSource 265 Label ツール デスクトップ 154 LayerControl 83 Windows コントロール 144 カスタマイズ 513 カスタム タブの作成 513 レイヤ ノード 513–514 LayerControl.Styles 315 LayerNodeHelper クラス カスタマイズ 513 LegendControl 83 LineStrings 作成 324 LineStyleRepository クラス カスタマイズ 515 LocateAlong 線形リファレンス操作 408 LocateBetween 線形リファレンス操作 408 655 索引 LocateMeasure 線形リファレンス操作 408 M MapAlias プロパティ Web コントロール 88 MapCatalog 定義 650 MapControl 83 Web コントロール 79 Windows コントロール 139, 260 定義 650 テーブル セル内 102 MapControlModel Web アプリケーション 86 MapExport イメージへのエクスポート 258 MapFactory マップの作成 259 MapForm アプリケーション MapForm テンプレートの使用 46, 48–49 Windows コントロール 50 MapInfo.Engine.Session.State 定義 107 MapInfo_MapCatalog 作成 247 MapInfo 3.0 Compatible フォント ポイントの描画 314 MapInfo 3.0 互換フォント VectorSymbolRepository クラス 315 MapInfo ADO.NET データ プロバイダ MICommand 209–210 MIConnection 208 データ アクセス 208 データ プロバイダ 196 MapInfoCoordinateSystemSet.xml ファイル 座標単位 620 投影法 608 投影法の ID 番号 607 MapInfo Grid ファイル サポートされているグリッド形式 344 MapInfo MapCatalog 定義 650 MapInfo_MapCatalog 行の追加 248, 250, 252–253 MapInfo SQL 言語 212 MIDataReader 211 定義 650 リファレンス 220 Mapinfow.abb ファイル 置き換えのキーワード 285 置き換えの方法 285, 287–288 656 道路略語の照合 275–276 編集 283, 285, 288 MapInfo コードスペース 600–604 定義 650 MapInfo コードスペースの定義 600, 602 MapInfo ワークスペース形式 (.MWS) 432 MapLoader データの読み込み 260 MapMarker サーバ 結果コード 358 Mapping.Legends 名前空間 概要 70 Mapping.Thematics 名前空間 UML 図 292–293 概要 70 Mapping 名前空間 UML 図 258 概要 70, 258 MapPrinting クラス 566 MapStyleControl 565 MapToolBar Windows コントロール 142–143 MapTools デスクトップ アプリケーション 151 MapView ビューのリスト 260 MapX 5.0 MapXtreme への移行 475–485 MapXtreme Web コントロールのアーキテクチャ 84 アーキテクチャーの概要 68 アップグレード 41, 45 アプリケーションの作成 487 移行 24 インストール 40 オブジェクト モデル 69–71, 476 機能の概要 22 サポート リソース 27 製品の概要 22 MapXtreme ASP.NET Web アプリケーション テンプレートがない場合の構築 51 テンプレートの使用 48 MapXtreme JavaScript Web コントロール MapXtreme ポスト バック コントロールからの 移行 100 MapXtreme Session インスタンス クリーン 124 説明 125 MapXtreme Windows マップ アプリケーション テンプレートの使用 46 MapXtreme アプリケーションからの印刷 562–566, 568, 570–574 MapXtreme 2008 v7.0.0 索引 MapXtreme セッション 定義 106 MapXtreme タイル ハンドラ 96 キャッシュ 98 使用 96 使用可能なマップのリクエスト 97 MapXtreme へのアップグレード 41, 45 MapXtreme への移行 24, 475–485 Map オブジェクト 座標系の調査方法 332 Map クラス マップの内容 259 MatrixRouteRequest クラス 390 MatrixRoutingPreferences クラス 391 Microsoft Data Access Components (MDAC) アプリケーションの展開 57 MemTable サポートされているテーブルの種類 186 MI_Geometry フィールド 182 MI_Key フィールド 182 MI_Style フィールド 183 MICommand 210 SQL ステートメント 209 データ アクセス 208 データの分析 219 MIConnection MapInfo ADO.NET データ プロバイダ 208 データ アクセス 208 MIDataReader 211 MrSID ファイル サポートされているラスタ形式 339 MS Access サポートされているテーブルの種類 185 MSI インストーラ インストーラの作成 53, 56 MultiPoint オブジェクト 作成 323 MXTRunNCP.exe ランタイム インストーラを参照 M カテゴリの一致 ジオコード化の結果コード 367–368 N NAD 83 測地系 622 NADCON NAD 27 と NAD 83 の変換 622 National Transformation v.2 (NTv2) 627–630 NITF サポートされているラスタ形式 339 North American Datum Conversion (NADCON) NADCON を参照 開発者ガイド O ODBC 接続文字列の形式 239 OGC クエリ インターフェイス データの分析 219 OpenGIS Implementation Specification Web Feature Service 412 Web Map Service 372 Oracle Spatial ジオメトリ変換 233–236 接続文字列の形式 240 Oracle アプリケーション トラブルシューティング 254–255 P Pan ツール デスクトップ 154 PCX ファイル サポートされているラスタ形式 339 Pen スタイル 590 リモート空間テーブル 253 PerpendicularOffset 線形リファレンス操作 409 Persistence 名前空間 概要 71 Photoshop ファイル サポートされているラスタ形式 339 PNG ファイル サポートされているラスタ形式 339 Point 作成 322 PointExclude クラス 392 PointPercentageSpeedUpdate クラス 402 PointRef スキーマ 205–206 定義 650 PointRelativeSpeedUpdate クラス 401 PointSpeedUpdate クラス 401 Polygon 作成 327 Q QueryDefinition カスタマイズ 511 QueryFilters カスタマイズ 511 R Radius ツール デスクトップ 154 Raster サポートされているテーブルの種類 186 657 索引 Raster 名前空間 UML 図 338 概要 71 RDBMS サーバ サポートされているテーブルの種類 186 Rectangle ツール 長方形の描画 157 デスクトップ 154 REST-based タイル ハンドラ 96 ResultSet サポートされているテーブルの種類 187 Reverse 座標 (M) 値の決定 408 Ring 作成 327 RoadTypePercentageSpeedUpdate クラス 403 RoadTypeRelativeSpeedUpdate クラス 403 RoadTypeSpeedUpdate クラス 402 RouteInstructionsRequest クラス 391 RouteRequest クラス 388–389 RouteSegmentDataRequest クラス 399 RoutingPreferences クラス 391 Routing 名前空間 UML 図 387 概要 72, 386 S ScaleMeasures 座標 (M) 値の決定 408 SDK 拡張可能データ プロバイダ 533 SDK インストール 32 SDK ライセンス 33 Seamless サポートされているテーブルの種類 187 SearchResultProcessor クラス カスタマイズ 511 Search サンプル アプリケーション 216 SegmentExclude クラス 393 SegmentPercentageSpeedUpdate クラス 401 SegmentRelativeSpeedUpdate クラス 400 SegmentRoadTypeUpdate クラス 400 SegmentSpeedUpdate クラス 400 Selection クラス 171 select ステートメント MICommand 209–210 結果セット 204 sessionState 定義 107 SetMeasures 座標 (M) 値の決定 408 658 SetMeasuresAsDistance 座標 (M) 値の決定 408 ShapeFile サポートされているテーブルの種類 185 SimpleFeature 拡張可能データ プロバイダ ユーティリティ ク ラス 540 SmoothingMode プロパティ 564 SpatialWare アプリケーション トラブルシューティング 254–255 Spot ファイル サポートされているラスタ形式 339 SQL 言語 MapInfo リファレンス 220 SQL ステートメント MICommand 209–210 SRID コード MapXtreme への登録 332–335 StateManager クラス インプリメント 121–122 定義 107 StyleRepository スタイル ストレージ 315 StyleRepository クラス アクセス、定義済みのスタイル 314 Styles 名前空間 UML 図 310 概要 71 Symbol スタイル リモート空間テーブル 253 S カテゴリの一致 ジオコード化の結果コード 367 T TableInfo メタデータ 191 Targa ファイル サポートされているラスタ形式 339 TIFF ファイル サポートされているラスタ形式 339 Time データ型 180 SQL 式 226 TIN 不定形三角網を参照 Tools 名前空間 概要 71 TranslateMeasures 座標 (M) 値の決定 408 TravelTime クラス 393 TrueType フォント StyleRepository クラス 315 MapXtreme 2008 v7.0.0 索引 U W UCS (Universal Character Set) 定義 652 UML 図 Data.Find 277 Data 名前空間 178 Geometry 321 Mapping 258 Mapping.FeatureStyleModifier 271 Mapping.Labels 265 Mapping.Layers 261 Mapping.Thematics.IModiferTheme 292 Mapping.Thematics.ObjectTheme 293 Raster 338 Routing 387 Styles 310 URL (Uniform Resource Locator) 定義 652 URL リクエスト MapControlModel 86 クライアント サイド 86–87 サーバ サイド 86–87 UserDrawLayer クラス 512 USGS DEM ファイル サポートされているグリッド形式 344 UTF-8 (Unicode Transformation Format) 定義 652 ワークスペースでのサポート 527 web.config ファイル 事前に読み込んだワークスペース 88 セッション管理 120, 166 設定 88 WebControls 名前空間 概要 71, 81 Web アプリケーション ASP.NET AJAX コントロールの追加 94–95 MapXtreme Session インスタンス 124–125 MapXtreme へのアップグレード 42–43 アーキテクチャ 73–74 クライアント サイドのコマンド実行 86 クライアント サイドのマップ対話 86 計画 78–81, 106, 108–114, 116, 491–492, 494, 497–498 サーバ サイドのコマンド アーキテクチャ 86 実行時画面 80 状態管理 81, 504 初期リクエスト 124 設計時画面 80 設計上の検討事項 78 チュートリアル 499–504 ツール 81 展開 507 バックグラウンド マップ 79 パッケージ化 505–507 パッケージ化のチュートリアル 505–507 プール 81 用語集 106–107 Web コントロール 81, 83–85, 88–89, 100, 102 ASP.NET AJAX 94 ASP.NET Web アプリケーション 50 MapAlias プロパティ 88 MapXtreme ポスト バック コントロールからの 移行 100 アーキテクチャ 84–85 イベント処理 89 エラー処理 89 使用 83, 88–89, 100, 102 状態管理 89 説明 83–84 ソース コードの変更 92–93 ツール 81 定義 652 ディレクトリ構造 83 配布 92–93 フレーム内 102 ローカライズ 103 Web サーバ 定義 652 V VectorPointStyleRepository クラス カスタマイズ 516 Vertical Mapper Classified Grid サポートされているラスタ形式 339 Vertical Mapper Continuous Grid サポートされているグリッド形式 344 サポートされているラスタ形式 339, 344 ViaPoint クラス 394 View サポートされているテーブルの種類 187 Vista Windows Vista を参照 Visual Basic .NET ASP.NET アプリケーション テンプレート 48– 50 MapForm アプリケーション テンプレート 46 開発フレームワーク 30 マップ アプリケーション テンプレート 46 Visual C# 30 Visual Studio アプリケーションの作成 46, 48–50 開発フレームワーク 30 開発者ガイド 659 索引 Web ツール JavaScript 対応 82 MapControl での使用 102 MapControl との対話 85 アーキテクチャ 85 カスタマイズ 90, 93 使用 87 説明 83–84 ページ全体のポストバックとの比較 82 WFS WFS (Web Feature Service) を参照 WFS (Web Feature Service) クライアント 423, 425–426 サーバの構成 417–420 サーバへのリクエスト 413, 415–416 定義 652 マップ レイヤの作成 427 where 句 225 Windows.Controls 名前空間 概要 71 Windows.Dialogs 名前空間 概要 71 Windows 7 インストール要件 サポート対象のオペレーティング システム 30 Windows Server 2003 サポート対象のオペレーティング システム 30 Windows Server 2008 サポート対象のオペレーティング システム 30 Windows Server 2008 インストール要件 Windows Vista IIS 7.0 を使用 48 インストール要件 38 サポート対象のオペレーティング システム 30 Windows XP サポート対象のオペレーティング システム 30 Windows 拡張メタファイル サポートされているラスタ形式 339 Windows コントロール LayerControl 144 MapControl 139 MapForm アプリケーション 50 MapToolBar 142–143 デスクトップ アプリケーション 138 Windows ダイアログ ボックス CreateThemeWizard 146–147, 149–150 アプリケーションへの追加 145 カスタマイズ 151 Windows ビットマップ ファイル サポートされているラスタ形式 339 Windows メタファイル サポートされているラスタ形式 339 660 WMS WMS (Web Map Service) を参照 サポートされているテーブルの種類 187 WMS (Web Map Service) クライアントを介するマップ リクエスト 383 サーバ上のレイヤ構成 380, 382–383 サーバの構成 374–376, 378, 380 サーバへのリクエスト 372–374 定義 652 テスト ケース 132 WorkSpaceLoader クラス カスタマイズ 516 X XML ファイル GeoDictionary 468, 470, 472 フィーチャのインポート 516 ワークスペース形式 (.MWS) 432 XY スキーマ 205–206 定義 652 Z Z カテゴリの一致 ジオコード化の結果コード 368 MapXtreme 2008 v7.0.0 索引 ワークスペース マネージャでの有効化 448, 456, 458 湾曲ラベル 453 あ アーキテクチャ Web アプリケーション 73–74 アプリケーション 72–75 オブジェクト モデルのインプリメント 476 概要 68 デスクトップ アプリケーション 75 アセンブリ 新しいバージョンへのリダイレクト 44–45 新規作成 92–93 ソース コードからの作成 92–93 アセンブリのリダイレクト 44–45 アフィン変換 定義 646 アプリケーション Web アプリケーションのパッケージ化 505– 507 アーキテクチャ 72–75 開始状態 116 計画、Web 78–81, 109, 112–114, 116, 491–492, 494, 497–498 スタートアップ ワークスペース 116, 125–126 デスクトップ、アーキテクチャ 75 デスクトップ アプリケーションの計画 136– 137, 151 展開 499 パッケージ化、デスクトップ 499 パフォーマンス 130–133 ライセンス 33–34 アプリケーション状態 主題図のサンプル 124 定義 107 アプリケーションの計画 Web 491–492, 494, 497–498 アプリケーションの作成 Visual Studio 46, 48–50 テンプレートがない場合 51 アプリケーションの展開 インストーラ 52, 56 アプリケーションのテンプレート ASP.NET 48–50 MapForm 46, 48–49 アプリケーション プールの設定 IIS 132 稼働状況 132 識別 132 パフォーマンス 132 リサイクル 132 アンチエイリアス処理 MapStyleControl 565 印刷時 564 定義 646 開発者ガイド い 一時更新 ルーティング 399 一致 ジオコード化 366 一致が存在しない ジオコード化の結果コード 369 一般マップ 定義 650 緯度 定義 647, 649 イベント ツール 159–160 イベント処理 IWorkspaceManagerNotifications 519 イベント ハンドラ Web コントロール 89 定義 647 陰影処理 グリッド パラメータ 313 定義 648 インストーラ アプリケーションの展開 52, 56 インストール システム要件 30 種類 32 手順 40–41 要件 38 インストール済みビットマップ イメージ アクセス 314 インターネット インフォメーション サービス (IIS) 定義 649 インポート フィーチャ、XML ファイルからの 516 う ウォーターマーク SDK ライセンス 33 試用版ライセンス 33 ランタイム ライセンス 34 運転用指示 ルーティング 391 え 永続化 情報の保存 516 定義 650 プロセスの説明 170 661 索引 永続化プロバイダ 拡張可能データ プロバイダ 550 エクスポート マップ、イメージへの 258 エラー処理 Web コントロール 89 円 (Circle) ツール 円の描画 157 円錐投影法 標準緯線 621 円の描画 円 (Circle) ツール 157 お 置き換え Mapinfow.abb ファイル、キーワード 285 オブジェクト主題図 円グラフ 295 サイズ可変シンボル 293–294 説明 293 棒グラフ 296 オブジェクトの選択 バッファ内 226 バッファに含まれない 226 オブジェクト モデル MapXtreme と MapX 476 アーキテクチャ 69 インプリメント 476 データ アクセス 197, 204, 206, 219–220, 222 名前空間 69–71 オプションのインターフェイス 拡張可能データ プロバイダ 543 オペレーティング システム サポート対象 30 折れ線 描画、スタイル 313 折れ線 (Polyline) ツール 156 折れ線の描画 折れ線 (Polyline) ツール 156 スタイル 313 か カーソル 拡張可能データ プロバイダ 536 開始状態 アプリケーション 116 定義 107 開発インストール 32 開発フレームワーク 30 開発モデル InProc 型 111–113 プール型 113 662 拡大ツール 例 87 拡張可能 ワークスペース マネージャ 517 拡張可能データ プロバイダ ICursor インターフェイス 539 IDataProvider インターフェイス 538 IDataSource 543 IFeatureAccessor インターフェイス 539 ITableDefinition インターフェイス 538 ITableMetaData インターフェイス 539 ITable インターフェイス 539 SimpleFeatue クラス 540 永続化プロバイダ 550 オプションのインターフェイス 543 カーソル 536 概要 534 作成 536 作成とテスト 544 座標系 548 ジオメトリの作成 547 シリアライゼーション 553 スタイル 549 スレッド セーフ機能 559 ソフトウェア開発キット 533, 560 抽象ベース クラス 540 データ ソース 535 データ プロバイダ 535 認証 556 必須コンポーネント 538 例外処理 550 拡張機能 ワークスペース マネージャ 517–521 カスタマイズ EngineCustomProperties クラス 510 FeatureOverrideStyleModifier 511 FeatureStyleModifier 511 GMLFeatureCollection 516 Web ツール 90, 93 Windows コントロール 513–514 Windows ツール 158 WorkSpaceLoader 516 検索機能 511 スタイル 515 ダイアログ ボックス 151 ツール 514 ワークスペース マネージャ 517–521 UserDrawLayer 512 カスタム (Custom) ツール 動作 155 カスタム インストーラ アプリケーションの展開 53, 56 MapXtreme 2008 v7.0.0 索引 カスタム ビットマップ ポイント スタイル 311 グループ レイヤ レイヤの設定 454 き け キー 経緯度線 定義 648 レイヤの設定 455 ワークスペース マネージャでの有効化 464– 465 計画 Web 78–81, 109, 112–114, 116 データ アクセス 206, 219, 222 デスクトップ アプリケーション 136–137, 151 経度 定義 647, 649 経度 / 緯度 定義 650 結果コード 282–283 クラス 358 ジオコード化 366, 368–369 結果セット 204 select ステートメント 204 結果のプロパティ 検索結果 281 検索機能 213 Catalog メソッド 214 SearchInfo 215 SearchInfoFactory 215 カスタマイズ 511 MI_Key フィールド 182 キーワード Mapinfow.abb ファイル、置き換え 285 幾何学的中心点 定義 648 擬似偏東距離 621 擬似偏北距離 621 既存のアプリケーションのアップグレード 43 逆距離加重 グリッド補間機能 347 キャッシュ MapXtreme タイル ハンドラ 98 キャッシュ管理 リモート テーブル 244 リモート テーブルへのアクセス 245–246 曲線の順序 線形リファレンス操作 409 く 空間スキーマ PointRef 205–206 XY 空間 205–206 定義 651 クエリ QueryDefinition クラスを使用したカスタマイズ 511 クラス 定義 646 グリッド 343–344 GridInflectionCalculator クラス 349 Hillshade パラメータ 313 作成 346 色調変化値および色の変更 348 色調変化点 313 スタイル 313, 348 スタイル ダイアログ 350 設定の変更 350 定義 648 データの取得 345 マップへの追加 344 メインのクラス 344 グリッド補間機能 逆距離加重 347 不定形三角網 347 グリッド補間クラス プログラミング インターフェイス 348 開発者ガイド こ 交差点 検索 274 交差点のジオコード化 362 コードスペース 定義 600–604, 646 コードスペースの定義 600, 602 個別値主題図 作成 300 個別値ラベル主題図 作成 302 コントロール Web 81, 83–85, 88–89, 100, 102 さ サーバ テーブル データのキャッシュ 244 サーバ テーブル クエリ マップ作成可能テーブルの定義 241–242 サイズ可変シンボル主題図 作成 293–294 663 索引 作成 LineStrings 324 MapInfo_MapCatalog 247 MapXtreme アプリケーション 487 Web ア プ リ ケ ー シ ョ ン 78–81, 109, 112–114, 116, 491–492, 494, 497–504 拡張可能データ プロバイダ 536 デスクトップ アプリケーション 136–137, 151, 488–489, 491, 494, 496 作成 グリッド 346 座標 NAD 27 と NAD 83 の変換 622 定義 647 他の測地系への変換 622 座標 (M) 値の決定 CalculateMissingMeasures 408 DropMeasures 408 Reverse 408 ScaleMeasures 408 SetMeasures 408 SetMeasuresAsDistance 408 TranslateMeasures 408 座標系 CoordSysFactory オブジェクトへの登録 330 EPSG コードと SRID コードの登録 332–335 Geometry オブジェクトの変換 331 MapXtreme への追加 332–335 拡張可能データ プロバイダ 548 原点 620–621 ジオメトリ 330–332, 334–335 調査方法 332 定義 647 ドキュメントとリソース 630 マッピング用語の解説 63 ラスタ イメージ 340 座標系の単位 620 サポートされているファイル形式 グリッド 344 ラスタ イメージ 339 サンプル アプリケーション AJAXDemo 94–95 MapXtreme に付属 137 Search 216 線形リファレンス 410 サンプル コード ワークスペース マネージャ機能拡張 520 し シームレス ラスタ レイヤ 445 ジオコード 定義 648 664 ジオコード化 アプリケーションへのジオコード クライアン トの追加 356 概要 64, 358, 360 結果コード 366, 368–369 交差点 362 参照住所 359 住所候補 357 住所ディクショナリ 360 制約 363 制約設定 364 近い一致 366 定義 356 入力住所 359 番地 361 マップ上でのデータの表示 64 郵便番号 363 リクエストの送信 357 例 361 ジオコード化住所 CandidateAddress クラス 358 ジオコードのクラス 356 ジオメトリ 座標系 330–332, 334–335 ジオメトリの作成 Curve 326 LineStrings 324 MultiPoint オブジェクト 323 Point 322 Polygon 327 Ring 327 拡張可能データ プロバイダ 547 ジオメトリ フィールド マップ作成可能テーブル 241 式 AddColumns 227 関数 225 作成 224–228 主題図 228 使用 225 情報チップ 228 バッファ内のオブジェクトの選択 226 バッファに含まれないオブジェクトの選択 226 フィーチャ検索 227 ブール 225 ラベル 228 ラベルの優先度 453–454 例 226–228 色調変化値 グリッド 348–349 計算 349 MapXtreme 2008 v7.0.0 索引 色調変化点 グリッド 313 定義 649 子午線 定義 650 システム要件 30 自動ラベル作成機能 ワークスペース マネージャ 452 斜軸方位角 ホティン斜軸メルカトル図法 621 住所 検索 274 検索結果コード 281 修飾 定義 646 マップ要素 269 修飾子主題図 個別値主題図 300 個別値ラベル主題図 302 説明 292 ドット密度主題図 303 レンジ 297 レンジ ラベル主題図 299 修飾スタイル 複合スタイル 312 住所候補 ジオコード レスポンス 357 住所ディクショナリ カスタム 360 住所範囲 Find クラスの結果 279 住所番号 検索 276 主題図 Bin の再計算 148 CreateThemeWizard 146–147, 149–150 円グラフ 295 オブジェクト 293 個別値主題図 300 個別値ラベル主題図 302 サイズ可変シンボル 293–294 修飾子 292 ドット密度主題図 303 二変数 304 半透明効果の適用 461 凡例 305 棒グラフ 296 マッピング用語の解説 62 レンジ 297 レンジ ラベル主題図 299 ワークスペース マネージャ 438, 451 開発者ガイド 主題図の作成 円グラフ 295 個別値 300 サイズ可変シンボル 293–294 ドット密度 303 棒グラフ 296 レンジ 297 主題図のサンプル 初期リクエスト 124 小数度 定義 647 状態管理 Web アプリケーション 81, 504 Web アプリケーションの計画 106 Web コントロール 89 オプション 108 構成、手動 118 主題図のサンプル 119–124 手動 115, 121–122 手動、例 116–118 セッション オブジェクト 166 定義 106, 108, 651 プール型のアプリケーション 115 用語 106–107 自動 115 試用版ライセンス 33 情報チップ 157 シリアライゼーション ADO.NET 199 ManualSerializer 122–123 拡張可能データ プロバイダ 553 状態の復元 123 状態の保存 122–123 定義 651 プロセスの説明 169, 553 シンボル凡例 305–306 シンボル フォント セット 591 す ズーム ツール デスクトップ 154 スケールバー 修飾 269 スケール、パターン 569 スタイル LayerControl 315 オーバーライド 272, 316, 445 カスタム ビットマップの作成 316 屈折 313 グリッド 313, 348 サポートされるカスタム ビットマップ シンボ 665 索引 ル 595 サポートされるフィル パターン 576 サポートされるベクトル シンボル 591 サポートされるライン スタイル 590 ストック 314 テキスト 314 フィル 312, 314 フォント 312 フォント ポイント 312 複合 312 ベクトル ポイント 314 変更 271 ポイント 311, 313 ライン 313–314 ラスタ 313 ラベル 452 リポジトリ クラスを使用した カスタマイズ 515 リモート空間テーブル 253 領域 311 ルックアップ テーブル 575 ワークスペース マネージャ 452 スタイル オーバーライド レイヤの設定 454 スタイルのオーバーライド 316 FeatureOverrideStyleModifier 272 ストック スタイル デフォルト スタイル 314 ストック ダイアログ MapXtreme にあらかじめ用意された 146 ストック ツール Web 81, 85 デスクトップ 158 スレッド セーフ機能 拡張可能データ プロバイダ 559 線形リファレンス 408 ソース行 204 ソース コード MapXtreme Web コントロール 92–93 属性データ アクセス 243 測地系 カスタムの定義 622–626 座標の変換 622 投影法 610 リスト 610, 612–618 せ た 製品のアーキテクチャ 68 製品の機能 主要な機能 22 制約 ジオコード化 363 セグメント情報 ルーティング 399 セッション インスタンス プール 114 セッション管理 166 ASP.NET 166 ISession インターフェイス 166 接続文字列の例 240 ダイアログ ボックス CreateThemeWizard 146–147, 149–150 アプリケーションへの追加 145 カスタマイズ 151 グリッド スタイル 350 タイル ハンドラ 96 キャッシュ 98 使用可能なマップのリクエスト 97 楕円 楕円の描画 156 多円錐図法 621 楕円の描画 楕円 (Ellipse) ツール 156 666 線形リファレンス 405–410 CalculateMissingMeasures 408 DropMeasures 408 FeatureGeometry.Distance 408 LocateAlong メソッド 408 LocateBetween メソッド 408 LocateMeasure メソッド 408 PerpendicularOffset 409 Reverse 408 ScaleMeasures 408 SetMeasures 408 SetMeasuresAsDistance 408 TranslateMeasures 408 曲線の順序 409 座標 (M) 値の決定 408 サンプル アプリケーション 410 操作 408 選択 (Select) ツール ポイントとリージョンの選択 154 線の描画 ライン (Line) ツール 156 そ 操作 MapXtreme 2008 v7.0.0 索引 ち て 近い一致 Find クラスの結果 280 近い一致が 1 件存在 ジオコード化の結果コード 367 中心点 定義 646 チュートリアル Web アプリケーションの作成 499–504 Web アプリケーションのパッケージ化 505– 507 アプリケーション 45 デスクトップ アプリケーションの作成 488– 489, 491, 494, 496 デスクトップ アプリケーションのパッケージ 化 499 調整領域テーブル 検索結果コード 282 番地の検索 276 長方形の描画 長方形 (Rectangle) ツール 157 定義済みのスタイル 314 データ MapXtreme での使用 202 分析 219 データ アクセス DataTable 198 ExecuteFeatureCollection 210 GeoDictionary マネージャ 205 IDBCommand 200–201 MapInfo ADO.NET データ プロバイダ 208 MapInfo SQL language 212 MICommand 209–210 MIConnection 208 MIDataReader 211 SQL コマンド 209–210 計画 197, 204, 206, 219–220, 222 式 224–228 ソース行 204 パフォーマンスの最適化 222 フィーチャ 212 アプリケーションの配布 57 データ ソース 記述 535 サポート 196 データの対応付け GeoDictionary 205 自動一致 205 データの分析 219 ADO.NET インターフェイス 219 Catalog 219–220 MICommand 219 OGC クエリ インターフェイス 219 データの読み込み MapLoader 260 データ バインド GeoDictionary へのテーブルの登録 468 説明 202 定義 647 データ プロバイダ 拡張可能 533, 560 記述 535 選択 196 データベース、サポート対象 31 テーブル Catalog 183 MI_Geometry フィールド 182 MI_Style フィールド 183 MI_Key フィールド 182 圧縮 189 イベント 190 エイリアス 179 つ 追加 グリッド イメージ、マップへの 344 ジオメトリ オブジェクト、マップへの 155 ダイアログ ボックス、アプリケーションへの 145 ラスタ イメージ、マップへの 341 追加 (Add) ツール ジオメトリ オブジェクトのマ ップへの追加 155 ジオメトリ フィーチャの描画 156 ツール Web アーキテクチャ 85 Web アプリケーション 81 カスタマイズ 158, 514 カスタム設計 155 ツール イベント 159–160 デスクトップ アプリケーション 158 デスクトップ名前空間 71 ワークスペース マネージャ 439–441 開発者ガイド 667 索引 拡張可能データ プロバイダ 拡張可能データ プロバイダ テーブル 536 関連付け 204, 206 結果セット 204 作成、一時 MemTable 194 作成、一時ネイティブ 193 作成、永久ネイティブ 192 サポートされている種類 185 式フィールドの追加 195 定義 651 閉じる 189 ビュー 204 開く 183 フィールド 180–181 マッピング用語の解説 60 マップ作成可能 205–206 マップ作成不可 179, 183, 197, 205–206, 650– 652 テーブルの圧縮 189 テーブルの関連付け 204, 206 テーブルを閉じる 189 テーブルを開く Catalog 183 テキスト 描画 312 描画、スタイル 314 テキストの描画 スタイル 314 フォント スタイル 312 テクニカル サポートへの問い合わせ 27 デシリアライゼーション 状態の復元 122–123 プロセスの説明 169, 553 デスクトップ アプリケーション MapControl 140 MapTools 151 アーキテクチャ 75 アップグレード 43 計画 136–137, 151 セッション管理 166 チュートリアル 488–489, 491, 494, 496 パッケージ化 499 プロトタイプ作成 136 デスクトップアプリケーション 作成 488–489, 491, 494, 496 デスクトップ コントロール 138 デスクトップ ツール名前空間 71 デフォルト スタイル 複合スタイル 312 展開 Web アプリケーション 507 展開インストール 32 668 展開ライセンス 34 テンプレート MapForm 46, 48–49 MapXtreme プロジェクト 137 ASP.NET 48–50 と 問い合わせ、テクニカル サポート 27 投影法 MapInfoCoordinateSystemSet.xml 608 MapInfoCoordinateSystemSet.xml の ID 番号 607 測地系 610, 612–618 定義 651 ドキュメントとリソース 630 マッピング用語の解説 63 透過性 MapStyleControl 565 印刷時 564 マップ フィーチャへの適用 458–461 ワークスペース マネージャでの有効化 448, 456, 458 動的選択 154 投影法 パラメータ 606 道路名 検索 274 道路略語 検索 275–276 特殊文字 Mapinfow.abb ファイル、置き換え 288 ドット密度主題図 作成 303 凸包ポリゴン 定義 646 トラブルシューティング Oracle アプリケーション 254 SpatialWare アプリケーション 254 ライセンス 36–37 な 内部スタイル BaseInterior クラス 314 SimpleInterior 312 リージョンの描画 312 名前空間 69–71 定義 650 名前付き接続 種類 435 ワークスペースの保持 526 MapXtreme 2008 v7.0.0 索引 に ふ 二変数主題図 304 認証 拡張可能データ プロバイダ 556 ファイル形式 グリッド 344 ラスタ イメージ 339 フィーチャ ExecuteFeatureCollection 210 FeatureCollection 213 FeatureGeometry 212 Selection クラス 171 記述 212 検索 213, 215 修飾子主題図 292 定義 648 テーブルから取得 213 変更 213 マッピング用語の解説 61 フィーチャ ジオメトリ スタイル 拡張可能データ プロバイダ 549 フィーチャの取得 213 フィーチャの変更 213 フィールド サポートされるデータ型 180–181 式フィールドの追加 195 追加 227 フィールドの説明 632–635 フィル スタイル 576 リージョンの描画 312 リモート空間テーブル 254 フィル パターン 576 プール InProc との比較 111–114 開発モデル 114 定義 113 利点 114 プール型開発モデル 状態の保存 115 定義 106 プール型の Web アプリケーション CPU 使用率 131 メモリ消費量 131 プール型のアプリケーション 開発モデル 113 プール サイズ 構成 116, 125–126 ブール式 225 プール、定義 651 フォント スタイル テキストの描画 312 フォント ポイント スタイル ポイントの描画 312 複合スタイル 312 は 配布アプリケーション ライセンス 34 バインド、データ 202 派生クラス 定義 647 パターンのスケール 569 バックグラウンド マップ 定義 106 パッケージ化 Web アプリケーション 505–507 デスクトップ アプリケーション 499 バッファ 内部のオブジェクトの選択 226 含まれないオブジェクトの選択 226 パフォーマンス アプリケーション 130–133 最適化、データ アクセス 222 パラメータ 投影法 606 番地 検索 274 検索結果コード 281 番地のジオコード化 361 凡例 305 修飾 269 シンボル 305–306 フレームの配置 306 マッピング用語の解説 61 ひ ビットマップ 作成、カスタム 316 ビットマップ シンボル 595 非プール型の Web アプリケーション メモリ消費量 130 ビュー MapView 260 ビュー テーブル 204 表示ツール マップ ビューの変更 154 標準緯線 円錐投影法 621 比率因数 横メルカトル図法 621 開発者ガイド 669 索引 複数の候補からの最適一致 ジオコード化の結果コード 367–368 不定形三角網 グリッド補間機能 347 ブラウザ サポート対象 30 ブラウザ セッション 定義 106 プレース名 274 検索結果コード 283 プロジェクト テンプレート MapXtreme に付属 137 プロトタイプ作成 すばやいデスクトップ アプリケーション開発 136 ほ ポイント スタイル 591 BasePointStyle クラス 313 使用、ビットマップ イメージ 314 リモート空間テーブル 253 ポイントツーポイント ルーティング 387 ポイントの描画 MapInfo 3.0 互換フォント 314 カスタム ビットマップ スタイル 311 フォント ポイント スタイル 312 方位図法 621 棒グラフ主題図 作成 296 ホティン斜軸メルカトル図法 斜軸方位角 621 ま マージ モジュール インストーラの作成 53, 56 マッピングの用語と概念 60–63 マップ シンボル凡例 305–306 マッピングの用語と概念 60–63 マップ アプリケーション テンプレート すばやいプロトタイプ作成 136 マップ作成可能テーブル Map Catalog への行の追加 248, 250, 252 サーバ テーブル クエリでの定義 241–242 テーブルをマップ作成可能にする 205 マップ作成可能テーブルの定義 241–242 マップ作成可能テーブルへのアクセス 206 マップ作成不可データへのアクセス 510 マップ作成不可テ ーブ ルへ のア クセ ス 179, 183, 197, 205–206 マップ タイトル 修飾 269 670 マップ ツール JavaScript 対応 85 アーキテクチャ 85 使用 87 プロセス図 87 マップの作成 MapFactory 259 マップの凡例 305 フレームの配置 306 マップ ビュー 表示ツール 154 マップ フィーチャの検索 交差点 274 正しくない番地要素 288 調整領域テーブル 276 番地 274–276 プレース名 274 マトリックス ルーティング 389 マニュアル 27 マルチポイント ルーティング 388 め メタデータ TableInfo 191 TAB ファイル 192 メモリ消費量 非プール型の Web アプリケーション 130 プール型の Web アプリケーション 131 も 文字エンコード UTF-8、ワークスペース 527 定義 646 ゆ ユーザ状態 管理 118 定義 107 ユーザ定義のメタデータ 632–635 ユーティリティ GeoDictionary マネージャ 205, 468–469, 471– 473 ワークスペース マネージャ 432, 465 郵便番号中心点の一致 ジオコード化の結果コード 368 郵便番号のジオコード化 363 MapXtreme 2008 v7.0.0 索引 よ 用語集 646–652 Web アプリケーションの計画 106–107 状態管理 106–107 プール 106–107 横メルカトル図法 比率因数 621 ら ライセンス アプリケーション 33–34 既知の問題 38 取得 33 種類 33, 35 トラブルシューティング 36–37 ファイルの場所 35 ライン (Line) ツール 156 ライン スタイル 590 BaseLineStyle クラス 314 折れ線の描画 313 リモート空間テーブル 253 ラスタ イメージ 印刷、半透明 448 座標系 340 サポートされているファイル形式 339 スタイル 313 制限 341 マップへの追加 341 メイン クラス 339 ラスタ再投影 340, 448–449 ラスタ ハンドラ 341–342 ラベル UML 図 265 概要 265 個別値主題図 302 スタイル 452 マッピング用語の解説 61 優先度の式 453–454 レンジ主題図 299 ワークスペース マネージャ 451–453 湾曲 268, 461, 463–464 ラベル主題図 作成 299, 302 ラベル主題図の作成 個別値 302 レンジ 299 ラベル ツール 手動で追加されたラベルの削除 452 湾曲ラベルの再配置 464 開発者ガイド ランタイム インストーラ アプリケーションの展開 52 ランタイム インストール 32 ランタイム ライセンス 33–34 り リージョンの描画 スタイル 311 内部スタイル 312 リクエスト / レスポンス サイクル Web ツール 87 リポジトリ クラス 515 リモート空間テーブル DBMS データベースへのインポート 247 Map Catalog への行の追加 248, 250, 252–253 MapInfo_MapCatalog 246–247 スタイル 253 スタイルの指定 253 レコードごとのスタイル 252–253 リモート空間テーブルへのアクセス スタイルの指定 253 リモート テーブル .tab ファイルを使用 232 .tab ファイルを使用しない 233 DBMS サーバ 232 ODBC 接続文字列の形式 239 X/Y フィールドとのマッピング 233 キャッシュ管理 244–246 属性データへのアクセス 243 パフォーマンス 244 マップ作成可能テーブル 241–242 マップ作成可能テーブルの定義 241 リモート テーブルへのアクセス .tab ファイルを使用 232 .tab ファイルを使用しない 233 DataTable 198 DBMS データベース 232 IDBCommand 200 MapInfo_MapCatalog 246–247 ODBC 接続文字列の形式 239 X/Y フィールドとのマッピング 233 キャッシュ管理 244–246 属性データ 243 パフォーマンス 222, 244 マップ作成可能テーブル 241–242 マップ作成可能テーブルの定義 241 略語ファイル 置き換えのキーワード 285 置き換えの方法 285, 287–288 編集 283, 285, 288 671 索引 る ルーティング アプリケーションへのルーティング クライア ントの追加 386 一時更新 399 運転用指示 391 開始時間と終了時間 393 回避するポイント、フィーチャ、セグメント 392 概要 65 時間ベース 393 セグメント情報の取得 399 設定 390 定義 386 停止時間 394 ポイントツーポイント 387 マトリックス 389 マルチポイント 388 ルート ジオメトリ 392 れ 例外クラス Engine 名前空間 175 例外処理 拡張可能データ プロバイダ 550 レイヤ UML 図 261 UserDrawLayer クラス 512 外観のカスタマイズ 511 種類 261 定義 649 半透明効果の適用 458–459 マッピング用語の解説 61 レイヤ オーバーライド スタイル 複合スタイル 312 レイヤ管理 ワークスペース マネージャ 443–444, 446–447, 449–452, 454 レイヤの作成 UserDrawLayer クラス 512 レイヤの種類 FeatureLayer 261 GroupLayer 262 MapLayer 262 ObjectThemeLayer 262 UserDrawLayer 262 レコードごとのスタイル 252–253 列挙 定義 647 レリーフ色分け 陰影処理を参照 672 レンジ 投影法の 621 レンジ主題図 作成 297 配分方法 298–299 レンジ ラベル主題図 299 作成 299 わ ワークスペース XML 形式 433 構造 527–528, 530–531 再投影されたイメージ 340 事前読み込み 79 定義 652 プログラムによる作成 532 読み込み 116, 125–126 ワークスペースの作成 プログラムによる 532 ワークスペース マネージャ 432 ワークスペース マネージャ LayerControl 444, 446, 451 LayerControl ツール 447, 449 XML として保存 432 カスタマイズ 517–521 機能概要 432 グリッド スタイル ダイアログ 350 主題図 451 スタイルのオーバーライド 445 ツール メニューのコマンド 439 名前付き接続 435 メニュー コマンド 433–436, 438, 440–441 ラベル 452 ラベル ツール 452, 464 レイヤ管理 443, 450–452, 454 レイヤ管理ツール 443 拡張メニュー 442 ワークスペース マネージャ機能拡張 作成 517 サンプル コード 520 読み込み 519 湾曲ラベル 268, 461, 463–464 MapXtreme 2008 v7.0.0
© Copyright 2024 Paperzz