MongoDB错误代码16755 - 无法提取地理数据键&重复顶点

时间:2016-04-21 17:28:14

标签: mongodb geometry 2dsphere

当我尝试在几何体db.polygons.createIndex({"geometry":"2dsphere"})上创建索引时,它会停在某个多边形,错误代码为16755.它表示Can't extract geo keysDuplicate vertices: 18 and 20

因此,经过进一步检查,当多边形中的2个节点靠近在一起,甚至重复时,似乎会发生这种情况。

然后我在QGIS中手动删除此节点并重新尝试该过程,只是为了找到具有相同问题的另一个多边形。

如何解决此问题,而无需重复修复多边形的整个过程>上传到MongoDB>创建索引?有没有办法可以找出有多少多边形有这个问题?

3 个答案:

答案 0 :(得分:4)

我遇到了类似的问题。我只需要在我的数据集中找到有效记录(我丢弃了带有重复顶点的记录)。

我重命名了这个集合 -

db.myCollection.renameCollection('myCollectionBk')

然后我将原始集合中的单个记录添加到新集合中,并为集合添加了地理空间索引

db.myCollection.insert(db.myCollectionBk.findOne()) // recreate the collection
db.myCollection.createIndex({geometry:"2dsphere"}) // create the index (assumes the geometry on the record is valid)
db.myCollection.remove({}) // remove the record

然后我将有效记录添加到新集合中。

db.myCollectionBk.find().forEach(function(x){
    db.myCollection.insert(x);
})

简单地忽略无效记录。

在您的情况下,您可能希望从WriteResult获取insert,并查看是否成功。像

这样的东西
var errors = []
db.myCollectionBk.find().forEach(function(x){
    var result = db.myCollection.insert(x);
    if (result.writeError) {
        errors.push({x._id:result.writeError.errmsg});
    }
})

作为另一种选择,请查看this question(我无法让它工作)

答案 1 :(得分:1)

所以我做的是,我首先用索引创建了集合,然后尝试使用mongoimport插入,这给了我成功插入了多少。

> db.someNewCollection.createIndex({"geometry":"2dsphere"})

要将GeoJSON插入MongoDB,我执行了以下操作:

$ jq --compact-output ".features" yourGeoJSON > output.geojson
$ mongoimport --db someDB -c someNewCollection --file "output.geojson" --jsonArray

答案 2 :(得分:0)

MongoDB 错误代码 16755 由于字段不匹配而出现,因此您只需要将相同数量的数据发送到表中即可。