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 ] } }
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.
Comme mentionné par @ go-oleg , le problème est que la plage de coordonnées est la suivante:
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 typePoint
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
});
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é.
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.
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
]
}
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