はじめに
皆さんは、
SQL Serverと同じようには使えませんが、
Bing Spatial Data Services
Bing Spatial Data Servicesの大きな特徴として、
Bing Spatial Data Servicesは、
- Geocode Dataflow API
住所や経緯度の地理情報の含む多数のデータを、
一括でジオコーディング・ 逆ジオコーディングするAPIです。実は、 Bing Spatial Data Servicesについては、 一度第12回で紹介しています。このときは、 このGeocode Dataflow APIしかありませんでしたが、 2011年2月のアップデートにより次の2種類のAPIが追加されています。 - Data Source Management API
このData Source Management APIと次のQuery APIが、
今回のテーマとなる、 空間データのデータベースを扱うAPIです。Spatial Data Servicesではデータベースという言葉は使わず、 ユーザー (開発者) が定義およびアップロードしたデータをData Sourceと呼びます。このAPIでは、 Data Sourceの作成 (データのアップロード) や、 削除、 データ定義の参照などを行います。 - Query API
3個目は、
Data Sourceにあるデータを問い合わせるAPIです。Data Sourceの制限として、 一部のデータを更新したり削除することはできません。つまりData Sourceからデータの検索のみ行えます。このAPIによって、 ある地点から1kmに含まれるデータなどの検索ができます。位置情報を使った検索だけでなく、 別の項目 (たとえば書店名) などから検索も可能です。ただし文字列の検索の場合、 完全一致か不一致しか扱えません。
特長と制限
Bing Spatial Data Servicesのデータストアと検索サービスの特長は、
制限としては、
利用手順
Data Sourceの利用は、
- 地理情報を含んだデータの準備
- データのアップロード
(Data Sourceの作成) - データの検索
またサービスの利用には、
Bing Maps Keyについて、
データの準備
それではData Sourceの元となるデータを準備します。ここではData Sourceを構成するデータの定義と実データを、
サンプルデータ
書店を題材にしてみましょう。書店は次のような情報
- 店名
- 住所
- 電話番号
実際のデータは次のような感じになります。
ほげほげ書店, 名古屋県○○区, 052-XXX-XXXX
ぴよぴよ書房, 名古屋県□□区, 052-YYY-YYYY
ふがふが堂, 名古屋県△△区, 052-ZZZ-ZZZZ
ひとつのデータには必ず、
001, 34.98261, 136.79583, ほげほげ書店, 名古屋県○○区, 052-XXX-XXXX
002, 34.97023, 136.69696, ぴよぴよ書房, 名古屋県□□区, 052-YYY-YYYY
003, 34.89705, 136.74502, ふがふが堂, 名古屋県△△区, 052-ZZZ-ZZZZ
プロパティの定義
これらのデータに、
- 英数字とアンダースコア
(_) を使用 - 最大50文字
- 先頭の文字は数字以外
- 2文字のアンダースコア
(__) で始まる名前は禁止 - 大文字・
小文字は区別しない
また、
プロパティに使用できるデータ型は、
データ型 | OData Type | ひとつのデータに使用できる個数 |
---|---|---|
文字列 | Edm. | 50 |
整数 | Edm. | 20 |
論理 | Edm. | 40 |
実数 | Edm. | 20 |
日時 | Edm. | 5 |
今回のデータでは、
名前 | データ型 | 説明 |
---|---|---|
ID | Edm. | ID |
Latitude | Edm. | 緯度 |
Longitude | Edm. | 経度 |
Name | Edm. | 店名 |
Address | Edm. | 住所 |
Tel | Edm. | 電話番号 |
ちなみに、
ファイルの書式
データは、
今回は、
まずファイルの1行目に、
Bing Spatial Data Services, 1.0, Bookstores
2行目は、
ID(Edm.String,primaryKey)|Latitude(Edm.Double)|Longitude(Edm.Double)|Name(Edm.String)|Address(Edm.String)|Tel(Edm.String)
3行目以降には実際のデータを記述します。最終的には以下の内容のテキストファイルができます。
Bing Spatial Data Services, 1.0, Bookstores
ID(Edm.String,primaryKey)|Latitude(Edm.Double)|Longitude(Edm.Double)|Name(Edm.String)|Address(Edm.String)|Tel(Edm.String)
001|34.98261|136.79583|ほげほげ書店|名古屋県○○区|052-XXX-XXXX
002|34.97023|136.69696|ぴよぴよ書房|名古屋県□□区|052-YYY-YYYY
003|34.89705|136.74502|ふがふが堂|名古屋県△△区|052-ZZZ-ZZZZ
以上でアップロードするデータの準備ができました。
データのアップロード
次は用意したテキストファイルをData Source Management APIを利用してサーバーへアップロードします。アップロードしてすぐにData Sourceが作成されるわけではなく、
リクエスト
Data Sourceの作成
- http://
spatial. virtualearth. net/ REST/ v1/ Dataflows/ LoadDataSource?
dataSourceName=dataSourceName&
loadOperation=complete&
input=pipe&
output=json&
key=masterKey&
queryKey=queryKey
URLのパラメーターの内容は次の通りです。
名前 | 説明 |
---|---|
dataSourceName | Data Source名 50文字以下 次の記号は使えません *?"<>:|\\ |
loadOperation | complete を指定 Data Source内のすべてのデータを新しいデータに置き換えます |
input | 入力形式 次のいずれか xml, csv, tab, pipe |
output | レスポンスの形式 xmlまたは json |
key | マスターキーとなるBing Maps Key |
queryKey | クエリーキーとなるBing Maps Key オプションですが指定推奨です |
HTTPリクエストヘッダーのContent-typeの値は、
- application/
xml - text/
xml - text/
plain - application/
octet-stream
POSTデータに含めるのではなく、
レスポンス
アップロードにより、
{
"authenticationResultCode": "ValidCredentials",
"brandLogoUri": "http://spatial.virtualearth.net/Branding/logo_powered_by.png",
"copyright": "Copyright c 2011 Microsoft and its suppliers. (省略)",
"resourceSets": [
{
"estimatedTotal": 1,
"resources": [
{
"__type": "DataflowJob:http://schemas.microsoft.com/search/local/ws/rest/v1",
"createdDate": "Wed, 08 Jun 2011 17:29:46 GMT",
"failedEntityCount": 0,
"id": "XXX",
"links": [
{
"role": "self",
"url": "https://spatial.virtualearth.net/REST/v1/dataflows/LoadDataSource/XXX"
}
],
"processedEntityCount": 0,
"status": "Pending",
"totalEntityCount": 0
}
]
}
],
"statusCode": 201,
"statusDescription": "Created",
"traceId": "…"
}
レスポンス中の、
また、
- https://
spatial. virtualearth. net/ REST/ v1/ dataflows/ LoadDataSource/JobID?
key=masterKey
ジョブの状態を確認するには、
既に述べたようにリクエスト方法やレスポンスの内容は、
サンプルコード
データをアップロードするC#のサンプルコードを示します。Visual C# 2010 ExpressやVisual Studio 2010からC#のコンソールアプリケーション プロジェクトを作成し、
var file = @"C:\Users\Owner\Documents\bookstores.txt"; // 準備したデータのテキストファイル
var name = "GihyoSample"; // Data Source 名
var masterKey = "MasterKey"; // マスターキー用の Bing Maps Key
var queryKey = "QueryKey"; // クエリーキー用の Bing Maps Key
var url = string.Format("http://spatial.virtualearth.net/REST/v1/Dataflows/LoadDataSource?dataSourceName={0}&loadOperation=complete&input=pipe&output=json&key={1}&queryKey={2}",
name, masterKey, queryKey);
using (var reader = new System.IO.StreamReader(file, System.Text.Encoding.UTF8))
{
using (var client = new System.Net.WebClient())
{
client.Encoding = System.Text.Encoding.UTF8;
client.Headers[System.Net.HttpRequestHeader.ContentType] = "text/plain";
var response = client.UploadString(url, reader.ReadToEnd());
Console.WriteLine(response); // レスポンスの表示
}
}
実行すると、
データの検索
データをアップロードし、
リクエストとレスポンス
データの検索は、
- http://
spatial. virtualearth. net/ REST/ v1/ data/accessId/dataSourceName/entityTypeName?
spatialFilter=nearby(latitude,longitude,distance)&
queryoption1&
queryoption2&
:
queryoptionN&
jsonp=jsonCallBackFunction&
jsonso=jsonState&
key=queryKey
URLのパラメーターは次の通りです。
名前 | 説明 |
---|---|
accessId | Data SourceのID |
dataSourceName | Data Source名 |
entityTypeName | Data Sourceのエンティティの種類の名前 |
spatialFilter | 地理情報による検索範囲の指定 |
queryoption1, 2, …N | クエリーのオプション 取得する形式や項目、 |
jsonp | JSONP形式で取得する場合、 例:jsonp=MyCallbackFunction |
jsonso | jsonp使用時に任意のデータを指定。コールバック関数の第2引数の値になる 例:jsons |
queryKey | クエリーキーに指定したBing Maps Key |
URLのパスの、
レスポンスで得られるデータは、
{
"d": {
"__copyright": "© 2011 Microsoft and its suppliers. (省略)",
"results": [
{
"Address": "名古屋県△△区",
"ID": "003",
"Latitude": 34.89705,
"Longitude": 136.74502000000001,
"Name": "ふがふが堂",
"Tel": "052-ZZZ-ZZZZ",
"__metadata": {
"uri": "https://spatial.virtualearth.net/REST/v1/data/XXX/GihyoSample/Bookstores('003')"
}
}
]
}
}
Atom形式の場合は次のような内容になります。
<feed xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">
</title>
<id>...</id>
<rights type="text">
© 2011 Microsoft and its suppliers.(省略)
</rights>
<updated>
2011-06-12T19:45:13Z
</updated>
<entry>
<id>
https://spatial.virtualearth.net/REST/v1/data/xxx/GihyoSample/Bookstores('003')
</id>
<title type="text">
</title>
<updated>
2011-06-12T19:45:13Z
</updated>
<content type="application/xml">
<m:properties>
<d:id>
003
</d:id>
<d:latitude m:type="Edm.Double">
34.897050
</d:latitude>
<d:longitude m:type="Edm.Double">
136.745020
</d:longitude>
<d:name>
ふがふが堂
</d:name>
<d:address>
名古屋県△△区
</d:address>
<d:tel>
052-ZZZ-ZZZZ
</d:tel>
</m:properties>
</content>
</entry>
</feed>
今回は割愛しますが、
続いて、
Access ID
accessId
ひとつは、
もうひとつは、
- http://
spatial. virtualearth. net/ REST/ v1/ data?
$format=json&
key=BingMapsKey
URLのパラメーターは次の通りです。
名前 | 説明 |
---|---|
$format | 取得する形式 atom |
key | マスターキーまたはクエリーキーに指定したBing Maps Key |
Atom
<?xml version='1.0' encoding='utf-8'?>
<app:service xmlns:app="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:bsi="http://schemas.microsoft.com/bing/spatial/2010/11/odata">
<bsi:copyright>
© 2011 Microsoft and its suppliers. (省略)
</bsi:copyright>
<app:workspace bsi:updated="2011-06-08T17:29:46Z">
<atom:title>
GihyoSample
</atom:title>
<app:collection app:href="https://spatial.virtualearth.net/REST/v1/data/XXX/GihyoSample/Bookstores">
<atom:title>
Bookstores
</atom:title>
</app:collection>
</app:workspace>
</app:service>
<app:workspace>要素内に、
地理情報による検索条件の指定
次は、
- spatialFilter=nearby(34.
9,136. 7,5. 0)
4点の東西南北の経緯度で指定した領域に含まれるデータを取得するには、
- spatialFilter=bbox(34.
9,136. 7,35. 0,136. 8)
クエリーオプションの指定
queryoptionNパラメーターは、
- 取得するデータ形式
$formatパラメーターで取得するデータ形式を指定できます。XML
(Atom)・ JSON形式のいずれかです。 - $format=json
規定の値はatomです。
- プロパティの選択
規定では結果に、
すべてのプロパティが含まれています。取得するプロパティを選択するには$selectパラメーターを使用して、 プロパティ名をカンマ区切りで指定します。 - $select=Name,Address
- 取得件数とオフセットの指定
$skipと$topパラメーターを使用して、
取得データの件数と位置を指定します。 - $skip=0&$top=10 … (データの1〜10件を取得)
- $skip=10&$top=10 … (データの11〜20件目を取得)
その他のクエリーオプションは、
サンプルコード
最後に、

データのアップロードサンプルと同じくC#のコンソールアプリケーションです。
// MEMO: using System.Xml.Linq; を追加すること
static void Main(string[] args)
{
var dataSrouceName = "GihyoSample";
var entityTypeName = "BookStores";
var accessId = "AccessID";
var queryKey = "QueryKey";
var spatialFilter = "nearby(34.9,136.7,5.0)";
var url = string.Format("http://spatial.virtualearth.net/REST/v1/data/{0}/{1}/{2}?$format=atom&key={3}&spatialFilter={4}", accessId, dataSrouceName, entityTypeName, queryKey, spatialFilter);
XNamespace a = "http://www.w3.org/2005/Atom";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
var doc = XDocument.Load(url);
foreach (var entry in doc.Element(a + "feed").Elements(a + "entry"))
{
var props = entry.Element(a + "content").Element(m + "properties");
Console.WriteLine(string.Format("{0}, {1}", props.Element(d + "Name").Value, props.Element(d + "Address").Value));
}
}
データはC#で扱いやすいAtom形式を指定しています。コードでは結果の書店名と住所を表示しています。
今回はここまでです。いかがでしたか。次回はData Source Management APIとQuery APIについてもう少し紹介して、