AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

地理空間クエリ

このガイドでは、Scalaドライバーを使用して地理空間データをクエリする方法を学ぶことができます。MongoDBがサポートする様々な地理空間データ形式についても学ぶことができます。

地理空間データは、地球の表面上の地理的ロケーションを表します。地理空間データの例には、次のようなものがあります。

  • 映画館のロケーション

  • 国境

  • 自転車走行ルート

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

theaterssample_mflixこのガイドの例では、Atlasサンプルデータセット の データベースの コレクションを使用します。Scalaアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する MongoClient を作成し、database 変数と collection 変数に次の値を割り当てます。

val database: MongoDatabase = mongoClient.getDatabase("sample_mflix")
val collection: MongoCollection[Document] = database.getCollection("theaters")

MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。

MongoDB に地理空間データを保存してクエリするには、 GeoJSONを使用します。 GeoJSON は、インターネット エンジニアリング タスク 強制(ETF)によって作成されたデータ形式です。

GeoJSON の MongoDB 本社のロケーションは次のとおりです。

"location" : {
"type": "Point",
"coordinates": [-73.986805, 40.7620853]
}

GeoJSON に関する明確な情報については、公式 IETF 仕様 を参照してください。

位置は地球上の単一の場所を表し、2 つまたは 3 つの数値を含む配列として与えられます。

  • 最初の位置の経度(必須)

  • 2 番目の位置の緯度(必須)

  • 3 番目の位置での高度(任意)

重要

経度、次に緯度

GeoJSON では、座標は最初に経度、次に緯度の順に並べられます。地理座標系の規則では、一般に緯度が最初に、経度が 2 番目に記載されているため、これは意外かもしれません。作業に使用する他のツールがどのような形式を使用しているかを必ず確認しましょう。OpenStreetMap や Google マップなどの一般的なツールでは、座標が最初に緯度、次に経度としてリストされます。

GeoJSON オブジェクトのタイプによって幾何学的形状が決まります。 幾何学的形状は位置で構成されています。

以下に、一般的な GeoJSON の型と、それらを位置で指定する方法を示します。

  • Point: 単一の位置。これは暗号化の場所を表すことができます。

  • LineString: 2 つ以上の位置の配列。これにより、一連の線セグメントを形成します。これは、中国のすべての国のルートを表す可能性があります。

  • Polygon: 最初と最後の位置が同じで、スペースを含む位置の配列。これは バチカン市国内の土地 を表すことができます

MongoDBで使用できる形状の詳細については、サーバー マニュアルの GeoJSON を参照してください。

2dsphereインデックスを作成するには、 Indexes.geo2dsphere()ヘルパーを使用して2dsphereインデックスの仕様を作成します。 仕様をMongoCollection.createIndex()メソッドに渡してインデックスを作成します。

次の例では、 theatersコレクションの"location.geo"フィールドに2dsphereインデックスを作成します。

val indexObservable = collection.createIndex(Indexes.geo2dsphere("location.geo"))
Await.result(indexObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

Scala ドライバーのインデックスの詳細については、 「インデックスを使用したクエリの最適化」ガイドを参照してください。

2 次元ユークリッド平面上の x 座標と y 座標を使用して地理空間データを保存できます。2 次元平面上の座標は、legacy coordinate pairs と呼ばれます。

legacy coordinate pairsは次の構造をしています。

{ "location" : [ x, y ] }

フィールド値には 2 つの値の配列が含まれており、1 つ目は x 軸の値を表し、2 つ目は y 軸の値を表します。

legacy coordinate pairs として保存 (する)されたデータをクエリするには、legacy coordinate pairs を含むフィールドを 2d インデックスに追加する必要があります。次のスニペットは、Indexes オブジェクトを使用して coordinates フィールドに 2d インデックスを作成します:

val indexObservable = collection.createIndex(Indexes.geo2d("coordinates"))
Await.result(indexObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

Scala ドライバーのインデックスの詳細については、 「インデックスを使用したクエリの最適化」ガイドを参照してください。

レガシー coordinate pairs の詳細については、サーバー マニュアルの地理空間クエリガイドのレガシー coordinate pairsセクションを参照してください。

Tip

サポートされている演算子

球面(2dsphere)と平面(2d)インデックスは、同じクエリ演算子の一部をサポートしていますが、すべてではありません。演算子とそのインデックスの互換性の完全なリストを表示するには、サーバー マニュアルの「地理空間クエリガイド」の地理空間クエリ演算子セクションを参照してください。

地理空間クエリは、 クエリ演算子 とクエリ パラメータとして GeoJSON シェイプ で構成されます。

地理空間データをクエリするには、次のいずれかのクエリ演算子を使用します。

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects 2DSPHERE インデックスが必要です

これらのクエリ演算子は、Filtersオブジェクトのnear()、geoWithin()、nearSphere()、geoIntersects()メソッドを使用して Scala ドライバーで指定できます。

地理空間クエリ演算子の詳細については、サーバー マニュアルの「地理空間クエリ演算子」ガイドの「地理空間クエリ演算子」セクションを参照してください。

Filtersヘルパーメソッドの完全なリストを表示するには、 フィルターAPIドキュメントを参照してください。

地理空間クエリで使用する形状を指定するには、Scala ドライバーの Position、Point、LineString、Polygon クラスを使用します。

GeoJSON シェイプ クラスの詳細については、GeoJSONパッケージ APIドキュメント を参照してください。

次の例では、sample_mflix サンプル データベースの MongoDB Atlas theaters コレクションを使用します。自分の無料階層 Atlas クラスターを設定する方法およびサンプル データセットをロードする方法については、Scala ドライバーの使用開始 ガイドで学びます。

このセクションの例には、次のインポートが必要です。

import org.mongodb.scala.*
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.Filters
import org.mongodb.scala.model.Projections
import com.mongodb.client.model.geojson.{Point, Polygon, Position}
import java.util.Arrays
import java.util.concurrent.TimeUnit
import scala.concurrent.Await
import scala.concurrent.duration.Duration

theatersコレクションには、 location.geoフィールドの2dsphereインデックスがすでに含まれています。

ある点から最も近いものから最も遠いものへの順でドキュメントを検索して返すには、Filters オブジェクトの near() メソッドを使用します。near() メソッドは、$near クエリ演算子を使用してクエリを構築します。

次の例では、指定された GeoJSON Point インスタンスから最大 1000 メートル離れたドキュメントを返し、近い順から遠い順へとソートします。

val refPoint = new Point(new Position(-73.986805, 40.7620853))
val findObservable = collection.find(Filters.near("location.geo", refPoint, Some(1000.0), Some(0.0)))
val results = Await.result(findObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

Tip

MongoDB は、GPS インスタンスと同じ参照システムを使用して、地球上の形状を計算します。

$near 演算子の詳細については、サーバー マニュアルの $near に関する参照を参照してください。

指定された形状内の地理空間データを検索するには、Filters オブジェクトの geoWithin() メソッドを使用します。geoWithin() メソッドは、$geoWithin クエリ演算子を使用してクエリを構築します。

次の例では、Long Island のセクションで映画館を検索します。この例では、プロジェクションを適用して、各結果に location.address.city フィールドのみが含まれ、 _id フィールドが除外されるようにします。

val longIslandTriangle = new Polygon(Arrays.asList(
new Position(-72.0, 40.0),
new Position(-74.0, 41.0),
new Position(-72.0, 39.0),
new Position(-72.0, 40.0)
))
val projection = Projections.fields(
Projections.include("location.address.city"),
Projections.excludeId()
)
val geoWithinComparison = Filters.geoWithin("location.geo", longIslandTriangle)
val findObservable = collection.find(geoWithinComparison).projection(projection)
val results = Await.result(findObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
results.foreach(doc => println(doc.toJson()))

次の図は、longIslandTriangle 変数によって定義される多角形と、クエリが返す映画館のロケーションを表すドットを示しています。

映画館を検索する長い言語の面積

$geoWithin 演算子の詳細については、サーバー マニュアルの $geoWithin 参照を参照してください。

地理空間クエリの実行の詳細については、サーバー マニュアルの「地理空間クエリ 」を参照してください。