次の方法で共有


開発者によるデータベース構築

空間データの表示

Bob Beauchemin

マイクロソフトは、SQL Server 2008 から geometry と geography という 2 つの組み込みデータ型を使って、空間データのサポートを開始しました。空間列では、Well-Known Text、Well-Known Binary、および GML (Geographic Markup Language) という 3 種類の形式でデータを確認できます。しかし、地図上にデータを表示するには、SQL Server Management Studio に追加された [空間結果] タブを使う方法しかありません。これは地図中のポリゴンや、地図に直接関連しない幾何学データ (倉庫の幾何学レイアウトなど) を表示する開発者にとっては便利ですが、各都市の場所を地点の集まりとして保有しているような場合は、その地点しか表示できません。そこで "基盤となる地図" (たとえば、都市の位置をその上にレイヤーとして重ねることができる世界地図) を追加して、SELECT ステートメントで UNION ALL 構文を使用すれば、[空間結果] タブを使ってその地図と地点を表示できます。

SELECT city_name, geog FROM cities
UNION ALL 
SELECT NULL, geog FROM map_of_the_world_table;

しかし、SQL Server Management Studio は管理者やプログラマ向けのツールです。管理のために作成しているレポートの内部でデータを表示できないものでしょうか。データにグラフィックスが含まれていると、このような要望が目立ってきます。また、地理学者であり地図製作者でもある Waldo Tobler 博士の「First Law of Geography」(地理学上の第一法則) には、「すべては他のすべてに関連しているが、近いものほど密接に関連している」と述べられています。そこで、今回は空間データの表示に関連する SQL Server の 3 つの新機能を紹介します。つまり、SQL Server 2008 R2 Reporting Services (SSRS) のマップ コントロール、ESRI の MapIt 製品、および SQL Server 2008 向けの MapPoint アドインの 3 つです。

Reporting Services のマップ コントロール

地図の表示にはレイヤーの概念を使用します。背景や基盤となる地図 (世界地図など) に、他の空間情報やデータベース情報を 1 つ以上のレイヤーとして重ね合わせます。空間情報は、商品の販売区域のようなポリゴン、道路や河川のような線分、店舗所在地のような点から構成されます。ビジネス データの分析によく使われる地図の種類にコロプレス地図 (階級区分図) があります。これは、分析対象となる統計変数の比率に応じて色分けされる主題地図です。たとえば、合衆国の州別売上を表すコロプレス地図は図 1 のようになります。これに店舗の場所を示すレイヤーを 2 つ目のレイヤーとして追加すると、新たな分析観点が生まれます。


図 1 合衆国の州別売上を表すコロプレス地図

レポートを作成するプログラマは、レポート ビルダー 3.0 から、または Business Intelligence Development Studio (BIDS) で Reporting Services プロジェクトから、SQL Server 2008 R2 のマップ コントロールにアクセスできます。レポート ビルダーでは、主要テンプレートの選択肢の 1 つとして表示されます。BIDS プロジェクトでは、ツールボックスからドラッグすることでマップ コントロールをレポートに追加できます。いずれの方法でも、マップ ウィザードによってマップ コントロールの基礎を把握できるようになっています。

まず最初に、[New Map Layer] (新しい地図レイヤー) ダイアログ ボックスを使って基盤となる地図を選択します。基盤となる地図は、組み込みの "Map Gallery" (地図ギャラリー)、ESRI の shapefile (地理空間データを表す標準データ形式)、または SQL Server の空間クエリのいずれかから取得します。これを図 2 に示します。


図 2 SSRS 2008 R2 の [New Map Layer] (新しい地図レイヤー) ダイアログ ボックス

SQL Server の空間クエリを選択すると、SQL Server テーブルの空間列から地図データが取得されます。ウィザードでは、クエリ デザイナーのクエリを作成するときに、データ接続を作成します。クエリには geometry 型か geography 型のいずれかの列が 1 列以上含まれていなければなりません。1 列も含まれていないとエラーになります。次に、[Choose Spatial Data and Map View options] (空間データと地図ビューのオプションの選択) ダイアログ ボックスで、空間フィールド (クエリに複数の空間フィールドが含まれる場合) とレイヤーの種類を選択します (図 3 参照)。通常、テーブルの空間列にはすべての地点、線分、ポリゴンが含まれているため、Map Wizard (マップ ウィザード) がデータを調べて、対応するレイヤーの種類を返します。レイヤーの種類は変更できます。ただし、すべてのポリゴン (または複数のポリゴン) を含むフィールドを選択しておいて、[Layer Type] (レイヤーの種類) に [Point] (地点) を選択すると、プレビュー ウィンドウには地図データが表示されません。そこで便利な機能として、背景に Bing の地図を挿入するオプションがあります。つまり、地点のデータがある場合は、マップ コントロールの背景の基盤となる地図として Bing のタイル地図を使用できます。背景の Bing のタイル地図には、標準の道路地図、航空写真、または道路地図と航空写真を両方表示する地図のいずれかを選択できます。Bing の地図を選択すると、Bing の地図を基本レイヤーとし、その上に空間データが重ねられます。


図 3**[Choose Spatial Data and Map View options] (空間データと地図ビューのオプションの選択)**

基本レイヤーを設定したら、地図の種類を選択します。地図の種類は、空間データが地点、線分、ポリゴンのいずれによって構成されているかに応じて変化します。たとえば、レイヤーにポリゴンが含まれていると、[Basic Map] (基本地図)、[Color Analytical Map] (色分析地図)、[Bubble Map] (バブル地図) のいずれかを選択できます。基本地図では、選択した空間データのみが表示されます。色分析地図は、分析変数に応じて各ポリゴンが色分けされる、前述のコロプレス地図です。バブル地図は、各区域の中心にある記号のサイズが分析変数の比率に応じて変化する地図です。線分データの場合に選択できるのは [Basic Line Map] (基本線図) か [Analytical Line Map] (分析線図) のいずれかです。地点データの場合に選択できるのは、[Basic Marker Map] (基本マーカー図)、[Analytical Marker Map] (分析マーカー図)、[Bubble Map] (バブル地図) のいずれかです。図 1 のコロプレス地図は、ウィザードによって生成された色分析地図です。

色分析地図かバブル地図を選択すると、分析するデータ列を選択する画面に移動します。このデータは、空間データと同じデータ セットのデータでも、別のデータセットの関連フィールドのデータでもかまいません。たとえば、州の情報を含むテーブルと、州ごとの販売合計を含むテーブルが分かれていてもかまいません。地図の形状に関するデータは shapefile、[Map Gallery] (地図ギャラリー)、または SQL Server の空間テーブルからしか取得できませんが、分析データは SQL Server Analysis Services など、任意のデータ ソースから取得できます。

分析用のデータ ソースを選択したら、最後の画面で必要に応じて、表示上共通する外観を選択できます。たとえば、バブル地図のバブルのサイズやポリゴンの色などです。また、レイヤーにラベルを表示するかどうかも選択できます。たとえば、地図が州の形状を表すポリゴンから構成されている場合は、ラベルに各州の名前を付けます。ポリゴンのサイズにラベルのテキストが収まらない場合、ラベルは表示されません。

ウィザードベースの開発では全般的に言えることですが、ウィザードでの作業は本当に必要な作業のほんの表面部分に過ぎません。コントロールの地図の部分はビューポート内に含まれます。ビューポートとは、レポート ページ上の地図に境界を設定する別のコントロールです。マップ コントロールのプロパティは、ビューポートのプロパティ、地図のプロパティ、およびレイヤーのプロパティに大別されます。これらのプロパティは、コンテキスト メニュー、または [Propeties Window] (プロパティ ウィンドウ) の詳細表示ビューで変更できます。[Propeties Window] (プロパティ ウィンドウ) に表示される一連のプロパティは、マップ コントロールのどの部分にフォーカスがあるかによって変わります。

[Map Projection] (地図投影法) はビューポートのプロパティで指定します。選択肢は、レイヤーで使用している空間列の型によって異なり、データや SRID (空間参照 ID) の影響を受けることにも留意することが重要です。最も単純なケースとして、会社の倉庫 (商品を保管する物理的な倉庫のことで、データ ウェアハウスのことではありません) のレイアウト図を考えてみましょう。まず、倉庫の大きさを計測し、間取り図を作成し、それに従って商品の配置を図面にします。この場合、図面上の距離はきわめて短く、地球が平面ではなく球体であるという事実はまったく問題になりません。したがって、計測には X 座標と Y 座標から構成される幾何学座標軸と、SQL Server の geometry データ型を使用します。この場合、ビューポートの Coordinate System (座標系) プロパティには Planar (平面) を設定します。

次に、より一般的な場合、つまり、緯度と経度によって地球上の地点を描画する場合を考えてみましょう。地図データには緯度と経度があるため、データ型には geography 型を使用します。地球 (技術上は扁球面) から平面の地図を作成するため、マップ コントロールには一連の地図投影法が用意されています。地図投影法を適切に使用するためには、geography データ型の列に SRID 4326、4269、またはマップ コントロールが対応可能な他の地球関連の SRID が用いられている必要があります。この場合は、ビューポートの Coordinate System (座標系) プロパティに Geographic (地理) を設定し、地図投影法をビューポートの Projection (投影法) プロパティ リストとして選択します。

最後に、データに投影座標系を使用している場合を考えます。このシナリオでは、SQL Server のデータ型には geography ではなく、geometry を使用します。投影情報は既にデータ型自体に含まれているため、データを投影するためにマップ コントロールが行うことは何もありません。投影座標系の一般的な SRID には、State Plane データ投影や British National Grid などがあります。この場合は、ビューポートの Coodinate System (座標系) プロパティに Planar (平面) を設定します。

geography 型の座標 (4326 から WGS84 の座標) を投影する場合を除き、マップ コントロールは異なる座標系の間で自動的に再投影を行いません。ここまで座標系について詳しく説明したのはそのためです。たとえば、Bing 地図のタイル レイヤー (geographic 型) と British National Grid 座標系のレイヤー (平面) を同じ地図上に混在させることはできません。仮に混在させても、結果は望ましいものにはならないでしょう。

SQL Server 2008 R2 Reporting Services のマップ コントロールの大きな長所は、SQL Server の空間データをさまざまな地図形式を自動的に変換して表示できる点です。ウィザードを使ってビジネス データと空間データを簡単に関連付けることができるため、プロパティを使用してさまざまなカスタマイズを行えば、必要な追加機能をすべて実現できます。個人的に気に入っている機能は、(空間データには直接関連しませんが) SQL Server Reporting Services の通常の "操作" メカニズムを使ってドリルダウンできることです。[Map Propaties] (地図のプロパティ) ダイアログ ボックスの [Action] (操作) タブを選択するだけで、世界地図上に国別売上高を表す地図を含む複数のレポートを相互にリンクし、そこから州、地域、都市へとドリルダウンできます。都市レベルでは各店舗の所在地を含む地点レイヤーを追加ことも可能です。SQL Server 2008 R2 Reporting Services のマップ コントロールで空間データを操作するための準備や方法の詳細については、Ed Katibah 氏のすばらしいブログ記事、blogs.msdn.com/edkatibah/archive/2009/05/09/cartographic-adjustment-of-spatial-data-for-sql-server-reporting-services-part-1.aspx (英語) を参照してください。

ESRI の MapIt 製品

GIS 業界で世界トップ レベルの ESRI は、2009 年度のユーザー カンファレンスで MapIt という新製品をリリースしました。MapIt は、実際には、位置情報を含む既存のビジネス データの操作を容易にする一連のコンポーネントから構成されています。この製品は、SQL Server 2008 の空間データ型を直接生成したり使用したりするため、他の ESRI ソフトウェアが必要になることはありません。

位置ベースのビジネス データとして最も一般的な例が住所データです。そのため、MapIt には住所データのジオコーディングをさまざまな形式で実行する、Spatial Data Assistant というプログラムが含まれています。Spatial Data Assistant は、住所情報のある SQL Server テーブルに Geometry という列を新たに追加し、Web ベースのサービスを呼び出すことでこの列に値を設定します。選択できるサービスは、ESRI Map Service か、Bing Maps Geocoding サービスのいずれかです。既存のデータが更新されると、該当する住所位置と同期を保つように、トリガー内でジオコーディングを使用します。このようなトリガーの例は、ESRI の MapIt サポート サイトから入手できます。

ビジネス データを他の地図レイヤーと重ねて表示する (たとえば、生徒の住所を学区から構成されるレイヤーに重ねて表示する) 場合は、SQL Server 2008 に追加の位置情報をインポートする必要があります。Spatial Data Assistant では、既存の GIS データを ESRI の shapefile 形式でインポートできます。または、オンラインで入手可能な無料の ESRI 地図データも使用できます。インポート時には、Bing の地図や ArcGIS Server で使われている投影法と一致するようにデータの投影法を変更することができます。その際、サポートする SRID のリストから特定の SRID を指定することも可能です。このインポート機能によって、インポートされるテーブル内に SQL Server の Geometry 列が作成されます。

いったんビジネス データと他の地図レイヤーのデータを SQL Server に保持すれば、独自のプログラムでこのデータを表示できます。ESRI では、リッチ Web アプリケーションや Windows ベースのアプリケーションの作成に使用できる、Silverlight と Windows Presentation Foundation (WPF) の API を無償で提供しています。これらの API で SQL Server 空間データを使用できるように、MapIt には REST ベースの Spatial Data Service が含まれています。この Spatial Data Service は、Silverlight API が使用する形式で JSON 出力や HTML 出力を生成する Web エンドポイントを 1 つ以上公開できるようにします。また、テーブルやビューを参照し、その中から geometry 列や geography 列を含むものにクエリを実行できる Spatial Data Services ディレクトリも含まれています。地図上で使用するデータを決定したら、該当するテーブルかビューの URL をSpatial Data Services ディレクトリからコピーして、API を使用するアプリケーションに貼り付けるだけです。ここで、AdventureWorks2008 データベースの顧客住所を公開する例を紹介します (図 4)。この例ではビューを指定して Spatial Data Service を使用しています。指定するビューは、Sales.vIndividualCustomerSpatial という今回作成したビューで、既存の AdventureWork2008 ビューに SpatialLocation という列を追加したものです。この地図には個人的に気に入っている機能の 1 つ、低解像度の地図で地点の集合体に集団化したコンポーネントを追加する機能が含まれています。この機能では、高い解像度の地図にドリルダウンしていくにつれ、地点の集合体が個別の地点として表示されていきます。

図 4 ビューを指定して Spatial Data Service を使用する

<!--UserControl element and namespace declarations elided for clarity -->
<Grid x:Name="LayoutRoot">
    <esri:Map x:Name="MyMap" >
        <esri:Map.Layers>
            <esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
                Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_
StreetMap_World_2D/MapServer"/>
                <esri:FeatureLayer ID="MyFeatureLayer"
                    Url="http://zmv10/SDS/databases/AdventureWorks2008/Sales.
vIndividualCustomerSpatial"
                Where="CountryRegionName = 'United States'">
                <esri:FeatureLayer.Clusterer>
                    <esri:FlareClusterer FlareBackground="#99FF0000"
                        FlareForeground="White" MaximumFlareCount="9" />
                    </esri:FeatureLayer.Clusterer>
                </esri:FeatureLayer>
            </esri:Map.Layers>
        </esri:Map>
</Grid>

上記のコードを実行すると、図 5 のような結果になります。SQL Server 2008 の空間データ レイヤーは、ArcGIS や Bing の地図の基盤地図レイヤーや、Spatial Data Assistant でインポートした他のレイヤーと混在させて使用することができます。たとえば、販売員の住所を含むレイヤーを追加すれば、顧客に対応する販売員の位置を表示できます。レイヤーにはグラフィックス向けの種類もあり、地図の操作性を高めるために、API では描画サーフェスがサポートされます。最後に、GeoRSS や KML に対応する特殊なレイヤーも ESRI のサポート Web サイトから入手できます。これらの API 機能についてはここでは詳しく説明しません。Silverlight と WPF の API の詳細については、resources.esri.com/arcgisserver/apis/silverlight/index.cfm (英語) を参照してください。


図 5 MapIt で生成した地点の集合体を表示する顧客位置の地図

Silverlight アプリケーションや WPF アプリケーションのプログラミングや管理を行わずに、SQL Server のデータを基にプロフェッショナルが作成したような地図を提供するなら、MapIt に含まれている Web パーツを使うと、プログラミング作業を行わずに SharePoint サイトに地図を追加できます。以下のソースから入手した空間データを使用できます。

  • 住所フィールドまたは緯度/経度フィールドを含む SharePoint リスト
  • Spatial Data Assistant で公開される SQL Server の空間データ
  • ArcGIS Server データ

ESRI の SharePoint Web パーツのインスタンスを編集すると、URL や SharePoint のリスト名を指定して、空間データのレイヤーをインポートすることができます。基盤となる地図には Bing の地図か ArcGIS Server を使用できます。付随するダイアログ ボックスでチェック ボックスをクリックすれば、フィルター式の指定、各地点にマウスを停止したときに追加情報を表示するポップアップ ウィンドウ (Silverlight API では MapTips と呼びます) の定義、記号論の選択、地点の集合体の追加などを行うことができます。動的に変化するデータを使用していれば、最新の情報を表示するように地図が更新されます。地図データの更新は、個別の Web パーツ レベルで設定することも、Spatial Data Service に対してグローバルに設定することも可能です。

MapPoint 2010 の SQL Server 2008 向けアドイン

MapPoint は、ビジネス用空間データの表示と位置ベースのクエリの分野におけるマイクロソフト独自の製品です。MapPoint の特長は、独自の空間レイヤーを追加できる機能や、オフライン モードで機能する複数レベルの地図情報の豊富なコレクションが付属していることです。最新バージョンの MapPoint では GPS 機能が統合されています。2009 年 8月、マイクロソフトは SQL Server の空間データに対応する MapPoint 2010 アドインを無償でリリースしました。このアドインでは、SQL Server ベースの情報のレイヤーの追加、データやレイヤーに対する空間クエリの実行、将来の改良に備えた最終成果物のディスク保存などが容易になります。保存した地図を配布する場合に、使用している SQL Server へのアクセス許可は必要ありません。

この WPF ベースのアドインは、直接 ADO.NET 接続を使用して SQL Server と対話します。[Add Layer] (レイヤーの追加) タブで SQL Server のインスタンスと空間データを含むデータベースに接続したら (図 6 参照)、レイヤーとして使用する空間列を含むテーブルを選択します。ここでは、現在の地図範囲に機能を制限したり、列のサブセットを選択したり、返されるデータを汎用化したりすることで、返されるデータ量を削減して、レイヤーの設定を高速にすることができます。また、クエリの SQL WHERE 句を指定することもできます。クエリのインターフェイスは速度が最高になるように設計されています。空間インデックスを確実に使用できるように、複雑なクエリに共通テーブル式を使うこともできます。もちろん、記号論を完全に制御するダイアログ ボックスも用意されています。


図 6 MapPoint アドインの [Add Layer] (レイヤーの追加) ダイアログ ボックス

地図上の地点のような空間機能を選択したときに表示される MapTips には、指定したテーブル内の全データが含まれます。このデータは "ライブ" データです。つまり、個別の空間機能テーブルに対応するデータを編集して、[Save] (保存) ボタンをクリックすると、更新されたデータがデータベースに保存されます。アドインに新しい機能 (空間データを含む行) を追加したり、アドインから機能を削除したりすることも可能です。

既存の空間データのレイヤーを基にクエリを調整することもできます。たとえば、私が住んでいる街区にほぼ一致する範囲に限定して学校の位置を取得したとすると、その範囲にクエリを実行して、自宅から 1 マイル以内の学校を検索できます。もちろん、取得済みのフィールドであれば他のフィールドにもクエリを実行することができます。新たなクエリを実行するたびに新たなレイヤーが追加されます。これらのレイヤーは地図を保存する前に表示/非表示を切り替えたり、調整したりすることができます。地図を保存するときに、グラフィック レイヤーだけでなく、レイヤーを生成するために使用した SQL クエリも保存されるため、データの変化に応じてレイヤーを更新できます。サブレイヤーのクエリの場合は、クエリ実行前に、生成済みの SQL がウィンドウに表示されます。ユーザーが設定可能なタイムアウト値が用意され、実行中のクエリをキャンセルすることもできます。SQL Server に直接接続していることから、操作の対話性がきわめて高くなっています。また、shapefile や MapInfo の .mif ファイルから SQL Server にデータをインポートできるユーティリティもあります。

ここで説明した製品や機能は、SQL Server の空間データの利用法を拡張する最新のテクノロジです。ほかにも、Safe Software の SQL 2008 対応 FME 製品が SQL Server Integration Services (SSIS) と統合され、SSIS ワークフロー内で空間データの ETL を可能にしています。SQL Server の次期リリースでは SQL Server Analysis Services やデータ マイニング機能とのさらなる統合が実現されることでしょう。組み込みの表示機能やサード パーティの表示サポート機能によって、位置データは単なる住所の分析のような機能を超えてその利便性が拡大され、通常のビジネス データの利用範囲が広がります。

Bob Beauchemin は、データベース指向アプリケーションの専門家およびアーキテクト、学習コースの作成者および教官、ライター、および SQLskills のデベロッパー スキル パートナーです。これまで、SQL Server、データ アクセスおよび統合のテクノロジ、およびデータベース セキュリティについてさまざまな書籍や記事を執筆しています。連絡先は bobb@sqlskills.com (英語) です。