" MongoError:无法从对象"中提取地理位置密钥。类型:点

时间:2014-08-06 00:41:39

标签: 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 ] }

我看不出这个领域有什么问题?有什么想法吗?

当我查看this时,它会显示出来:

The following example stores a GeoJSON Point:

{ loc: { type: "Point", coordinates: [ 40, 5 ] } }

6 个答案:

答案 0 :(得分:47)

问题在于

[ 32.4586858, -110.8571443 ]

不是有效坐标。顺序应该是经度,然后是纬度,而该坐标看起来是相反的(根据有效纬度范围为-90到90且-110.8571443不在其中的事实来判断。)

我认为你的意思是:

{ type: "Point", coordinates: [ -110.8571443, 32.4586858 ] }

或者还有其他一些输入错误。

答案 1 :(得分:7)

作为mentioned by @go-oleg,问题是下一个坐标范围是:

  • 经度:(+ - )180°
  • 纬度:(+ - )90°

和索引期望坐标在该边界中

但是,如果您尝试在已导入的数据上应用索引并发现坐标已交换,您可能需要将其交换回来而不是重新导入整个采集。为此,您可以使用下一个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,

               }
] )

喜欢