Я использовал strike для создания маршрута между двумя точками прямо на дороге. Я нашел решение с помощью turf js, которое можно решить несколькими способами.

Здесь, чтобы объяснить мой собственный путь!

Что и почему Turf js?

Turf js — это библиотека с открытым исходным кодом. Как правило, он используется для пространственного анализа. Он может использоваться для пространственных операций и имеет встроенные функции для создания данных GeoJSON. Причина, по которой мы выбрали turf js вместо обычной коллекции GeoJSON:

  • Иметь изогнутые линии вместо прямых линий с прямыми разрезами.
  • Удобство построения маршрутов

Начало работы:

  • API оптимизации Mapbox. Это API оптимизации, который поможет вам создать оптимальные маршруты доставки для нескольких остановок по всему автопарку.
  • Учетная запись Mapbox и токен доступа. вам необходимо зарегистрировать учетную запись на странице mapbox.com/signup. Вы можете найти свои токены доступа на Странице аккаунта.

Шаги для создания маршрута с использованием оптимизированного API с использованием turf js:

  1. Создайте папку, например, для trip-tool
  2. Нам нужно установить turf js и mapbox-gl

npm i mapbox-gl npm i @turf/turf

3. Создайте файл js внутри этой папки, например, для TripFinder.js.

4. нам нужно инициализировать карту с помощью Mapbox GL JS внутри файла js

import React,{ useEffect,useRef } from 'react';
import mapboxgl from 'mapbox-gl'; 
import 'mapbox-gl/dist/mapbox-gl.css';  
mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN'; 
function TripFinder() {   //intializing the longititude and lattitudes   
const coordinates = [-96.5108, 39.1184];   
const mapContainer = useRef(null);    
useEffect(() => {     //intialize the map     
const map = new mapboxgl.Map({       
container: mapContainer.current, 
// container id       
style: 'mapbox://styles/mapbox/light-v11', 
// stylesheet location       
center: coordinates, 
// starting position       
zoom: 12, 
// starting zoom     
});   }, []);   
return (     <>       
<div id="map" ref={mapContainer}>       
</div>     </>   ); } 
export default TripFinder;

4. и создайте новый файл CSS в Trip-Tool, например: TripFinder.css

body { margin: 0; padding: 0; } #map { position: absolute; top: 0; bottom: 0; right: 0; left: 0; }

5. Откройте файл в браузере, и вы увидите карту, центрированную на

6. теперь нам нужно нанести точку от и до на карте. мы можем использовать для этого mapboxgl.Marker. нам нужно убедиться, что этот график выполняется только после загрузки карты, чтобы он возвращался в методе обратного вызова map.on

например: Из местоположения: PHOENIX, US [-112.073555,33.44793] и Куда: TEXAS, US [-110.965274,32.228759]

создать коллекцию, используя turf js для маркировки

// Create a GeoJSON feature collection for the warehouse
    from = turf.featureCollection([turf.point(FromLocation)]);
    to = turf.featureCollection([turf.point(ToLocation)]);

после создания коллекции нам нужно добавить маркеры с помощью этих коллекций

const addMarker= useCallback(() => {
    map.current.on('load', async () => {
      map.current.addLayer({
        id: 'from',
        type: 'circle',
        source: {
          data: from,
          type: 'geojson',
        },
        paint: {
          'circle-radius': 10,
          'circle-color': 'blue',
          'circle-stroke-color': 'blue',
          'circle-stroke-width': 3,
        },
      });
      map.current.addLayer({
        id: 'to',
        type: 'circle',
        source: {
          data: to,
          type: 'geojson',
        },
        paint: {
          'circle-radius': 10,
          'circle-color': 'red',
          'circle-stroke-color': 'red',
          'circle-stroke-width': 3,
        },
      });
    });
  });

результат будет отображаться следующим образом

Ура 😊..! мы в последних шагах!

7. давайте проложим маршрут между двумя точками, используя оптимизированный для Mapbox API v1. Несколько вещей, которые нужно знать перед использованием этого API. В приложении, генерирующем маршруты между несколькими точками, существует множество способов создания точек: пользователь может вводить адреса, пользователь может выбирать координаты на карте или вы можете получать данные из внешнего источника. мы будем тянуть из внешнего источника данных.

Запрос к API оптимизации должен содержать от 2 до 12 координат:

  • мы не будем использовать поведение API оптимизации по умолчанию, которое заключается в возврате маршрутов туда и обратно. Это означает, что первая координата является как начальной, так и конечной точкой поездки.
  • мы будем использовать другой API Mapbox для получения координат между двумя местоположениями:
https://api.mapbox.com/directions/v5/mapbox/driving/from,to?steps=true&geometries=geojson&access_token=${mapboxgl.AccessToken}
  • Место посадки также будет учитываться в 12-координатном пределе.
  • В результате пользователь может выбрать до 10 точек, исключая начальную координату и конечную координату.

Для лучшей практики давайте сделаем так, чтобы API извлекал отдельный файл.

Давайте получим координаты из Mapbox API:

const response = await fetch(
`https://api.mapbox.com/directions/v5/mapbox/driving/${FromLocation.join(',')};
${ToLocation.join(',')}?steps=true&geometries=geojson&access_token=${mapboxgl.accessToken
}`,
 { method: 'GET' });
let data = await response.json();
data = data.routes[0];
// to get the coordinates between the source and destination
let coordinates = data.geometry.coordinates;
console.log(coordinates);

результирующие координаты будут:

8. Поскольку мы получили координаты, нам нужно построить их с помощью Оптимизированного API. В то же время нам нужно убедиться, что значение параметра оптимизированного API по умолчанию равно 12, поэтому нам нужно соединить этот массив координат с диапазоном 12.

const len = coordinates.length;
const distributions = [1, 2];
if (len > 12) {
    coordinates.splice(1, coordinates.length - 12);
}

API оптимизации возвращает оптимизированный по длительности маршрут между двумя и 12 входными координатами.

Запрос API оптимизации имеет два обязательных параметра:

  • профиль: это вид транспорта, используемый запросом. Выберите один из идентификаторов профиля маршрутизации Mapbox Directions (mapbox/вождение, mapbox/ходьба, mapbox/езда на велосипеде и mapbox/вождение-трафик). В этом руководстве вы будете использовать картографию/профиль вождения.
  • координаты: Это список разделенных точкой с запятой координат {долгота}, {широта}. Должно быть от 2 до 12 координат, и первая координата является начальной и конечной точкой.

Запрос API оптимизации выглядит следующим образом:

https://api.mapbox.com/optimized-trips/v1/mapbox/driving/-122.42,37.78;-122.45,37.91;-122.48,37.73?access_token=YOUR_MAPBOX_ACCESS_TOKEN

Запрос API оптимизации имеет несколько необязательных параметров:

  • туда и обратно: по умолчанию API оптимизации будет следовать туда и обратно, чтобы быть правдой. Чтобы изменить это поведение по умолчанию, нам нужно передать параметры источника и назначения.
  • geometries: этот параметр сообщает API оптимизации, в каком формате должна быть возвращаемая геометрия. Для этого приложения вы запросите geometries=geojson для получения данных GeoJSON.
  • steps: этот параметр сообщает API оптимизации, должен ли он возвращать пошаговые инструкции.
  • распределения: Это список пар чисел, разделенных точкой с запятой, которые соответствуют списку координат.

чтобы узнать подробности, см.: https://docs.mapbox.com/api/navigation/optimization-v1/

добавьте следующий фрагмент после получения координат и соединения

return await fetch(
`https://api.mapbox.com/optimized-trips/v1/mapbox/driving/${coordinates.join(';'
)}?distributions=${distributions}&overview=full&steps=true&geometries=geojson&roundtrip=false&source=first&destination=last&access_token=${
mapboxgl.accessToken}`,
{ method: 'GET' }
);

большой прогресс до сих пор! 👌

9. Нанесите полученные координаты с помощью turf js

const query = await fetchLoaction();
const response = await query.json();
const newTurfCollection = turf.featureCollection([]);
// Update the `route` source by getting the route source
// and setting the data equal to routeGeoJSO
const routeGeoJSON = turf.featureCollection([
      turf.feature(response.trips[0].geometry),
]);

// if the route already exists on the map, we'll reset it using setData
    if (map.current.getSource('route')) {
      map.current.getSource('route').setData(routeGeoJSON);
    } 
    else {
    // adding the layer of routeline-active to plot the result
      map.current.addSource('route', {
        type: 'geojson',
        data: newTurfCollection,
      });
      map.current.addLayer(
        {
          id: 'routeline-active',
          type: 'line',
          source: 'route',
          layout: {
            'line-join': 'round',
            'line-cap': 'round',
          },
          paint: {
            'line-color': '#0E3464',
            'line-width': ['interpolate', ['linear'], ['zoom'], 12, 3, 22, 12],
          },
        },
        'waterway-label'
      );
    }

Бум!😌

давайте завернем здесь ..!👋

Ресурсы:

URL-адрес репозитория кода: https://github.com/keerthivasanm20/optimizedmapRoute