私はこれでジオコーディングのために私のデータベースフィールドを準備しようとします:
MyCollection._ensureIndex({'data.address.located':'2dsphere'});
しかし、このエラーが発生します:
MongoError: Can't extract geo keys from object, malformed geometry?:
{ type: "Point", coordinates: [ 32.4586858, -110.8571443 ] }
このフィールドの何が問題なのかわかりませんか?何か案が ?
this を見ると、次のように表示されます。
The following example stores a GeoJSON Point:
{ loc: { type: "Point", coordinates: [ 40, 5 ] } }
問題はそれです
[ 32.4586858, -110.8571443 ]
は有効な座標ではありません。順序は経度の後に緯度が続く必要がありますが、その座標は逆になっているように見えます(有効な緯度の範囲が-90から90で、-110.8571443がその範囲外であるという事実から判断すると)。
私はあなたが意味したと思います:
{ type: "Point", coordinates: [ -110.8571443, 32.4586858 ] }
または、その他の入力エラーがありました。
@ go-oleg で言及されているように、問題は座標の範囲が次であることです。
インデックスは座標がその範囲内であることを期待します。
ただし、インデックスをすでにインポートされたデータに適用しようとしていて、座標が交換されているであることがわかった場合は、コレクション全体を再インポートするのではなく、交換することをお勧めします。この目的で、次のmongoshell
スクリプトを使用できます。
タイプ
GeoJSON
の整形式Point
がすでにあると仮定します。
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
});
経度と緯度の順序が正しい間、私は同じ問題を抱えていました。私の間違いは、私がcoordiantes
ではなくcoordinates
と書いたことでした。
pymongo.errors.WriteError: Can't extract geo keys: {data} Point must be an array or object
おそらくあなたは正しい順序を持っていますが、キー名に問題があります。
問題が解決したとしても、GeoJSONオブジェクトのタイプを省略した場合にもこのバグが発生する可能性があることを強調する必要があります。
私の場合、モデルの値にtype: 'Point'
を追加することで修正されました。
同じエラーが発生しましたが、問題は、2つの同じ座標を持つLineString
があったことです。
"geometry" : {
"type" : "LineString",
"coordinates" : [
[
143.345763,
-33.840952
],
[
143.345763,
-33.840952
]
]
}
これをPoint
にして有効にする必要がありました
"geometry" : {
"type" : "Point",
"coordinates" : [
143.345763,
-33.840952
]
}
最初のステップは、最初のオブジェクト形式である必要があるいくつかのデータを挿入することです。
schema :
location:{
type: { type: String },
coordinates:[mongoose.Schema.Types.Mixed]
},
次に、データベースにデータを挿入します
db.userDetails.createIndex({location: "2dsphere"})
場所にオブジェクトが含まれている場合にのみインデックスが作成されます
クエリを書き込んだ後、距離を知りたい場合
db.userDetails.aggregate( [
$geoNear: {
near: { type: "Point", coordinates: [data.lat1,data.lon1]},
spherical: true,
"distanceMultiplier" : 0.001,
distanceField: "calcDistance",
$maxDistance: distance,
}
] )
そして、もう1つ、データはクォーテーション付きの文字列なしで渡される
"lat":18.7323
"lon":73.1232
このような