web-dev-qa-db-fra.com

"MongoError: Impossible d'extraire les clés géographiques d'un objet" avec Type: Point

J'essaie de préparer mon champ de base de données pour le géocodage avec ceci:

MyCollection._ensureIndex({'data.address.located':'2dsphere'});

Mais alors cette erreur vient:

MongoError: Can't extract geo keys from object, malformed geometry?:
{ type: "Point", coordinates: [ 32.4586858, -110.8571443 ] }

Je ne peux pas voir ce qui ne va pas avec ce domaine? Une idée ?

Quand je regarde ceci cela s’affiche:

The following example stores a GeoJSON Point:

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

Le problème est que

[ 32.4586858, -110.8571443 ]

n'est pas une coordonnée valide. L'ordre doit être longitude, suivi de latitude, alors que cette coordonnée semble être l'inverse (à en juger par le fait que la plage de latitude valide est comprise entre -90 et 90 et que -110,8571443 se situe en dehors de cette plage).

Je pense que tu voulais dire:

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

ou il y avait une autre erreur d'entrée.

41
go-oleg

Comme mentionné par @ go-oleg , le problème est que la plage de coordonnées est la suivante:

  • Longitude: (+ -) 180 °
  • Latitude: (+ -) 90 °

et index s'attend à ce que coordonnées soit dans les limites.

Mais si vous essayez d'appliquer l'index sur des données déjà importées et que vous avez découvert que les coordonnées sont échangées, vous voudrez probablement les échanger plutôt que de réimporter toute la collection. Pour cela, vous pouvez utiliser le prochain script mongoshell.

En supposant que vous ayez déjà GeoJSON de type Point bien formé.

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
});
7
Paul T. Rawkeen

J'ai eu le même problème alors que ma longitude et mon ordre de latitude étaient corrects. Mon erreur est que j'avais écrit coordiantes au lieu de coordinates le mongo m'a donné ceci:

pymongo.errors.WriteError: Can't extract geo keys: {data}  Point must be an array or object

alors peut-être que vous avez le bon ordre mais vous avez un problème dans vos noms de clé.

1
Iman Mirzadeh

Même si le problème a été résolu, je dois souligner que ce bogue peut aussi apparaître si vous omettez le type d'objet GeoJSON.

Dans mon cas, il a été corrigé en ajoutant le type: 'Point' à la valeur du modèle.

1
Gustavo Gondim

J'ai eu la même erreur, mais le problème était que j'avais une LineString avec deux coordonnées identiques. 

"geometry" : {
    "type" : "LineString",
    "coordinates" : [ 
        [ 
            143.345763, 
            -33.840952
        ], 
        [ 
            143.345763, 
            -33.840952
        ]
    ]
}

Je devais en faire une Point pour que ce soit valide

"geometry" : {
    "type" : "Point",
    "coordinates" : [ 
        143.345763, 
        -33.840952
    ]
}
0
SymbolixAU

la première étape consiste à insérer des données qui doivent être au premier format d'objet, sinon cette erreur apparaît 

schema :
location:{
            type: { type: String },
            coordinates:[mongoose.Schema.Types.Mixed]
        },

puis insérez des données dans db 

db.userDetails.createIndex({location: "2dsphere"})

l'index ne peut être créé que si l'emplacement contient un objet 

après cette requête d'écriture, si vous voulez découvrir la distance

db.userDetails.aggregate( [
 $geoNear: {
                  near: { type: "Point",  coordinates: [data.lat1,data.lon1]},
                  spherical: true,
                  "distanceMultiplier" : 0.001,
                  distanceField: "calcDistance",
                  $maxDistance: distance,

               }
] )

et encore une donnée de chose devrait être passée sans ficelle

"lat":18.7323
"lon":73.1232 

comme ça 

0
Akshay Dhawle