使ってみよう! Bing API/SDK

第10回使ってみよう! Bing Maps REST Services(2)

Imagery API

前回はBing Maps REST ServicesのLocation APIを紹介しました。今回は同じくREST ServicesのひとつImagery APIについてです。Imagery APIを利用すると、大きく分けて次のふたつのことができます。

  • 地図画像の取得
  • メタデータの取得

ひとつ目の地図画像の取得では、指定した地域の画像をJPEGやPNG形式で取得でき、Blogなどに貼り付けて使えます。また、プッシュピンの描画などもできます。ふたつ目のメタデータの取得とは、Bing Mapsを構成するタイル状の画像の情報の取得です。

Imagery APIは日本・日本語に対応していませんが、日本のサービス向けにも利用できると思われる部分を中心に紹介します。

画像の取得

場所の指定

それでは画像の取得方法からみていきましょう。地図の一部分を画像として切り出すわけですが、取得する場所の指定は次の方法が用意されています。

  • 画像の中心となる経緯度とズームレベルの指定
  • 2点の経緯度で表示エリアの指定
  • ルートの指定
  • クエリーの指定

上記の最初のふたつは、経緯度を指定するものです。

ルートの指定では、複数の地点を経緯度や住所で指定すると車または徒歩での経路情報を表示するのに最適な範囲の地図が得られます。ただし日本の場合、結果は得られますがルート情報としてはあまり有用とはいえません。また日本語での場所指定もできません。

クエリーの指定では、住所や建物名などを指定し、その地域を表すのに最適な範囲の地図が得られます。ただしこちらも日本語がサポートされていませんので日本語や詳細な住所では結果を得られません。

以上より、今のところ日本での利用は経緯度指定によるものが使えそうです。地図画像は日本語表記のものが得られます。また、クエリーの指定について、Imagery APIは日本語対応していませんが、前回のLocation APIは対応していますので、Location APIから得られた経緯度をImagery APIで利用する組み合わせが可能です。

場所の指定方法にもよりますが、地図画像に対して主に次の操作ができます。

  • プッシュピンの描画
  • ルートの描画
  • 大きさの指定

リクエストURLの書式

以上をふまえて、画像を取得するためのURLの書式とそのパラメーターをみていきましょう。

画像を取得するURL書式は以下のようになります(青字が値を指定する箇所です⁠⁠。

  • http://dev.virtualearth.net/REST/version/Imagery/Map/imagerySet/centerPoint/zoomLevel/Routes/travelMode?
      mapArea=mapArea&
      waypoint.1=routeWaypoint1&
      waypoint.2=routeWaypoint2&
      waypoint.n=routeWaypointn&
      avoid=avoidOptions&
      mapSize=mapSize&
      pushpin=pushpin&
      mapLayer=mapLayer&
      key=BingMapsKey

パラメーターが多いですがすべて使用するわけではなく、場所の指定方法に合わせて選択または組み合わせて使います。たとえば、ルートを指定して画像の中心場所を指定するなどが可能です。

クエリーを指定する場合は次の書式になります。

  • http://dev.virtualearth.net/REST/version/Imagery/Map/imagerySet/query?
      mapSize=mapSize&
      mapLayer=mapLayer&
      key=BingMapsKey

前回も述べたようにBing Maps REST Servicesは下記の共通のURLの書式に従っています(HTTPSもサポートしています⁠⁠。Imagery APIの場合、restApi部分がImageryになっています。

  • http://dev.virtualearth.net/REST/version/restApi/resourcePath?queryParameters&key=BingMapsKey

Imagery APIの各パラメーターは次の通りです。versionBingMapsKeyについては前回説明しています。⁠v1」とBing Maps Keyを指定します。

パラメーター(省略名) 説明
centerPoint 画像の中心となる緯度と経度をカンマ区切りで指定
例:35.68918461,139.69163358
imagerySet 地図の種類(必須)
  • Aerial:航空写真
  • AerialWithLabels:航空写真に道路地図を重ねた地図
  • Road:道路地図
mapArea(ma) エリアを示す2点の経緯度
例:ma=35.686481,139.68893,35.691888193,139.694337
mapSize(ms) 取得する画像の大きさ
縦、横のピクセル数をカンマ区切りで指定
横幅は80~900、縦幅は80~834の範囲内で指定
規定値は350x350
例:ms=720,330
pushpin(pp) 地図にプッシュピンを描画
プッシュピンの経緯度、種類番号、ピンに表示する文字列をセミコロン区切りで指定
最大18個まで指定可能
例:pp=35.68918461,139.69163358;14;TK
waypoint.n(wp.n ルートの始点・終点・中継点を経緯度または住所や建物名で指定
nの部分は0または1から1ずつインクリメントとした値を順番に2点以上を指定
ルート指定形式の場合必須
例:wp.1=Tokyo&wp.2=Kyoto
zoomLevel ズームレベルを1(世界地図⁠⁠~22の範囲の整数で指定
query 住所や建物名を指定(英語のみ)

場所を特定できる、centerPointzoomLevel, mapArea, waypoint.nのいずれかは必須のパラメーターです。当然ながらクエリー形式指定の場合、queryパラメーターは必須です。

少し重要度の低いルート指定関連のパラメーターを次にまとめています。いずれのパラメーターも省略可です。

パラメーター(省略名) 説明
avoid 経路探索時、高速道路や有料道路を使用しない、または最小限に抑えるよう指示するためのオプションです。
以下の値を指定
  • highways
  • tolls
  • minimizeHighways
  • minimizeTolls
値はカンマ区切りで指定可能
例:avoid=highways,tolls
mapLayer(ml) 値TrafficFlowのみ設定可能で交通情報を表示
例: mapLayer=TrafficFlow
optimize(optmz) 以下の値を指定
  • distance:最短距離経路優先
  • time:最短時間経路優先(規定値)
  • timeWithTraffic:交通情報を考慮した最短時間経路優先
travelMode 車または徒歩の経路かを指定
  • Driving:車(規定値)
  • Walking:徒歩

URL書式をみるとcenterPointとzoomLevelは、URLのパス部分にあります。ルートについても各地点の指定はクエリー部分(⁠⁠?」以降)にありますが、ルート指定時はパスにRoutesを指定します。クエリー指定時も場所を示すクエリーはパス部分に記述します。エリアのみクエリー部分で表現されていることがわかります。

中心の経緯度とズームレベルだけを指定する場合は、⁠/Routes/travelMode」を省略し次のようにパスを構成します。

  • /REST/version/Imagery/Map/imagerySet/centerPoint/zoomLevel

ルートのみ指定する場合は、/centerPoint/zoomLevel部分を省略し次のようにパスを構成します。

  • /REST/version/Imagery/Map/imagerySet/Routes/travelMode

さらにtravelModeを省略すると次のようになります。

  • /REST/version/Imagery/Map/imagerySet/Routes

いずれも指定する順番は変更せずに必要ない部分を省略します。URLの「?」以降のクエリー部分は順不同です。次の実際の例を見て確認してみましょう。

画像取得の例

実際に取得した画像をみてみましょう。中心となる経緯度とズームレベルの指定した場合は図1のようになります。

  • http://dev.virtualearth.net/REST/v1/Imagery/Map/AerialWithLabels/35.689184611,139.691633583/17?
      key=BingMapsKey
図1 中心の経緯度とズームレベルの指定
図1 中心の経緯度とズームレベルの指定

エリアを示す2点の経緯度を指定した場合は図2のようになります。

  • http://dev.virtualearth.net/REST/v1/Imagery/Map/AerialWithLabels?
      mapArea=35.686481029111,139.68893000133298,35.691888193111005,139.694337165333&
      key=BingMapsKey
図2 エリアを示す2点の経緯度を指定
図2 エリアを示す2点の経緯度を指定

ルートの指定は図3のようになります。各地点にはフラッグ形式のプッシュピンが描画されます。

  • http://dev.virtualearth.net/REST/v1/Imagery/Map/Road/Routes/Driving?
      waypoint.1=Tokyo&
      waypoint.2=Kyoto&
      key=BingMapsKey
図3 ルートの指定
図3 ルートの指定

クエリーの指定は次のようになります。クエリーが示す地点には図4のようなプッシュピンが描画されます。

  • http://dev.virtualearth.net/REST/v1/Imagery/Map/Road/Tokyo?
      key=BingMapsKey
図4 クエリーの指定
図4 クエリーの指定

次はプッシュピンを描画した場合です。経緯度とズームレベルを指定した地図の3か所にプッシュピンを描画しています。図5のように一応、プッシュピンに日本語の表示も可能です。

  • http://dev.virtualearth.net/REST/v1/Imagery/Map/Road/35.689184611,139.691633583/8?&
      pp=35.68955124,139.6918197;34;%E6%9D%B1&
      pp=35.856954163889,139.648881555556;36;%E5%9F%BC&
      pp=35.605059852778,140.123322944444;36;%E5%8D%83&
      key=BingMapsKey
図5 プッシュピンの描画
図5 プッシュピンの描画

プッシュピンの種類や表示する文字列は「pp=35,139」「pp=35,139;;A」のように省略可能です。指定できる種類の番号は0から36まで用意されています。詳しくはMSDN Libraryからダウンロードできる文書を参照してください。

次はルートを描画した場合です。

  • http://dev.virtualearth.net/REST/v1/Imagery/Map/Aerial/Routes?
      mapArea=35.5,139,35.9,139.8&
      wp.0=35.68955124,139.6918197&
      wp.1=35.020907305556,135.755329916667&
      key=BingMapsKey
図6 ルートの描画
図6 ルートの描画

いずれの場所の指定方法でも、次のように画像の大きさを指定できます。

  • http://dev.virtualearth.net/REST/V1/Imagery/Map/Road?
      mapArea=37.317227,-122.318439,37.939081,-122.194565&
      ml=TrafficFlow&
      ms=200,200&
      key=BingMapsKey
図7 大きさの指定
図7 大きさの指定

上図は交通情報も表示しています。交通情報なしの場合は下図のようになります。

図8 大きさの指定(交通情報なし)
図8 大きさの指定(交通情報なし)

メタデータの取得

次はメタデータの取得です。Bing Mapsの地図は256x256ピクセルの画像をタイル状に並べて構成されています。Imagery APIを利用すると、そのタイル構成などの情報が得られます。指定した経緯度とズームレベルの地点を含むタイル画像のURLが取得可能で、主にこのために利用すると考えてよいでしょう。

URLの書式

メタデータ取得のURL書式には次の通りです。

  • http://dev.virtualearth.net/REST/version/Imagery/Metadata/imagerySet/centerPoint?
      orientation=orientation&
      zoomLevel=zoomLevel&
      include=ImageryProviders&
      key=BingMapsKey

そして、各パラメーターは次の通りです。

パラメーター(省略名) 説明
imagerySet 地図の種類
  • Aerial:航空写真
  • AerialWithLabels:航空写真に道路地図を表示した地図
  • Road:道路地図
  • Birdseye:概観図
  • BirdseyeWithLabels:道路地図を表示した概観図
centerPoint 緯度と経度をカンマ区切りで指定
orientation(incl) 視点を0~360度の実数で指定
0:北, 90:東, 180:南, 270:西
概観図を指定した場合に有効
include(dir) 値ImageryProvidersのみ設定可能
指定した場合、メタデータにタイル画像の提供元が含まれます。
zoomLevel(zl) ズームレベル

メタデータの取得では、Bird's eyeと呼ばれる概観図の情報も取得可能です。その場合、imagerySetパラメーターには、BirdseyeまたはBirdseyeWithLabelsを指定します。

経緯度とズームレベルは省略可能で、その場合は指定した地図の種類に関する情報が得られます。ただし、概観図は必ず経緯度・ズームレベルの指定が必要です。そのため、経緯度・ズームレベルを指定しないパターンは、imagerySetパラメーターにAerialAerialWithLabelsRoadのいずれかを指定した3パターンのみです。

メタデータの取得例

実際にメタデータを取得してみましょう。特定の場所を指定しない場合は次のようになります。この例はAerial(航空写真)を指定した場合です。

航空写真のメタデータ

  • http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?
      key=BingMapsKey&o=xml

リクエスト結果をみる[1]

次は経緯度を指定した場合です。

指定した経緯度が含まれるタイル画像情報

  • http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/35.689184611,139.691633583?
      zoomLevel=19&
      key=BingMapsKey&o=xml

リクエスト結果をみる

次は地図の種類に概観図を指定した場合です。

概観図のタイル画像情報

  • http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Birdseye/35.689184611,139.691633583?
      orientation=90&
      zoomLevel=19&
      key=BingMapsKey&o=xml

リクエスト結果をみる

リクエスト結果の各値については、次のレスポンス内容で説明します。

レスポンス内容

画像取得のレスポンス

画像の取得の場合、レスポンスはJPEG・PNG・GIF形式のいずれかの画像となります。これらの形式の選択はできません。Bing Maps Keyやパラメーターの誤りはHTTPのステータスコードで判断するしかありません(具体的なパラメーターの誤りはわかりません⁠⁠。

メタデータ取得のレスポンス

メタデータ取得の場合、XMLまたはJSON形式でレスポンスが返ってきます。レスポンス内容の構造はBing Maps REST Servicesで共通になっています。共通の構造は前回の内容を参照してください。ここではメタデータ特有の部分の内容を説明します(<Resources>要素以下の内容⁠⁠。

メタデータの取得で得られるJSON・XML形式の内容は次のような内容になっています。

航空写真のメタデータ

JSON
{
    "__type": "ImageryMetadata:http://schemas.microsoft.com/search/local/ws/rest/v1", 
    "imageHeight": 256, 
    "imageUrl": "http://{subdomain}.tiles.virtualearth.net/tiles/a{quadkey}.jpeg?g=580&mkt={culture}&token={token}", 
    "imageUrlSubdomains": [
        "t0", 
        "t1", 
        "t2", 
        "t3"
    ], 
    "imageWidth": 256, 
    "imageryProviders": null, 
    "vintageEnd": null, 
    "vintageStart": null, 
    "zoomMax": 19, 
    "zoomMin": 1
}
XML
<ImageryMetadata>
        <ImageUrl>http://{subdomain}.tiles.virtualearth.net/tiles/a{quadkey}.jpeg?g=580&mkt={culture}&token={token}</ImageUrl>
        <ImageUrlSubdomains>
                <string>t0</string>
                <string>t1</string>
                <string>t2</string>
                <string>t3</string>
        </ImageUrlSubdomains>
        <ImageWidth>256</ImageWidth>
        <ImageHeight>256</ImageHeight>
        <ZoomMin>1</ZoomMin>
        <ZoomMax>19</ZoomMax>
</ImageryMetadata>

指定した経緯度が含まれるタイル画像情報

JSON
{
    "__type": "ImageryMetadata:http://schemas.microsoft.com/search/local/ws/rest/v1", 
    "imageHeight": 256, 
    "imageUrl": "http://t0.tiles.virtualearth.net/tiles/a1330021123012310220.jpeg?g=580&mkt={culture}&token={token}", 
    "imageUrlSubdomains": null, 
    "imageWidth": 256, 
    "imageryProviders": null, 
    "vintageEnd": "05 Apr 2007 GMT", 
    "vintageStart": "05 Apr 2007 GMT", 
    "zoomMax": 19, 
    "zoomMin": 19
}
XML
<ImageryMetadata>
        <ImageUrl>http://t0.tiles.virtualearth.net/tiles/a1330021123012310220.jpeg?g=580&mkt={culture}&token={token}</ImageUrl>
        <ImageWidth>256</ImageWidth>
        <ImageHeight>256</ImageHeight>
        <ZoomMin>19</ZoomMin>
        <ZoomMax>19</ZoomMax>
        <VintageStart>2007-04-05</VintageStart>
        <VintageEnd>2007-04-05</VintageEnd>
</ImageryMetadata>

各要素の内容は以下の通りです。XMLとJSON形式では大文字小文字などが異なりますが、適宜読み替えてください。

要素名 説明
ImageUrl タイル画像のURLの書式
imageUrlSubdomains タイル画像URLのサブドメインの値
ImageWidth タイル画像の横幅(ピクセル)
ImageHeight タイル画像の縦幅(ピクセル)
VintageStart タイル画像の登録日
VintageEnd タイル画像の最新の更新日
ZoomMin 利用可能な最小のズームレベル
ZoomMax 利用可能な最大のズームレベル

次の要素は概観図にのみ含まれる内容です。

要素名 説明
Orientation 視点(0~360度)
TilesX 水平方向のタイル数
TilesY 垂直方向のタイル数

次に、メタデータのこれらの値を使用してタイル画像のURLを求めてみましょう。

タイル画像

タイル画像を得るには、メタデータのImageUrl要素の値を使用します。URLの{quadkey}{culture}部分に適切な値を指定することでタイル画像のURLを作成します。

航空写真のメタデータのImageUrl要素の値は次のようになっています。

  • http://{subdomain}.tiles.virtualearth.net/tiles/a{quadkey}.jpeg?g=580&mkt={culture}&token={token}

経緯度を指定した場合に得られるURLにも{culture}などの文字列が含まれています。URL内に登場するこれらの値は次の通りです。

{subdomain}

{subdomain}は、負荷分散のため使用されているサブドメイン名です。t0やt1などImageUrlSubdomains要素の値のいずれかを指定します。

{quadkey}

{quadkey}は、QuadKeysと呼ばれるタイルの番号です。指定した経緯度が含まれるタイル画像情報を取得した場合、この{quadkey}部分には「1330021123012310220」のように値が格納されています。

QuadKeysは、タイルの地図上の位置とズームレベルによって決まります。Bing Mapsの場合、ズームレベルが1のとき図9のように2x2のタイルで構成されています。ズームレベルが1あがると1枚のタイルで表現されていた領域が2x2の4枚で表現されるようになります。

図9 タイル構成とQuadKeys
図9 タイル構成とQuadKeys

QuadKeysを求めるには、まずタイルの位置をXとYの座標で表します。図10のように横軸をX、縦軸をYとし、左上の座標を(0,0)とします。

図10 タイルの座標
図10 タイルの座標

上図の場合はズームレベルが3の場合です。座標(3,5)のQuadKyesは次のように求めます。

  1. X=3, Y=5 をズームレベルと同じ桁数の2進数で表現
    • X = 011
    • Y = 101
  2. 求めた2進数の値を合わせて4進数で表現
    (011101)2 = (213)4

求めた4進数の値、213がQuadKeysです。図9の値と一致していますね。このように求めたQuadKeysは、1段階前のズームレベルでの値に0~3が付いて表現される特徴があります。

ちなみに、QuadKeysを含む画像ファイル名は、⁠a1330021123012310220.jpeg」のようになり、先頭のアルファベットは、r, a, hのいずれかになり、道路地図・航空写真・航空写真+道路地図で異なっています。

{culture}

{culture}には、サービス地域を指定します。日本の場合はja-JP、米国の場合はen-USです。

{token}

{token}は、API利用者には必要のない値です。値を指定する必要はありません。

{tileId}

{tileId}は、概観図で使用するタイル番号です。概観図の場合、QuadKeysの規則に従って番号が付いていません。メタデータ取得時に指定した経緯度の概観図のタイルは、図11のようにTilesXとTilesY要素の値のタイル数で構成されています。左上から行と列に順に0から付けられている値がタイル番号です。

図11 概観図のタイル構成
図11 概観図のタイル構成

以上が、タイルのURL書式の内容と、タイルの構成についてでした。この内容から特定の地点のタイル画像の取得が可能になったかと思います。

おわりに

今回はここまでです。いかがでしたでしょうか。特にメタデータの取得は、使い方によってはおもしろい利用方法があるかもしれません。今回のImagery APIが利用されていたわけではありませんが、タイル画像を利用して、Silverlight版のBing Mapsがリリースされる以前から、SilverlightのDeep Zoom機能を利用して地図コントロールを作成しているオープンソースプロジェクトもありましたDeepEarth⁠。また、Google Mapsのタイル構成と似ているため、Google MapsとBing Mapsを組み合わせたサービスやアプリケーションも可能かもしれません。おもしろいアイデアが思い付いた方は、ぜひサービス作成にトライしてみてください。

次回もBing Maps REST Servicesを紹介予定です。

おすすめ記事

記事・ニュース一覧