

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon DocumentDB を使用した地理空間データのクエリ
<a name="geospatial"></a>

このセクションでは、Amazon DocumentDB を使用して地理空間データをクエリする方法について説明します。このセクションを読むと、Amazon DocumentDB に地理空間データを格納、クエリ、インデックス付けする方法について理解することができます。

**Topics**
+ [概要:](#overview)
+ [地理空間データのインデックス作成と格納](#indexing)
+ [地理空間データのクエリ](#querying_geospatial)
+ [制限事項](#limitations)

## 概要:
<a name="overview"></a>

地理空間の一般的なユースケースには、データからの近接解析が含まれます。たとえば、「シアトルから50マイル以内のすべての空港を検索する」、または「特定の場所から最も近いレストランを探す」などです。Amazon DocumentDB は [GeoJSON 仕様](https://datatracker.ietf.org/doc/html/rfc7946) を使用して、地理空間データを表します。GeoJSON は、座標空間内の図形の JSON 形式のためのオープンソース仕様です。GeoJSON 座標は、地球のような球上の位置を表す経度と緯度の両方をキャプチャします。

## 地理空間データのインデックス作成と格納
<a name="indexing"></a>

Amazon DocumentDB は、地理空間データを格納するために「ポイント」GeoJSON タイプを使用します。各 GeoJSON ドキュメント (またはサブドキュメント) は、通常 2 つのフィールドで構成されます。
+ **タイプ** - 表される図形。Amazon DocumentDB に「座標」フィールドの解釈方法を知らせます。現時点では、Amazon DocumentDB はポイントのみをサポートしています
+ **座標** — 配列内のオブジェクトとして表される緯度と経度のペア — [経度、緯度]

Amazon DocumentDB では、2dsphere インデックスを使用して地理空間データのインデックスも使用します。Amazon DocumentDB はインデックスポイントをサポートしています。Amazon DocumentDB は、2dsphere インデックスを使用した近接クエリをサポートしています。

フードデリバリーサービスのアプリケーションを構築しているシナリオを考えてみましょう。さまざまなレストランの緯度と経度のペアを Amazon DocumentDB に保存したい。これを行うには、まず緯度と経度のペアを保持する [地理空間] フィールドにインデックスを作成することをお勧めします。

```
use restaurantsdb 
db.usarestaurants.createIndex({location:"2dsphere"})
```

このコマンドの出力は次のようになります。

```
{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
```

インデックスを作成したら、Amazon DocumentDB コレクションへのデータの挿入をスタートできます。

```
db.usarestaurants.insert({
   "state":"Washington",
   "city":"Seattle",
   "name":"Thai Palace",
   "rating": 4.8,
   "location":{
      "type":"Point",
      "coordinates":[
         -122.3264,
         47.6009
      ]
   }
});

db.usarestaurants.insert({
   "state":"Washington",
   "city":"Seattle",
   "name":"Noodle House",
   "rating": 4.8,
   "location":{
      "type":"Point",
      "coordinates":[
        -122.3517,
         47.6159
      ]
   }
});

db.usarestaurants.insert({
   "state":"Washington",
   "city":"Seattle",
   "name":"Curry House",
   "rating": 4.8,
   "location":{
      "type":"Point",
      "coordinates":[
         -121.4517,
         47.6229
      ]
   }
});
```

## 地理空間データのクエリ
<a name="querying_geospatial"></a>

Amazon DocumentDB は、地理空間データの近接クエリをサポートしています。近接クエリの良い例は、特定の距離より小さく、別のポイントからの距離を超えるすべてのポイントを検索することです。包含クエリの良い例は、指定したエリア/ポリゴン (ニューヨーク州) にあるすべてのポイント (すべての空港) を検索することです。交差クエリの良い例として、ポイント (都市) と交差するポリゴン (州/地域) の検索があります。次の地理空間演算子を使用して、データからインサイトを得ることができます。
+ `$nearSphere` - `$nearSphere` は、GeoJSON ポイントから最も近いポイントから最も遠いポイントの検索をサポートする検索演算子です。
+ `$geoNear` - `$geoNear` は、GeoJSON ポイントからの距離をメートル単位で計算する集計演算子です。
+ `$minDistance` - `$minDistance` は、`$nearSphere` または `$geoNear` と併用される検索演算子で、中心ポイントから指定した最小距離のドキュメントをファイリングします。
+ `$maxDistance` - `$maxDistance` は、`$nearSphere` または `$geoNear` と併用される検索演算子で、中心ポイントから指定した最大距離のドキュメントをファイリングします。
+ `$geoWithin`: `$geoWithin` は、ポリゴンなどの特定の形状に完全に存在する地理空間データを含むドキュメントの検索をサポートする検索演算子です。
+ `$geoIntersects`: `$geoIntersects` は、地理空間データが指定された GeoJSON オブジェクトと交差するドキュメントの検索をサポートする検索演算子です。

**注記**  
`$geoNear` そして `$nearSphere` は、近接クエリで使用する GeoJSON フィールドに 2dsphere インデックスを必要とします。

### 例 1
<a name="w2aac47c23c11b9"></a>

この例では、住所 (ポイント) から最も近い距離でソートされたすべてのレストラン (ポイント) を検索する方法を学習します。

このようなクエリを実行するには、`$geoNear` を使用して、別のポイントからのポイントのセットの距離を計算します。また、`distanceMultiplier` を追加して、距離をキロメートル単位で測定します。

```
db.usarestaurants.aggregate([
   {
      "$geoNear":{
         "near":{
            "type":"Point",
            "coordinates":[
               -122.3516,
               47.6156
            ]
         },
         "spherical":true,
         "distanceField":"DistanceKilometers",
         "distanceMultiplier":0.001
      }
   }
])
```

上記のコマンドでは、指定したポイントからの距離 (最も遠い) でソートされたレストランが返されます。このコマンドの出力は次のようになります。

```
{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "state" : "Washington", "city" : "Seattle", "name" : "Noodle House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3517, 47.6159 ] }, "DistanceKilometers" : 0.03422834547294996 }
{ "_id" : ObjectId("611f3da185009a81ad38e74a"), "state" : "Washington", "city" : "Seattle", "name" : "Thai Palace", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3264, 47.6009 ] }, "DistanceKilometers" : 2.5009390081704277 }
{ "_id" : ObjectId("611f3dae85009a81ad38e74c"), "state" : "Washington", "city" : "Seattle", "name" : "Curry House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -121.4517, 47.6229 ] }, "DistanceKilometers" : 67.52845344856914 }
```

クエリの結果の数を制限するには、`limit` または `num` オプションを使用します。

`limit`:

```
db.usarestaurants.aggregate([
   {
      "$geoNear":{
         "near":{
            "type":"Point",
            "coordinates":[
               -122.3516,
               47.6156
            ]
         },
         "spherical":true,
         "distanceField":"DistanceKilometers",
         "distanceMultiplier":0.001,
         "limit": 10
      }
   }
])
```

`num`:

```
db.usarestaurants.aggregate([
   {
      "$geoNear":{
         "near":{
            "type":"Point",
            "coordinates":[
               -122.3516,
               47.6156
            ]
         },
         "spherical":true,
         "distanceField":"DistanceKilometers",
         "distanceMultiplier":0.001,
         "num": 10
      }
   }
])
```

**注記**  
`$geoNear` ステージは、返されるドキュメントの最大数を指定する `limit` および `num` オプションをサポートします。`$geoNear` は、`limit` または `num` オプションが指定されていない場合、デフォルトで最大 100 個のドキュメントを返します。これは、`$limit` ステージの値が存在する場合はその値により上書きされ、常に 100 未満の値となります。

### 例 2
<a name="w2aac47c23c11c11"></a>

この例では、特定の住所 (ポイント) から 2 キロメートル以内のすべてのレストラン (ポイント) を検索する方法を学習します。このようなクエリを実行するには、GeoJSON ポイントから `$nearSphere` 最小値以内および `$minDistance` 最大値 `$maxDistance` を使用します。

```
db.usarestaurants.find({
   "location":{
      "$nearSphere":{
         "$geometry":{
            "type":"Point",
            "coordinates":[
               -122.3516,
               47.6156
            ]
         },
         "$minDistance":1,
         "$maxDistance":2000
      }
   }
},
{
   "name":1
})
```

上記のコマンドは、指定されたポイントから最大 2 km のレストランを返します。このコマンドの出力は次のようになります。

```
{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }
```

## 制限事項
<a name="limitations"></a>

Amazon DocumentDB は、ポリゴン、ラインストリング、マルチポイント、マルチポリゴン、マルチラインストリング、GeometryCollection のクエリやインデックス作成をサポートしていません。