Azure Cosmos DB for NoSQL の地理空間データと GeoJSON 位置データ

適用対象: NoSQL

Azure Cosmos DB for NoSQL には、マップ上の幾何学的図形または実際の場所/ポリゴンを表す組み込みの地理空間機能があります。

地理空間データには、多くの場合、近接クエリが含まれます。 たとえば、"自分の現在の場所の近くにあるすべての小売店の場所を見つける" という質問には、複数の地理空間データ オブジェクトに対する近接クエリを使用して回答が与えられます。

一般的な地理空間のユース ケースには次が含まれますが、これらに限定されません。

  • 位置情報分析。特定の場所ベースのマーケティング イニシアチブを促進します。
  • 場所ベースのパーソナル化。小売や医療などの業界がユーザー エクスペリエンスを向上させるためのものです。
  • 物流の強化。最適化が重要な輸送などの業界向けです。
  • リスク分析。保険や金融などの業界が他のメタデータを補完するためのものです。
  • 状況認識*。近接ベースのアラートと通知向けです。

空間データの概要

空間データは、物体の空間における位置と形状を表現します。 ほとんどのアプリケーションで、これらのポイントやシェイプは、地球上の物体や地理空間データに対応します。 空間データを使用することで、人物の位置や、関心のある場所、都市や湖の境界を表現することができます。

Azure Cosmos DB for NoSQL では、geometry データ型と geography データ型の 2 つの空間データ型がサポートされています。

  • geometry 型は、ユークリッド (平面) 座標系のデータを表します。 この型は、線の測定、ポリゴンの交差、ポイント間の距離の測定などの一般的な幾何学的タスクに役立ちます。
  • geography 型は、球体地球座標系のデータを表します。 この型は、場所が特定の境界内にあるかどうかを判断したり、場所間の距離を測定したりといった一般的な地理的タスクに役立ちます。

サポートされるデータ型

Azure Cosmos DB for NoSQL では、GeoJSON 仕様を使用して表現された地理空間ポイント データのインデックス付けとクエリ実行がサポートされています。 GeoJSON データの構造は常に有効な JSON オブジェクトであるため、特殊なツールやライブラリがなくても、Azure Cosmos DB を使って保存とクエリを実行できます。

Azure Cosmos DB では、次の空間データ型がサポートされます。

  • Point
  • LineString
  • Polygon
  • MultiPolygon

ポイント

Point は、空間における一点の位置を表します。 スーパーやキオスクの所在地、自動車、都市などの位置は、地理空間データにおけるポイントによって正確に表されます。 GeoJSON (と Azure Cosmos DB for NOSQL) では、ポイントがその座標ペア (経度緯度) を使用して表されます。

次の GeoJSON ポイントの例について考えてみましょう。 経度は -122.12826822304672 で、緯度は 47.63980239335718 です。

{
  "type": "Point",
  "coordinates": [
    -122.12826822304672,
    47.63980239335718
  ]
}

ヒント

geography データ型の場合、GeoJSON 仕様では、最初に経度、次に緯度と指定されています。 他の地図作成アプリケーションと同様、経度と緯度は角度であり、度 (°) の単位で表されます。 経度値はグリニッジ子午線を基準に測られ、-180 度から 180.0 度の間となり、緯度値は赤道を基準に測られ、-90.0 度から 90.0 度の間となります。

geometry データ型の場合、GeoJSON の仕様では、まず水平軸が指定され、次に垂直軸が指定されます。

空間データ型は、この GeoJSON データを含むファシリティ項目の例に示すように、項目内に埋め込むことができます。

{
  "name": "Headquarters",
  "location": {
    "type": "Point",
    "coordinates": [
      -122.12826822304672,
      47.63980239335718
    ]
  },
  "category": "business-offices"
}

Azure Cosmos DB for NoSQL は座標を WGS-84 参照系に従って表されているものとして解釈します。 詳細については、「座標の参照系」を参照してください。

LineStrings

LineString は、空間における一連の複数のポイントとそれらをつなぐ線分を表します。 地理空間データでは、幹線道路や川を表すために LineString がよく使用されます。

この例では、2 つのポイント間に描画される線を表すために、ライン ストリングを使用します。

{
  "type": "LineString",
  "coordinates": [
    [ 31.8, -5 ],
    [ 31.8, -4.7 ]
  ]
}

多角形

接続されたポイントが LineString を形成し、それによって囲まれた境界が Polygon となります。 ポリゴンは通常、湖や行政区 (市区町村、都道府県など) など、自然な形状を表す目的で使用されます。

Polygon 内のポイントは、反時計回りに指定する必要があります。 時計回りに指定された Polygon は、その中の領域を逆にしたものを表します。

この例では、複数のポイントを接続することでポリゴンを作成します。

{
    "type":"Polygon",
    "coordinates":[ [
        [ 31.8, -5 ],
        [ 32, -5 ],
        [ 32, -4.7 ],
        [ 31.8, -4.7 ],
        [ 31.8, -5 ]
    ] ]
}

ヒント

GeoJSON 仕様では、最後に指定された座標ペアが、最初に指定された座標ペアとちょうど重なり、閉じた形状になっていることが、有効な Polygon の条件となります。

MultiPolygon

MultiPolygon は、0 個以上の多角形の配列です。 MultiPolygon は辺を重ねたり、共通の領域を持つことはできません。 1 つ以上の点で接することはできます。

MultiPolygon の例を次に示します。

{
    "type":"MultiPolygon",
    "coordinates":[[[
            [52.0, 12.0],
            [53.0, 12.0],
            [53.0, 13.0],
            [52.0, 13.0],
            [52.0, 12.0]
        ]],
        [[
            [50.0, 0.0],
            [51.0, 0.0],
            [51.0, 5.0],
            [50.0, 5.0],
            [50.0, 0.0]
        ]]]
}

座標参照系

地球の形状は不規則であるため、地理の地理空間データの座標は多くの座標参照系 (CRS) で表されます。 各 CRS には、独自の参照フレームと測定単位があります。 たとえば、"National Grid of Britain" は、イギリスでは精度の高い座標系ですが、イギリス外では精度が下がります。

今日使われている最も一般的な CRS は、世界測地系の WGS-84です。 WGS-84 は、GPS 装置や、多くの地図サービス (Google マップ、Bing マップの API など) で使用されています。 Azure Cosmos DB for NoSQL でサポートされるのは、WGS-84 CRS を使用した地理の地理空間データのインデックス付けとクエリ実行だけです。

空間データを使用した項目の作成

GeoJSON 値を含む項目を作成すると、それらは空間インデックスを使用して自動的にインデックスが付けられます。 この既定のインデックス付けは、コンテナーのインデックス付けポリシーに従って行われます。 指定されていない場合、既定のインデックス付けポリシーが正確に GeoJSON データのインデックス付けを行います。 Python や Node.js などの動的型付け言語で SDK を使用している場合、有効な GeoJSON を作成する必要があります。

var userProfileitem = {
    "id":"cosmosdb",
    "location":{
        "type":"Point",
        "coordinates":[ -122.12, 47.66 ]
    }
};

client.createitem(`dbs/${databaseName}/colls/${collectionName}`, userProfileitem, (err, created) => {
    // additional code within the callback
});

緯度と経度の情報を持っておらず、物理的な住所や場所の名前を持っている場合は、オンライン サービスを使用して実際の座標を検索します。 Bing Maps などのサービスは、既知の場所の名前から実際の地理データを見つけるのに役立ちます。 Bing Maps ジオコーディングの詳細については、「Bing Maps REST Services」を参照してください。