Overview
このガイドでは、MongoDB Java ドライバーを使用して地理空間データを検索する方法と、MongoDB でサポートされているさまざまな地理空間データ形式を学習できます。
地理空間データとは、地球の表面上の地理的ロケーションを表すデータです。 地理空間データの例には、次のようなものがあります。
映画館のロケーション
国境
自転車走行ルート
ニューヨーク市の犬の運動エリア
地球上の座標
MongoDB に地理空間データを保存してクエリするには、 GeoJSONを使用します。 GeoJSON は、インターネット エンジニアリング タスク 強制(ETF)によって作成されたデータ形式です。
GeoJSON の MongoDB 本社のロケーションは次のとおりです。
"MongoDB Headquarters" : { "type": "point", "coordinates": [-73.986805, 40.7620853] }
GeoJSON に関する明確な情報については、公式 IETF 仕様 を参照してください。
GeoJSON の位置
位置は地球上の単一の場所を表し、コード内では 2 つまたは 3 つの数値を含む配列として存在します。
最初の位置の経度(必須)
2 番目の位置の緯度(必須)
3 番目の位置での高度(任意)
重要
経度、次に緯度
GeoJSON では、座標は最初に 経度 、次に 緯度 の順に並べられます。 地理座標系の規則では、一般に緯度が最初に、経度が 2 番目に記載されているため、これは意外かもしれません。 作業に使用する他のツールがどのような形式を使用しているかを必ず確認しましょう。 OpenStreetMap や Google マップなどの一般的なツールでは、座標が最初に緯度、次に経度としてリストされます。
GeoJSON タイプ
GeoJSON オブジェクトのタイプによって幾何学的形状が決まります。 幾何学的形状は位置で構成されています。
以下に、一般的な GeoJSON の型と、それらを位置で指定する方法を示します。
LineString: 2 つ以上の位置の配列で、一連の線セグメントを形成します。これは、中国のすべての地域のルートを表すことができます。Polygon: 最初と最後の位置が同じであるため、スペースを含む位置の配列。これは バチカン市国内の土地 を表すことができます
MongoDB で使用できる形状の詳細については、 GeoJSON のマニュアル エントリを参照してください。
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);
ドキュメントを挿入する方法の詳細については、「挿入操作 」ガイドを参照してください。
Index
GeoJSON 形式で保存されたデータをクエリするには、GeoJSON データを含むフィールドを2dsphereインデックスに追加します。 次のスニペットは、 Indexesビルダを使用してlocation.geoフィールドに2dsphereインデックスを作成します。
// <MongoCollection setup code here> collection.createIndex(Indexes.geo2dsphere("location.geo"));
Indexesビルダの詳細については、 インデックス ビルダに関するガイド をご覧ください。
2D 平面上の座標
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);
ドキュメントを挿入する方法の詳細については、「挿入操作 」ガイドを参照してください。
Index
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$geoIntersects2DSPHERE インデックスが必要です
これらのクエリ演算子は、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"}}}
$near演算子の詳細については、 $near の参照ドキュメントを参照してください。
範囲内のクエリ
指定した形状内の地理空間データを検索するには、 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マニュアルの「 地理空間クエリ演算子 」のページを参照してください。