Du kan ikke helt gøre dette sådan her - generelt kan du ikke basere noget i dine MongoDB-forespørgsler på værdier i samlingerne.
Men siden MongoDB 2.4 understøtter vi et nyt indeks kaldet 2dsphere
som giver dig mulighed for at gemme ikke kun punkter i databasen, men også polygoner. Du vil gemme disse oplysninger i et dokument som:
db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
} );
Og så kan du bruge en "skærende" forespørgsel til at finde ud af, om et punkt er dækket af hver af polygonerne:
db.so.find( {
'loc' : {
$geoIntersects: {
$geometry: { type: 'Point', coordinates: [ 0, 0 ] }
}
}
} );
Som så returnerer:
{
"_id" : ObjectId("51f24d566775068ab0b786f0"),
"name" : "Firestation 1",
"loc" : {
"type" : "Polygon",
"coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
}
Her finder den brandstationen, fordi 0, 0 er i midten af polygonen. Nu er kunsten selvfølgelig at beregne polygonpunkterne, der udgør en cirkel, der er "radius" (f.eks. 10 km) væk fra midtpunktet. Du vil ikke kunne få en rigtig cirkel, men en sekskant eller ottekant burde være god nok. Matematikken til det er ikke ekstremt simpel, men http:// www.movable-type.co.uk/scripts/latlong.html#destPoint har et eksempel i JavaScript. Bare løkke din pejling i 8 trin fra 0 til 2PI for at beregne punkterne langs cirklens omkreds, og sæt dem i koordinaterne. Sørg for at integrere dem i et dobbelt indlejret array og gør den første og den sidste ens:
{
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [
[ point1-lon, point1-lat ],
[ point2-lon, point2-lat ],
[ point3-lon, point3-lat ],
...
[ point1-lon, point1-lat ],
] ]
}
}