MongoDB 2dsphere index не работает (неправильная геометрия?)

В настоящее время я пытаюсь построить индекс 2dsphere, но создание кажется неудачным.

Документ, по которому не удается создать индекс, является действительным геойсон (согласно геойсонлинту).

Также, насколько я вижу, он подчиняется правилам MongoDB "Polygon".

Я был бы признателен за любую помощь, так как я не могу понять, почему создание индекса кажется неудачным.

Заранее спасибо!

db.poly.ensureIndex( { loc: "2dsphere" } )
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "ok" : 0,
        "errmsg" : "Can't extract geo keys from object, malformed geometry?: { _
id: 353, loc: { type: \"Polygon\", coordinates: [ [ [ 8.090732000000001, 53.6379
766 ], [ 8.050639500000001, 53.6250853 ], [ 8.036974600000001, 53.6286108 ], [ 7
.994035500000001, 53.6016978 ], [ 8.0120927, 53.59855020000001 ], [ 8.0102720000
00001, 53.5883803 ], [ 8.023379, 53.5867745 ], [ 8.0148004, 53.5832729 ], [ 8.02
6839500000001, 53.57895840000001 ], [ 8.0271685, 53.5727671 ], [ 8.0432450000000
01, 53.57190120000001 ], [ 8.0386477, 53.565241 ], [ 8.0192488, 53.5609644 ], [
8.030192100000001, 53.5508096 ], [ 8.037298, 53.5565769 ], [ 8.041402400000001,
53.55249540000001 ], [ 8.030647100000001, 53.53854200000001 ], [ 8.0381080000000
01, 53.5275022 ], [ 8.048501400000001, 53.5243656 ], [ 8.051459700000001, 53.509
912 ], [ 8.091510100000001, 53.50258460000001 ], [ 8.153839000000001, 53.5148059
0000001 ], [ 8.1708242, 53.53993010000001 ], [ 8.164240300000001, 53.5287913 ],
[ 8.1562255, 53.531339 ], [ 8.1700993, 53.54524050000001 ], [ 8.150740200000001,
 53.5596328 ], [ 8.1539377, 53.56452330000001 ], [ 8.1408203, 53.58015880000001
], [ 8.155694800000001, 53.5858101 ], [ 8.1496093, 53.60191990000001 ], [ 8.1234
503, 53.5984032 ], [ 8.090732000000001, 53.6379766 ] ] ] } }",
        "code" : 16755
}

4 ответа

Решение

Было пересечение в координатах, но я не мог видеть это через geojsonlint.com, потому что это не было очевидно!

MongoDB не позволяет вставлять многоугольник, линии которого будут пересекаться.

Примените индекс к "loc" (поле GeoJSON), как вы сделали. Тем не менее, убедитесь, что ваши координаты указаны в следующем порядке: долгота, широта (не широта, долгота).

Согласно документации на http://docs.mongodb.org/manual/applications/geospatial-indexes/:

Сохраните данные о местоположении в виде объектов GeoJSON с этим порядком координатной оси: долгота, широта. Система координат координат для GeoJSON использует данные WGS84.

Кроме того, согласно спецификации GeoJSON по адресу http://geojson.org/geojson-spec.html:

Позиция представлена ​​массивом чисел. Должно быть как минимум два элемента, а может быть и больше. Порядок элементов должен соответствовать порядку x, y, z (восток, север, высота для координат в спроецированной системе координат или долгота, широта, высота для координат в географической системе координат). Допускается любое количество дополнительных элементов - толкование и значение дополнительных элементов выходит за рамки данной спецификации.

Эта ошибка возникает, если в вашей коллекции несколько документов, и хотя бы один из них имеет поле 'loc' как NULL ИЛИ ПУСТО.

Поэтому убедитесь, что у вас нет документа, в котором поле "loc" имеет значение NULL ИЛИ ПУСТО.

Запрос: db.poly.find("loc":{$exist:true, $eq:""});

Примечание. Вам необходимо добавить индекс в поле "loc", а не в поле "loc.coordinates".

Таким образом, решение будет просто построить индекс на loc.coordinates вместо loc

db.coor.ensureIndex({"loc.coordinates": "2dsphere"})

Примечание 2d index поддерживает другой формат, примеры которого вы можете найти в документе. В то время как loc не один из них.

Я не понимаю, почему у вас есть вложенный массив там, хотя.

Другие вопросы по тегам