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

465 lines
20 KiB

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.

<?php
/**
* Black Maps Block Template
* WordPress标准地图区块模板
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 获取简码参数或使用默认值
global $black_maps_shortcode_atts;
$atts = isset($black_maps_shortcode_atts) ? $black_maps_shortcode_atts : array();
// 设置默认参数
$map_id = !empty($atts['id']) ? esc_attr($atts['id']) : 'black-maps-' . uniqid();
$map_class = !empty($atts['class']) ? esc_attr($atts['class']) : '';
$map_height = !empty($atts['height']) ? esc_attr($atts['height']) : get_theme_mod('black_maps_height', '100vh');
$background_color = get_theme_mod('black_maps_bg_color', '#f8f9fa');
$title = get_theme_mod('black_maps_title', 'Global Layout');
$subtitle = get_theme_mod('black_maps_subtitle', 'Global Service Operations: Remote diagnostics with 2-hour onsite response in key markets');
?>
<div class="black-maps-wrapper <?php echo $map_class; ?>" id="<?php echo esc_attr($map_id); ?>-wrapper" style="background-color: <?php echo esc_attr($background_color); ?>; height: <?php echo esc_attr($map_height); ?>;">
<div id="<?php echo esc_attr($map_id); ?>" class="black-maps-container">
<div class="black-maps-loading"><?php _e('Loading map...', 'nenghui-energy-theme'); ?></div>
</div>
</div>
<script type="text/javascript">
// 等待所有资源加载完成
(function() {
function initMapWhenReady() {
// 检查jQuery和ECharts是否都已加载
if (typeof jQuery === 'undefined') {
setTimeout(initMapWhenReady, 100);
return;
}
if (typeof echarts === 'undefined') {
setTimeout(initMapWhenReady, 100);
return;
}
// 使用jQuery执行初始化
jQuery(document).ready(function($) {
'use strict';
// 初始化地图函数
function initBlackMap() {
var mapContainer = document.getElementById('<?php echo esc_js($map_id); ?>');
if (!mapContainer) {
console.error('Map container not found');
return;
}
// 清除加载提示
$(mapContainer).find('.black-maps-loading').remove();
var chart = echarts.init(mapContainer);
// 从自定义器获取配置
var mapConfig = {
title: '<?php echo esc_js($title); ?>',
subtitle: '<?php echo esc_js($subtitle); ?>',
backgroundColor: '<?php echo esc_js(get_theme_mod("black_maps_chart_bg", "transparent")); ?>',
titleColor: '<?php echo esc_js(get_theme_mod("black_maps_title_color", "#333")); ?>',
titleSize: <?php echo intval(get_theme_mod('black_maps_title_size', 20)); ?>,
chinaColor: '<?php echo esc_js(get_theme_mod("black_maps_china_color", "#e74c3c")); ?>',
targetColor: '<?php echo esc_js(get_theme_mod("black_maps_target_color", "#2eb6aa")); ?>',
lineColor: '<?php echo esc_js(get_theme_mod("black_maps_line_color", "#FFFFFF")); ?>',
effectColor: '<?php echo esc_js(get_theme_mod("black_maps_effect_color", "#0080ff")); ?>'
};
// 获取自定义国家数据
var customCountries = <?php echo json_encode(get_theme_mod('black_maps_countries', array())); ?>;
// 国家代码到全称的映射表
var countryNames = {
'Shanghai': 'Shanghai',
'NL': 'Netherlands',
'BE': 'Belgium',
'CZ': 'Czech Republic',
'IQ': 'Iraq',
'ES': 'Spain',
'PL': 'Poland',
'FR': 'France',
'RO': 'Romania',
'IN': 'India',
'VN': 'Vietnam',
'ID': 'Indonesia',
'TH': 'Thailand',
'DE': 'Germany',
'IT': 'Italy',
'AE': 'United Arab Emirates'
};
/*
图中相关城市经纬度,根据你的需求添加数据
关于国家的经纬度,可以用首都的经纬度或者其他城市的经纬度
*/
var geoCoordMap = {
// 起点城市
'Shanghai': [121.4737, 31.2304],
// 目标国家坐标 (使用国家英文简写作为键)
'NL': [5.291265999999999, 52.132633],
'BE': [4.469936, 50.503887],
'CZ': [15.472962, 49.81749199999999],
'IQ': [43.679291, 33.223191],
'ES': [-3.74922, 40.46366700000001],
'PL': [19.145136, 51.919438],
'FR': [2.213749, 46.227638],
'RO': [24.96676, 45.943161],
'IN': [78.96288, 20.593684],
'VN': [108.277199, 14.058324],
'ID': [113.921327, -0.789275],
'TH': [100.992541, 15.870032],
'DE': [10.451526, 51.165691],
'IT': [12.56738, 41.87194],
'AE': [55.296249, 25.276987]
};
// 上海到全球15个国家的贸易路线数据 (保持与geoCoordMap中的键一致)
var globalTradeData = [
[{ name: 'Shanghai' }, { name: "NL", value: 30 }],
[{ name: 'Shanghai' }, { name: "BE", value: 30 }],
[{ name: 'Shanghai' }, { name: "CZ", value: 30 }],
[{ name: 'Shanghai' }, { name: "IQ", value: 30 }],
[{ name: 'Shanghai' }, { name: "ES", value: 30 }],
[{ name: 'Shanghai' }, { name: "PL", value: 30 }],
[{ name: 'Shanghai' }, { name: "FR", value: 30 }],
[{ name: 'Shanghai' }, { name: "RO", value: 30 }],
[{ name: 'Shanghai' }, { name: "IN", value: 30 }],
[{ name: 'Shanghai' }, { name: "VN", value: 30 }],
[{ name: 'Shanghai' }, { name: "ID", value: 30 }],
[{ name: 'Shanghai' }, { name: "TH", value: 30 }],
[{ name: 'Shanghai' }, { name: "DE", value: 30 }],
[{ name: 'Shanghai' }, { name: "IT", value: 30 }],
[{ name: 'Shanghai' }, { name: "AE", value: 30 }]
];
// 小飞机的图标,可以用其他图形替换
var planePath =
'path://M720.384 237.824H307.6608c-38.7072 0-70.0928 31.3856-70.0928 70.0928v403.712c0 22.9376 11.0592 43.2128 28.0576 56.0128 22.1184 3.328 44.6976 5.0688 67.7376 5.0688 101.4784 0 195.1232-33.536 270.4896-90.1632l-75.9296-128.5632-56.1664 51.7632-12.6464 86.0672c-1.0752 7.3728-10.8032 9.2672-14.592 2.816l-42.8544-73.216-75.6224-45.056c-6.4-3.7888-4.4032-13.5168 2.9184-14.5408l87.6544-12.2368 52.2752-54.6304-138.2912-79.872a8.3968 8.3968 0 0 1-1.8944-13.056l18.944-20.0704c1.8944-1.9968 4.7104-2.9696 7.424-2.5088l194.6112 31.1296 72.3456-75.6224c19.2-20.0192 51.2-20.0192 70.3488 0.0512 18.7904 19.712 17.8176 50.944-2.2016 69.4272l-72.6528 66.9696 25.7024 177.92c86.784-82.176 140.9024-198.4512 140.9024-327.3728 0-16.2304-0.8704-32.3072-2.56-48.0768-11.9296-21.504-34.8672-36.0448-61.184-36.0448z';
// 获取地图中起点和终点的坐标,以数组形式保存下来
var convertData = function(data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var dataItem = data[i];
var fromCoord = geoCoordMap[dataItem[0].name];
var toCoord = geoCoordMap[dataItem[1].name];
if (fromCoord && toCoord) {
res.push([{
coord: fromCoord // 起点坐标
}, {
coord: toCoord // 终点坐标
}])
}
}
return res;
}
var color = [mapConfig.effectColor, mapConfig.effectColor, mapConfig.lineColor]; // 自定义图中要用到的颜色
var series = []; // 用来存储地图数据
[
['Shanghai', globalTradeData]
].forEach(function(item, i) {
series.push({
// 白色航线特效图
type: 'lines',
zlevel: 1, // 用于分层z-index的效果
effect: {
show: true, // 动效是否显示
period: 6, // 特效动画时间
trailLength: 0.7, // 特效尾迹的长度
color: '#fff', // 特效颜色
symbolSize: 3 // 特效大小
},
lineStyle: {
normal: { // 正常情况下的线条样式
color: color[2],
width: 0, // 因为是叠加效果,要是有宽度,线条会变粗,白色航线特效不明显
curveness: -0.2 // 线条曲度
}
},
data: convertData(item[1]) // 特效的起始、终点位置
}, { // 小飞机航线效果
type: 'lines',
zlevel: 2,
//symbol: ['none', 'arrow'], // 用于设置箭头
symbolSize: 10,
effect: {
show: true,
period: 6,
trailLength: 0,
// symbol: planePath, // 特效形状可以用其他svg pathdata路径代替
symbolSize: 5
},
lineStyle: {
normal: {
color: color[2],
width: 1,
opacity: 0.6,
curveness: -0.2
}
},
data: convertData(item[1]) // 特效的起始、终点位置一个二维数组相当于coords: convertData(item[1])
}, { // 散点效果
type: 'effectScatter',
coordinateSystem: 'geo', // 表示使用的坐标系为地理坐标系
zlevel: 3,
rippleEffect: {
brushType: 'stroke', // 波纹绘制效果
period: 4,
scale: 2.5
},
// 添加鼠标交互动画
animationDelay: function (idx) {
return idx * 100;
},
label: {
normal: { // 默认隐藏文本标签
show: false
},
emphasis: { // 鼠标悬停时显示标签
show: true,
position: 'top',
formatter: '{b}',
textStyle: {
color: '#333',
fontSize: 12,
fontWeight: 'bold',
textShadowColor: '#fff',
textShadowBlur: 2
}
}
},
itemStyle: {
normal: {
color: color[0],
shadowBlur: 10,
shadowColor: 'rgba(0, 0, 0, 0.3)'
},
emphasis: {
color: color[0],
shadowBlur: 20,
shadowColor: 'rgba(0, 0, 0, 0.5)',
scale: 1.2
}
},
data: item[1].map(function(dataItem) {
return {
name: dataItem[1].name,
value: geoCoordMap[dataItem[1].name], // 目标国家的位置
symbolSize: dataItem[1].value / 6, // 增大散点大小,更突出显示目标国家
};
})
});
});
// 显示终点位置,类似于上面最后一个效果,放在外面写,是为了防止被循环执行多次
series.push({
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 3,
rippleEffect: {
brushType: 'stroke',
period: 4,
scale: 2.5
},
// 添加鼠标交互动画
animationDelay: function (idx) {
return idx * 50;
},
label: {
normal: {
show: false // 默认隐藏标签
},
emphasis: { // 鼠标悬停时显示标签
show: true,
position: 'left',
formatter: '{b}',
textStyle: {
color: '#333',
fontSize: 20,
fontWeight: 'bold',
textShadowColor: '#fff',
textShadowBlur: 3
}
}
},
symbolSize: function(val) {
return val[2] / 6; // 增大上海起点的散点大小
},
itemStyle: {
normal: {
color: color[1],
shadowBlur: 15,
shadowColor: 'rgba(0, 0, 0, 0.4)'
},
emphasis: {
color: color[1],
shadowBlur: 25,
shadowColor: 'rgba(0, 0, 0, 0.6)',
scale: 1.3
}
},
data: [{
name: 'Shanghai',
value: [121.4737, 31.2304, 30],
itemStyle: {
normal: {
shadowBlur: 15,
shadowColor: 'rgba(0, 0, 0, 0.4)'
},
emphasis: {
shadowBlur: 25,
shadowColor: 'rgba(0, 0, 0, 0.6)',
scale: 1.3
}
},
label: {
normal: {
show: false // 默认隐藏上海标签
},
emphasis: { // 鼠标悬停时显示标签
show: true,
position: 'right',
textStyle: {
color: '#333',
fontSize: 12,
fontWeight: 'bold',
textShadowColor: '#fff',
textShadowBlur: 3
}
}
}
}]
});
// 如果有自定义国家数据,合并到默认数据中
if (customCountries && customCountries.length > 0) {
customCountries.forEach(function(country) {
if (country.code && country.lat && country.lng) {
geoCoordMap[country.code] = [parseFloat(country.lng), parseFloat(country.lat)];
globalTradeData.push([{ name: 'Shanghai' }, { name: country.code, value: parseInt(country.value) || 30 }]);
}
});
}
// 配置地图选项
var mapOption = {
backgroundColor: mapConfig.backgroundColor,
title: {
text: mapConfig.title,
subtext: mapConfig.subtitle,
textStyle: {
color: mapConfig.titleColor,
fontSize: mapConfig.titleSize
},
top: '10px',
left: 'center',
},
// 添加tooltip配置实现鼠标悬停提示
tooltip: {
trigger: 'item',
backgroundColor: '#ffffff',
borderColor: '#e0e0e0',
borderWidth: 1,
borderRadius: 8,
padding: [8, 12],
boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',
textStyle: {
color: '#333333',
fontSize: 12,
fontWeight: 'normal'
},
formatter: function(params) {
if (params.seriesType === 'effectScatter') {
return countryNames[params.name] || params.name;
}
return countryNames[params.name] || params.name;
},
// 添加动画效果
animation: true,
animationDuration: 300,
animationEasing: 'cubicOut'
},
// 添加全局动画配置
animation: true,
animationDuration: 1000,
animationEasing: 'cubicOut',
geo: {
map: 'world', // 与引用进来的地图js名字一致
roam: false, // 禁止缩放平移
itemStyle: { // 每个区域的样式
normal: {
areaColor: '#e8e8e8', // 将非目标区域调暗
borderColor: '#d0d0d0',
borderWidth: 1
},
emphasis: {
areaColor: '#c8c8c8', // 鼠标悬停时的颜色
borderColor: '#a0a0a0',
borderWidth: 2
}
},
regions: [
{ // 中国区域
name: 'China',
selected: false,
itemStyle: {
normal: {
areaColor: mapConfig.chinaColor // 中国颜色
},
emphasis: {
areaColor: mapConfig.chinaColor
}
}
},
// 目标国家区域高亮显示
{ name: 'Netherlands', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Belgium', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Czech Republic', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Iraq', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Spain', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Poland', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'France', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Romania', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'India', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Vietnam', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Indonesia', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Thailand', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Germany', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'Italy', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } },
{ name: 'United Arab Emirates', itemStyle: { normal: { areaColor: mapConfig.targetColor }, emphasis: { areaColor: mapConfig.targetColor } } }
]
},
series: series,
textStyle: {
fontSize: 12
}
};
// 设置地图配置
chart.setOption(mapOption);
// 响应式处理
window.addEventListener('resize', function() {
chart.resize();
});
}
// 初始化地图
initBlackMap();
});
}
// 开始检查和初始化
initMapWhenReady();
})();
</script>