Отображение зон доступности в веб-картах на базе HERE Technologies реализуется через механизм изохрон (isochrones) — геометрических областей, ограничивающих достижимую территорию от заданной точки за определённое время или расстояние при выбранном способе передвижения. В HERE Maps API for JavaScript этот функционал интегрируется через сервис Isoline Routing API и визуализируется как полигоны на карте.
Зона доступности представляет собой географическую область, внутри которой все точки достижимы из исходной позиции при заданных ограничениях:
Формально изохрона определяется множеством точек:
= { x ^2 t(x_0, x) T }
где:
В экосистеме HERE расчёт выполняется через Isoline Routing API, который использует:
Результатом является GeoJSON-подобная структура, содержащая полигон или мультиполигон.
Инициализация карты в JavaScript SDK осуществляется через базовый контейнер и платформу:
const platform = new H.service.Platform({
apikey: 'YOUR_API_KEY'
});
const defaultLayers = platform.createDefaultLayers();
const map = new H.Map(
document.getElementById('map'),
defaultLayers.vector.normal.map,
{
center: { lat: 52.5200, lng: 13.4050 },
zoom: 12,
pixelRatio: window.devicePixelRatio || 1
}
);
const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));
const ui = H.ui.UI.createDefault(map, defaultLayers);
На этом этапе формируется базовый рендеринг, к которому будут добавляться слои зон доступности.
Основной запрос формируется через сервис маршрутизации:
const routingService = platform.getRoutingService(null, 8);
const params = {
'origin': '52.5200,13.4050',
'range[type]': 'time',
'range[values]': '600',
'transportMode': 'car'
};
routingService.calculateIsoline(
params,
result => {
const shape = result.response.isoline[0].component[0].shape;
renderIsochrone(shape);
},
error => {
console.error(error);
}
);
origin — координаты центра;range[type] — тип ограничения (time или
distance);range[values] — массив значений (в секундах или
метрах);transportMode — режим движения.Ответ API содержит массив координат, описывающий контур зоны. Для отображения используется полигон:
function renderIsochrone(shape) {
const linestring = new H.geo.LineString();
shape.forEach(point => {
const [lat, lng] = point.split(',');
linestring.pushPoint({ lat: parseFloat(lat), lng: parseFloat(lng) });
});
const polygon = new H.map.Polygon(linestring, {
style: {
fillColor: 'rgba(0, 128, 255, 0.3)',
strokeColor: '#0078ff',
lineWidth: 2
}
});
map.addObject(polygon);
}
Поддерживается построение нескольких изохрон одновременно. Это используется для анализа градаций доступности:
Пример параметров:
'range[values]': '300,600,900'
В этом случае API возвращает несколько полигонов, которые можно отрисовать разными стилями.
Стилизация играет ключевую роль в интерпретации данных:
Пример градиентного подхода:
const colors = [
'rgba(0, 128, 255, 0.4)',
'rgba(0, 128, 255, 0.25)',
'rgba(0, 128, 255, 0.1)'
];
Каждый полигон связывается с соответствующим цветом в зависимости от диапазона времени.
Разные режимы движения формируют существенно отличающиеся зоны:
Параметр:
transportMode: 'pedestrian'
Влияет на граф дорог, используемый для вычисления изохроны, и меняет форму полигона.
При включённом параметре трафика зона становится динамической:
Пример:
'timeTraffic': 'enabled'
Это позволяет строить реальные зоны доступности, а не статические геометрические приближения.
При работе с большим количеством изохрон учитываются следующие аспекты:
Упрощение геометрии часто выполняется через алгоритмы редукции вершин (например, Douglas–Peucker).
Результаты можно преобразовать в GeoJSON для дальнейшей обработки:
const geojson = {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [shape.map(p => {
const [lat, lng] = p.split(',');
return [parseFloat(lng), parseFloat(lat)];
})]
}
};
GeoJSON используется для:
Изохроны применяются для анализа пространственных данных:
При расчёте зон от нескольких источников формируются пересечения областей:
Это используется для анализа конкуренции точек и оптимизации сети объектов.
Модель изохрон имеет ряд особенностей:
При высокой детализации возрастает нагрузка на вычисления и объём передаваемых данных.
При использовании векторных тайлов зоны могут накладываться на слои:
Порядок слоёв критичен для читаемости: полигоны размещаются выше базового слоя, но ниже UI-элементов.
При изменении входных параметров (точка старта, время, режим) зона пересчитывается и перерисовывается:
Это обеспечивает интерактивную реакцию интерфейса на изменения данных.