web-dev-qa-db-ja.com

"MongoError:Ca n't extract geo keys from object" with Type:Point

私はこれでジオコーディングのために私のデータベースフィールドを準備しようとします:

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 ] } }
19
TJR

問題はそれです

[ 32.4586858, -110.8571443 ]

は有効な座標ではありません。順序は経度の後に緯度が続く必要がありますが、その座標は逆になっているように見えます(有効な緯度の範囲が-90から90で、-110.8571443がその範囲外であるという事実から判断すると)。

私はあなたが意味したと思います:

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

または、その他の入力エラーがありました。

49
go-oleg

@ go-oleg で言及されているように、問題は座標の範囲が次であることです。

  • 経度:(+-)180°
  • 緯度:(+-)90°

インデックスは座標その範囲内であることを期待します。

ただし、インデックスをすでにインポートされたデータに適用しようとしていて、座標が交換されているであることがわかった場合は、コレクション全体を再インポートするのではなく、交換することをお勧めします。この目的で、次の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
});
7
Paul T. Rawkeen

経度と緯度の順序が正しい間、私は同じ問題を抱えていました。私の間違いは、私がcoordiantesではなくcoordinatesと書いたことでした。

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

おそらくあなたは正しい順序を持っていますが、キー名に問題があります。

1
Iman Mirzadeh

問題が解決したとしても、GeoJSONオブジェクトのタイプを省略した場合にもこのバグが発生する可能性があることを強調する必要があります。

私の場合、モデルの値にtype: 'Point'を追加することで修正されました。

1
Gustavo Gondim

同じエラーが発生しましたが、問題は、2つの同じ座標を持つLineStringがあったことです。

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

これをPointにして有効にする必要がありました

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

最初のステップは、最初のオブジェクト形式である必要があるいくつかのデータを挿入することです。

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 

このような

0
Akshay Dhawle