AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

地理空間で検索する

このガイドでは、MongoDB Java ドライバーを使用して地理空間データを検索する方法と、MongoDB でサポートされているさまざまな地理空間データ形式を学習できます。

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

  • 映画館のロケーション

  • 国境

  • 自転車走行ルート

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

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

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

"MongoDB Headquarters" : {
"type": "point",
"coordinates": [-73.986805, 40.7620853]
}

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

位置は地球上の単一の場所を表し、コード内では 2 つまたは 3 つの数値を含む配列として存在します。

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

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

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

重要

経度、次に緯度

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

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

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

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

GeoJSON データを保存するドキュメントを挿入するには、GeoJSON 値を含むドキュメントを作成し、そのドキュメントをinsertOne()メソッドに渡します。

次の例では、GeoJSON データを含むlocation.geoフィールドを含むドキュメントを挿入します。

// Add your MongoCollection setup code here
Point point = new Point(new Position(-74.0065, 40.7085));
Document theater = new Document("theaterId", 1203)
.append("location", new Document("geo", point));
InsertOneResult result = collection.insertOne(theater);

ドキュメントを挿入する方法の詳細については、「挿入操作 」ガイドを参照してください。

GeoJSON 形式で保存されたデータをクエリするには、GeoJSON データを含むフィールドを2dsphereインデックスに追加します。 次のスニペットは、 Indexesビルダを使用してlocation.geoフィールドに2dsphereインデックスを作成します。

// <MongoCollection setup code here>
collection.createIndex(Indexes.geo2dsphere("location.geo"));

Indexesビルダの詳細については、 インデックス ビルダに関するガイド をご覧ください。

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

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

"<field name>" : [ x, y ]

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

legacy coordinate pair を保存するドキュメントを挿入するには、フィールドに coordinate pair 値を割り当てるドキュメントを作成します。 次に、ドキュメントをinsertOne()メソッドに渡します。

次の例では、legacy coordinate pair を含むcoordinatesフィールドを含むドキュメントを挿入します。

// Add your MongoCollection setup code here
Document theater = new Document("theaterId", 1204)
.append("coordinates", Arrays.asList(-73.9862, 40.7311));
InsertOneResult result = collection.insertOne(theater);

ドキュメントを挿入する方法の詳細については、「挿入操作 」ガイドを参照してください。

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

// <MongoCollection setup code here>
collection.createIndex(Indexes.geo2d("coordinates"));

Indexesビルダの詳細については、 インデックス ビルダに関するガイド をご覧ください。

レガシー coordinate pairs の詳細については、 レガシー coordinate pairsに関するMongoDB Server のマニュアル ページ を参照してください。

Tip

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

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

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

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

  • $near

  • $geoWithin

  • $nearSphere

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

これらのクエリ演算子は、MongoDB Java ドライバー内でFiltersビルダ クラスのnear() 、 geoWithin() 、 nearSphere() 、およびgeoIntersects()ユーティリティ メソッドを使用して指定できます。

地理空間クエリ演算子の詳細については、地理空間クエリに関するマニュアル エントリを参照してください。

Filtersの詳細については、 フィルター ビルダに関するガイド をご覧ください。

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

MongoDB Javaドライバーで使用できる GeoJSON シェイプの完全なリストについては、 GeoJSONパッケージAPIドキュメント を参照してください。

次の例では、MongoDB Atlas サンプル データセットを使用します。 クイック スタート ガイドでは、独自の無料階層 Atlas クラスターをセットアップする方法と、サンプル データセットをロードする方法について学びます。

例では、サンプル データセットの sample_mflix データベースの theaters コレクションを使用します。theaters コレクションには、 location.geo フィールドに 2dsphere インデックスが含まれています。

の例には次のインポートが必要です。

import java.util.Arrays;
import org.bson.conversions.Bson;
import com.mongodb.client.model.geojson.Point;
import com.mongodb.client.model.geojson.Polygon;
import com.mongodb.client.model.geojson.Position;
import static com.mongodb.client.model.Filters.near;
import static com.mongodb.client.model.Filters.geoWithin;
import static com.mongodb.client.model.Projections.fields;
import static com.mongodb.client.model.Projections.include;
import static com.mongodb.client.model.Projections.excludeId;

Githubの例のソースコードはこちらから見つけることができます。

点に最も近いドキュメントから最も遠いドキュメントの順に検索して返すには、 Filtersビルダ クラスのnear()静的ユーティリティ メソッドを使用します。 near()メソッドは、 $nearクエリ演算子を使用してクエリを構築します。

次の例では、Atlas10,000 5,000Triggers から から メートルの間にある映画館をクエリします。

// Add your MongoClient setup code here
MongoDatabase database = mongoClient.getDatabase("sample_mflix");
MongoCollection<Document> collection = database.getCollection("theaters");
Point centralPark = new Point(new Position(-73.9667, 40.78));
// Creates a query that matches all locations between 5,000 and 10,000 meters from the specified Point
Bson query = near("location.geo", centralPark, 10000.0, 5000.0);
// Creates a projection to include only the "location.address.city" field in the results
Bson projection = fields(include("location.address.city"), excludeId());
// Prints the projected field of the results from the geospatial query as JSON
collection.find(query)
.projection(projection)
.forEach(doc -> System.out.println(doc.toJson()));

上記のコードの出力は、次のようになります。

{"location": {"address": {"city": "Bronx"}}}
{"location": {"address": {"city": "New York"}}}
{"location": {"address": {"city": "New York"}}}
{"location": {"address": {"city": "Long Island City"}}}
{"location": {"address": {"city": "New York"}}}
{"location": {"address": {"city": "Secaucus"}}}
{"location": {"address": {"city": "Jersey City"}}}
{"location": {"address": {"city": "Elmhurst"}}}
{"location": {"address": {"city": "Flushing"}}}
{"location": {"address": {"city": "Flushing"}}}
{"location": {"address": {"city": "Flushing"}}}
{"location": {"address": {"city": "Elmhurst"}}}

Tip

ユニークファクター

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

$near演算子の詳細については、 $near の参照ドキュメントを参照してください。

Filtersの詳細については、 フィルター ビルダに関するガイド をご覧ください。

指定した形状内の地理空間データを検索するには、 Filtersビルダ クラスのgeoWithin()静的ユーティリティ メソッドを使用します。 geoWithin()メソッドは、 $geoWithinクエリ演算子を使用してクエリを構築します。

次の例では、Long Expression の セクションで映画館を検索します。

// Add your MongoCollection setup code here
// Creates a set of points that defines the bounds of a geospatial shape
Polygon longIslandTriangle = new Polygon(Arrays.asList(new Position(-72, 40),
new Position(-74, 41),
new Position(-72, 39),
new Position(-72, 40)));
// Creates a projection to include only the "location.address.city" field in the results
Bson projection = fields(include("location.address.city"), excludeId());
// Creates a query that matches documents containing "location.geo" values within the specified bounds
Bson geoWithinComparison = geoWithin("location.geo", longIslandTriangle);
// Prints the projected field of the results from the geolocation query as JSON
collection.find(geoWithinComparison)
.projection(projection)
.forEach(doc -> System.out.println(doc.toJson()));

上記のコードの出力は、次のようになります。

{"location": {"address": {"city": "Baldwin"}}}
{"location": {"address": {"city": "Levittown"}}}
{"location": {"address": {"city": "Westbury"}}}
{"location": {"address": {"city": "Mount Vernon"}}}
{"location": {"address": {"city": "Massapequa"}}}

次の図は、 longIslandTriangle変数によって定義される多角形と、クエリによって返された映画館の場所を表すドットを示しています。

映画館を検索しているリクエスト中の長い言語の面積

$geoWithin演算子の詳細については、 $geoWithin の参照ドキュメントを参照してください

クエリで使用できる演算子の詳細については、 MongoDB Serverマニュアルの「 地理空間クエリ演算子 」のページを参照してください。