You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
5.1 KiB
HTML

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>温度数据粒子效果可视化</title>
<!-- Leaflet CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<style>
body {
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
}
#map {
height: 100vh;
width: 100%;
}
#info {
position: absolute;
top: 10px;
right: 10px;
background: rgba(255, 255, 255, 0.8);
padding: 10px;
border-radius: 5px;
z-index: 1000;
max-width: 300px;
}
.legend {
background: white;
padding: 10px;
border-radius: 5px;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);
}
.legend-item {
display: flex;
align-items: center;
margin-bottom: 5px;
}
.legend-color {
width: 20px;
height: 20px;
margin-right: 5px;
}
</style>
</head>
<body>
<div id="map"></div>
<div id="info">
<h3>温度数据粒子效果</h3>
<p>粒子流动方向和速度表示温度梯度</p>
<div id="legend" class="legend"></div>
</div>
<!-- Leaflet JS -->
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<!-- 使用 CDN 版本的 leaflet-velocity.js -->
<script src="https://cdn.jsdelivr.net/npm/leaflet-velocity@1.0.0/dist/leaflet-velocity.min.js"></script>
<!-- 温度数据 -->
<script>
// 从本地JSON文件加载温度数据
fetch('/data/Atm_ATM_TEMP.json')
.then(response => response.json())
.then(data => {
// 验证数据格式
if (data.status === 10200 && data.message === "SUCCESS") {
window.tempData = data;
// 数据加载成功后初始化地图
initializeMap();
} else {
console.error('数据加载失败:', data.message);
}
})
.catch(error => {
console.error('加载温度数据时出错:', error);
});
// 初始化地图的函数
function initializeMap() {
// 初始化地图
const map = L.map('map').setView([45, 125], 4);
// 添加底图
L.tileLayer(
'http://t{s}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=489fa3b53cd351877dcf69e9ed899a04',
{ attribution: '天地图地形', subdomains: [0, 1, 2, 3, 4, 5, 6, 7] },
).addTo(map);
// 创建温度图层使用GeoJSON而不是velocity
const tempLayer = L.geoJSON(tempData.data.jasonlistf, {
style: function(feature) {
return {
fillColor: feature.properties.fill,
color: feature.properties.stroke,
weight: feature.properties['stroke-width'],
opacity: feature.properties['stroke-opacity'],
fillOpacity: feature.properties['fill-opacity']
};
},
onEachFeature: function(feature, layer) {
// 可以添加弹出窗口显示温度信息
const tempRange = feature.properties.title;
layer.bindPopup(`温度范围: ${tempRange}°C`);
}
}).addTo(map);
// 创建图例
createLegend();
}
// 创建温度颜色映射
function createTempColorScale(colorlist) {
const colorScale = [];
colorlist.forEach(item => {
const temp = item[0];
const rgb = item[1];
colorScale.push(`rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`);
});
return colorScale;
}
// 创建图例
function createLegend() {
const legend = document.getElementById('legend');
const colorlist = tempData.data.colorlist;
// 简化图例,只显示部分温度值
for (let i = 0; i < colorlist.length; i += 4) {
const item = colorlist[i];
const temp = item[0];
const rgb = item[1];
const legendItem = document.createElement('div');
legendItem.className = 'legend-item';
const colorBox = document.createElement('div');
colorBox.className = 'legend-color';
colorBox.style.backgroundColor = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;
const label = document.createElement('span');
label.textContent = `${temp}°C`;
legendItem.appendChild(colorBox);
legendItem.appendChild(label);
legend.appendChild(legendItem);
}
}
</script>
</body>
</html>