地理空間で検索する
項目一覧
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 の型と、それらを位置で指定する方法を示します。
Point
: 単一の位置。 これは暗号化の場所を表すことができ ます。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 次元ユークリッド平面上の 座標と 座標を使用して地理空間データを保存できます。x
y
2 次元平面上の座標を "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
ビルダの詳細については、 インデックス ビルダに関するガイド をご覧ください。
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 ドライバーの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
クエリ演算子を使用してクエリを構築します。
次の例では、Atlas Triggers から から メートルの間にある映画館をクエリし ます。10,000
5,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"}}}
$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 マニュアルの「 地理空間クエリ演算子 」のページを参照してください。