Навигация | Isochrone API | Обзор | 2GIS Documentation
Isochrone API
Личный кабинет

Isochrone API

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

Isochrone API можно использовать для отображения области курьерской доставки в зависимости от времени доставки и типа движения.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>2GIS isochrone API</title>
        <meta name="description" content="Several destination points example" />
        <style>
            html,
            body,
            #container {
                margin: 0;
                width: 100%;
                height: 100%;
                overflow: hidden;
            }

            select {
                border: 0;
                padding: 4px 10px;
                font-size: 13px;
                box-shadow: 0 1px 3px 0 rgba(38, 38, 38, 0.5);
                border-radius: 4px;
            }
        </style>
    </head>
    <body>
        <div id="container"></div>
        <div id="tooltip"></div>
        <script src="https://mapgl.2gis.com/api/js/v1"></script>
        <script>
            const reqUrl = `https://routing.api.2gis.com/get_hull?key=Your directions API access key`;
            const start = {
                lat: 55.76259,
                lon: 37.668598,
            };

            const map = new mapgl.Map('container', {
                center: [start.lon, start.lat],
                zoom: 11,
                key: 'Your API access key',
            });

            const controlsHtml = `<div class="controls">
                    <select name="reverse">
                        <option value="to">Go here</option>
                        <option value="from" selected>Go from here</option>
                    </select>
                    <select name="transport">
                        <option value="walking">on foot</option>
                        <option value="driving" selected>by car</option>
                    </select>
                    <select name="duration">
                        <option value="600" selected>10 min</option>
                        <option value="1200">20 min</option>
                    </select>
                </div>`;
            new mapgl.Control(map, controlsHtml, {
                position: 'topLeft',
            });

            const reverseSelectEl = document.querySelector('select[name="reverse"]');
            const transportSelectEl = document.querySelector('select[name="transport"]');
            const durationSelectEl = document.querySelector('select[name="duration"]');

            const startMarker = new mapgl.Marker(map, {
                coordinates: [start.lon, start.lat],
            });

            let polyline;
            function renderGeometries(geometries) {
                if (polyline) {
                    polyline.destroy();
                }
                polyline = new mapgl.Polyline(map, {
                    coordinates: geometries.map((item) => [item.lon, item.lat]),
                    width: 2,
                    color: '#00b7ff',
                });
            }
            window.addEventListener('change', (evt) => {
                if (evt.target.name === 'reverse' || evt.target.name === 'transport' || evt.target.name === 'duration') {
                    updateGeometries();
                }
            });
            updateGeometries();

            function updateGeometries() {
                const reverse = reverseSelectEl.value === 'to';
                const transport = transportSelectEl.value;
                const duration = Number(durationSelectEl.value);

                fetch(reqUrl, {
                    method: 'POST',
                    body: JSON.stringify({
                        start,
                        durations: [duration],
                        transport,
                        reverse,
                        start_time: new Date().toISOString(),
                    }),
                })
                    .then((res) => res.json())
                    .then((parsed) => renderGeometries(parsed.geometries[0].points))
                    .catch((err) => console.error('error', err));
            }
        </script>
    </body>
</html>

Чтобы работать с API сервиса, нужно получить ключ доступа:

  1. Зарегистрируйтесь в личном кабинете Platform Manager.
  2. Создайте демо-ключ или купите ключ для доступа к API: см. инструкцию Ключи доступа.

Работать с ключами можно в личном кабинете Platform Manager: подробнее см. в разделе Platform Manager.

Чтобы получить данные о достижимой области, нужно отправить POST-запрос на endpoint /get_hull. В строке запроса укажите ваш ключ API в качестве значения параметра key.

https://routing.api.2gis.com/get_hull?key=YOUR_KEY

Координаты начальной точки, время на дорогу, тип движения и другие параметры нужно передать в виде JSON в теле запроса.

Например, чтобы получить область карты, до точек которой можно добраться пешком за 10 и 20 минут, можно отправить следующий запрос:

curl --request POST \
 --url 'https://routing.api.2gis.com/get_hull?key=API_KEY' \
 --header 'Content-Type: application/json' \
 --data '{
    "start": {
        "lat": 55.028268092578884,
        "lon": 82.91853904724123
    },
    "durations": [600, 1200],
    "transport": "walking"
}'

Параметр start содержит координаты начальной точки (широту и долготу), параметр durations содержит массив отрезков времени, за которые нужно добраться от начальной точки (600 и 1200 секунд), параметр transport указывает тип движения (пешком).

Дополнительно можно указать время начала движения, реверсивность движения (чтобы двигаться к указанной точке, а не от) и другие параметры. Полный список можно найти в Справочнике API.

Запрос вернёт массив geometries, описывающий области карты, достижимые за заданные промежутки времени. Информацию о каждом поле можно посмотреть в Справочнике API.

{
    "generation_time": 0.117,
    "geometries": [
        {
            "attract_points": [...],
            "duration": 600,
            "points": [...],
            "start_point": {
                "lat": 55.028268092578884,
                "lon": 82.91853904724123
            },
            "wkt": "LINESTRING(...)"
        },
        {
            "attract_point": [...],
            "duration": 1200,
            "points": [...],
            "start_point": {
                "lat": 55.028268092578884,
                "lon": 82.91853904724123
            },
            "wkt": "LINESTRING(...)"
        }
    ],
    "transport": "walking",
    "status": "OK"
}