2013-07-17 50 views

回答

1

您需要將其建模爲一個點,然後半徑存儲在另一個領域的支持。如果你想測試某個東西是否在那個圓圈內,你將需要使用接近空間索引here

+0

我把圓轉換成近似正則polygen – Tallmad

-1

另一種方法。在這種情況下,我使用貓鼬最受歡迎的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(); 
    }); 
} 

See full example in action

4

我有完全相同的問題,解決的辦法是建立一個多邊形那個r粗略近似一個圓圈(想象一下具有32條邊的多邊形)。

我寫了一個module that does this。你可以這樣使用它:

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); 
相關問題