#mongodb #2dsphere
#mongodb #2dsphere
Вопрос:
Привет, у меня есть коллекция с индексом 2d-сферы
wayCollection.createIndex(new BasicDBObject("poly", "2dsphere"));
я, когда пытаюсь вставить определенный объект, получаю сообщение об ошибке:
Exception in thread "main" com.mongodb.WriteConcernException: { "serverUsed" : "localhost:27017" , "ok" : 1 , "n" : 0 , "err" : "insertDocument :: caused by :: 16755 Can't extract geo keys from object, malformed geometry?: { _id: ObjectId('53a89dc6a0042baf54050037'), id: 24837452, version: "64", changeset: "13731788", uid: "362915", user: "micha555", timestamp: "2012-11-03T09:11:23Z", poly: { type: "Polygon", coordinates: [ [ [ 9.1244131, 50.0109503 ], [ 9.120464800000001, 50.0099731 ], [ 9.116641, 50.0077
хотя многополигонное кольцо замкнуто (первая и последняя координаты одинаковы)
есть идеи?
Вот еще один полигон, который отклоняется:
{
"type":"Polygon",
"coordinates":[
[
[
9.0496053,
51.3255584
],
[
9.0492235,
51.32532
],
[
9.0495831,
51.3251321
],
[
9.049917199999999,
51.3253429
],
[
9.0496053,
51.3255584
],
[
9.049984500000001,
51.3258463
],
[
9.0505795,
51.3262127
],
[
9.050045600000001,
51.326574
],
[
9.0496432,
51.3263928
],
[
9.049625300000001,
51.3262806
],
[
9.0495628,
51.3261244
],
[
9.0495316,
51.3259341
],
[
9.0495471,
51.3257127
],
[
9.0496053,
51.3255584
]
]
]
}
когда я вставляю его сюда, кажется, все в порядке: http://geojsonlint.com /
возможно, mongo db не нравится, когда точка используется дважды
Комментарии:
1. Если вы можете поделиться схемой для своего объекта вместе с образцами данных, людям будет намного проще помочь вам.
2. извините, но форматированный json превышает максимальный размер записи stackoverflow, но сообщение об ошибке содержит полный объект
3. Это многоугольник или мультиполигон? Много точек. Попробуйте представить это как инструмент отладки. Возможно, у вас могут быть некоторые пересекающиеся элементы.
4. Это обычный многоугольник. знаете ли вы какой-нибудь онлайн-полигонопостроитель?
Ответ №1:
Полигон самопересекающийся:
MongoDB запрещает такие полигоны.
Комментарии:
1. он не пересекается сам с собой, его способы просто разделяют эту точку зрения… просто «прикосновение»
2. Несмотря на то, что в этот момент он просто касается самого себя, он считается самопересекающимся, и MongoDB выдает ошибку.
Ответ №2:
Первое, что я бы сделал, это проверил ваш полигон на http://geojsonlint.com / . Если он не проходит, значит, вы знаете, что у вас проблема с вашими точками данных (что ранее вызывало эту ошибку у многих людей).
Если он пройдет, я бы проверил эту ошибку, о которой недавно сообщалось и было отправлено в MongoDB: https://jira.mongodb.org/browse/SERVER-13735 . По сути, допустимый мультиполигон вызывает ошибку с индексом 2dsphere в MongoDB 2.6.X. Другие сообщали о подобных проблемах, поэтому я уверен, что это ошибка или какое-то недокументированное ограничение.
Я бы проголосовал за проблему в JIRA и добавил свой голос в комментарии — чем больше людей сообщают MongoDB, что эта ошибка существует и влияет на них, тем быстрее она будет исправлена.
Комментарии:
1. Полигон является самопересекающимся, как отметил Джесси ниже.