Код ошибки MongoDB 16755 - Не удается извлечь гео-ключи и дублировать вершины

Когда я пытаюсь создать индекс по геометрии db.polygons.createIndex({ "geometry": "2dsphere" }), он останавливается на определенном полигоне с кодом ошибки 16755. Он говорит it Невозможно извлечь гео-ключи и Дублировать вершины: 18 и 20.

Таким образом, при дальнейшем осмотре кажется, что это происходит, когда 2 узла в многоугольнике близки друг к другу или даже дублируются.

Затем я вручную удалю этот node в QGIS и повторю попытку процесса, только чтобы найти там другой полигон с той же проблемой.

Как я могу исправить эту проблему, не повторяя весь процесс фиксации полигонa > загрузка в MongoDB > создание индекса? Есть ли способ узнать, сколько полигонов имеет эту проблему?

3
задан mapr 21 апр. '16 в 20:28
источник поделиться

2 ответов

Я столкнулся с подобной проблемой. Мне просто нужно было найти действительные записи в моем наборе данных (я отменил записи с Duplicate Vertices).

Я переименовал коллекцию -

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

В качестве другой альтернативы, зайдите в этот вопрос (я не мог заставить это работать)

4
ответ дан Aidan Ewen 07 июня '16 в 21:18
источник поделиться

Итак, что я сделал, я сначала создал коллекцию с индексом, а затем попытался вставить с помощью mongoimport, который дал мне, сколько было вставлено успешно.

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

Чтобы вставить GeoJSON в MongoDB, я сделал следующее:

$ jq --compact-output ".features" yourGeoJSON > output.geojson
$ mongoimport --db someDB -c someNewCollection --file "output.geojson" --jsonArray
1
ответ дан user3000805 11 авг. '16 в 11:59
источник поделиться

Другие вопросы по меткам