Прекрасные возможности картографирования меняют правила игры в приложениях. Как сделать это в веб-приложении?

Все обращают внимание на приложение, в котором удобно работать с картами. Мы все видели мобильные приложения, благодаря которым это происходит: вы ждете, пока вас заберет, и действительно видите, как ваш водитель приближается! Так как же добиться этого в веб-приложении?

Mapbox

Я предпочитаю Mapbox картам Google по нескольким причинам, в основном из-за того, что я считаю его более производительным. В следующих примерах будет использоваться React и сторонний модуль NPM, react-mapbox-gl. Вы можете сделать все то же самое, используя vanilla JS и вашу библиотеку представлений по своему выбору.

Настройка карты (пример React-mapbox-gl)

После того, как наша карта настроена и отрисована, мы можем создать анимированный маркер. Это может быть маркер или символ, как в примере выше. Также мы собираемся использовать другой пакет под названием Turf. Turf - это в основном lodash для функций карты. Это очень удобно.

Реагировать на хуки

React Hooks - это ажиотаж в последнее время. Хуки позволяют нам использовать многие функции, к которым мы привыкли, с компонентами на основе классов без дополнительных затрат на классы. В этом примере мы собираемся использовать два разных хука, useState и useEffect.

Настройка компонентов

Наш компонент будет принимать опору, которая представляет собой массив местоположений за заданный период времени. Я предполагаю, что ваше приложение обновляет данные о местоположении каждые несколько секунд. Если у вас есть шаблон, более основанный на событиях, такой как веб-сокеты, вам больше возможностей 👏. Первое, что мы хотим сделать, это инициализировать текущее местоположение, которое мы передадим нашему поставщику карт.

const [currentLocation, setCurrentLocation] = useState(null);

Затем мы хотим настроить наш эффект, который, по сути, будет проходить через наш массив координат местоположения. Мы собираемся использовать функцию веб-API под названием requestAnimationFrame:

Еще немного разобрав этот эффект. Прежде всего, мы хотим убедиться, что наша опора местоположений не пуста (length == 0). Если так, мы хотим вернуться и больше ничего не делать. Как только мы узнаем, что у нас есть координаты, мы будем использовать Turf для построения нашего более детального массива координат. Это может принять массив из X элементов и создать массив шнуров, сколько бы шагов ни длилось. Очень полезно! Затем мы хотим определить нашу функцию анимации. Здесь мы фактически установим наше состояние с текущим местоположением из нашего массива. Убедитесь, что у нас есть запасной вариант на случай, если мы найдем undefined.

Предполагая, что наш timeStep не превышает количество шагов, мы продолжим вызывать requestAnimationFrame , передавая ему нашу функцию анимации. Как только у нас закончатся шаги, анимация перестанет вызываться. В приведенном выше примере мы предполагаем, что мы будем получать новые местоположения примерно каждые 30 секунд. Под функцией анимации находится наш вызов для отмены кадра анимации и запуска нового кадра. Это произойдет, когда наш массив локаций изменится. useEffect имеет хороший способ предотвратить запуск во время рендеринга каждого компонента. Это второй параметр useState: массив свойств для просмотра и сравнения.

Оказывать

Наконец, мы визуализируем наш маркер с состоянием текущего местоположения:

Ресурсы