Ошибка MongoDB 2dsphere (искаженная геометрия?)

В настоящее время я пытаюсь создать индекс 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
}
6
задан coalmee 29 мая '14 в 3:23
источник поделиться
4 ответов

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

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

0
ответ дан coalmee 09 сент. '16 в 13:58
источник поделиться

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

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

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

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

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

2
ответ дан philidem 16 дек. '14 в 6:46
источник поделиться

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

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

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

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

0
ответ дан Mants 28 июля '16 в 9:16
источник поделиться

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

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

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

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

-2
ответ дан yaoxing 29 мая '14 в 4:36
источник поделиться

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