Я хочу использовать геометрию в MongoDB.
Но круг не поддерживается в geojson в соответствии с geojson.org.
Я хочу использовать геометрию в MongoDB.
Но круг не поддерживается в geojson в соответствии с geojson.org.
У меня была точно такая же проблема, решение состоит в том, чтобы создать многоугольник, который примерно приближается к кругу (представьте себе многоугольник с 32+ ребрами).
Я написал модуль, который делает это. Вы можете использовать его следующим образом:
const circleToPolygon = require('circle-to-polygon');
const coordinates = [-27.4575887, -58.99029]; //[lon, lat]
const radius = 100; // in meters
const numberOfEdges = 32; //optional that defaults to 32
let polygon = circleToPolygon(coordinates, radius, numberOfEdges);
Вам нужно будет смоделировать его как точку, а затем сохранить радиус в другом поле. Если вы хотите проверить, находится ли что-то внутри этого круга, вам нужно будет использовать пространственный индекс близости, как обсуждалось здесь
{
<location field>: {
$geoWithin: { $centerSphere: [ [ <x>, <y> ], <radius> ] }
}
}
https://docs.mongodb.com/manual/reference/operator/query/centerSphere/
Начиная с версии 1.8
Другой подход к этому. В этом случае я использовал mongoose, один из самых популярных дистрибутивов MongoDB, чтобы добавить круг на карту с радиусом, а затем выполнить запрос с использованием внешнего параметра и оценить, находится ли он внутри круга или вне круга. В этом примере также есть раздел комментариев для многоугольника, где, если вы сохранили многоугольник и хотите найти, существует ли точка внутри многоугольника, вы также можете это сделать. Кроме того, в ближайшее время появится раздел для полной интеграции внешнего интерфейса и внутреннего интерфейса для полноценного использования геозоны.
Код
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var assert = require('assert');
console.log('\n===========');
console.log(' mongoose version: %s', mongoose.version);
console.log('========\n\n');
var dbname = 'testing_geojsonPoint';
mongoose.connect('localhost', dbname);
mongoose.connection.on('error', function() {
console.error('connection error', arguments);
});
// schema
var schema = new Schema({
loc: {
type: {
type: String
},
coordinates: []
},
radius : {
type : 'Number'
}
});
schema.index({
loc: '2dsphere'
});
var A = mongoose.model('A', schema);
// mongoose.connection.on('open', function() {
// A.on('index', function(err) {
// if (err) return done(err);
// A.create({
// loc: {
// type: 'Polygon',
// coordinates: [
// [
// [77.69866, 13.025621],
// [77.69822, 13.024999, ],
// [77.699314, 13.025025, ],
// [77.69866, 13.025621]
// ]
// ]
// }
// }, function(err) {
// if (err) return done(err);
// A.find({
// loc: {
// $geoIntersects: {
// $geometry: {
// type: 'Point',
// coordinates: [77.69979,13.02593]
// }
// }
// }
// }, function(err, docs) {
// if (err) return done(err);
// console.log(docs);
// done();
// });
// });
// });
// });
mongoose.connection.on('open', function() {
A.on('index', function(err) {
if (err) return done(err);
A.create({
loc: {
type: 'Point',
coordinates: [77.698027,13.025292],
},
radius : 115.1735664276843
}, function(err, docs) {
if (err) return done(err);
A.find({
loc: {
$geoNear: {
$geometry: {
type: 'Point',
coordinates: [77.69735,13.02489]
},
$maxDistance :docs.radius
}
}
}, function(err, docs) {
if (err) return done(err);
console.log(docs);
done();
});
});
});
});
function done(err) {
if (err) console.error(err.stack);
mongoose.connection.db.dropDatabase(function() {
mongoose.connection.close();
});
}