2016-04-21 10 views
3

Wenn ich versuche, einen Index für die Geometrie db.polygons.createIndex({"geometry":"2dsphere"}) zu erstellen, wird bei einem bestimmten Polygon mit dem Fehlercode 16755 gestoppt. Es heißt Can't extract geo keys und Duplicate vertices: 18 and 20.MongoDB Error Code 16755 - Geo-Schlüssel und doppelte Scheitelpunkte können nicht extrahiert werden

Bei näherer Betrachtung scheint es also so zu sein, wenn zwei Knoten in einem Polygon nahe beieinander liegen oder sogar duplizieren.

Ich gehe dann manuell entfernen Sie diesen Knoten in QGIS und versuchen Sie erneut den Prozess, nur um dort ein anderes Polygon mit dem gleichen Problem zu finden.

Wie kann ich dieses Problem beheben, ohne den gesamten Prozess zum Reparieren von Polygon> Hochladen in MongoDB> Indexerstellung wiederholen zu müssen? Kann ich herausfinden, wie viele Polygone dieses Problem haben?

Antwort

4

Ich traf ein ähnliches Problem. Ich musste nur die gültigen Datensätze in meinem Datensatz finden (ich habe die Datensätze mit doppelten Vertices verworfen).

ich die Sammlung umbenannt -

db.myCollection.renameCollection('myCollectionBk') 

Dann einen geospatial Index zur Sammlung

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 

Dann habe ich den gültigen einen einzelnen Datensatz aus der ursprünglichen Sammlung in eine neue Kollektion und fügte ich hinzu zeichnet in die neue Sammlung auf.

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

Ungültige Datensätze werden einfach ignoriert.

In Ihrem Fall möchten Sie wahrscheinlich die WriteResult von Ihrem insert bekommen, und schauen, ob es erfolgreich war. So etwas wie

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

Als weitere Alternative Besuche this question

+0

Große Lösung, danke! – mapr

+0

Brilliant. Ich wollte gerade einen dunklen, dunklen Pfad hinuntergehen. Ich frage mich, ob es einen Weg gibt, dies in einer größeren Menge wie Mode zu tun. – jroot

1

So (ich dies nicht zur Arbeit kommen konnte), was ich tat, war, habe ich zuerst die Sammlung mit dem Index und dann versucht, das Einfügen mongoimport mit was gab mir wie viele erfolgreich eingefügt wurden.

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

Um GeoJSON in MongoDB füge ich folgendes getan:

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