Интеграция с картами является неотъемлемой частью таких продуктов, как приложения для мониторинга автопарка и сервисы совместного использования. Однако создать карту с самого начала сложно, и разработка стабильного прототипа может занять много времени. Вместо того, чтобы пытаться найти или создать карту и интегрировать ее самостоятельно, мы можем сэкономить время (и массу хлопот), используя TomTom Map API, Maps SDK и Map Styler. API Карт включают API отображения карты, API маршрутизации карты и API трафика карты. Map API позволяют нам легко и эффективно интегрировать карты в наши продукты.

API-интерфейсы карт взаимодействуют с Maps SDK TomTom, который предоставляет все необходимые методы для работы с картами. С помощью Maps SDK и Maps API мы можем устанавливать маркеры на картах, искать места, использовать обратное геокодирование и многое другое.

В этом руководстве показано, как использовать TomTom Maps API, Maps SDK и React Router для динамического обновления карты путем подключения карт TomTom к React Routing.

Обзор учебника

В этом уроке мы интегрируем карту с приложением React. На карте показаны разные страны. С помощью маршрутизации React мы отобразим другую страну, добавив название страны к URL-адресу в адресной строке и выполнив поиск с помощью TomTom Search API.

Предпосылки

Чтобы следовать этой статье, вам необходимо следующее:

  • Базовое понимание React. Чтобы получить общее представление об интеграции карты в React, ознакомьтесь с этой статьей. В вашей системе должен быть установлен Node.js, так как вы используете диспетчер пакетов Node для установки различных инструментов. Если вы знакомы с Yarn, вы можете использовать его, но мы не будем рассматривать его в этом уроке.
  • Учетная запись разработчика TomTom. После регистрации этой учетной записи вы получите ключ API, который будете использовать для своего приложения. Начало работы Начнем с создания и запуска приложения React. Сделайте это, выполнив следующую команду в своем терминале:
1 npx create-react-app tomtom-map
2 cd tomtom-map
3 npm start

После этого открывается новая вкладка браузера с адресом localhost:3000. Всякий раз, когда вы вносите изменения в свой код, вкладка обновляется и отображается соответствующим образом.

Код также автоматически создает новый каталог с именем приложения. Перейдите в каталог src в каталоге приложения, созданном create-react-app. В каталоге откройте файл App.css и добавьте стиль каскадной таблицы стилей (CSS) для карты. Стиль устанавливает высоту карты равной 100 процентам области просмотра.

1.mapDiv{
2  height: 100vh;
3}

В следующих разделах мы будем шаг за шагом изменять файл App.js. Напоминаем, что этот файл находится в каталоге src.

Установка и добавление зависимостей

Чтобы избежать возможных ошибок, удалите элемент ‹header/›, чтобы остался почти пустой компонент, похожий на тот, что ниже. Также обратите внимание на удаление импорта изображения логотипа.

1import './App.css';
2
3function App() {
4  return (
5    <div className="App">
6    </div>
7  );
8}
9
10export default App;

В этот файл нам нужно добавить зависимости Map SDK и react-router-dom для маршрутизации. Поскольку эти зависимости не поставляются вместе с React, мы должны установить их с помощью следующей команды:

npm i @tomtom-international/web-sdk-maps @tomtom-international/web-sdk-services
react-router-dom

Затем мы добавляем зависимости, используя этот фрагмент:

1import './App.css';
2import '@tomtom-international/web-sdk-maps/dist/maps.css'
3import mapSDK from '@tomtom-international/web-sdk-maps';
4import mapServices from '@tomtom-international/web-sdk-services';
5import { React, useState, useEffect, useRef } from 'react'
6import {
7  BrowserRouter as Router,
8  Routes,
9  Route,
10  useParams
11} from 'react-router-dom';

Настройка карты

Для начала удалите строку экспорта приложения по умолчанию, так как мы не будем экспортировать компонент приложения по умолчанию. Вместо этого мы используем компонент App для получения координат и отображения карты.

Для этого начните с экспорта компонента CountryNameHelper с приведенным ниже фрагментом:

1/*This maps a country name URL parameter in the search bar*/
2export default function CountryNameHelper() {
3  return (
4    <Router>
5      <div>
6
7
8
9        <Routes>
10          <Route exact path="/:countryName" element={<App />} />
11
12
13
14        </Routes>
15
16
17
18      </div>
19    </Router>
20  );
21}

Фрагмент создает маршрут с параметром названия страны (countryName), который вы используете в компоненте приложения.

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

1  //your API key
2  const API_KEY = ''
3  //getting the country's name from the URL
4  let { countryName } = useParams();
5  const mapContainer = useRef();
6  //default coordinates
7  const [countryLongitude, setCountryLongitude] = useState(-121.91599);
8  const [countryLatitude, setCountryLatitude] = useState(37.36765);
9  //use this to change the zoom level of the map
10  const [zoomLevel, setZoomLevel] = useState(3);
11  const [ourMap, setMap] = useState({});

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

1//fetching the coordinates for the typed country's administrative capital city
2  mapServices.services.fuzzySearch({
3    key: API_KEY,
4    query: countryName
5  }).then(getCoordinates);
6
7  function getCoordinates(response) {
8    console.log(response.results)
9    let latitude = response.results[0]["position"]["lat"];
10
11    let longitude = response.results[0]["position"]["lng"];
12
13    setCountryLatitude(latitude)
14
15    setCountryLongitude(longitude)
16  }

Используя координаты по умолчанию при загрузке страницы, используйте хук useEffect для рендеринга карты. Этот хук передает ключ API, контейнер карты, координаты и уровень масштабирования объекту карты SDK. Обратите внимание, что в этом уроке используется уровень масштабирования три, чтобы дать нам большее поле зрения страны и ее границ.

Теперь визуализируйте карту, используя метод setMap с объектом карты (ourMap) в качестве аргумента.

1useEffect(() => {
2
3    let ourMap = mapSDK.map({
4      key: API_KEY,
5      container: mapContainer.current,
6      center: [countryLongitude, countryLatitude],
7      zoom: zoomLevel
8    });
9    setMap(ourMap);
10    /*values to listen to*/
11  }, [countryLongitude, countryLatitude]);

Установка маркера местоположения помогает быстро определить целевое местоположение. После метода setMap добавьте этот код:

1let locationMarker = new mapSDK.Marker({
2      draggable: false
3    }).setLngLat([countryLongitude, countryLatitude]).addTo(ourMap);

Задаем нужные нам свойства в конструкторе Marker, задаем координаты для размещения маркера с помощью метода setLngLat, а затем добавляем его на карту с помощью метода addTo. Наконец, мы размонтируем компонент карты из DOM, чтобы прослушать другие изменения и обновить его, используя этот метод. Он идет после кода установки маркера.

return () => ourMap.remove();

Примечание. В этом руководстве карта воссоздается каждый раз при выборе новой страны, что работает в демонстрационных целях. На практике более эффективно создать экземпляр карты один раз и использовать дополнительный эффект для обновления вида на основе значений координат.

Мы используем массив (второй параметр хука useEffect) для установки значений для прослушивания изменений. Это избавляет от необходимости использовать кнопку и метод для обновления карты. Это полный код хука useEffect:

1  useEffect(() => {
2
3    let ourMap = mapSDK.map({
4      key: API_KEY,
5      container: mapContainer.current,
6      center: [countryLongitude, countryLatitude],
7      zoom: zoomLevel
8    });
9    setMap(ourMap);
10    //setting the location marker to help easily identify the target*/
11    let locationMarker = new mapSDK.Marker({
12      draggable: false
13    }).setLngLat([countryLongitude, countryLatitude]).addTo(ourMap);
14
15
16
17    return () => ourMap.remove();
18    /*values to listen to*/
19  }, [countryLongitude, countryLatitude]);

В методе возврата добавьте <div> внутри приложения <div> для отображения карты.

Вот скриншоты маршрутов приложения для нескольких стран: маршрут в США, маршрут в Южную Африку и маршрут в Норвегию.

Заключение

В этом руководстве мы увидели, как получить название страны из URL-адреса, выполнить поиск координат страны с помощью API поиска и отобразить карту на основе полученных координат. С картами TomTom можно легко и просто интегрировать карту в приложение React и использовать React Router для изменения отображения местоположения.

Чтобы узнать больше о картографической технологии TomTom, зарегистрируйте учетную запись разработчика и начните работу с TomTom уже сегодня.

Эта статья изначально была опубликована на страницеdeveloper.tomtom.com/blog.