Как определить круг с помощью GeoJson?

Я хочу использовать геометрию в MongoDB.

Но круг не поддерживается в geojson в соответствии с geojson.org.


person Tallmad    schedule 17.07.2013    source источник


Ответы (4)


У меня была точно такая же проблема, решение состоит в том, чтобы создать многоугольник, который примерно приближается к кругу (представьте себе многоугольник с 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);
person arg20    schedule 27.11.2016

Вам нужно будет смоделировать его как точку, а затем сохранить радиус в другом поле. Если вы хотите проверить, находится ли что-то внутри этого круга, вам нужно будет использовать пространственный индекс близости, как обсуждалось здесь

person Shane C. Mason    schedule 26.11.2013
comment
Наконец, я конвертирую круг в приблизительный правильный многоугольник. - person Tallmad; 27.11.2013

{
   <location field>: {
      $geoWithin: { $centerSphere: [ [ <x>, <y> ], <radius> ] }
   }
}

https://docs.mongodb.com/manual/reference/operator/query/centerSphere/

Начиная с версии 1.8

person CodeMan    schedule 17.05.2016

Другой подход к этому. В этом случае я использовал 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();
    });
}

Полный пример в действии

person Saras Arya    schedule 18.02.2016