Геопространственный индекс MongoDB против службы маршрутов GoogleMaps



Недавно я работал над небольшим проектом по услугам, основанным на местоположении, и моей целью было найти ближайшее такси (со встроенным GPS) в заданном радиусе от запрашивающего пассажира (телефон Android с поддержкой GPS). Я хотел использовать геопространственные индексы MongoDB, но оказалось, что геопространственные индексы работают с широтой и долготой и вычисляют смещение между двумя точками, а не расстояние. В моем случае поиск был ограничен городом, и мне пришлось использовать службу маршрутов GoogleMaps, потому что она показывает расстояние как по дороге, расчетное время, затраченное на поиск, и т. д.

Означает ли это, что геопространственные индексы имеют смысл только тогда, когда смещение достаточно велико, так что расстояние и смещение становятся практически одним и тем же?


person Aafreen Sheikh    schedule 05.09.2012    source источник


Ответы (1)


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

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

person pqnet    schedule 05.09.2012
comment
согласились, а затем используйте матрицу расстояний Google Maps API, чтобы найти расстояния между вашим подмножеством данных. - person Mano Marks; 06.09.2012
comment
@pqnet спасибо за ответ, но кабина со смещением 21 км на самом деле может быть ближе к дороге, чем кабина со смещением 20 км (представьте себе прямую дорогу на 21 км и извилистую дорогу на 20 км).. и MongoDB не узнает об этом.. это точно моя проблема :( - person Aafreen Sheikh; 06.09.2012
comment
извилистая дорога не может быть короче прямой дороги. Это основное свойство треугольника. - person pqnet; 06.09.2012
comment
по крайней мере, на евклидовых пространствах: поскольку вы находитесь на квазисферической поверхности, вам может потребоваться вычислить геодезическую (или, по крайней мере, нижнюю границу для нее), но все же вы можете быть уверены, что путь прямо из A в B короче или равен любому пути, идущему из А в В. - person pqnet; 06.09.2012
comment
Сравнение маршрутов движения для поиска ближайшего автомобиля не является строго геопространственным запросом, это оценка нескольких факторов, включая расстояние, время в пути и ограничения транспортного потока. Использование быстрого географического поиска для сужения списка кандидатов для предоставления матрицы расстояний быть хорошим подходом (хороший API, указанный @ManoMarks!). - person Stennie; 07.09.2012