Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 中庸;地理空间查询-查找与另一个给定名称相交的线字符串_Angularjs_Node.js_Mongodb_Google Maps Api 3_Mongoose - Fatal编程技术网

Angularjs 中庸;地理空间查询-查找与另一个给定名称相交的线字符串

Angularjs 中庸;地理空间查询-查找与另一个给定名称相交的线字符串,angularjs,node.js,mongodb,google-maps-api-3,mongoose,Angularjs,Node.js,Mongodb,Google Maps Api 3,Mongoose,我正在尝试使用MEAN构建一个应用程序,但现在我在尝试查找与另一个给定名称的线串相交的线串时遇到了麻烦 例如,给定下图,poly1和poly2应该有交点,而poly3没有交点 让我们假设poly1具有以下坐标和以下JSON: { "_id" : ObjectId("57ab2107505ab11b1bd8422e"), "name" : "poly1", "updated_at" : ISODate("2016-08-10T12:41:43.789+0000"), "c

我正在尝试使用MEAN构建一个应用程序,但现在我在尝试
查找与另一个给定名称的线串相交的线串时遇到了麻烦

例如,给定下图,
poly1
poly2
应该有交点,而
poly3
没有交点

让我们假设
poly1
具有以下坐标和以下
JSON

{ 
  "_id" : ObjectId("57ab2107505ab11b1bd8422e"), 
  "name" : "poly1", 
  "updated_at" : ISODate("2016-08-10T12:41:43.789+0000"), 
  "created_at" : ISODate("2016-08-10T12:41:43.780+0000"), 
  "geo" : {
      "coordinates" : [ [14.59, 24.847], [28.477, 15.961] ], 
      "type" : "LineString"
  }, 
  "__v" : NumberInt(0)
}
当我在
MongoChef
上运行查询时,我找到了
poly1
poly2
,但没有找到我想要的
poly3

{
    geo :{
        $geoIntersects:{
            $geometry :{
                type: "LineString" ,
                coordinates: [ [14.59, 24.847], [28.477, 15.961] ]
            }
        }
    }
}
然而,当我在
Mongoose
上运行查询时,给定一个
多段线Id/name
它不起作用

//Given
var linestringById = Linestrings.find({name : lineName});
var linestrings    = Linestrings.find({});    

//Works
query = linestrings.where({ geo : { $geoIntersects : 
                    { $geometry : 
                       { type : 'LineString', 
                         coordinates : [ [27.528, 25.006], [14.063, 15.591] ]
                        } 
                     } } });

//Does not work
query = linestrings.where({ geo : { $geoIntersects : 
                   { $geometry : 
                     { type : 'LineString', 
                       coordinates : linestringById.geo.coordinates
                     } 
                    } } });
//Also does not work:
query = linestrings.where({ geo : { $geoIntersects : 
                   { $geometry : 
                     { type : 'LineString', 
                       coordinates : linestringById
                     } 
                    } } });
这是线条字符串的模式:

var mongoose = require('mongoose');
var Schema   = mongoose.Schema;

// Creates a LineString Schema.
var linestrings = new Schema({
    name: {type: String, required : true},
    geo : {
        type : {type: String, default: "LineString"},
                coordinates : Array
    },
    created_at: {type: Date, default: Date.now},
    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
linestrings.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

linestrings.index({geo : '2dsphere'});
module.exports = mongoose.model('linestrings', linestrings);
/** Requiring Factories **/
var LinestringFactory = require('./factories/linestring.factory.js');

module.exports = function(app) {
  // Retrieves JSON records for all linestrings intersecting a given one
    app.post('/find-poly-intersection', function(req, res) {
        LinestringFactory.findIntersections(req).then( function (linestrings) {
            return res.json(linestrings);
        }, function (error) {
            return res.json(error);
        })
    });
}
var Linestrings  = require('../models/linestring-model.js');

exports.findIntersections = findIntersections;

/** Finds Linestrings Intersections **/
function findIntersections(req) {
    return new Promise( function (resolve, reject) {
        var lineName       = req.body.name;
        var linestringById = Linestrings.find({name : lineName});
        var linestrings    = Linestrings.find({});

        //Check if that certain linestring exists with Lodash
        if (_.isEmpty(linestringById) || _.isUndefined(linestringById) 
            || _.isNull(linestringById)){
            return reject('No Linestrings found for that Name');
        } else {

        query = linestrings.where({ geo : 
                { $geoIntersects : { $geometry : 
                  { type : 'LineString', 
                    coordinates : linestringById.geo.coordinates} 
                } } });

        query.exec(function (err, intersections) {
            if (err){
                return reject(err);
            }
            return resolve(intersections);
        });

    }, function (error) {
        return reject(error);
    })
}
这就是我从前端调用查询的方式QueryController.js

/** Looks for LineStrings intersecting a given linestring **/
vm.polyIntersect = function () {

   //Taking name from a form
   vm.queryBody = {
                    name : vm.formData.poly1
   };

   // Post the queryBody 
   $http.post('/find-poly-intersection', vm.queryBody)
             .success(function(queryResults) {
                console.log(queryResults);
             })
            .error(function(queryResults) {
                console.log('Error: no results found '+queryResults));
            });
};
这是我的路线。js

var mongoose = require('mongoose');
var Schema   = mongoose.Schema;

// Creates a LineString Schema.
var linestrings = new Schema({
    name: {type: String, required : true},
    geo : {
        type : {type: String, default: "LineString"},
                coordinates : Array
    },
    created_at: {type: Date, default: Date.now},
    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
linestrings.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

linestrings.index({geo : '2dsphere'});
module.exports = mongoose.model('linestrings', linestrings);
/** Requiring Factories **/
var LinestringFactory = require('./factories/linestring.factory.js');

module.exports = function(app) {
  // Retrieves JSON records for all linestrings intersecting a given one
    app.post('/find-poly-intersection', function(req, res) {
        LinestringFactory.findIntersections(req).then( function (linestrings) {
            return res.json(linestrings);
        }, function (error) {
            return res.json(error);
        })
    });
}
var Linestrings  = require('../models/linestring-model.js');

exports.findIntersections = findIntersections;

/** Finds Linestrings Intersections **/
function findIntersections(req) {
    return new Promise( function (resolve, reject) {
        var lineName       = req.body.name;
        var linestringById = Linestrings.find({name : lineName});
        var linestrings    = Linestrings.find({});

        //Check if that certain linestring exists with Lodash
        if (_.isEmpty(linestringById) || _.isUndefined(linestringById) 
            || _.isNull(linestringById)){
            return reject('No Linestrings found for that Name');
        } else {

        query = linestrings.where({ geo : 
                { $geoIntersects : { $geometry : 
                  { type : 'LineString', 
                    coordinates : linestringById.geo.coordinates} 
                } } });

        query.exec(function (err, intersections) {
            if (err){
                return reject(err);
            }
            return resolve(intersections);
        });

    }, function (error) {
        return reject(error);
    })
}
这是我的LineString.factory.js

var mongoose = require('mongoose');
var Schema   = mongoose.Schema;

// Creates a LineString Schema.
var linestrings = new Schema({
    name: {type: String, required : true},
    geo : {
        type : {type: String, default: "LineString"},
                coordinates : Array
    },
    created_at: {type: Date, default: Date.now},
    updated_at: {type: Date, default: Date.now}
});

// Sets the created_at parameter equal to the current time
linestrings.pre('save', function(next){
    now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now
    }
    next();
});

linestrings.index({geo : '2dsphere'});
module.exports = mongoose.model('linestrings', linestrings);
/** Requiring Factories **/
var LinestringFactory = require('./factories/linestring.factory.js');

module.exports = function(app) {
  // Retrieves JSON records for all linestrings intersecting a given one
    app.post('/find-poly-intersection', function(req, res) {
        LinestringFactory.findIntersections(req).then( function (linestrings) {
            return res.json(linestrings);
        }, function (error) {
            return res.json(error);
        })
    });
}
var Linestrings  = require('../models/linestring-model.js');

exports.findIntersections = findIntersections;

/** Finds Linestrings Intersections **/
function findIntersections(req) {
    return new Promise( function (resolve, reject) {
        var lineName       = req.body.name;
        var linestringById = Linestrings.find({name : lineName});
        var linestrings    = Linestrings.find({});

        //Check if that certain linestring exists with Lodash
        if (_.isEmpty(linestringById) || _.isUndefined(linestringById) 
            || _.isNull(linestringById)){
            return reject('No Linestrings found for that Name');
        } else {

        query = linestrings.where({ geo : 
                { $geoIntersects : { $geometry : 
                  { type : 'LineString', 
                    coordinates : linestringById.geo.coordinates} 
                } } });

        query.exec(function (err, intersections) {
            if (err){
                return reject(err);
            }
            return resolve(intersections);
        });

    }, function (error) {
        return reject(error);
    })
}
QueryController
中的
console.log
为任何 行字符串名称

我正在确保插入
[lng,lat]
坐标

你知道为什么我不能找到任何与Id相交的线串,而我可以使用直线坐标找到它们吗?


提前感谢。

您正在将latitute、longitute格式的linestring.geo.coordinates传递给最终查询。 Mongodb接受x,y格式的坐标,因此它必须是
经度、纬度

更新:

您将需要直接以$geometry的形式传递线字符串

query = linestrings.where({ geo : { $geoIntersects : 
                   { 
                       $geometry : lineStringbyId.

                    } } });

我终于用下面的代码解决了这个问题

/** Finds Linestrings Intersections **/
function findIntersections(req) {
    return new Promise( function (resolve, reject) {
        var lineName = req.body.name;
        Linestrings.findOne({name : lineName}).then( function (linestringById, error) {
            if(error){
                return reject({error : 'LineString not Found'});
            }
                queryIntersections(linestringById).then( function (response) {
                    return resolve(response);
                });
        });
    }, function (error) {
        return reject({error : 'Error while executing promise'});
    });
}

function queryIntersections(linestringById) {
    return new Promise( function (resolve, reject) {
        if (_.isEmpty(linestringById) || _.isUndefined(linestringById) || _.isNull(linestringById)){
            return reject({ error : 'No Linestrings found for that Name'});
        } else {
            query = Linestrings.where( { geo : { $geoIntersects : { $geometry : { type: 'LineString', coordinates: linestringById.geo.coordinates  } } } } );
            queryExec(query).then( function (intersections) {
                return resolve(intersections);
            });
        }
    }, function (error){
       return reject({error : 'Error while executing promise'});
    });
}
错误是由于我没有正确地将
linestrings
linestringById
对象传递到查询而导致的


我希望它能帮助别人。

嗨,谢谢你的回答。你的意思是,我应该在发布新的行字符串时插入
[lng,lat]
?我想我不需要为此更改代码。仍然是空对象。这是猫鼬日志有什么想法吗@DhruvPathak