Геозоны с MongoDB - PullRequest
       20

Геозоны с MongoDB

8 голосов
/ 29 августа 2011

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

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

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

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

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

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

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

2 голосов
/ 30 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...