Дапамажыце dev.by 🤍
Падтрымаць

Как интегрировать Google Maps в Ruby on Rails приложение

Пакінуць каментарый
Как интегрировать Google Maps в Ruby on Rails приложение

 


Валерий Коренков
August 10, 2016

Первая и главная вещь, которую нужно знать о Google Maps – они шикарны! Это быстрый, надёжный, хорошо настраиваемый и условно-бесплатный сервис, причём бесплатность его заканчивается где-то на уровне 2500 запросов в день, поэтому условностью бесплатности в случае подавляющего большинства стартапов можно пренебречь.

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

Так же случилось и с Google Maps: вместо поисков gem'ов, я начал с изучения документации на сайте, о чём сейчас нисколько не жалею. Выяснилось, что ничего особо сложного в интеграции Google Maps API нет.

Геокодирование

Прежде, чем перейти непосредственно к интеграции Google Maps, стоит упомянуть такую вещь, как Геокодирование (Geocoding).

Согласно определению с сайта Google, геокодирование это процесс преобразования адресов (наподобие "1600 Amphitheatre Parkway, Mountain View, CA") в географические координаты в формате latitude: 37.423021; longitude: -122.083739 (широта и долгота соответственно, доли градусов десятичные, без минут и секунд, северная или южная, западная или восточная определяются знаком).

Эти координаты можно использовать для расстановки маркеров или для позиционирования карты.

Для Rails существует отличный gem – Geocoder, который берёт на себя вопросы, связанные с геокодированием. Настраивать его очень просто: достаточно после установки добавить в таблицу, содержащую адреса, поля latitude:float и longitude:float, указать в модели:

и при сохранении записи координаты будут обновляться.

Кроме того, у Geocoder'a есть ещё несколько замечательных "географических" возможностей, вроде поиска каких-либо объектов в окрестностях указанного места.

Статические карты

Google предоставляет работу с картами двух видов – статическими и динамическими.

Казалось бы, область применения статических карт нулевая, ведь динамические намного более привлекательны и функциональны, однако есть два аргумента за использование статических карт:

во-первых, работа с ними, естественно, намного проще,
во-вторых и в-главных, они без проблем и лишних усилий могут быть добавлены в какой-либо генериуемый статический документ, например, PDF-файл.

API статических карт очень простой – HTTP запрос с параметрами возвращает цельное изображение. Всё. С полученным изображением можно делать всё, что угодно. Не стоит, разумеется, обрезать копирайт Google или делать что-нибудь подобное.

На этом примере можно увидеть знакомое многим нашим сотрудникам место - офис Анадеи в Днепре:

На этом – оно же, но немного поближе:

И снова оно же, только в виде фото (это тоже один из сервисов Google Maps – Street View):

Очевидно, что вся интеграция статических карт в первом приближении состоит в написании одного метода одного хелпера, что-то вроде:

Понятно, что в реальном приложении параметры не следует делать "магическими числами", они могут как передаваться в виде аргументов в хелпер, так и храниться в файле настроек.

Это, собственно, всё, что касается интеграции статических карт.

Встраиваемые карты

API встраиваемых карт очень похож на API статических.

При помощи всего лишь одного HTTP-запроса можно легко добавить интерактивную карту в приложение. Её можно встроить разместив на странице iframe и указав URL-адрес Google Maps Embed API в качестве атрибута src:

<iframe width="300" height="300" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?key=YOUR_API_KEY&q=ADDRESS_OR_COORDINATES" allowfullscreen> </iframe>

Таким образом можно очень легко и очень быстро получить базовую функциональность Google Maps.

Естественно, в реальном приложении такой код должен быть помещён в хелпер, немного облагорожен и тому подобное, однако интеграция по-прежнему остаётся очень простой.

Дополнительную информацию о встраиваемых картах можно найти здесь.

Динамические карты (JS)

Всё по-прежнему просто!

Первое, что нужно сделать, это подключить Google Maps Scripts при помощи тэга <script>:

Второе: добавить на страницу div c идентификатором, например, map. По этому идентификатору JS-скрипты будут определять, где именно рисовать карту.

Третье, начинать изучать Google Maps Guide и добавлять возможности к интерактивной карте.

Рассмотрим пример: пусть в приложении существует несколько вкладок, каждой из которых соответствует карта одной и той же местности, но с разным набором маркеров на ней. По клику на любом из маркеров карта должна быть отцентрирована на этом и масштаб карты должен быть увеличен.

Ниже приведён код на CoffeeScript для реализации требуемого функционала.

Сначала созданием класс, реализующий необходимые процедуры работы с картой:

Всё уже не так просто, но все ещё понятно, не так ли?

Rails gem'ы и JS плагины

Естественно, один из главных вопросов о GoogleMaps, который интересует RoR разработчиков, а можно ли использовать все прелести GoogleMaps, без использования JavaScript вообще.

Что ж, существует пара gem'ов, пытающихся в этом помочь.

Первый и наиболее популярный – Google-Maps-for-Rails. Откровенно говоря, этот gem очень напоминает знаменитую "Кашу из топора". В роли топора выступает сам gem, в роли крупы, масла, соли – все те кусочки JS-кода, которые всё равно придётся писать руками, чтобы добавить и кастомизировать карту.

Другое дело – gem GoogleMaps, который, кстати, на удивление нелегко найти. Здесь всё рельсовое, добавление всех основных JS-скриптов берёт на себя сам gem. Но и он не без недостатков.

Сложности с подобным подходом начинаются, когда появляется необходимость в интерактивном изменении карт. Без JS-скриптов здесь не обойтись, что сильно понижает ценность попыток оформления подобного функционала в виде gem'ов.

Таким образом, окончательный ответ - нет, нельзя получить полностью функциональную динамическую карту без JS-кода.

Что касается JS-плагинов, подавляющее большинство просмотренных бесплатных вариантов сводятся к одному - JS-код, скопированный с Google Maps Guide, иногда немного реорганизованный.

Список плагинов, которые произвели наиболее приятное впечатление:

gmap3,
Maplace.Js,
gmaps.js.

Плюсы использования gem'ов не найдены. Плюс использования плагинов - все необходимые скрипты уже подключены в плагин и вы можете начинать работать с картой без предварительной реализации базового набора скриптов.

К минусам как gem'ов, так и плагинов можно отнести необходимость построения логики приложения, опираясь на их синтаксис и этот синтаксис предварительно надо изучить. В случае изменения GoogleMap API (а подобное случалось), при отсутствии поддержки gem'а разработчиком (и такое случалось), это может привести к печальным последствиям.

Заключение

Интеграция статических и встраиваемых карт - вопрос написания одного метода. В поисках "готовых решений" просто нет смысла.

Интеграция динамических карт сложнее, но не настолько, чтобы не попробовать сделать это "с нуля", так как:

это поможет вам разобраться в их API и возможностях, что наверняка пригодится в будущем;
это не займёт больше времени, чем интеграция при помощи "готовых" решений;
это избавит вас от траты времени на поиски решения получше;
это избавит вас от изучения чужого (и потенциально неуклюжего) синтаксиса;
это добавит вам фронтендерского опыта;
это, в конце концов, просто интересно.

И да, написанный код может быть легко использован в новом проекте или даже вынесен в свой родной плагин. А следовательно, кто знает, возможно, в будущем появится статья о вашем готовом решении!

Чытайце таксама
«Дастукаліся да антыдзяржаўнай палітыкі, сталі
«Дастукаліся да антыдзяржаўнай палітыкі, сталі "царкамі"»: Лукашэнка змяніў рэктара БДТУ
«Дастукаліся да антыдзяржаўнай палітыкі, сталі "царкамі"»: Лукашэнка змяніў рэктара БДТУ
5 каментарыяў
Аддаленшчыкі пачалі працаваць па пятніцах амаль на 1,5 гадзіны менш
Аддаленшчыкі пачалі працаваць па пятніцах амаль на 1,5 гадзіны менш
Аддаленшчыкі пачалі працаваць па пятніцах амаль на 1,5 гадзіны менш
5 каментарыяў
Літва адкрывае мяжу з Беларуссю
Літва адкрывае мяжу з Беларуссю
Літва адкрывае мяжу з Беларуссю
Улады хочуць 40% ад даходаў самых багатых. Айцішнікі вызвалены? Не зусім!
Улады хочуць 40% ад даходаў самых багатых. Айцішнікі вызвалены? Не зусім!
Улады хочуць 40% ад даходаў самых багатых. Айцішнікі вызвалены? Не зусім!
Беларусь фактычна пераходзіць на прагрэсіўную шкалу падаткаў. Як гэта закране айцішнікаў і ці дапаможа новая сістэма казне?
44 каментарыя

Хочаце паведаміць важную навіну? Пішыце ў Telegram-бот

Галоўныя падзеі і карысныя спасылкі ў нашым Telegram-канале

Обсуждение
Комментируйте без ограничений

Релоцировались? Теперь вы можете комментировать без верификации аккаунта.

Комментариев пока нет.