地理空間で検索する
項目一覧
Overview
このガイドでは、Rust ドライバーを使用して地理空間データを検索する方法を学習できます。 地理空間データは、地球の表面またはユークリッド平面上の地理的ロケーションを表します。
地理空間データの例には、次のようなものがあります。
映画館のロケーション
国境
自転車走行ルート
ニューヨーク市の犬の運動エリア
グラフ上の点
このガイドには、次のセクションが含まれています。
地理空間データの保存 では、地理空間データを表すために使用できるデータ形式について説明します
地理空間インデックスでは、地理空間データを保存しているフィールドにインデックスを作成する方法について説明します
地理空間クエリでは、インデックス フィールドに保存されている地理空間データをクエリする方法について説明します
追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します
地理空間データの保存
MongoDB 内のすべての地理空間データは、次のいずれかの形式で保存されます。
GeoJSON は、地球のような球体上で地理空間データを表す形式です。
レガシー座標ペアは、ユークリッド平面上で地理空間データを表す形式です
GeoJSON
GeoJSONを使用して、地球のような球体上で地理空間情報を表すデータを保存します。GeoJSON は、1 つ以上の位置と型で構成されます。
位置
位置は地球上の単一の場所を表し、コード内では次の値を含む配列として存在します。
最初の位置の経度
2 番目の位置の緯度
次のコードは、ニューヨーク州ニューヨーク市にある MongoDB 本社の位置を表しています。
let coords = vec! [-73.986805, 40.7620853];
重要
経度、次に緯度
GeoJSON では、座標は最初に経度、次に緯度の順に並べられます。 これは、一般に緯度を最初に、経度を 2 番目に記載する地理座標系の規則と競合します。 GeoJSON 標準と一致するように座標を再フォーマットしていることを確認してください。
タイプ
GeoJSON オブジェクトの型によって、それが表す幾何学的形状が決まります。幾何学的形状は位置で構成されています。
次のリストでは、一般的な GeoJSON の型と、それらを位置で指定する方法について説明します。
Point
: 単一の位置。 たとえば、次のPoint
は MongoDB 本社の所在地を表しています。let point = doc! {"name": "MongoDB HQ", "location": doc! { "type": "Point", "coordinates": vec! [-73.986805, 40.7620853], } }; LineString
: 一連の線セグメントを形成する 2 つ以上の位置の配列。LineString
は、パス、ルート、境界、またはその他の線形地理空間データを表すことができます。例、次のLineString
は、中国のグレー表示のセグメントを表します。let line = doc! {"name": "Great Wall of China", "location": doc! { "type": "LineString", "coordinates": vec! [ vec! [116.572, 40.430], vec! [116.570, 40.434], vec! [116.567, 40.436], vec! [116.566, 40.441] ], } }; Polygon
: 最初と最後の位置が同じで、スペースを含む位置の配列。 たとえば、次のPolygon
は バチカン市国内の土地 を表しますlet polygon = doc! {"name": "Vatican City", "location": doc! { "type": "Polygon", "coordinates": vec![ vec! [ vec! [12.458, 41.906], vec! [12.458, 41.901], vec! [12.450, 41.901], vec! [12.450, 41.906], vec! [12.458, 41.906], ] ], } };
MongoDB で使用できる GeoJSON タイプの詳細については、サーバー マニュアルのGeoJSONページを参照してください。
Legacy Coordinate Pairs
legacy coordinate pairs を使用して、2 次元ユークリッド平面上の地理空間データを表します。
次のコードは、ワシントン州ワシントン州の場所を表す legacy coordinate pair を指定します。
let capital = vec! [-77.0369, 38.9072];
legacy coordinate pairsの詳細については、サーバー マニュアルのlegacy coordinate pairsを参照してください。
地理空間インデックス
地理空間データをクエリする前に、データ形式に対応するインデックスを作成する必要があります。 次のインデックス型により、地理空間クエリが可能になります。
2dsphere
GeoJSON データ用2d
legacy coordinate pairs の場合
2dsphere
インデックスと2d
インデックスに関する次のセクションには、Atlas サンプル データのsample_mflix
データベース内のtheaters
コレクションを使用するコード例が含まれています。
Tip
インデックスの作成の詳細については、「 インデックスガイド 」をご覧ください。
Atlas サンプル データのインポート手順については、「サンプル データのロード」ページを参照してください。
2dsphere
GeoJSON 形式で保存されたデータをクエリするには、 type
フィールドとcoordinates
フィールドの両方を含むフィールドを2dsphere
インデックスに追加します。 次の例では、 location.geo
フィールドに2dsphere
インデックスを作成します。
let index = IndexModel::builder() .keys(doc! { "location.geo": "2dsphere" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo_"2dsphere"
2d
legacy coordinate pairs として保存されたデータをクエリするには、legacy coordinate pairs を含むフィールドを2d
インデックスに追加します。 次の例では、 location.geo.coordinates
フィールドに2d
インデックスを作成しています。
let index = IndexModel::builder() .keys(doc! { "location.geo.coordinates": "2d" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo.coordinates_"2d"
地理空間クエリ
地理空間データを含むフィールドに2dsphere
または2d
インデックスを作成すると、それらのフィールドにアクセスする地理空間クエリを実行できます。
地理空間データをクエリするには、フィールド名と地理空間クエリ演算子を使用してクエリフィルターを作成します。 特定の地理空間クエリ演算子のオプションを指定すると、返されるドキュメントを制限できます。
地理空間クエリの次のセクションには、Atlas サンプル データのsample_mflix
データベース内のtheaters
コレクションを使用するコード例が含まれています。 theaters
コレクションにはlocation.geo
フィールドの2dsphere
インデックスがあるとします。
Tip
データのクエリの詳細については、「クエリの指定」ガイドを参照してください。
Atlas サンプル データのインポート手順については、「サンプル データのロード」ページを参照してください。
クエリ演算子
地理空間データをクエリするには、次のいずれかのクエリ演算子を使用します。
$near
$geoWithin
$nearSphere
$geoIntersects
( 2dsphere インデックスが必要です)
$near
演算子を使用する場合、次の距離演算子を指定できます。
$minDistance
$maxDistance
$geoWithin
演算子を使用する場合、次の図形演算子を指定できます。
$box
$polygon
$center
$centerSphere
Tip
地理空間クエリ演算子の詳細については、サーバー マニュアルの「地理空間クエリ演算子 」を参照してください。
近接性によるクエリの例
次の例では、 location.geo
フィールドに、ニューヨーク州ニューヨーク市にある MongoDB 本社から 1000 メートル以内のロケーションが保存されているドキュメントをクエリします。 このコードでは、MongoDB 本社からの距離の昇順でドキュメントが返されます。
let mongodb = vec! [-73.986805, 40.7620853]; let query = doc! {"location.geo": doc! { "$near": { "$geometry": { "type": "Point", "coordinates": mongodb, }, "$maxDistance": 1000, } } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); }
{ "_id":{...},"theaterId":1908,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.983487,40.76078] } } } { "_id":{...},"theaterId":1448,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.982094,40.769882] } } }
範囲内のクエリの例
次の例では、 location.geo
フィールドにデータベース内のロケーションが保存されているドキュメントをクエリします。 この例では、地理検索領域の境界を表す 4 つの座標を保存するchicago
というベクトルが作成されます。
let chicago = doc! { "type": "Polygon", "coordinates": vec![ vec![ vec![-87.851, 41.976], vec![-87.851, 41.653], vec![-87.651, 41.653], vec![-87.651, 41.976], vec![-87.851, 41.976], ] ] }; let query = doc! {"location.geo": doc! { "$geoWithin": { "$geometry": chicago }} }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); }
{ "_id":{...},"theaterId":322,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.849403, 41.90707] } } } { "_id":{...},"theaterId":2960,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.811262, 41.847938] } } } { "_id":{...},"theaterId":323,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.653557, 41.912025] } } } { "_id":{...},"theaterId":320,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.805817, 41.847572] } } } { "_id":{...},"theaterId":814,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.670631, 41.919514] } } }
詳細情報
検索操作の詳細については、「データの取得」ガイドを参照してください。
地理空間データの操作の詳細については、次のサーバー マニュアル ページを参照してください。
API ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。