【问题标题】:MongoDB Error Code 16755 - Can't extract geo keys & duplicate verticesMongoDB 错误代码 16755 - 无法提取地理键和重复顶点
【发布时间】:2016-04-21 17:28:13
【问题描述】:

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

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

然后我在 QGIS 中手动删除此节点并重试该过程,结果发现另一个多边形存在相同问题。

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

【问题讨论】:

    标签: mongodb geometry 2dsphere


    【解决方案1】:

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

    我重命名了集合 -

    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);
    })
    

    无效的记录会被忽略。

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

    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(我无法让它工作)

    【讨论】:

    • 太棒了。我正要走上一条黑暗黑暗的道路。我想知道是否有办法以更大规模的方式做到这一点。
    • 谢谢,你拯救了我的一天! :D
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2016-03-05
      相关资源
      最近更新 更多