「近く」の場合
考慮される距離は、常に、保存されているGeoJSONオブジェクトの「最も近い」ポイントからです。同じことがPolygon、MultiPolygon、そして実際にストレージに有効なすべてのGeoJSONオブジェクトにも当てはまります。
これを考慮してください:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
また、集計を使用する場合は、 $geoNear
特定の場所からの距離を表示する手段として:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
これは、距離が824メートルと見なされることを示しています。
ここで、各「ポイント」をコレクション内の代わりに独自のドキュメントと見なし、同じクエリプロセスを実行した場合:
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
},
"distance" : 824.837276194968
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
},
"distance" : 1114.0666715946495
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.958,
40.8003
]
},
"distance" : 3266.4720692258156
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9498,
40.7968
]
},
"distance" : 3351.9091229713567
}
次に、原点からの各ポイントの異なる距離がクエリであることがわかります。前者の場合、オブジェクト全体に対して「最も近い」のみが実際に考慮されました。
したがって、距離が$near
で考慮されているという証拠があります。 / $geoNear
または常にのみ クエリで使用された原点に最も近いポイント。
$geoWithinのケース
$geoWithin
ただし、操作は異なります。元の「MultiPoint」ドキュメントを検討してから、次のクエリを検討してください。
db.geo.find({
"location": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": [
[
[
-73.98382186889648,
40.75961056635002
],
[
-74.00030136108398,
40.782751138401245
],
[
-73.97317886352539,
40.78950978441435
],
[
-73.95910263061523,
40.7720918760227
],
[
-73.98382186889648,
40.75961056635002
]
]
]
}
}
}
})
これは結果を返しません。また、オブジェクトの「すべてではない」ポイントコンポーネントが、クエリで使用されるポリゴンの境界内にあるためではありません。ただし、各ポイントを1つのドキュメントと見なした場合:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
次に、2つのポイントがポリゴンの内側にあるように見えます。ただし、これらは個別のドキュメントとしてではなく「MutiPoint」の一部として保存されるため、すべてでない限り そのオブジェクトの一部が図形内に含まれている場合、結果はfalseになり、ドキュメントは返されません。
ここでも同じことが、何らかの表現で「ポイント」のコレクションを本質的に含むすべてのGeoJSONオブジェクトに当てはまります。