Nick93
@Nick93

Как сделать такую выборку геологационных данных mongodb?

Всем привет, как можно сделать выборку всех окружностей в радиус которых попадает точка?
Пока у меня есть такое рещение, но мне кажется можно сделать куда проще и может я что-то упускаю?
Вот так выглядит модель комнаты 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 точек для полигона в базе. Думал еще сделать выборку окружностей, которые попадают в опрделенный радиус для пользователя, а уже на клиенте считать, попадает ли точка в эти окружности или нет? Может быть уже у кого-то был подобный опыт и он может подсказать правильный вариант?
  • Вопрос задан
  • 470 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы