"MongoError: невозможно извлечь гео-ключи из объекта" с помощью 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 ] }

Я не могу понять, что случилось с этим полем? Любая идея?

Когда я посмотрю этот, это показывает следующее:

The following example stores a GeoJSON Point:

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

Ответы

Ответ 1

Проблема заключается в том, что

[ 32.4586858, -110.8571443 ]

не является допустимой координатой. Порядок должен быть долготой, за которой следует широта, тогда как эта координата представляется обратным (судя по тому, что действительный диапазон широты составляет от -90 до 90 и -110.8571443 находится за пределами этого).

Я думаю, вы имели в виду:

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

или была некоторая другая ошибка ввода.

Ответ 2

Как упомянутый @go-oleg, проблема заключается в следующем диапазоне координат:

  • Долгота: (+ -) 180 °
  • Широта: (+ -) 90 °

и индекс ожидает координат в этих границах.

Но если вы пытаетесь применить индекс к уже импортированным данным и обнаружили, что координаты меняются местами, вам, скорее всего, захочется поменять его, а не реимпортировать в целом коллекция. Для этого вы можете использовать следующий mongoshell script.

Предположим, что у вас уже есть хорошо сформированный 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
});

Ответ 3

Даже проблема была решена, мне нужно выделить эту ошибку, также может появиться, если вы опустите тип объекта GeoJSON.

В моем случае это было исправлено, добавив значение type: 'Point' к модели.

Ответ 4

У меня была та же проблема, в то время как моя долгота, порядок широты были правильными. Моя ошибка заключалась в том, что я написал coordiantes вместо coordinates монго дал мне это:

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

поэтому, возможно, у вас есть правильный заказ, но у вас есть проблемы с именами ваших ключей.