Docs Menu
Docs Home
/ / /
Java Sync Driver
/ / /

地理空間で検索する

項目一覧

  • Overview
  • 地球上の座標
  • GeoJSON の位置
  • GeoJSON タイプ
  • GeoJSON データを含むドキュメントの挿入
  • Index
  • 2D 平面上の座標
  • レガシー座標を含むドキュメントの挿入
  • Index
  • 地理空間クエリ
  • クエリ演算子
  • クエリ パラメータ
  • 近接性によるクエリ
  • 範囲内のクエリ

このガイドでは、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 の型と、それらを位置で指定する方法を示します。

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

  • LineString: 2 つ以上の位置の配列で、一連の線セグメントを形成します。 これは 、中国のすべての地域のルートを表すことができます。

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

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ビルダの詳細については、 インデックス ビルダに関するガイド をご覧ください。

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

Tip

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

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

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

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

  • $near

  • $geoWithin

  • $nearSphere

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

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

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

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

地理空間クエリで使用する形状を指定するには、MongoDB Java ドライバーのPositionPointLineString 、および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クエリ演算子を使用してクエリを構築します。

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

// 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 マニュアルの「 地理空間クエリ演算子 」のページを参照してください。

戻る

返すフィールドを指定する