В веб-картах геометрия представлена как набор структур: точки, линии, полигоны, окружности и их комбинации. В HERE Technologies JavaScript API каждая геометрия существует одновременно в двух состояниях: как математическая модель (координаты) и как интерактивный объект карты (MapObject), способный реагировать на действия пользователя.
Редактирование геометрии строится вокруг трёх базовых операций:
При этом API разделяет данные геометрии и инструменты взаимодействия, что позволяет гибко управлять поведением объектов на карте.
Точка является базовым элементом. В редакторском контексте она может быть:
const marker = new H.map.Marker({ lat: 52.5, lng: 13.4 }, {
volatility: true
});
marker.draggable = true;
map.addObject(marker);
Ключевое свойство volatility: true сообщает движку, что
объект будет часто изменяться, и оптимизирует перерисовку.
Полилиния состоит из массива координат и является основой для маршрутов и трасс.
Редактирование полилинии включает:
const lineString = new H.geo.LineString();
lineString.pushPoint({ lat: 52.5, lng: 13.4 });
lineString.pushPoint({ lat: 52.6, lng: 13.5 });
const polyline = new H.map.Polyline(lineString, {
style: { lineWidth: 4 },
volatility: true
});
map.addObject(polyline);
Полигоны представляют замкнутые области и используются в задачах зонирования, анализа территорий и построения пользовательских областей.
Редактирование полигона требует соблюдения целостности контуров:
const strip = new H.geo.LineString();
strip.pushPoint({ lat: 52.5, lng: 13.4 });
strip.pushPoint({ lat: 52.6, lng: 13.5 });
strip.pushPoint({ lat: 52.5, lng: 13.6 });
const polygon = new H.map.Polygon(strip, {
style: { fillColor: 'rgba(0, 128, 255, 0.3)' },
volatility: true
});
map.addObject(polygon);
Редактирование начинается с активации событий pointer/mouse. API использует унифицированную модель событий:
tapdragstartdragdragendmap.addEventListener('dragstart', onDragStart, false);
map.addEventListener('drag', onDrag, false);
map.addEventListener('dragend', onDragEnd, false);
Каждое событие содержит:
Для редактирования геометрии необходимо определить, какие точки являются изменяемыми.
Типичный подход:
function updateGeometry(polyline, index, newCoords) {
const line = polyline.getGeometry();
line.removePoint(index);
line.insertPoint(index, newCoords);
polyline.setGeometry(line);
}
Редактируемые объекты часто группируются в контейнер:
const group = new H.map.Group();
map.addObject(group);
Группа позволяет:
Редактируемые объекты обычно визуально отличаются:
const style = {
lineWidth: 6,
strokeColor: '#ff0000'
};
В режиме редактирования стиль часто динамически меняется в зависимости от состояния объекта.
Добавление новых точек происходит через вставку в LineString:
lineString.insertPoint(index, { lat: 52.55, lng: 13.45 });
Часто используется логика:
Удаление требует аккуратной обработки топологии:
lineString.removePoint(index);
При удалении крайних точек полилиния может изменять форму кардинально, что требует дополнительной проверки целостности.
Полное смещение объекта реализуется через пересчёт всех координат:
function shiftGeometry(lineString, deltaLat, deltaLng) {
const points = lineString.getPoints();
const newLine = new H.geo.LineString();
points.forEach(p => {
newLine.pushPoint({
lat: p.lat + deltaLat,
lng: p.lng + deltaLng
});
});
return newLine;
}
Более сложные трансформации требуют:
Типовой подход:
Редактирование в реальном времени требует постоянной синхронизации:
Основная проблема — избежание лишних перерисовок.
Оптимизация достигается через:
GeoJSON часто используется как промежуточный формат при редактировании.
Преимущества:
const geojson = polygon.toGeoJSON();
Обратное преобразование:
const geometry = H.geo.LineString.fromGeoJson(geojson);
Редактируемая геометрия должна проверяться на корректность:
Часто добавляется слой бизнес-логики:
При работе с плотными геометриями возникают узкие места:
Оптимизационные стратегии:
volatilityОбычно выделяются несколько режимов:
Переключение режимов управляет:
Редактируемая геометрия часто используется как:
Изменение геометрии может триггерить:
Это требует строгой синхронизации между UI и сервисами маршрутизации.
Каждый объект обычно имеет состояние:
Состояние влияет на:
Типичная структура:
Такое разделение позволяет: