Побеждаем злой вулкан с Rails и RGeo​

84bb70d2ddd44f789777fb5b3c4531da.png
Автор: Сергей Зиновьев

Многие мобильные и веб-приложения включают в себя разные географические данные, ведь мы сталкиваемся с картами практически везде. Так, они используются в разных социальных приложениях — от геосоциальных сетей вроде Foursquare до сервисов по поиску попутчиков вроде BlaBlaCar. Google, Microsoft, Yahoo и многие другие IT-гиганты предоставляют свой API для простых операций: отображение карт, маркеров на этих картах и проведение наиболее востребованных вычислений. Популярный фреймворк для быстрой разработки Ruby on Rails часто используется для разработки геоинформационных систем (ГИС) и веб-приложений с использованием картографических данных. На простом примере продемонстирую, какие проблемы могут ждать при использовании пространственных данных и как их избежать в Ruby on Rails-приложении.

Как не встретиться со злым вулканом

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

Дэниэл предлагает нам рассмотреть следующую гипотетическую ситуацию. Представьте самолет, которому нужно совершить рейс из Сан-Франциско в Афины во время очередного извержения ТогоСамогоВулканаКоторыйНевозможноПроизнести в Исландии. Задача летчика — спланировать маршрут так, чтобы пролететь на безопасном расстоянии от вулкана. Также ему нужно знать длину маршрута, чтобы заправить самолет достаточным количеством топлива. Чтобы верно все рассчитать, командир воздушного судна делает запрос в центр организации воздушного движения.

Сотрудник центра недавно разработал на Ruby on Rails новейшее веб-приложение для планирования полетов. Получив запрос, он решает впервые испытать приложение в действии: он вводит координаты начальной и конечной точек путешествия и проводит между ними прямую линию по Google Maps, прямо вдоль 38-й параллели северной широты:

688fc8575a6849ceb9084bf6300bbae5.png

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

87b7913fd9444adbbc257385072f2a83.png

Как вы уже наверняка догадались, это произошло из-за того, что не были учтены искажения картографической проекции. Сферическая форма нашей планеты никак не может быть представлена в плоскости без искажений. Потому и получилось, что фактический кратчайший маршрут по прямой между Сан-Франциско и Афинами проходит прямо над Исландией, где извергается вулкан. А прямой на плоской карте маршрут в действительности совсем не прямой.

Вообще, у каждой картографической проекции есть свои преимущества и недостатки; выбор же нужной проекции зависит от территории, захватываемой картой, и от целей разработчика. Главное — не прокладывать маршруты и не считать расстояния, используя привычную нам со школы линейную ортогональную систему координат с широтами и долготами.

Простое решение: RGeo

Как разработчик на Ruby on Rails, я очень рад, что всю бизнес-логику пересчета координат, вычислений расстояний и работ с проекциями не приходится каждый раз реализовывать с нуля. У нас есть инструменты для работы с пространственными данными, включая дополнения для самых распространенных SQL и NoSQL баз данных — с их помощью строить картографические приложения намного легче.

Одна из самых крупных и функциональных библиотек такого рода — PostGIS для PostgreSQL. Также Дэниэл Азума разработал гем RGeo и адаптеры для различных СУБД для ActiveRecord, чтобы сделать разработку на Ruby on Rails с использованием пространственных данных проще и быстрее. Таким образом, у меня как разработчика есть выбор между сотнями проекций. В то же время, мне не нужно запоминать все необходимые формулы, чтобы переключиться с географического представления данных на геометрическое.

Это очень хороший рабочий инструмент. Когда я разрабатывал веб-приложение по поиску попутчиков «Подвезу», гемы и сервисы помогли существенно снизить время на разработку. Я и представить не мог, насколько легко и быстро можно работать с пространственными данными.

© Habrahabr.ru