Перемагаємо злий вулкан з Rails і RGeo


Автор: Сергій Зінов'єв

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

Як не зустрітися зі злим вулканом

Отже, ми розробляємо програму, і в якийсь момент необхідно додати функцію пошуку найкоротшого прямого відстані між двома географічними точками. Здавалося б, нічого складного? Як би не так! У своєму блозі, в серії записів під тегом GeoRails, Деніел Азума наводить приклад, коли невміння працювати з просторовими даними може призвести до трагедії.

Деніел пропонує нам розглянути наступну гіпотетичну ситуацію. Уявіть літак, яким потрібно здійснити рейс з Сан-Франциско в Афіни під час чергового виверження ТогоСамогоВулканаКоторыйНевозможнопроизнести в Ісландії. Завдання льотчика — спланувати маршрут так, щоб пролетіти на безпечній відстані від вулкана. Також йому потрібно знати довжину маршруту, щоб заправити літак достатньою кількістю палива. Щоб правильно все розрахувати, командир повітряного судна робить запит в центр організації повітряного руху.

Співробітник центру нещодавно розробив на Ruby on Rails новітнє веб-додаток для планування польотів. Отримавши запит, він вирішує вперше випробувати програму в дії: він вводить координати початкової і кінцевої точок подорожі і проводить між ними пряму лінію з Google Maps, прямо вздовж 38-ї паралелі північної широти:



Все добре, вулкан польоту не загрожує! Потім співробітник центру вимірює відстань між двома точками (щоб екіпаж міг розрахувати потрібну кількість палива), відправляє всі необхідні дані екіпажу і бажає льотчику гарного польоту. А за кілька годин потому центр управління польотами отримує сигнал SOS від цього літака, який влетів прямо в зону виверження вулкана:



Як ви вже напевно здогадалися, це сталося через те, що не були враховані спотворення картографічної проекції. Сферична форма нашої планети ніяк не може бути представлена у площині без викривлень. Тому і вийшло, що фактичний найкоротший маршрут по прямій між Сан-Франциско і Афінами проходить прямо над Ісландією, де вивергається вулкан. А прямий на плоскій карті маршрут в дійсності зовсім не прямий.

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

Просте рішення: RGeo

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

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

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.