ポイント: MongoDBのジオロケーション機能は、GeoJSON形式を使用して位置データの効率的な保存とクエリを可能にします。このガイドでは、ポイントやエリアのクエリ、データのインポート、インデックスの作成についての例を提供し、MongoDBの空間クエリメソッドを利用します。
- ジオロケーションデータはGeoJSON形式で保存されます。
- 例には、MongoDBを使用したポイントやポリゴンのクエリが含まれます。
ここでは、MongoDBでジオロケーションデータをクエリし、作業する方法を説明します。GeoJSONは、緯度と経度、すなわち座標によって位置を表現するための普遍的に受け入れられている標準です。MongoDBは、米国地質調査や地図を扱う他の人々が使用するのと同じ構文を使用します。たとえば、単純なポイントは次のように表現されます:
"location" : {
"type" : "Point",
"coordinates" : [
-72.7738706,
41.6332836
]
}
地球上では、経度< 0はイギリスのグリニッジの西を意味します。数値> 0は東を示します。どちらがどちらかを思い出すには、経度の線は長いと考えられるように、北極から南極まで一直線であることを思い出してください。これは180度の弧です。慣例により、これはそれぞれ90度の2つの弧に分割されます。北は正、南は負です。緯度は地球の周りを360度回る円です。慣例により、これは-180(西)と180(東)の間で変動します。赤道は緯度が0の地点です。Googleマップを使用して地図上の地点を指し、右クリックしてここに何があるかを選択すると、経度と緯度が表示されます。しかし、慣例とは逆の順序で、緯度が最初で経度が2番目に表示されます。また、船乗りは度(°)、分(")、秒(')を使用しますが、これは360を基にしており、GeoJSONは基数10の10進法を使用します。これは算術を行う際に明らかに扱いやすくなります。GeoJSONでは、ポイントだけでなく、周囲を描く任意の数の線分によって領域を表現することもできます。これをポリゴンと呼びますが、これは必ずしも5つの辺を持たなければならないわけではありません。GeoJSONポリゴン内の各座標のペアは線分です。以下のように:
location: {
type: "Polygon",
coordinates:
[ [ -73.564453125, 41.178653972331674 ],
[ -71.69128417968749, 41.178653972331674 ],
[ -71.69128417968749, 42.114523952464246 ],
[ -73.564453125, 42.114523952464246 ],
[ -73.564453125, 41.178653972331674 ]
]]
}
MongoDBはジオロケーションデータを保存するのに適しており、ポイント、ポリゴン、その他のジオロケーションオブジェクトを提供し、特定の地点の周囲にあるデータをクエリするための組み込みクエリメソッドを備えています。私たちは、フェアフィールド市とコネチカット州の他の町から提供されたデータを使用してこれを示します。このデータはOpenAddressesによって集められました。(完全なライセンスはこちら。)データはこちらからダウンロードできます。次に、解凍します:
tar xvfz ct.json.tar
次に、次のようにMongoDBインスタンスにロードします。ここで、geoはデータベースであり、addressはコレクションです:
mongoimport --db geo --collection address --file ct.csv.json
次に、特定の地点の周りに地図を描くためにこの便利なツールを使用し、GeoJSON形式でポリゴンを生成します。下のグラフィックに注意してください。コネチカット州はほぼ長方形であるため、周囲をおおよそ定義するのに十分な大きさの長方形を描くことができます。
mongoと入力してMongoDBシェルを開き、下のように1件のレコードを表示し、タイプPointとして座標を表示します:
db.address.findOne()
{
"_id" : ObjectId("5c55b6b46c6e2fc66db81675"),
"state" : "CT",
"postcode" : "06037",
"street" : "Parish Dr",
"district" : "",
"unit" : "",
"location" : {
"type" : "Point",
"coordinates" : [
-72.7738706,
41.6332836
]
},
"region" : "Hartford",
"number" : "51",
"city" : "Berlin"
}
次に、インデックスを作成します。パラメータ2dsphereを使用します。これは、球面上のポイントを使用し、ユークリッド、すなわち平面を使用したくないことを意味します。そうすることで、距離を扱うときにMongoDBが地球の曲率を考慮するようになります:
db.address.createIndex( { "location": "2dsphere"} )
次に、以下に示す座標の4メートル以内にある住所を$nearオペレーターを使用して見つけてみましょう:
db.address.find ({
location: {
$near: {
$geometry: {
type: "Point" ,
coordinates: [ -72.7738706,41.6332836 ]
},
$maxDistance: 4,
$minDistance: 0
}
}
})
次に、上で描画したコネチカット州を定義する正方形内のすべての住所を$geoWithinを使用して見つけてみましょう。座標ペアの周りに追加のブラケット[]を付ける必要があることに注意してください。さもなければMongoDBはそれが配列ではないと不平を言います。慣例では、最初と最後の線分は同じです。だからこそ、4つではなく5つの線を定義するのに必要なのです。
db.address.find ({location:
{$geoWithin:
{$geometry: {
type: "Polygon",
coordinates:
[[ [ -73.564453125, 41.178653972331674 ],
[ -71.69128417968749, 41.178653972331674 ],
[ -71.69128417968749, 42.114523952464246 ],
[ -73.564453125, 42.114523952464246 ],
[ -73.564453125, 41.178653972331674 ]
]]
}}}});
そして、MongoはJavaScriptを理解するので、コネチカット州を次のように定義できます:
var connecticut = db.address.find ({location:
{$geoWithin:
{$geometry: {
type: "Polygon",
coordinates:
[[ [ -73.564453125, 41.178653972331674 ],
[ -71.69128417968749, 41.178653972331674 ],
[ -71.69128417968749, 42.114523952464246 ],
[ -73.564453125, 42.114523952464246 ],
[ -73.564453125, 41.178653972331674 ]
]]
}}}});
そこには918,356の住所があります:
connecticut.count()
918356
MongoDBガイド
- MongoDB概要:MongoDBの始め方
- UbuntuとMacにMongoDBをインストールする方法
- MongoDBでデータベースを作成する
- MongoDBシェル基本コマンド
- MongoDB Compass:Mongo GUIの使用
- MongoDBロールベースのアクセス制御(RBAC)について
- MongoDBのプロジェクションとプロジェクションオペレーターについて
- MongoDB集約関数について
- MongoDBのソート:sort()メソッドと例
- MongoDBでのPushとPullオペレーターの使用
- MongoDB $unwindの使用方法
- 23の一般的なMongoDBクエリオペレーターとその使用方法
- MongoDBのジオロケーションクエリの例
- MongoDBトランザクションの紹介
- MongoDBインデックス:主要インデックスタイプとその管理方法
- 知っておくべきMongoDBの主要コマンド
- MongoDBレプリケーション:完全な紹介
- MongoDBクラスタの設定方法
- MongoDBシャーディング:概念、例、チュートリアル
- MongoDB Atlas:管理されたMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBのメモリ使用、管理、および要件
- MongoDBバックアップ用のmongodumpの使用方法
- MongoDBバックアップの復元のためのmongorestoreの例
- PyMongoの使用方法
- MongoDBとNodeJSのためのMongooseの使用方法
- MongoDBチートシート
- MongoDB対Cassandra:NoSQLデータベースの比較
- PostgreSQL対MongoDB:データベースの比較
- MySQL対MongoDB:データベースの比較
- MongoDB認定:紹介
これらの投稿は私のものであり、必ずしもBMCの立場、戦略、または意見を表しているわけではありません。