首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多边形内的猫鼬地质查询

多边形内的猫鼬地质查询
EN

Stack Overflow用户
提问于 2014-07-25 18:59:30
回答 1查看 3.4K关注 0票数 1

不知怎么我要疯了,但让我解释一下。我有一个文档集合,每个文档在"loc“字段中都有一个GPS坐标(例如下面的例子)。现在,我想查询属于特定领域的所有文档。当我使用MongoShell进行查询时,我得到了正确的结果,但是当我使用Mongoose尝试时,每次尝试都失败了。

如下所示,我尝试了在多边形坐标附近使用2和3 []的不同尝试。

MongoDB版本: 2.6.3猫鼬版本: 3.8.13

也许有人能帮我找出我看不到的类型或其他愚蠢的错误;-(遗憾的是,错误信息“未定义不是一个函数”并没有多大帮助。)

谢谢!

Mongoose-Schema

代码语言:javascript
复制
(function () {
    module.exports = function (mongoose, Schema) {

        var PointSchema = new Schema({
            _id: Schema.ObjectId,
            loc: {
                type: { type: String },
                coordinates: { type: [Number]}
            }           
        }, { collection: "points" });
        PointSchema.index({ loc: "2dsphere" });

        mongoose.model("Point", PointSchema);
    };
})(); 

来自集合示例文档

代码语言:javascript
复制
{
   "_id": ObjectId("53d0d30c92a82799d8ed31d2"),
   "loc": {
     "type": "Point",
     "coordinates": {
       "0": 8.5652166666667,
       "1": 49.3288
    }
  }
}

Mongo脚本,它基于:geoWithin工作

代码语言:javascript
复制
db.points.find( { loc :
                         { $geoWithin :
                            { $geometry :
                               { type : "Polygon" ,
                                 coordinates :  [[[8.594874265234353, 49.33654935186479],
            [8.594874265234353, 49.322858939564284],
            [8.553675534765603, 49.322858939564284],
            [8.553675534765603, 49.33654935186479],
            [8.594874265234353, 49.33654935186479]]]
                      } } } } )

1.失败的猫鼬尝试错误消息: TypeError:未定义不是一个函数-尝试接受脚本并将其放入“查找”中

代码语言:javascript
复制
var Point = mongoose.model("Point");
    var pointFields = { '_id': 1, 'loc': 1 };
    Point.find({
        loc:
                             {
                                 $geoWithin:
                                  {
                                      $geometry:
                                       {
                                           type: "Polygon",
                                           coordinates: [[[8.594874265234353, 49.33654935186479],
                      [8.594874265234353, 49.322858939564284],
                      [8.553675534765603, 49.322858939564284],
                      [8.553675534765603, 49.33654935186479],
                      [8.594874265234353, 49.33654935186479]]]
                                       }
                                  }
                             }
    }).select(pointFields).lean().exec(function (error, result) {
        console.log("Error: " + error);
        processResponse(error, result, response);
    });

**2.失败的猫鼬尝试使用3[] **错误消息: MongoError:无法规范化查询:基于:https://github.com/LearnBoost/mongoose/issues/2092的BadValue坏地理查询

代码语言:javascript
复制
var geoJsonPoly = {
        polygon: [[[8.594874265234353, 49.33654935186479],
                      [8.594874265234353, 49.322858939564284],
                      [8.553675534765603, 49.322858939564284],
                      [8.553675534765603, 49.33654935186479],
                      [8.594874265234353, 49.33654935186479]]]
    };

    var Point = mongoose.model("Point");
    var pointFields = { '_id': 1, 'loc': 1 };
    Point.find({}).where('loc').within(geoJsonPoly).select(pointFields).lean().exec(function (error, result) {
        console.log("Error: " + error);
        processResponse(error, result, response);
        });

3.失败的猫鼬尝试使用2[]错误消息: TypeError:未定义不是基于:https://github.com/LearnBoost/mongoose/issues/2092查询-在的函数

代码语言:javascript
复制
var geoJsonPoly = {
        polygon: [[8.594874265234353, 49.33654935186479],
                      [8.594874265234353, 49.322858939564284],
                      [8.553675534765603, 49.322858939564284],
                      [8.553675534765603, 49.33654935186479],
                      [8.594874265234353, 49.33654935186479]]
    };

    var Point = mongoose.model("Point");
    var pointFields = { '_id': 1, 'loc': 1 };
    Point.find({}).where('loc').within(geoJsonPoly).select(pointFields).lean().exec(function (error, result) {
        console.log("Error: " + error);
        processResponse(error, result, response);
    });

4.失败的猫鼬尝试错误消息: MongoError:无法规范化查询: BadValue糟糕的地理查询--试图使用2[]在坐标附近使用完整的GeoJSON

代码语言:javascript
复制
var geoJsonPoly = {
        type: "Polygon",
        coordinates: [[8.594874265234353, 49.33654935186479],
            [8.594874265234353, 49.322858939564284],
            [8.553675534765603, 49.322858939564284],
            [8.553675534765603, 49.33654935186479],
            [8.594874265234353, 49.33654935186479]]
    };

    var Point = mongoose.model("Point");
    var pointFields = { '_id': 1, 'loc': 1 };
    Point.find({}).where('loc').within(geoJsonPoly).select(pointFields).lean().exec(function (error, result) {
        console.log("Error: " + error);
        processResponse(error, result, response);
    });

5.失败的猫鼬尝试错误消息: TypeError:未定义不是一个函数--尝试使用坐标周围的3[]来使用完整的GeoJSON

代码语言:javascript
复制
var geoJsonPoly = {
        type: "Polygon",
        coordinates: [[[8.594874265234353, 49.33654935186479],
            [8.594874265234353, 49.322858939564284],
            [8.553675534765603, 49.322858939564284],
            [8.553675534765603, 49.33654935186479],
            [8.594874265234353, 49.33654935186479]]]
    };

    var Point = mongoose.model("Point");
    var pointFields = { '_id': 1, 'loc': 1 };
    Point.find({}).where('loc').within(geoJsonPoly).select(pointFields).lean().exec(function (error, result) {
        console.log("Error: " + error);
        processResponse(error, result, response);
    });

console.trace()返回

代码语言:javascript
复制
Trace
at Promise.<anonymous> (C:\Dev\Mobile\src\nodejs\analyze.js:336:17)
    at Promise.<anonymous> (C:\Dev\Mobile\src\nodejs\node_modules\mongoose\node_modules\mpromise\lib\promise.js:172:8)
    at Promise.EventEmitter.emit (events.js:95:17)
    at Promise.emit (C:\Dev\Mobile\src\nodejs\node_modules\mongoose\node_modules\mpromise\lib\promise.js:84:38)
    at Promise.reject (C:\Dev\Mobile\src\nodejs\node_modules\mongoose\node_modules\mpromise\lib\promise.js:111:15)
    at Promise.error (C:\Dev\Mobile\src\nodejs\node_modules\mongoose\lib\promise.js:89:15)
    at Promise.resolve (C:\Dev\Mobile\src\nodejs\node_modules\mongoose\lib\promise.js:107:24)
    at Promise.<anonymous> (C:\Dev\Mobile\src\nodejs\node_modules\mongoose\node_modules\mpromise\lib\promise.js:172:8)
    at Promise.EventEmitter.emit (events.js:95:17)
    at Promise.emit (C:\Dev\Mobile\src\nodejs\node_modules\mongoose\node_modules\mpromise\lib\promise.js:84:38)
EN

回答 1

Stack Overflow用户

发布于 2014-07-25 23:16:22

文档中的GeoJSON结构似乎不正确。尝试将坐标指定为数组:

代码语言:javascript
复制
 {
   "_id": ObjectId("53d0d30c92a82799d8ed31d2"),
   "loc": {
     "type": "Point",
     "coordinates": [8.5652166666667, 49.3288]
  }
}

这与您的第五个示例结合使用。还可以查看关于多边形的结构方面的多边形引用。

工作示例代码:

代码语言:javascript
复制
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var PointSchema = new mongoose.Schema({
    _id: mongoose.Schema.ObjectId,
    loc: {
        type: { type: String },
        coordinates: { type: [Number] }
    }
}, { collection: "points" });

PointSchema.index({ loc: "2dsphere" });
mongoose.model("Point", PointSchema);

var geoJsonPoly = {
        type: "Polygon",
        coordinates: [
            [
                [8.594874265234353, 49.33654935186479],
                [8.594874265234353, 49.322858939564284],
                [8.553675534765603, 49.322858939564284],
                [8.553675534765603, 49.33654935186479],
                [8.594874265234353, 49.33654935186479]
            ]
        ]
    };

var Point = mongoose.model("Point");
var pointFields = { '_id': 1, 'loc': 1 };
Point.find({}).where('loc').within(geoJsonPoly).select(pointFields).lean().exec(function (error, result) {
    console.log("Error: " + error);
    console.log(result);
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24962751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档