Merge remote-tracking branch 'origin/velocity' into components

This commit is contained in:
ThePetrovich 2025-07-02 19:56:12 +08:00
commit a5bfed73a1
4 changed files with 85 additions and 222 deletions

View file

@ -5,10 +5,13 @@
import 'leaflet-velocity/dist/leaflet-velocity.css';
import 'leaflet-velocity/dist/leaflet-velocity';
import 'leaflet.heat';
import 'leaflet-timedimension';
export let map; // принимаем карту из родительского компонента
export let windData;
let timeDimension;
let timeDimensionControl;
let velocityLayer;
let heatLayer;
let legend;
@ -18,6 +21,22 @@
let showVectors = true;
let layerControl;
// Преобразование testVelo.json в формат timeData
const prepareTimeData = (windData) => {
if (!windData || windData.length < 2) return {};
// Используем дату из header или текущую дату, если не указана
const refTime = windData[0]?.header?.refTime || new Date().toISOString();
return {
[refTime]: {
u: windData[0].data, // U-компонента (первый объект в массиве)
v: windData[1].data // V-компонента (второй объект)
}
};
};
// Функция для нормализации данных тепловой карты
const prepareHeatData = (windData) => {
if (!windData || windData.length < 2) {
@ -55,9 +74,9 @@
// Вычисляем координаты для текущей точки
const y = Math.floor(i / nx);
const x = i % nx;
const lat = la1 - y * dy;
const lng = lo1 + x * dx;
let lat = la1 - y * dy;
let lng = lo1 + x * dx;
if (lng >= 180) lng -= 360;
heatData.push([lat, lng, speed]);
maxSpeed = Math.max(maxSpeed, speed);
}
@ -82,9 +101,9 @@
try {
return L.heatLayer(data, {
radius: 20, // Увеличьте радиус для глобальной карты
blur: 15,
maxZoom: 10,
radius: 8, // Увеличьте радиус для глобальной карты
blur: 20,
// maxZoom: 10,
minOpacity: 0.7,
gradient: {
0.1: 'blue',
@ -189,7 +208,50 @@
};
onMount(() => {
updateLayers();
if (!map) return;
// 1. Настройка TimeDimension (добавьте эти строки в начале)
// L.TimeDimension.Util.setProxy('https://your-proxy.com/?url='); // Для загрузки больших данных
L.TimeDimension.Util.setCacheLimit(10); // Лимит кэшированных кадров
// 1. Подготовка данных
const timeData = prepareTimeData(windData);
const firstTime = Object.keys(timeData)[0];
// Инициализация TimeDimension
timeDimension = new L.TimeDimension({
period: "PT1H", // Интервал 1 час
timeInterval: '${firstTime}/${firstTime}',
});
// Добавляем контролы времени
timeDimensionControl = new L.Control.TimeDimension({
timeDimension,
position: 'bottomleft',
// autoPlay: true,
playerOptions: {
// transitionTime: 1000,
loop: false,
minBufferReady: -1
}
});
map.addControl(timeDimensionControl);
// 4. Создание слоев
const velocityLayer = L.timeDimension.layer.windVelocity({
displayValues: true,
data: timeData,
displayOptions: {
velocityType: 'Wind Speed',
position: 'bottomleft'
}
}).addTo(map);
// 5. Тепловая карта (адаптируйте под ваш формат)
const heatLayer = L.timeDimension.layer.heat({
radius: 15,
data: prepareTimeHeatData(timeData)
}).addTo(map);
});
onDestroy(() => {