我尝试使用以下方法准备我的数据库字段以进行地理编码:
MyCollection._ensureIndex({'data.address.located':'2dsphere'});
然后这个错误来了:
MongoError: Can't extract geo keys from object, malformed geometry?:
{ type: "Point", coordinates: [ 32.4586858, -110.8571443 ] }
我看不出这个领域有什么问题?有什么想法吗?
当我查看this时,它会显示出来:
The following example stores a GeoJSON Point:
{ loc: { type: "Point", coordinates: [ 40, 5 ] } }
答案 0 :(得分:47)
问题在于
[ 32.4586858, -110.8571443 ]
不是有效坐标。顺序应该是经度,然后是纬度,而该坐标看起来是相反的(根据有效纬度范围为-90到90且-110.8571443不在其中的事实来判断。)
我认为你的意思是:
{ type: "Point", coordinates: [ -110.8571443, 32.4586858 ] }
或者还有其他一些输入错误。
答案 1 :(得分:7)
作为mentioned by @go-oleg,问题是下一个坐标范围是:
和索引期望坐标在该边界中 。
但是,如果您尝试在已导入的数据上应用索引并发现坐标已交换,您可能需要将其交换回来而不是重新导入整个采集。为此,您可以使用下一个mongoshell
脚本。
假设您已经格式
GeoJSON
类型为Point
。
db.coll.find().forEach(function (e) {
// assuming that `geoJson` is our field containing `coordinates`
e.geoJson.coordinates = [ // Swapping Lat/Lon
e.geoJson.coordinates[1], // Longitude goes first
e.geoJson.coordinates[0] // Latitude goes last
];
db.coll.save(e);
// Some `print(e.name)` can go here just to understand the progress
});
答案 2 :(得分:1)
即使问题已解决,如果省略GeoJSON对象的类型,我也需要突出显示此错误。
在我的情况下,更正了将output
添加到模型的值。
答案 3 :(得分:1)
当我的经度,纬度顺序正确时,我遇到了同样的问题。我的错误是我写了coordiantes
而不是coordinates
mongo给了我这个:
pymongo.errors.WriteError: Can't extract geo keys: {data} Point must be an array or object
所以也许你有正确的订购,但你的密钥名称有问题。
答案 4 :(得分:0)
我遇到了同样的错误,但是问题是我有一个LineString
,它的两个坐标相同。
"geometry" : {
"type" : "LineString",
"coordinates" : [
[
143.345763,
-33.840952
],
[
143.345763,
-33.840952
]
]
}
我必须将其设置为Point
才能有效
"geometry" : {
"type" : "Point",
"coordinates" : [
143.345763,
-33.840952
]
}
答案 5 :(得分:0)
第一步是插入一些应采用第一种对象格式的数据,否则该错误将出现在图片中
foreach($bookings as $booking){
// do something with each booking
// e.g. var_dump($booking) to see the data you're working with
}
然后将一些数据插入db
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,
}
] )
喜欢