API направлений Mapbox gl

Поэтому я пишу приложение, которое позволяет пользователю-администратору создавать путешествие по определенному месту с разными точками остановки.

Для отображения карты, добавления маркеров, местоположения flyTo и т. д. я использую Mapbox GL.

Я использовал cURL реализацию Mapbox API, чтобы прокладывать маршруты и рисовать линию на карте.

Итак, в качестве примера вызова cURL я получаю список координат, которые представляют мои направления.

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

Как пример HTML с некоторыми JS

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' />
    <title></title>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.18.0/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.18.0/mapbox-gl.css' rel='stylesheet' />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
    </style>
</head>
<body>

<div id='map'></div>
<script>
mapboxgl.accessToken = '<ACCESS TOKEN>';
var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/streets-v8',
    center: [-122.486052, 37.830348],
    zoom: 15
});

map.on('load', function () {
    map.addSource("route", {
        "type": "geojson",
        "data": {
            "type": "Feature",
            "properties": {},
            "geometry": {
                "type": "LineString",
                "coordinates": [
                 [-155.088899,19.722942],[-155.08565,19.72472],[-155.084661,19.723701],[-155.083569,19.723139],[-155.079557,19.722262],[-155.074227,19.721938],[-155.069939,19.722545],[-155.070061,19.721225],[-155.07007,19.711726]
                ]
            }
        }
    });

    map.addLayer({
        "id": "route",
        "type": "line",
        "source": "route",
        "layout": {
            "line-join": "round",
            "line-cap": "round"
        },
        "paint": {
            "line-color": "#888",
            "line-width": 8
        }
    });
});
</script>

</body>
</html>

Вы можете увидеть набор координат, которые будут связаны для рисования линии. Мне было интересно, есть ли способ соединить эти точки, чтобы линия шла только по дороге (для вождения)?

Чтобы лучше объяснить, это увеличенное изображение вывода mapbox gl соединяет набор точек линией

Я знаю, что это довольно общее объяснение моей проблемы, но я надеюсь, что оно понятно.

Я пытался поколдовать с Mapbox Gl Directions API, но безуспешно, так как мне нужно добавить contoller, чего я не хочу. Мне нужно только нарисовать маршрут и не позволять публичному пользователю изменять его.

Любые советы?


person Andrejs Gubars    schedule 16.05.2016    source источник


Ответы (3)


Не уверен, правильно ли я понял, но когда вы отправляете запрос на получение маршрута, включите в URL-адрес 'overview=full'. Это вернет более подробный путь, поэтому вам не нужно будет использовать Matching API после этого.

Пример: `https://api.mapbox.com/directions/v5/mapbox/driving/-74.50,40;-80,50?overview=full&geometries=geojson&access_token=

person Dmitry Nagorny    schedule 18.05.2018

Я пытался сделать это сегодня, и мне удалось проложить маршруты на карту и удалить начальный и конечный элементы управления, вытащив проект mapbox-gl-directions из git hub и сделав небольшой мод для src/directions.js

Я закомментировал строки с 48 по 52.

// Add controllers to the page
//new Inputs(inputEl, store, this.actions, this.map);
//new Instructions(directionsEl, store, {
//  hoverMarker: this.actions.hoverMarker,
//  setRouteIndex: this.actions.setRouteIndex
//}, this.map);

Это было относительно легко проверить с помощью настройки в npm и моих собственных тестовых файлов, запустив настройку npm в соответствии с https://github.com/mapbox/mapbox-gl-directions/blob/master/CONTRIBUTING.md

npm install & npm start & open http://localhost:9966/example/

Я также добавил строку:

localStorage.setItem('MapboxAccessToken', '<TOKEN HERE>');

ниже требования ('../); в примере/index.js. Пока у вас есть пример, работающий в npm, вы можете получить доступ к новой версии подключаемого модуля в комплекте с http://localhost:9966/example/bundle.js

Затем я смог изменить строку

<script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-directions/v2.0.0/mapbox-gl-directions.js'></script>

to

<script src='http://localhost:9966/example/bundle.js'></script>

В примере запуска в npm происходит целая куча волшебства, о котором я ничего не знаю, но все это просто работало на моей машине. Надеюсь это поможет. Линия направления работает с анимацией и анимацией высоты тона, масштабирования и пеленга. См. снимок экрана ниже:

введите здесь описание изображения

ОБНОВЛЕНИЕ: Добавление ответа сюда, чтобы я мог показать снимок экрана. @Andrejus, поскольку этот хак основан на поведении плагина направлений gl mapbox, а не на рисовании путей с нуля, вы получаете встроенную дорогу, и у вас есть доступ к API направлений, чтобы добавлять путевые точки для выполнения вашего A-> B-> C-> Д как так:

map.on('load', function() {
    directions.setOrigin(start); 
    directions.addWaypoint(0, [-0.07571203, 51.51424049]);
    directions.addWaypoint(1, [-0.12416858, 51.50779757]);
    directions.setDestination(end);  
});

В документации сказано, что у вас может быть до 25 путевых точек.

введите здесь описание изображения

В плагине mapbox-gl-directions нет возможности отключить экранные элементы управления, они добавляются в методе onAdd(map) класса Directions, который вызывается при добавлении направлений на карту. Я хотел посмотреть, смогу ли я удалить их раньше, и экспериментировал, таким образом, взлом. Чтобы сделать гибкое решение, можно было бы добавить параметр, передаваемый в конструктор класса Directions. Там переданы и другие параметры, хотя они, похоже, привязаны к параметрам для вызова API направлений:

var directions = new mapboxgl.Directions({
  unit: 'metric',
  profile: 'cycling'
}); 

Так что может быть лучшее решение, чем это. Я использую Mapbox уже ‹1 день и мало знаю о том, как он написан или структурирован.

Также обратите внимание, что изменения кода находятся в плагине, а не в ядре mapbox gl, поэтому относительно изолированы. Кстати, этот плагин является оболочкой для вызываемого вами API cURL, который возвращает массив точек. Предположительно, исходный код на GitHub будет включать код, который следует тому пути, по которому он отображает строку, если это определенно то, что вы хотите сделать.

person Steven Pavett    schedule 23.05.2016
comment
хм, интересный подход, хотя для меня это звучит как хак. Что я также хочу, так это расширяемость для создания маршрутов, например, из A->B->C->D по этому шаблону. Но мне все равно нравится твой способ! - person Andrejs Gubars; 23.05.2016
comment
@AndrejsGubars: я обновил ответ выше, добавив еще несколько заметок о добавлении путевых точек, как вы просили об этом. Также добавлены некоторые примечания по созданию решения. Надеюсь, это поможет. - person Steven Pavett; 24.05.2016
comment
Да, в точку! Это именно то, что я хотел сделать. Наверное, я был слишком амбициозен и ожидал чего-то, что делает целая библиотека :) Но спасибо за ваши советы! - person Andrejs Gubars; 24.05.2016
comment
Здравствуйте, @StevenPavett, не могли бы вы проверить этот вопрос, пожалуйста? stackoverflow.com/questions/59255333 / - person DevAS; 09.12.2019

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

person Andrejs Gubars    schedule 08.06.2016
comment
Вы можете проверить этот вопрос, пожалуйста? stackoverflow.com/questions/59255333 / - person DevAS; 10.12.2019