Javascript &引用;MongoError:Can';t从对象中提取地理关键点“;类型:Point
我尝试使用以下内容准备用于地理编码的数据库字段:Javascript &引用;MongoError:Can';t从对象中提取地理关键点“;类型:Point,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我尝试使用以下内容准备用于地理编码的数据库字段: MyCollection._ensureIndex({'data.address.located':'2dsphere'}); 但这一错误随之而来: MongoError: Can't extract geo keys from object, malformed geometry?: { type: "Point", coordinates: [ 32.4586858, -110.8571443 ] } 我看不出这个领域有什么问题?有什么想
MyCollection._ensureIndex({'data.address.located':'2dsphere'});
但这一错误随之而来:
MongoError: Can't extract geo keys from object, malformed geometry?:
{ type: "Point", coordinates: [ 32.4586858, -110.8571443 ] }
我看不出这个领域有什么问题?有什么想法吗
当我查看它时,会显示以下内容:
The following example stores a GeoJSON Point:
{ loc: { type: "Point", coordinates: [ 40, 5 ] } }
问题是
[ 32.4586858, -110.8571443 ]
不是有效的坐标。顺序应该是经度,然后是纬度,而该坐标似乎是相反的(根据有效纬度范围为-90到90,并且-110.8571443在该范围之外这一事实判断)
我想你的意思是:
{ type: "Point", coordinates: [ -110.8571443, 32.4586858 ] }
或者有其他输入错误。因为问题是坐标范围是下一个:
- 经度:(+-)180°
- 纬度:(+-)90°
mongoshell
脚本
假设您已经拥有格式良好的GeoJSON
,类型为Point
db.coll.find().forEach(函数(e){
//假设'geoJson'是包含'coordinates'的字段`
e、 geoJson.coordinates=[//交换Lat/Lon
e、 geoJson.coordinates[1],//首先是经度
e、 geoJson.coordinates[0]//纬度最后一个
];
db.coll.save(e);
//有些“print(e.name)”可以到这里来了解进展情况
});
即使问题已经解决,我也需要强调,如果忽略GeoJSON对象的类型,也可能会出现此错误
在我的例子中,在模型的值中添加了
类型:'Point'
。当我的经度、纬度顺序正确时,我也遇到了同样的问题。我的错误是我写了坐标
,而不是坐标
,mongo给了我这个:
pymongo.errors.WriteError: Can't extract geo keys: {data} Point must be an array or object
因此,也许您的顺序正确,但您的键名有问题。我也有同样的错误,但问题是我有一个带有两个相同坐标的
行字符串
"geometry" : {
"type" : "LineString",
"coordinates" : [
[
143.345763,
-33.840952
],
[
143.345763,
-33.840952
]
]
}
我必须把它变成一个点
,它才有效
"geometry" : {
"type" : "Point",
"coordinates" : [
143.345763,
-33.840952
]
}
第一步是插入一些应该是第一个对象格式的数据,否则这个错误会出现在图片中
schema :
location:{
type: { type: String },
coordinates:[mongoose.Schema.Types.Mixed]
},
然后将一些数据插入数据库
db.userDetails.createIndex({location: "2dsphere"})
仅当位置包含对象时才能创建索引
在写查询之后,如果你想找到距离
db.userDetails.aggregate( [
$geoNear: {
near: { type: "Point", coordinates: [data.lat1,data.lon1]},
spherical: true,
"distanceMultiplier" : 0.001,
distanceField: "calcDistance",
$maxDistance: distance,
}
] )
还有一件事,数据应该在不使用quoated字符串的情况下传递
"lat":18.7323
"lon":73.1232
像这样该死的。。。你说得对。这太愚蠢了。。。几天前我也遇到了同样的问题,并解决了它。。。现在又犯了同样的错误。谢谢…这发生在最好的家庭!即使是我的!错误总会发生。MongoDB可以有一个更清晰的消息来解释失败的原因是经度值无效。我“喜欢”当我见过的其他系统都把lat
放在第一位时,每个人都会为此自责。@Andreweadges这是GeoJSON标准<代码>lon
首先!我想MongoDB不会接受笛卡尔坐标,只接受横向/纵向坐标对?@Mike只要坐标在纵向/横向范围内,你就可以使用坐标。否则索引将迫使你限制你的坐标,这很容易超出这些限制,你最终将成为同一个lon/lat对。@PaulT.Rawkeen不为我工作。db.coll.save(e)未更新“coll”集合。没有错误。