Tag for "nær"
Den betragtede afstand vil altid være fra det "nærmeste" punkt på ethvert gemt GeoJSON-objekt. Det samme gælder for Polygon eller MultiPolygon og egentlig alle GeoJSON-objekter, der er gyldige til opbevaring.
Overvej dette:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
Og hvis vi bruger aggregering $geoNear
som et middel til at vise os afstanden fra et givet sted:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Dette fortæller os, at afstanden anses for at være 824 meter.
Hvis du nu betragtede hvert "Punkt" som dets eget dokument i stedet i samlingen og kørte den samme forespørgselsproces:
{
"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
}
Så ser du de forskellige afstande for hvert punkt fra udgangspunktet er forespørgslen, hvor i førstnævnte tilfælde kun det "nærmeste" faktisk blev taget i betragtning for hele objektet.
Så der er beviset for, at afstanden betragtet med $near
/$geoNear
eller er altid kun det nærmeste punkt til den oprindelse, der blev brugt i forespørgslen.
Case for $geoWithin
$geoWithin
driften er dog anderledes. Overvej det originale "MultiPoint"-dokument og derefter denne forespørgsel:
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
]
]
]
}
}
}
})
Dette vil ikke returnere noget resultat, og det vil det ikke, fordi "ikke alle" punktkomponenter i objektet ligger inden for grænserne af den polygon, der bruges i forespørgslen. Men hvis du betragtede hvert punkt som et enkelt dokument:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Så ville to af punkterne ses at være inde i polygonen. Men da disse ikke er gemt som individuelle dokumenter, men som en del af et "MutiPoint", så medmindre alle dele af det objekt er indeholdt i formen, så er resultatet falsk, og dokumentet returneres ikke.
Det samme gælder her for alle GeoJSON-objekter, der i det væsentlige indeholder en samling af "Point" i en eller anden repræsentation.