Индекс 2dsphere в MongoDB не удается (с искаженной геометрией?)

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

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

также, насколько я вижу, он подчиняется правилам 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 ответов


примените индекс к " loc " (поле GeoJSON), как вы это сделали. Однако убедитесь, что ваши координаты указаны в порядке Долготы, Широты (не Широта, Долгота).

в документации на http://docs.mongodb.org/manual/applications/geospatial-indexes/#spherical:

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

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

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


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

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


эта ошибка возникает, если у вас есть несколько документов в вашей коллекции, и по крайней мере один документ среди них имеет поле " loc " как NULL или пустой.

поэтому убедитесь, что у вас нет документа, в котором поле " loc " равно NULL или пусто.

запрос: db.полиэстер.find ("loc": {$exists: true, $eq:""});

Примечание.: Вам нужно добавить индекс в поле "loc", а не для " loc.поле координат.


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

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

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

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