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.
1185 lines
33 KiB
HTML
1185 lines
33 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>中国敏感海域问题事件热点图</title>
|
|
<script src="/js/jquery.min.js"></script>
|
|
<!-- 引入 Leaflet.js 和必要的 CSS -->
|
|
<link rel="stylesheet" href="/assets/css/leaflet.css" />
|
|
<script src="/js/leaflet.js"></script>
|
|
|
|
<!-- 引入 Leaflet 聚合插件 -->
|
|
<script src="/js/leaflet.markercluster.js"></script>
|
|
<link rel="stylesheet" href="/assets/css/MarkerCluster.css" />
|
|
<link rel="stylesheet" href="/assets/css/MarkerCluster.Default.css" />
|
|
|
|
<style>
|
|
/* 保留原有的所有样式 */
|
|
/* 控制面板内容区域添加滚动条 */
|
|
.control-panel-content {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
padding-right: 10px;
|
|
margin-right: -10px;
|
|
}
|
|
|
|
/* 美化控制面板内容区域的滚动条 */
|
|
.control-panel-content::-webkit-scrollbar {
|
|
width: 4px;
|
|
}
|
|
|
|
.control-panel-content::-webkit-scrollbar-track {
|
|
background: rgba(12, 42, 73, 0.3);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.control-panel-content::-webkit-scrollbar-thumb {
|
|
background: rgba(79, 195, 247, 0.5);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.control-panel-content::-webkit-scrollbar-thumb:hover {
|
|
background: rgba(79, 195, 247, 0.8);
|
|
}
|
|
|
|
/* 替换原有的过滤器样式为以下代码 */
|
|
|
|
/* 修改过滤器相关样式 */
|
|
.filter-options {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
.filter-option {
|
|
display: flex;
|
|
align-items: center;
|
|
position: relative;
|
|
padding-left: 30px;
|
|
margin-bottom: 5px;
|
|
cursor: pointer;
|
|
transition: all 0.3s ease;
|
|
}
|
|
|
|
.filter-option:hover {
|
|
transform: translateX(5px);
|
|
background: rgba(40, 80, 130, 0.3);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.filter-option input[type="checkbox"] {
|
|
position: absolute;
|
|
opacity: 0;
|
|
cursor: pointer;
|
|
height: 0;
|
|
width: 0;
|
|
}
|
|
|
|
.filter-option .checkmark {
|
|
position: absolute;
|
|
left: 0;
|
|
height: 20px;
|
|
width: 20px;
|
|
background-color: rgba(25, 55, 95, 0.6);
|
|
border: 2px solid #4fc3f7;
|
|
border-radius: 4px;
|
|
transition: all 0.3s ease;
|
|
pointer-events: all;
|
|
/* 确保可以点击 */
|
|
}
|
|
|
|
.filter-option:hover .checkmark {
|
|
background-color: rgba(79, 195, 247, 0.2);
|
|
}
|
|
|
|
.filter-option input:checked~.checkmark {
|
|
background-color: #4fc3f7;
|
|
}
|
|
|
|
.filter-option .checkmark:after {
|
|
content: "";
|
|
position: absolute;
|
|
display: none;
|
|
}
|
|
|
|
.filter-option input:checked~.checkmark:after {
|
|
display: block;
|
|
}
|
|
|
|
.filter-option .checkmark:after {
|
|
left: 6px;
|
|
top: 2px;
|
|
width: 6px;
|
|
height: 10px;
|
|
border: solid white;
|
|
border-width: 0 2px 2px 0;
|
|
transform: rotate(45deg);
|
|
}
|
|
|
|
.filter-option label {
|
|
font-size: 0.95rem;
|
|
color: #e0f0ff;
|
|
padding: 5px 0;
|
|
cursor: pointer;
|
|
width: 100%;
|
|
margin-left: 10px;
|
|
user-select: none;
|
|
/* 防止文本选择 */
|
|
}
|
|
|
|
.control-title {
|
|
font-size: 1.1rem;
|
|
margin: 15px 0 10px 0;
|
|
color: #4fc3f7;
|
|
padding-bottom: 5px;
|
|
border-bottom: 1px solid rgba(79, 195, 247, 0.3);
|
|
}
|
|
|
|
.control-group {
|
|
margin-bottom: 20px;
|
|
padding: 10px;
|
|
background: rgba(16, 36, 62, 0.3);
|
|
border-radius: 8px;
|
|
border: 1px solid rgba(64, 156, 255, 0.2);
|
|
}
|
|
|
|
/* 优化滚动条以确保内容可见 */
|
|
/* .info-panel {
|
|
overflow-y: auto;
|
|
} */
|
|
|
|
/* 美化滚动条 */
|
|
.info-panel::-webkit-scrollbar {
|
|
width: 4px;
|
|
}
|
|
|
|
.info-panel::-webkit-scrollbar-track {
|
|
background: rgba(12, 42, 73, 0.3);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.info-panel::-webkit-scrollbar-thumb {
|
|
background: rgba(79, 195, 247, 0.5);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.info-panel::-webkit-scrollbar-thumb:hover {
|
|
background: rgba(79, 195, 247, 0.8);
|
|
}
|
|
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
font-family: 'Segoe UI', Arial, sans-serif;
|
|
}
|
|
|
|
body {
|
|
background: url('/assets/img/bg.png') no-repeat;
|
|
background-size: 100% 100%;
|
|
color: #e0f0ff;
|
|
overflow: hidden;
|
|
height: 100vh;
|
|
}
|
|
|
|
/* 定义本地字体 */
|
|
@font-face {
|
|
font-family: 'DS-Digital';
|
|
/* 自定义字体族名称 */
|
|
src: url('/assets/fonts/DS-Digita.TTF') format('truetype');
|
|
/* 指定字体文件路径和格式 */
|
|
font-weight: normal;
|
|
font-style: normal;
|
|
}
|
|
|
|
/* 定义本地字体 */
|
|
@font-face {
|
|
font-family: 'pmzd';
|
|
/* 自定义字体族名称 */
|
|
src: url('/assets/fonts/PMZD.TTF') format('truetype');
|
|
/* 指定字体文件路径和格式 */
|
|
font-weight: normal;
|
|
font-style: normal;
|
|
}
|
|
|
|
@font-face {
|
|
font-family: 'YouSheBiaoTiHei';
|
|
/* 自定义字体族名称 */
|
|
src: url('/assets/fonts/YouSheBiaoTiHei.ttf') format('truetype');
|
|
/* 指定字体文件路径和格式 */
|
|
font-weight: normal;
|
|
font-style: normal;
|
|
}
|
|
|
|
@font-face {
|
|
font-family: 'qweather';
|
|
/* 自定义字体族名称 */
|
|
src: url('/assets/fonts/qweather-icons.ttf') format('truetype');
|
|
/* 指定字体文件路径和格式 */
|
|
font-weight: normal;
|
|
font-style: normal;
|
|
}
|
|
|
|
/* 新增顶部标题栏样式 */
|
|
.topDiv {
|
|
width: 100%;
|
|
height: 8vh;
|
|
background: url('/assets/img/topBg2.png') top no-repeat;
|
|
background-size: 100% 115%;
|
|
display: flex;
|
|
justify-content: center;
|
|
z-index: 990;
|
|
position: relative;
|
|
/* background-color: rgba(12, 42, 73, 0.8); */
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
|
}
|
|
|
|
.topDiv .center {
|
|
font-family: 'pmzd', 'DS-Digital', 'PangMenZhengDao', 'Source Han Sans CN', sans-serif;
|
|
/* 优先使用 DS-Digital 字体 */
|
|
/* font-family: PangMenZhengDao, 'Source Han Sans CN'; */
|
|
font-weight: 400;
|
|
font-size: 4vh;
|
|
color: #ffffff;
|
|
align-self: center;
|
|
margin-top: -10px;
|
|
}
|
|
|
|
.topDiv .left {
|
|
position: absolute;
|
|
top: 4vh;
|
|
left: 3vw;
|
|
color: #ffffff;
|
|
}
|
|
|
|
.topDiv .left span:nth-child(1) {
|
|
font-weight: bold;
|
|
font-size: 0.8vw;
|
|
margin-right: 0.5vh;
|
|
}
|
|
|
|
.topDiv .left span:nth-child(2) {
|
|
font-weight: bold;
|
|
font-size: 1.2vw;
|
|
}
|
|
|
|
.topDiv .right {
|
|
position: absolute;
|
|
top: 3vh;
|
|
right: 0;
|
|
color: #ffffff;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.topDiv .right img:nth-child(1) {}
|
|
|
|
.topDiv .right span {
|
|
font-weight: bold;
|
|
font-size: 1.2vw;
|
|
}
|
|
|
|
.topDiv .icon-home {
|
|
position: absolute;
|
|
top: 1vh;
|
|
right: 8vw;
|
|
width: 4vh;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.container {
|
|
display: flex;
|
|
height: calc(100vh - 8vh - 20px);
|
|
position: relative;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
/* 左侧信息面板 */
|
|
.info-panel {
|
|
width: 300px;
|
|
height: 100%;
|
|
padding: 20px;
|
|
background: rgba(12, 42, 73, 0.1);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid rgba(64, 156, 255, 0.3);
|
|
box-shadow: 5px 0 15px rgba(0, 0, 0, 0.3);
|
|
z-index: 10;
|
|
border-radius: 8px;
|
|
position: absolute;
|
|
left: 15px;
|
|
top: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
/* 右侧控制面板 */
|
|
.control-panel {
|
|
width: 280px;
|
|
height: 100%;
|
|
padding: 20px;
|
|
background: rgba(12, 42, 73, 0.9);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid rgba(64, 156, 255, 0.3);
|
|
box-shadow: -5px 0 15px rgba(0, 0, 0, 0.3);
|
|
z-index: 10;
|
|
border-radius: 8px;
|
|
position: absolute;
|
|
right: 15px;
|
|
top: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
/* 卡片头部样式 */
|
|
/* .card-header {
|
|
height: 40px;
|
|
background: linear-gradient(to right, #1a3a5f, #2a5a8f);
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
border-radius: 8px 8px 0 0 !important;
|
|
border-bottom: 1px solid #4fc3f7;
|
|
padding: 12px 20px;
|
|
position: relative;
|
|
margin: -20px -20px 20px -20px;
|
|
}
|
|
|
|
.card-header span {
|
|
font-size: 1.2rem;
|
|
letter-spacing: 1px;
|
|
font-family: 'Microsoft YaHei';
|
|
font-weight: 400;
|
|
color: #ffffff;
|
|
} */
|
|
|
|
.stats-container {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 15px;
|
|
margin-bottom: 25px;
|
|
}
|
|
|
|
.stat-card {
|
|
background: rgba(25, 55, 95, 0.6);
|
|
/* background: url('/assets/img/common/kva2.png') no-repeat; */
|
|
/* background-size: 100% 100%; */
|
|
border-radius: 10px;
|
|
padding: 15px;
|
|
border-left: 4px solid #4fc3f7;
|
|
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
.stat-label {
|
|
font-size: 0.9rem;
|
|
color: #a0d2ff;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.stat-value {
|
|
font-size: 1.8rem;
|
|
font-weight: bold;
|
|
color: #4fc3f7;
|
|
}
|
|
|
|
.data-list {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
margin-top: 10px;
|
|
padding-right: 5px;
|
|
}
|
|
|
|
.data-item {
|
|
min-width: 200px;
|
|
background: rgba(25, 55, 95, 0.6);
|
|
border-radius: 8px;
|
|
padding: 10px;
|
|
border-left: 3px solid #4fc3f7;
|
|
transition: all 0.3s ease;
|
|
margin-bottom: 10px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.data-item:hover {
|
|
transform: translateX(5px);
|
|
background: rgba(40, 80, 130, 0.7);
|
|
}
|
|
|
|
.stream-device-info {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.stream-device-icon {
|
|
font-size: 1.5rem;
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.stream-device-details {
|
|
flex: 1;
|
|
}
|
|
|
|
.stream-device-name {
|
|
font-weight: bold;
|
|
color: #4fc3f7;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.stream-parameter {
|
|
font-size: 0.8rem;
|
|
color: #a0d2ff;
|
|
}
|
|
|
|
.stream-value-section {
|
|
text-align: right;
|
|
}
|
|
|
|
.stream-value {
|
|
font-weight: bold;
|
|
font-size: 1.1rem;
|
|
font-family: 'Courier New', monospace;
|
|
}
|
|
|
|
.stream-timestamp {
|
|
font-size: 0.7rem;
|
|
color: #81d4fa;
|
|
}
|
|
|
|
.control-group {
|
|
margin-bottom: 25px;
|
|
}
|
|
|
|
.control-title {
|
|
font-size: 1.2rem;
|
|
margin-bottom: 15px;
|
|
color: #4fc3f7;
|
|
}
|
|
|
|
.toggle-switch {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.switch-label {
|
|
margin-right: 10px;
|
|
font-size: 1rem;
|
|
}
|
|
|
|
.switch {
|
|
position: relative;
|
|
display: inline-block;
|
|
width: 60px;
|
|
height: 30px;
|
|
}
|
|
|
|
.switch input {
|
|
opacity: 0;
|
|
width: 0;
|
|
height: 0;
|
|
}
|
|
|
|
.slider {
|
|
position: absolute;
|
|
cursor: pointer;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background-color: #2c3e50;
|
|
transition: .4s;
|
|
border-radius: 34px;
|
|
}
|
|
|
|
.slider:before {
|
|
position: absolute;
|
|
content: "";
|
|
height: 22px;
|
|
width: 22px;
|
|
left: 4px;
|
|
bottom: 4px;
|
|
background-color: white;
|
|
transition: .4s;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
input:checked+.slider {
|
|
background-color: #4fc3f7;
|
|
}
|
|
|
|
input:checked+.slider:before {
|
|
transform: translateX(30px);
|
|
}
|
|
|
|
.filter-options {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
}
|
|
|
|
.filter-option {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.filter-option input {
|
|
margin-right: 10px;
|
|
}
|
|
|
|
/* 地球容器样式 */
|
|
.earth-container {
|
|
flex: 1;
|
|
height: 100%;
|
|
position: relative;
|
|
/* margin: 0 300px 0 320px; */
|
|
background: #0c1a2d;
|
|
}
|
|
|
|
#leafletMap {
|
|
width: 100%;
|
|
height: 100%;
|
|
display: block;
|
|
}
|
|
|
|
/* 信息卡片样式 */
|
|
.info-card {
|
|
position: absolute;
|
|
background: rgba(16, 36, 62, 0.95);
|
|
backdrop-filter: blur(10px);
|
|
border-radius: 10px;
|
|
padding: 15px;
|
|
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.4);
|
|
border: 1px solid rgba(64, 156, 255, 0.3);
|
|
z-index: 1000;
|
|
width: 250px;
|
|
transform: translate(-50%, -100%);
|
|
margin-top: -20px;
|
|
}
|
|
|
|
.info-card::before {
|
|
content: "";
|
|
position: absolute;
|
|
top: 100%;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
border-width: 10px;
|
|
border-style: solid;
|
|
border-color: rgba(16, 36, 62, 0.95) transparent transparent transparent;
|
|
}
|
|
|
|
/* 卡片头部样式 */
|
|
.card-header {
|
|
height: 40px;
|
|
background: url('/assets/img/common/homeTitle2.png') no-repeat;
|
|
background-position: center;
|
|
background-size: 108% 120%;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
border-radius: 8px 8px 0 0 !important;
|
|
border-bottom: 1px solid var(--light-blue);
|
|
padding: 32px 20px;
|
|
position: relative;
|
|
margin: -20px -20px 0px -20px;
|
|
}
|
|
|
|
.card-header span {
|
|
font-size: 1.2rem;
|
|
letter-spacing: 1px;
|
|
font-family: 'YouSheBiaoTiHei', 'Microsoft YaHei';
|
|
font-weight: 400;
|
|
color: #ffffff;
|
|
}
|
|
|
|
.info-card-title {
|
|
font-size: 1.1rem;
|
|
color: #4fc3f7;
|
|
margin: 0;
|
|
}
|
|
|
|
.info-card-close {
|
|
background: none;
|
|
border: none;
|
|
color: #a0d2ff;
|
|
font-size: 1.2rem;
|
|
cursor: pointer;
|
|
padding: 0;
|
|
width: 24px;
|
|
height: 24px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.info-card-close:hover {
|
|
color: #ffffff;
|
|
}
|
|
|
|
.info-card-content {
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.info-item {
|
|
margin: 8px 0;
|
|
display: flex;
|
|
}
|
|
|
|
.info-label {
|
|
width: 70px;
|
|
color: #a0d2ff;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.info-value {
|
|
flex: 1;
|
|
color: #e0f0ff;
|
|
word-break: break-all;
|
|
}
|
|
|
|
.status-online {
|
|
color: #4caf50;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.status-offline {
|
|
color: #f44336;
|
|
font-weight: bold;
|
|
}
|
|
|
|
/* 响应式调整 */
|
|
@media (max-width: 1200px) {
|
|
|
|
.info-panel,
|
|
.control-panel {
|
|
width: 260px;
|
|
}
|
|
|
|
.earth-container {
|
|
margin: 0 275px;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 900px) {
|
|
|
|
.info-panel,
|
|
.control-panel {
|
|
width: 220px;
|
|
padding: 15px;
|
|
}
|
|
|
|
.earth-container {
|
|
margin: 0 235px;
|
|
}
|
|
|
|
.stat-value {
|
|
font-size: 1.5rem;
|
|
}
|
|
}
|
|
|
|
/* 滚动条样式 */
|
|
::-webkit-scrollbar {
|
|
width: 4px;
|
|
height: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: rgba(12, 42, 73, 0.3);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: rgba(106, 149, 201, 0.5);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: rgba(106, 149, 201, 0.7);
|
|
}
|
|
|
|
/* 警报列表样式 */
|
|
.alert-list {
|
|
/* height: 240px;
|
|
overflow-y: auto; */
|
|
height: calc(40vh - 8vh - 20px);
|
|
overflow: scroll;
|
|
}
|
|
|
|
.alert-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 12px 15px;
|
|
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
|
transition: background 0.3s;
|
|
}
|
|
|
|
.alert-item:hover {
|
|
background: rgba(255, 255, 255, 0.05);
|
|
}
|
|
|
|
.alert-level {
|
|
width: 10px;
|
|
height: 10px;
|
|
border-radius: 50%;
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.level-high {
|
|
background: #ff4560;
|
|
box-shadow: 0 0 8px #ff4560;
|
|
}
|
|
|
|
.level-medium {
|
|
background: #ffa726;
|
|
box-shadow: 0 0 8px #ffa726;
|
|
}
|
|
|
|
.level-low {
|
|
background: #00e396;
|
|
box-shadow: 0 0 8px #00e396;
|
|
}
|
|
|
|
.alert-content {
|
|
flex: 1;
|
|
}
|
|
|
|
.alert-title {
|
|
font-weight: bold;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.alert-desc {
|
|
font-size: 13px;
|
|
color: #a0c8ff;
|
|
}
|
|
|
|
.alert-time {
|
|
font-size: 12px;
|
|
color: #7a9ccc;
|
|
}
|
|
|
|
/* 图表容器样式 */
|
|
.chart-container {
|
|
width: 100%;
|
|
/* height: 200px; */
|
|
margin-top: 10px;
|
|
height: calc(40vh - 8vh - 20px);
|
|
}
|
|
|
|
/* 新增样式:实时数据监控网格布局 */
|
|
.stats-grid {
|
|
height: calc(40vh - 8vh - 20px);
|
|
overflow: scroll;
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 10px;
|
|
margin-bottom: 25px;
|
|
}
|
|
|
|
.stat-grid-item {
|
|
background: rgba(25, 55, 95, 0.6);
|
|
border-radius: 8px;
|
|
padding: 12px;
|
|
/* border-left: 3px solid #4fc3f7; */
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
text-align: center;
|
|
}
|
|
|
|
.stat-grid-value {
|
|
font-size: 1rem;
|
|
font-weight: bold;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.stat-grid-label {
|
|
font-size: 0.8rem;
|
|
color: #a0d2ff;
|
|
margin-bottom: 3px;
|
|
}
|
|
|
|
.stat-grid-status {
|
|
font-size: 0.7rem;
|
|
color: #81d4fa;
|
|
}
|
|
|
|
/* 视频会议系统样式 */
|
|
.video-conference {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 10px;
|
|
margin-bottom: 25px;
|
|
}
|
|
|
|
.video-item {
|
|
background: rgba(25, 55, 95, 0.6);
|
|
border-radius: 8px;
|
|
padding: 12px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
text-align: center;
|
|
cursor: pointer;
|
|
transition: all 0.3s ease;
|
|
}
|
|
|
|
.video-item:hover {
|
|
transform: translateY(-3px);
|
|
background: rgba(40, 80, 130, 0.7);
|
|
}
|
|
|
|
.video-icon {
|
|
font-size: 2rem;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.video-name {
|
|
font-size: 0.9rem;
|
|
color: #e0f0ff;
|
|
}
|
|
|
|
/* 网络系统状态样式 */
|
|
.network-status {
|
|
margin-top: 20px;
|
|
}
|
|
|
|
.network-item {
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.network-label {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
margin-bottom: 5px;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.network-name {
|
|
color: #a0d2ff;
|
|
}
|
|
|
|
.network-value {
|
|
color: #4fc3f7;
|
|
}
|
|
|
|
.network-progress {
|
|
height: 8px;
|
|
background: rgba(25, 55, 95, 0.6);
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.network-progress-bar {
|
|
height: 100%;
|
|
border-radius: 4px;
|
|
transition: width 0.5s ease;
|
|
}
|
|
|
|
/* 项目监控样式 */
|
|
.project-monitor {
|
|
margin-top: 10px;
|
|
}
|
|
|
|
.project-item {
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.project-label {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
margin-bottom: 5px;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.project-name {
|
|
color: #a0d2ff;
|
|
}
|
|
|
|
.project-value {
|
|
color: #4fc3f7;
|
|
}
|
|
|
|
.project-progress {
|
|
height: 8px;
|
|
background: rgba(25, 55, 95, 0.6);
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.project-progress-bar {
|
|
height: 100%;
|
|
border-radius: 4px;
|
|
transition: width 0.5s ease;
|
|
}
|
|
|
|
.mars3d-popup-background {
|
|
background: var(--mars-base-bg, rgba(16, 36, 62, 0.85)) !important;
|
|
}
|
|
|
|
/* 区域选择器样式 */
|
|
.region-selector {
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.region-selector select {
|
|
width: 100%;
|
|
padding: 8px 12px;
|
|
background: rgba(25, 55, 95, 0.6);
|
|
border: 1px solid rgba(79, 195, 247, 0.5);
|
|
border-radius: 4px;
|
|
color: #e0f0ff;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.region-selector select:focus {
|
|
outline: none;
|
|
border-color: #4fc3f7;
|
|
}
|
|
|
|
.region-selector label {
|
|
display: block;
|
|
margin-bottom: 5px;
|
|
font-size: 0.9rem;
|
|
color: #a0d2ff;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<!-- 顶部标题栏 -->
|
|
<div class="topDiv">
|
|
<div class="left">
|
|
<span id="current-date">2025年9月17日</span>
|
|
<span id="current-time">15:18:00</span>
|
|
</div>
|
|
<div class="center">中国敏感海域问题事件热点图</div>
|
|
<div class="right">
|
|
<img src="/common/images/logo_gt.png" alt="" />
|
|
</div>
|
|
</div>
|
|
<div class="container">
|
|
<!-- 地球容器 -->
|
|
<div class="earth-container">
|
|
<div id="leafletMap"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// 全局变量
|
|
let map;
|
|
let markerCluster;
|
|
let isSimulationRunning = true;
|
|
let waterQualityChart;
|
|
let oxygenChart;
|
|
let chlorophyllChart;
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
initDateTime();
|
|
initMap();
|
|
});
|
|
|
|
// 初始化日期时间
|
|
function initDateTime() {
|
|
function updateDateTime() {
|
|
const now = new Date();
|
|
const dateStr = now.getFullYear() + '年' +
|
|
(now.getMonth() + 1) + '月' +
|
|
now.getDate() + '日';
|
|
const timeStr = now.toTimeString().substr(0, 8);
|
|
|
|
document.getElementById('current-date').textContent = dateStr;
|
|
document.getElementById('current-time').textContent = timeStr;
|
|
}
|
|
|
|
updateDateTime();
|
|
setInterval(updateDateTime, 1000);
|
|
}
|
|
|
|
// 初始化地图
|
|
function initMap() {
|
|
try {
|
|
// 创建 Leaflet 地图
|
|
map = L.map('leafletMap', {
|
|
center: [15.0, 110.0], // 南海区域中心
|
|
zoom: 5,
|
|
minZoom: 3,
|
|
maxZoom: 18,
|
|
attributionControl: false
|
|
});
|
|
|
|
const tdtImg = L.tileLayer(
|
|
'http://t{s}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=cd7516c53e2e5bee9bad989b63db6ce4',
|
|
{ attribution: '天地图影像', subdomains: [0, 1, 2, 3, 4, 5, 6, 7] },
|
|
)
|
|
|
|
const tdtCia = L.tileLayer(
|
|
'http://t{s}.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=cd7516c53e2e5bee9bad989b63db6ce4',
|
|
{ attribution: '天地图影像注记', subdomains: [0, 1, 2, 3, 4, 5, 6, 7] },
|
|
)
|
|
|
|
const defaultBaseLayer = L.layerGroup([tdtImg, tdtCia])
|
|
defaultBaseLayer.addTo(map)
|
|
|
|
|
|
// 创建标记聚合组
|
|
markerCluster = L.markerClusterGroup({
|
|
chunkedLoading: true,
|
|
maxClusterRadius: 30,
|
|
spiderfyOnMaxZoom: true,
|
|
showCoverageOnHover: true,
|
|
zoomToBoundsOnClick: true
|
|
});
|
|
|
|
// 将聚合组添加到地图
|
|
map.addLayer(markerCluster);
|
|
setTimeout(() => {
|
|
loadEventData();
|
|
addLegend();
|
|
}, 1000);
|
|
|
|
} catch (error) {
|
|
console.error('初始化 Leaflet 地图时出错:', error);
|
|
}
|
|
}
|
|
|
|
// 加载事件数据
|
|
async function loadEventData() {
|
|
try {
|
|
console.log('开始加载南海事件数据...');
|
|
|
|
// 定义文件和对应的颜色
|
|
const fileColors = {
|
|
'./data/jiison/1_lan.json': '#0000FF', // 蓝色
|
|
'./data/jiison/2_hong.json': '#FF0000', // 红色
|
|
'./data/jiison/3_cheng.json': '#FFA500', // 橙色
|
|
'./data/jiison/4_lv.json': '#008000', // 绿色
|
|
'./data/jiison/5_huang.json': '#FFFF00', // 黄色
|
|
'./data/jiison/6_zi.json': '#800080', // 紫色
|
|
'./data/jiison/7_zong.json': '#00FFFF' // 青色
|
|
};
|
|
|
|
let allPoints = [];
|
|
|
|
// 加载所有JSON文件
|
|
for (const [file, color] of Object.entries(fileColors)) {
|
|
try {
|
|
const response = await fetch(file);
|
|
const eventData = await response.json();
|
|
|
|
eventData.forEach(item => {
|
|
allPoints.push({
|
|
lng: item.经度,
|
|
lat: item.纬度,
|
|
value: 1.0,
|
|
color: color,
|
|
attr: {
|
|
事件: item.事件,
|
|
时间: item.时间,
|
|
经度: item.经度,
|
|
纬度: item.纬度
|
|
}
|
|
});
|
|
});
|
|
|
|
console.log(`加载 ${file} 完成,数据点数量:`, eventData.length);
|
|
} catch (fileError) {
|
|
console.error(`加载文件 ${file} 时出错:`, fileError);
|
|
}
|
|
}
|
|
|
|
console.log('总生成的事件数据点:', allPoints.length);
|
|
|
|
// 清除现有的标记
|
|
markerCluster.clearLayers();
|
|
|
|
// 为每个点创建标记
|
|
allPoints.forEach(point => {
|
|
// 创建自定义图标
|
|
const customIcon = L.divIcon({
|
|
className: 'custom-marker',
|
|
html: `<div style="background-color: ${point.color}; width: 12px; height: 12px; border-radius: 50%; border: 2px solid white; box-shadow: 0 0 5px rgba(0,0,0,0.5);"></div>`,
|
|
iconSize: [16, 16],
|
|
iconAnchor: [8, 8]
|
|
});
|
|
|
|
// 创建标记
|
|
const marker = L.marker([point.lat, point.lng], { icon: customIcon });
|
|
|
|
// 添加弹出窗口
|
|
marker.bindPopup(`
|
|
<div style="padding: 10px">
|
|
<h3 style="margin:0 0 10px 0;color:#4fc3f7">${point.attr.事件}</h3>
|
|
<p style="margin:5px 0"><strong>时间:</strong> ${point.attr.时间}</p>
|
|
<p style="margin:5px 0"><strong>纬度:</strong> ${point.attr.纬度}</p>
|
|
<p style="margin:5px 0"><strong>经度:</strong> ${point.attr.经度}</p>
|
|
</div>
|
|
`);
|
|
|
|
// 将标记添加到聚合组
|
|
markerCluster.addLayer(marker);
|
|
});
|
|
|
|
console.log('事件点图层创建完成,聚合功能已启用');
|
|
|
|
} catch (error) {
|
|
console.error('加载南海事件数据时出错:', error);
|
|
}
|
|
}
|
|
|
|
// 添加图例
|
|
function addLegend() {
|
|
const legend = document.createElement('div');
|
|
legend.style.cssText = `
|
|
position: absolute;
|
|
bottom: 20px;
|
|
left: 20px;
|
|
background: rgba(16, 36, 62, 0.85);
|
|
border: 1px solid rgba(64, 156, 255, 0.3);
|
|
border-radius: 8px;
|
|
padding: 15px;
|
|
color: #e0f0ff;
|
|
z-index: 1000;
|
|
max-width: 250px;
|
|
backdrop-filter: blur(5px);
|
|
`;
|
|
|
|
legend.innerHTML = `
|
|
<h3 style="margin: 0 0 10px 0; color: #4fc3f7; font-size: 14px;">事件类型图例</h3>
|
|
<div style="display: flex; align-items: center; margin-bottom: 8px;">
|
|
<div style="width: 12px; height: 12px; background-color: #0000FF; border-radius: 50%; margin-right: 8px;"></div>
|
|
<span style="font-size: 12px;">领海争议</span>
|
|
</div>
|
|
<div style="display: flex; align-items: center; margin-bottom: 8px;">
|
|
<div style="width: 12px; height: 12px; background-color: #FF0000; border-radius: 50%; margin-right: 8px;"></div>
|
|
<span style="font-size: 12px;">边境冲突</span>
|
|
</div>
|
|
<div style="display: flex; align-items: center; margin-bottom: 8px;">
|
|
<div style="width: 12px; height: 12px; background-color: #FFA500; border-radius: 50%; margin-right: 8px;"></div>
|
|
<span style="font-size: 12px;">低空与敌对冲突</span>
|
|
</div>
|
|
<div style="display: flex; align-items: center; margin-bottom: 8px;">
|
|
<div style="width: 12px; height: 12px; background-color: #008000; border-radius: 50%; margin-right: 8px;"></div>
|
|
<span style="font-size: 12px;">两岸海域纠纷</span>
|
|
</div>
|
|
<div style="display: flex; align-items: center; margin-bottom: 8px;">
|
|
<div style="width: 12px; height: 12px; background-color: #FFFF00; border-radius: 50%; margin-right: 8px;"></div>
|
|
<span style="font-size: 12px;">内部渔船管理与执法</span>
|
|
</div>
|
|
<div style="display: flex; align-items: center; margin-bottom: 8px;">
|
|
<div style="width: 12px; height: 12px; background-color: #800080; border-radius: 50%; margin-right: 8px;"></div>
|
|
<span style="font-size: 12px;">渔船打捞境外设备</span>
|
|
</div>
|
|
<div style="display: flex; align-items: center;">
|
|
<div style="width: 12px; height: 12px; background-color: #00FFFF; border-radius: 50%; margin-right: 8px;"></div>
|
|
<span style="font-size: 12px;">生态安全环境</span>
|
|
</div>
|
|
`;
|
|
|
|
document.querySelector('.earth-container').appendChild(legend);
|
|
}
|
|
</script>
|
|
</body>
|
|
|
|
</html> |