Всем привет, как можно сделать выборку всех окружностей в радиус которых попадает точка?
Пока у меня есть такое рещение, но мне кажется можно сделать куда проще и может я что-то упускаю?
Вот так выглядит модель комнаты aka окружность.
var schema = new Schema ({
name: {
type: String,
required: true
},
inPrivate: {
type: Boolean,
required: false
},
location: {
type: { type: String, "enum": [
"Point",
"MultiPoint",
"LineString",
"MultiLineString",
"Polygon",
"MultiPolygon"
] },
coordinates: { type: Array }
},
radius : Number,
created: {
type: Date,
default: Date.now
}
});
schema.index({'polygonConversion': "2dsphere"});
module.exports.Room = mongoose.model('Room', schema);
Мое решение состоит в том, что я преобразую широту долготу и радиус в полигон окружности.
function generateGeoJSONCircle(center, radius, numSides) {
var points = [];
var earthRadius = 6371;
var halfsides = numSides / 2;
var d = parseFloat(radius / 1000.) / earthRadius;
var lat = (center[1] * Math.PI) / 180;
var lon = (center[0] * Math.PI) / 180;
for(var i = 0; i < numSides; i++) {
var gpos = {};
var bearing = i * Math.PI / halfsides; //rad
gpos.latitude = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(bearing));
gpos.longitude = ((lon + Math.atan2(Math.sin(bearing) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(gpos.latitude))) * 180) / Math.PI;
gpos.latitude = (gpos.latitude * 180) / Math.PI;
points.push([gpos.longitude, gpos.latitude]);
};
points.push(points[0]);
return {
type: 'Polygon',
coordinates: [ points ]
};
}
И вот таким образом, я нахожу все полигоны для окружности окружности в радус которых попадает переданная широта и долгота.
coords[0] = req.params.latitude;
coords[1] = req.params.longitude;
Room.find({
location: {
$geoIntersects: {
$geometry: {
type: "Point",
coordinates: coords
}
}
}}).limit(limit).exec(function (err, locations) {
if (err) {
return res.json(500, err);
}
log.info(locations);
res.json(200, locations);
});
Но решение мне кажется не очень правильным, так как чтобы отрисовать потом полигон окружности на карте у клиента, нужно хранить 360 точек для полигона в базе. Думал еще сделать выборку окружностей, которые попадают в опрделенный радиус для пользователя, а уже на клиенте считать, попадает ли точка в эти окружности или нет? Может быть уже у кого-то был подобный опыт и он может подсказать правильный вариант?