地理空間で検索する
Overview
このガイドでは、地理空間データ、データ形式、インデックス、クエリの扱い方を説明します。
地理空間データは、地球の表面上の地理的ロケーションを表します。
地理空間データの例には、次のようなものがあります。
映画館のロケーション
国境
自転車走行ルート
ニューヨーク市の犬の運動エリア
グラフ上の点
地理空間データ形式
MongoDB 内のすべての地理空間データは、次のいずれかの形式で保存されます。
GeoJSON は、地球のような球体上で地理空間データを表す形式です。
legacy coordinate pairsは、ユークリッド平面上で地理空間データを表す形式です。
GeoJSON
GeoJSONを使用して、地球のような球体上で地理空間情報を表すデータを保存します。GeoJSON は、1 つ以上の位置と型で構成されます。
位置
位置は単一のロケーションを表し、コード内では次の値を含む配列として存在します。
最初の位置の経度(必須)
2 番目の位置の緯度(必須)
3 番目の位置での高度(任意)
ニューヨーク州ニューヨーク市にある MongoDB 本社の位置は、以下の通りです。
GeoJson.Position(-73.986805, 40.7620853)
あるいは、 GeoJson.Geographic()
メソッドを使用して座標ペアを構築することもできます。
GeoJson.Geographic(-73.986805, 40.7620853)
重要
経度、次に緯度
GeoJSON は、最初に 経度 、次に 緯度 の座標を並べ替えます。 作業に使用する他のツールがどのような形式を使用しているかを必ず確認しましょう。OpenStreetMap や Google マップなどの一般的なツールの多くは、緯度を最初に、経度が 2 番目の座標をリストしています。
タイプ
GeoJSON オブジェクトの型によって、それが表す幾何学的形状が決まります。 幾何学的形状は位置で構成されています。
以下に、一般的な GeoJSON の型と、それらを位置で指定する方法を示します。
Point
: 単一つの位置。次のPoint
は MongoDB 本社の所在地を表しています。GeoJson.Point(GeoJson.Position(-73.986805, 40.7620853)) LineString
: 一連の線セグメントを形成する 2 つ以上の位置の配列。LineString
は、パス、ルート、境界、またはその他の線形地理空間データを表すことができます。 次のLineString
は、中国の グレー表示 のセグメントを表します。GeoJson.LineString ( GeoJson.Position(116.572, 40.430), GeoJson.Position(116.570, 40.434), GeoJson.Position(116.567, 40.436), GeoJson.Position(116.566, 40.441) ) Polygon
: 最初と最後の位置が同じで、スペースを含む位置の配列。 次のPolygon
は、 バチカン市国内の土地 をほぼ表しますGeoJson.Polygon ( GeoJson.Position(12.446086, 41.901977), GeoJson.Position(12.457952, 41.901559), GeoJson.Position(12.455375, 41.907351), GeoJson.Position(12.449863, 41.905186), GeoJson.Position(12.446086, 41.901977) }
MongoDB で使用できる GeoJSON タイプの詳細については、 GeoJSON マニュアルの エントリを参照してください。
GeoJSON 形式の詳細については、 公式 IETF 仕様 を参照してください。
Legacy Coordinate Pairs
legacy coordinate pairs を使用して、2 次元平面上の地理空間情報を表すデータを保存します。
legacy coordinate pairsは 2 つの値の配列で表され、1 つ目は x
軸の値を表し、2 つ目は y
軸の値を表します。
legacy coordinate pairs の詳細については、legacy coordinate pairsに関する MongoDB Server のマニュアル ページを参照してください。
地理空間インデックス
地理空間データのクエリを有効にするには、データ形式に対応するインデックスを作成する必要があります。以下のインデックス型により、地理空間クエリが可能になります。
2dsphere
、GeoJSON データに使用2d
、legacy coordinate pairs に使用
地理空間インデックスの作成方法の詳細については、「インデックス ガイド」の 「地理空間インデックス」セクションを参照してください。
クエリ演算子
地理空間データをクエリするには、次のいずれかのクエリ演算子を使用します。
$near
$geoWithin
$nearSphere
$geoIntersects
( 2 dsphere インデックスが必要)
$near
演算子を使用する場合、次の距離演算子を指定できます。
$minDistance
$maxDistance
$geoWithin
演算子を使用する場合、次の図形演算子を指定できます。
$box
$polygon
$center
$centerSphere
地理空間クエリ演算子の詳細については、サーバー マニュアルの「地理空間クエリ演算子 」を参照してください。
例
次の例では、MongoDB Atlas サンプル データセットを使用します。 このサンプル データセットを取得するには、「クイック スタート 」を参照してください。
例では、サンプル データセットの sample_mflix
データベースの theaters
コレクションを使用します。theaters
コレクションには、 location.geo
フィールドに 2dsphere
インデックスが含まれています。
近接性によるクエリ
次の例では、ニューヨーク州ニューヨーク市にある MongoDB 本社から1000メートル以内にあるlocation.geo
フィールド値を持つドキュメントをクエリします。 ドキュメントは最も近いものから最も遠いものへと返されます。
// Point representation of the MongoDB Headquarters var point = GeoJson.Point(GeoJson.Position(-73.986805, 40.7620853)); // Specifies a maxDistance of 1000 meters and a minDistance of 0 meters var filter = Builders<Theater>.Filter.Near(m => m.Location.Geo, point, 1000.0, 0.0); // Only fetches the _id and theaterId fields var projection = Builders<Theater>.Projection.Include("theaterId"); var results = collection.Find(filter).Project(projection);
前の例の結果には、次のドキュメントが含まれています。
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 }
多角形によるクエリ
次の例では、MongoDB の境界内に存在するlocation.geo
フィールド値を持つドキュメントをクエリします。
// Polygon representation of Manhattan var polygon = GeoJson.Polygon ( GeoJson.Position(-73.925492, 40.877410), GeoJson.Position(-73.910372, 40.872366), GeoJson.Position(-73.935127, 40.834020), GeoJson.Position(-73.929049, 40.798569), GeoJson.Position(-73.976485, 40.711432), GeoJson.Position(-74.015747, 40.701229), GeoJson.Position(-74.018859, 40.708367), GeoJson.Position(-74.008007, 40.754307), GeoJson.Position(-73.925492, 40.877410) ); var filter = Builders<Theater>.Filter.GeoWithin(m => m.Location.Geo, polygon); // Only fetches the _id and theaterId fields var projection = Builders<Theater>.Projection.Include("theaterId"); var results = collection.Find(filter).Project(projection);
前の例の結果には、次のドキュメントが含まれています。
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47287cfa9a3a73e51eccb"), "theaterId" : 835 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 } { "_id" : ObjectId("59a47286cfa9a3a73e51e744"), "theaterId" : 1028 } { "_id" : ObjectId("59a47287cfa9a3a73e51ebe1"), "theaterId" : 609 } { "_id" : ObjectId("59a47287cfa9a3a73e51e8ed"), "theaterId" : 1906 } { "_id" : ObjectId("59a47287cfa9a3a73e51e87d"), "theaterId" : 1531 } { "_id" : ObjectId("59a47287cfa9a3a73e51eb63"), "theaterId" : 482 }
追加リソース
地理空間データの操作の詳細については、 地理空間データに関するマニュアル エントリを参照してください。
サポートされている GeoJSON タイプの詳細については、 GeoJSON のマニュアル エントリを参照してください。
地理空間クエリ演算子の詳細については、地理空間クエリに関するマニュアル エントリを参照してください。