Overview
このガイドでは、地理空間データ、データ形式、インデックス、クエリの扱い方を説明します。
地理空間データは、地球の表面上の地理的ロケーションを表します。
地理空間データの例には、次のようなものがあります。
映画館のロケーション
国境
自転車走行ルート
ニューヨーク市の犬の運動エリア
グラフ上の点
地理空間データ形式
MongoDB 内のすべての地理空間データは、次のいずれかの形式で保存されます。
GeoJSON は、地球のような球体上で地理空間データを表す形式です。
レガシー coordinate pairs は、ユークリッド平面上で地理空間データを表す形式です
GeoJSON
GeoJSONを使用して、地球のような球体上で地理空間情報を表すデータを保存します。GeoJSON は、1 つ以上の位置と型で構成されます。
位置
位置は単一のロケーションを表し、コード内では次の値を含む配列として存在します。
最初の位置の経度(必須)
2 番目の位置の緯度(必須)
3 番目の位置での高度(任意)
ニューヨーク州ニューヨーク市にある MongoDB 本社の位置は、以下の通りです。
[-73.986805, 40.7620853]
重要
経度、次に緯度
GeoJSON は、最初に 経度 、次に 緯度 の座標を並べ替えます。 作業に使用する他のツールがどのような形式を使用しているかを必ず確認しましょう。OpenStreetMap や Google マップなどの一般的なツールの多くは、緯度を最初に、経度が 2 番目の座標をリストしています。
タイプ
GeoJSON オブジェクトの型によって、それが表す幾何学的形状が決まります。 幾何学的形状は位置で構成されています。
以下に、一般的な GeoJSON の型と、それらを位置で指定する方法を示します。
Point
: 単一つの位置。次のPoint
は MongoDB 本社の所在地を表しています。{ "type": "Point", "coordinates": [-73.856077, 40.848447] } LineString
: 一連の線セグメントを形成する 2 つ以上の位置の配列。LineString
は、パス、ルート、境界、またはその他の線形地理空間データを表すことができます。 次のLineString
は、中国の グレー表示 のセグメントを表します。{ "type": "LineString", "coordinates": [[116.572, 40.430], [116.570, 40.434], [116.567, 40.436], [116.566, 40.441]] } Polygon
: 最初と最後の位置が同じで、スペースを含む位置の配列。 次のPolygon
は、 バチカン市国内の土地 をほぼ表します{ "type": "Polygon", "coordinates": [[[12.446086, 41.901977], [12.457952, 41.901559], [12.455375, 41.907351], [12.449863, 41.905186], [12.446086, 41.901977]]] }
MongoDB で使用できる GeoJSON タイプの詳細については、 GeoJSON マニュアル エントリを参照してください。
GeoJSON 形式の詳細については、 公式 IETF 仕様 を参照してください。
Legacy Coordinate Pairs
legacy coordinate pairs を使用して、2 次元平面上の地理空間情報を表すデータを保存します。
レガシー coordinate pairs は 2 つの値の配列で表され、最初の値は x
軸の値を表し、2 つ目の値は y
軸の値を表します。
legacy coordinate pairs の詳細については、legacy coordinate pairsに関する MongoDB Server のマニュアル ページを参照してください。
地理空間インデックス
地理空間データのクエリを有効にするには、データ形式に対応するインデックスを作成する必要があります。以下のインデックス型により、地理空間クエリが可能になります。
2dsphere
、GeoJSON データに使用2d
、legacy coordinate pairs に使用
地理空間インデックスの作成方法の詳細については、「インデックス ガイド」の 「地理空間インデックス」セクションを参照してください。
クエリ演算子
find
演算子を使用して地理空間データをクエリするには、次のいずれかのクエリ演算子を使用します。
$near
$geoWithin
$nearSphere
$geoIntersects
( 2 dsphere インデックスが必要)
$near
演算子を使用する場合、次の距離演算子を指定できます。
$minDistance
$maxDistance
$geoWithin
演算子を使用する場合、次の図形演算子を指定できます。
$box
$polygon
$center
$centerSphere
aggregate
演算子を使用して地理空間データをクエリするには、$geoNear
パイプラインステージを使用する必要があります。
地理空間クエリ演算子の詳細については、サーバー マニュアルの「地理空間クエリ演算子 」を参照してください。
例
次の例では、 MongoDB Atlasサンプルデータセットを使用します。このサンプルデータセットを取得するには、Atlasサンプルデータセットを参照してください。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、PyMongoを使い始める を参照してください。
例では、サンプル データセットの sample_mflix
データベースの theaters
コレクションを使用します。theaters
コレクションには、 location.geo
フィールドに 2dsphere
インデックスが含まれています。
近接性によるクエリ
次の例では、ニューヨーク州ニューヨーク市にある MongoDB 本社から1000メートル以内にあるlocation.geo
フィールド値を持つドキュメントをクエリします。 ドキュメントは最も近いものから最も遠いものへと返されます。
# set query with point at MongoDB headquarters and a maxDistance of 1000 meters query = { "location.geo": { "$near": { "$geometry": { # Search around this location "type": "Point", "coordinates": [-73.986805, 40.7620853] }, "$maxDistance": 1000 # Distance in meters (1 km) } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = location.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 }
多角形によるクエリ
次の例では、MongoDB の境界内に存在するlocation.geo
フィールド値を持つドキュメントをクエリします。
# Polygon representation of Manhattan query = { "location.geo": { "$geoWithin": { "$geometry": { # Search around this location "type": "Polygon", "coordinates": [[[-73.925492, 40.877410], [-73.910372, 40.872366], [-73.935127, 40.834020], [-73.929049, 40.798569], [-73.976485, 40.711432], [-74.015747, 40.701229], [-74.018859, 40.708367], [-74.008007, 40.754307], [-73.925492, 40.877410]]] } } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = location.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47287cfa9a3a73e51eccb"), "theaterId" : 835 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 } { "_id" : ObjectId("59a47286cfa9a3a73e51e744"), "theaterId" : 1028 } { "_id" : ObjectId("59a47287cfa9a3a73e51ebe1"), "theaterId" : 609 } { "_id" : ObjectId("59a47287cfa9a3a73e51e8ed"), "theaterId" : 1906 } { "_id" : ObjectId("59a47287cfa9a3a73e51e87d"), "theaterId" : 1531 } { "_id" : ObjectId("59a47287cfa9a3a73e51eb63"), "theaterId" : 482 }
追加リソース
地理空間データの操作の詳細については、 地理空間データに関するマニュアル エントリを参照してください。
サポートされている GeoJSON タイプの詳細については、 GeoJSON のマニュアル エントリを参照してください。
地理空間クエリ演算子の詳細については、地理空間クエリに関するマニュアル エントリを参照してください。