Я читал документацию по MongoDB здесь, и мне это показалось действительно интересным. Однако была одна особенность, которая казалась очень доступной, но не была явно задокументирована. Это концепция геозон. Если я создаю радиус (или прямоугольник), как я могу выполнить запрос, чтобы я мог указать точку, и Монго мог сказать мне, находится ли эта точка внутри определенной области (областей), вместо того, чтобы запрашивать близлежащие области и выполнить алгоритм Ray-Casting (или другой алгоритм), чтобы определить, предоставлена ​​ли моя точка находится в этих областях.

Любая помощь в правильном направлении или, что еще лучше, несколько примеров того, как это сделать с помощью MongoDB, приветствуется. Спасибо!

Обновить
Просто чтобы все знали, что я сделал. В итоге я развернул собственное решение, построенное на основе Mongo (чтобы использовать существующие возможности геопространственного индекса / запроса), и оно неплохо работает в качестве прототипа. В качестве решения для использования в производстве он определенно может потребовать некоторых улучшений. Но я написал серию блогов о том, как я подошел к проблеме, вместе с примером сервера на Ruby. Вы можете найти первую часть блога на моем сайте здесь.

8
user131441 29 Авг 2011 в 22:13

2 ответа

Лучший ответ

К сожалению, географические индексы mongodb предназначены только для хранения точечных данных. Хранение регионов потребует серьезной переработки структуры данных, которую мы используем, и это долгосрочная цель, но не произойдет в краткосрочной перспективе. В качестве обходного пути, если ваши регионы примерно одинакового размера, вам, возможно, удастся сохранить центральную точку каждого региона. Затем вы можете выбрать десять ближайших регионов и выполнить клиентский фильтр в своем приложении, чтобы выяснить, в каком регионе находится точка запроса.

В качестве альтернативы вы можете создать идеализированную сетку и сохранить квадраты сетки, содержащиеся в каждом регионе, в массиве для этого региона. Затем сопоставьте точку запроса с квадратом сетки и выясните, в какой области (если для этого квадрата больше одной) находится точка. Это фактически похоже на то, как мы реализуем наш геоиндекс, хотя мы используем динамическую сетку. Если вы хотите пойти по этому пути, вам следует использовать обычный (не геодезический) индекс.

Хотя ни один из них не идеален, мы надеемся, что они предоставят работоспособное решение.

5
mstearn 29 Авг 2011 в 18:31

Почему бы просто не использовать коллекции для своих регионов и не использовать полигоны для своих регионов - вот отличная презентация Грега Студера @ 10gen, которая может дать вам некоторые идеи: https://docs.google.com/present/edit?id=0ARXrl_iXSUmXZGhieDhqcTjus&hl=ru

2
Jordan 30 Авг 2011 в 13:36