Docs Menu
Docs Home
/ / /
Rust ドライバー
/

地理空間で検索する

項目一覧

  • Overview
  • 地理空間データの保存
  • GeoJSON
  • Legacy Coordinate Pairs
  • 地理空間インデックス
  • 2dsphere
  • 2d
  • 地理空間クエリ
  • クエリ演算子
  • 近接性によるクエリの例
  • 範囲内のクエリの例
  • 詳細情報
  • API ドキュメント

このガイドでは、Rust ドライバーを使用して地理空間データを検索する方法を学習できます。 地理空間データは、地球の表面またはユークリッド平面上の地理的ロケーションを表します。

地理空間データの例には、次のようなものがあります。

  • 映画館のロケーション

  • 国境

  • 自転車走行ルート

  • ニューヨーク市の犬の運動エリア

  • グラフ上の点

このガイドには、次のセクションが含まれています。

  • 地理空間データの保存 では、地理空間データを表すために使用できるデータ形式について説明します

  • 地理空間インデックスでは、地理空間データを保存しているフィールドにインデックスを作成する方法について説明します

  • 地理空間クエリでは、インデックス フィールドに保存されている地理空間データをクエリする方法について説明します

  • 追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します

MongoDB 内のすべての地理空間データは、次のいずれかの形式で保存されます。

  • 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 を使用して、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 サンプル データのインポート手順については、「サンプル データのロード」ページを参照してください。

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);

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);

地理空間データを含むフィールドに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);
}

次の例では、 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);
}

検索操作の詳細については、「データの取得」ガイドを参照してください。

地理空間データの操作の詳細については、次のサーバー マニュアル ページを参照してください。

このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。

戻る

照合