Сетевой анализ в среде CesiumJS представляет собой совокупность методов работы с графовыми структурами, наложенными на пространственные данные. Под сетью понимается граф, вершины которого соответствуют географическим объектам (перекрёстки, узлы инфраструктуры, остановки), а рёбра — связям между ними (дороги, маршруты, коммуникации). Основная цель анализа — вычисление оптимальных путей, оценка связности, моделирование потоков и анализ доступности объектов в 3D-городской среде.
В отличие от двумерных ГИС, где анализ ограничен плоскостью, CesiumJS позволяет учитывать высоту рельефа, здания и реальные физические ограничения пространства. Это делает сетевой анализ более приближенным к реальным условиям передвижения.
Любая транспортная или навигационная сеть формализуется как граф:
G = (V, E)
где:
В CesiumJS такие структуры часто накладываются поверх:
Сетевые графы редко создаются вручную и обычно импортируются из геоданных:
CesiumJS не предоставляет встроенный routing engine, но обеспечивает визуализацию и пространственную интеграцию сетей.
Базовая структура графа для последующего анализа:
class Graph {
constructor() {
this.nodes = new Map();
this.edges = new Map();
}
addNode(id, position) {
this.nodes.set(id, position);
}
addEdge(from, to, weight) {
if (!this.edges.has(from)) {
this.edges.set(from, []);
}
this.edges.get(from).push({ to, weight });
}
}
В пространственном контексте CesiumJS позиция узла часто хранится как:
Cesium.Cartesian3.fromDegrees(longitude, latitude, height)
Каждый узел сети может быть визуализирован как entity:
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(71.4304, 51.1282),
point: {
pixelSize: 8,
color: Cesium.Color.YELLOW
}
});
Рёбра визуализируются как полилинии:
viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArrayHeights([
71.4304, 51.1282, 0,
71.4400, 51.1300, 0
]),
width: 3,
material: Cesium.Color.CYAN
}
});
Сетевой анализ опирается на классические алгоритмы теории графов:
w(e)
Используется для поиска кратчайшего пути при неотрицательных весах.
Пример реализации:
function dijkstra(graph, start) {
const dist = new Map();
const visited = new Set();
for (let node of graph.nodes.keys()) {
dist.set(node, Infinity);
}
dist.set(start, 0);
while (visited.size < graph.nodes.size) {
let current = null;
for (let [node, value] of dist.entries()) {
if (!visited.has(node) && (current === null || value < dist.get(current))) {
current = node;
}
}
visited.add(current);
const neighbors = graph.edges.get(current) || [];
for (let { to, weight } of neighbors) {
const newDist = dist.get(current) + weight;
if (newDist < dist.get(to)) {
dist.set(to, newDist);
}
}
}
return dist;
}
f(n)=g(n)+h(n)
В CesiumJS эвристика часто вычисляется как евклидово расстояние между Cartesian3 точками.
Особенность CesiumJS — работа с глобальной моделью Земли. Поэтому вес ребра может включать:
d =
При использовании Terrain Provider вычисление высоты выполняется через:
Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, positions);
В трехмерной сцене маршрут не ограничен плоскостью. Это приводит к необходимости:
Коллизии с городской моделью решаются через:
CesiumJS использует иерархию тайлов:
Сетевой граф может быть привязан к тайлам:
В интерактивных сценах маршрут пересчитывается при изменении условий:
Пример пересчёта:
viewer.clock.onTick.addEventListener(() => {
const route = computeRoute(graph, start, end);
updatePolyline(route);
});
Вес ребра может быть векторным:
w(e)=d + t + r
где:
Сетевой анализ используется не только для маршрутов, но и для моделирования потоков:
Модель потока:
F = _{i=1}^{n} f_i
Для ускорения поиска применяются структуры:
CesiumJS эффективно сочетает это с тайловой системой рендеринга, минимизируя количество активных узлов графа в кадре.
При больших графах применяются:
Особенно критично это в глобальных сценах CesiumJS, где число узлов может достигать миллионов.
Результаты сетевого анализа обычно отображаются через:
Пример визуального обновления:
routeEntity.polyline.positions = Cesium.Cartesian3.fromDegreesArray(routeCoords);
routeEntity.polyline.material = Cesium.Color.RED;
CesiumJS поддерживает временные сцены, что позволяет анализировать сеть во времени:
Вес ребра становится функцией времени:
w(e,t) = f(t)