この章では、MongoDBが地理空間データをどのように格納するかについて紹介します。MongoDBの地理空間クエリ機能を活用するためには、まず地理空間データの格納方法を理解する必要があります。

地理空間データは主に点、線、および幾何学的な形状で構成されています。

地図上の1点はその経度と緯度座標で定義されます。複数の点が線を形成し、複数の線がさまざまな形状を形成することができます。

実際のアプリケーションでは、店舗の位置、「現在の場所は?」「学校はどこですか?」などはすべて座標を使用して表されます。キャンパスやショッピングモールの範囲を記述する際には、幾何学的な形状が必要となります。

GeoJSONオブジェクト

MongoDBはGeoJSONオブジェクトを使用して地理空間情報を表現します。

一般的なGeoJSONのタイプには以下があります:

  • Point - 座標点を表す
  • LineString - 線を表す
  • Polygon - 多角形を表す

MongoDBフィールド内でのGeoJSONオブジェクトの格納形式は以下のとおりです:

<field>: { type: <geojson type>, coordinates: <coordinates> }

説明:

  • - フィールド名
  • type - GeoJSONのタイプ
  • coordinates - 座標点の配列。異なるGeoJSONのタイプに応じてフォーマットが異なります。

例:

location: {
      type: "Point",  // 地理空間データのタイプ、この場合、座標点です
      coordinates: [-73.856077, 40.848447] // 経度、緯度
}

説明: locationフィールドは座標点の地理空間データを格納しています。

座標点 (Point)

フォーマット:

{ type: "Point", coordinates: [ 経度, 緯度 ] }

例:

{ type: "Point", coordinates: [ 40, 5 ] }

線 (LineString)

フォーマット:

{ type: "LineString", coordinates: [ 点1, 点2, ...] }

例:

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

多角形 (Polygon)

1つまたは複数の線で構成されることができます。 フォーマット:

{
  type: "Polygon",
  coordinates: [ 
		線1,
		線2,
		....
	]
}

注意:各線セグメントの開始と終了の座標は同じでなければならず、閉じた形状を形成するためです。

単一の線セグメントから成る形状

{
  type: "Polygon",
  coordinates: [
  		[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // 線セグメントの座標点、最初と最後の座標が同じであることに注意
	]
}

複数の線セグメントから成る形状

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // 線セグメント1
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]  // 線セグメント2
  ]
}

地理空間インデックス

MongoDBは2種類の地理空間インデックスをサポートしており、GeoJSONデータのクエリを高速化することができます。

2dsphere

これは球面ジオメトリのインデックスタイプであり、2点間の距離を計算する際、2dsphereは地球を球体として扱います。

2dsphereインデックスを作成する例:

db.collection.createIndex( { location : "2dsphere" } )

locationフィールドにインデックスを作成します。

2d

2Dは平面ジオメトリの一種であり、2点間の距離を地平面上にあるものとして計算します。 2Dインデックスを作成する例:

db.collection.createIndex( { location : "2d" } )

locationフィールドにインデックスを作成します。

地理空間クエリのタイプ

地理空間クエリはすべて幾何学的な計算に関連しています。MongoDBでサポートされているクエリのタイプは以下の通りです:

  • $geoIntersects - 特定の幾何学的な形状との交差をマッチングするために使用します。
  • $geoWithin - 指定された幾何学的なエリア内に含まれるドキュメントをマッチングします。
  • $near - 通常、指定された座標点に最も近いドキュメントをクエリするために使用されます。

注意:より詳細な地理空間クエリの情報については、次の章を参照してください。