This commit is contained in:
2025-09-10 15:21:56 +08:00
parent ffb3f6ccf2
commit a65b0780e6
4 changed files with 610 additions and 457 deletions

735
Log/1.log
View File

@@ -1,419 +1,316 @@
C:\Users\Administrator\.conda\envs\yunnan\python.exe D:\dsWork\YunNanProject\Tools\Full_Original.py {
开始执行全部数据处理工具 (T1-T8) "animation": true,
当前工作目录: D:\dsWork\YunNanProject\Tools "animationThreshold": 2000,
切换到工具目录: D:\dsWork\YunNanProject\Tools "animationDuration": 1000,
"animationEasing": "cubicOut",
================================================== "animationDelay": 0,
开始执行 T1_RenKou "animationDurationUpdate": 300,
================================================== "animationEasingUpdate": "cubicOut",
开始时间: 2025-09-10 14:23:24 "animationDelayUpdate": 0,
"aria": {
=== 名称转换记录 === "enabled": false
🔄 行 14: 石林县 → 石林彝族自治县 },
🔄 行 16: 禄劝县 → 禄劝彝族苗族自治县 "color": [
🔄 行 17: 寻甸县 → 寻甸回族彝族自治县 "#5470c6",
🔄 行 32: 澄江县 → 澄江市 "#91cc75",
🔄 行 36: 峨山县 → 峨山彝族自治县 "#fac858",
🔄 行 37: 新平县 → 新平彝族傣族自治县 "#ee6666",
🔄 行 38: 元江县 → 元江哈尼族彝族傣族自治县 "#73c0de",
🔄 行 59: 玉龙县 → 玉龙纳西族自治县 "#3ba272",
🔄 行 62: 宁蒗县 → 宁蒗彝族自治县 "#fc8452",
🔄 行 65: 宁洱县 → 宁洱哈尼族彝族自治县 "#9a60b4",
🔄 行 66: 墨江县 → 墨江哈尼族自治县 "#ea7ccc"
🔄 行 67: 景东县 → 景东彝族自治县 ],
🔄 行 68: 景谷县 → 景谷傣族彝族自治县 "series": [
🔄 行 69: 镇沅县 → 镇沅彝族哈尼族拉祜族自治县 {
🔄 行 70: 江城县 → 江城哈尼族彝族自治县 "type": "bar",
🔄 行 71: 孟连县 → 孟连傣族拉祜族佤族自治县 "name": "总人口",
🔄 行 72: 澜沧县 → 澜沧拉祜族自治县 "legendHoverLink": true,
🔄 行 73: 西盟县 → 西盟佤族自治县 "data": [],
🔄 行 80: 双江县 → 双江拉祜族佤族布朗族傣族自治县 "realtimeSort": false,
🔄 行 81: 耿马县 → 耿马傣族佤族自治县 "showBackground": false,
🔄 行 82: 沧源县 → 沧源佤族自治县 "stack": "stack1",
🔄 行 83: 楚雄州 → 楚雄彝族自治州 "stackStrategy": "samesign",
🔄 行 85: 禄丰市 → 禄丰县 "cursor": "pointer",
🔄 行 94: 红河州 → 红河哈尼族彝族自治州 "barMinHeight": 0,
🔄 行 99: 屏边县 → 屏边苗族自治县 "barCategoryGap": "20%",
🔄 行 105: 金平县 → 金平苗族瑶族傣族自治县 "barGap": "30%",
🔄 行 107: 河口县 → 河口瑶族自治县 "large": false,
🔄 行 108: 文山州 → 文山壮族苗族自治州 "largeThreshold": 400,
🔄 行 117: 西双版纳州 → 西双版纳傣族自治州 "seriesLayoutBy": "column",
🔄 行 121: 大理州 → 大理白族自治州 "datasetIndex": 0,
🔄 行 123: 漾濞县 → 漾濞彝族自治县 "clip": true,
🔄 行 127: 南涧县 → 南涧彝族自治县 "zlevel": 0,
🔄 行 128: 巍山县 → 巍山彝族回族自治县 "z": 2,
🔄 行 134: 德宏州 → 德宏傣族景颇族自治州 "label": {
🔄 行 140: 怒江州 → 怒江傈僳族自治州 "show": false,
🔄 行 143: 贡山县 → 贡山独龙族怒族自治县 "margin": 8,
🔄 行 144: 兰坪县 → 兰坪白族普米族自治县 "valueAnimation": false
🔄 行 145: 迪庆州 → 迪庆藏族自治州 },
🔄 行 148: 维西县 → 维西傈僳族自治县 "markLine": {
📊 共检测到 39 项名称转换 "silent": false,
✅ 所有区域名称均成功转换为全称 "precision": 2,
✅ 数据提取完成已保存至D:\dsWork\YunNanProject\Data\RenKou.json "label": {
📊 共处理 146 条地区数据 "show": true,
"margin": 8,
✅ T1_RenKou 执行成功 "valueAnimation": false
结束时间: 2025-09-10 14:23:26 },
耗时: 2.31 秒 "data": [
{
================================================== "name": "平均值",
开始执行 T2_MaoRuXueLv "type": "average"
================================================== }
开始时间: 2025-09-10 14:23:26 ]
✅ 数据提取完成已保存至D:\dsWork\YunNanProject\Data\MaoRuXueLv.json },
📊 共处理 146 条地区数据 "rippleEffect": {
"show": true,
=== 名称转换记录 === "brushType": "stroke",
🔄 行 13: 晋宁县 → 晋宁区 "scale": 2.5,
🔄 行 23: 马龙县 → 马龙区 "period": 4
🔄 行 29: 沾益县 → 沾益区 }
🔄 行 33: 江川县 → 江川区 },
🔄 行 34: 澄江县 → 澄江市 {
🔄 行 44: 腾冲县 → 腾冲市 "type": "bar",
🔄 行 58: 水富县 → 水富市 "name": "城镇人口",
🔄 行 143: 泸水县 → 泸水市 "legendHoverLink": true,
🔄 行 148: 香格里拉县 → 香格里拉市 "data": [],
📊 共检测到 9 项名称转换 "realtimeSort": false,
✅ 所有区域名称均成功转换为全称 "showBackground": false,
"stack": "stack1",
✅ T2_MaoRuXueLv 执行成功 "stackStrategy": "samesign",
结束时间: 2025-09-10 14:23:26 "cursor": "pointer",
耗时: 0.15 秒 "barMinHeight": 0,
"barCategoryGap": "20%",
================================================== "barGap": "30%",
开始执行 T3_SchoolCount "large": false,
================================================== "largeThreshold": 400,
开始时间: 2025-09-10 14:23:26 "seriesLayoutBy": "column",
✅ 学校数数据提取完成已保存至D:\dsWork\YunNanProject\Data\SchoolCount.json "datasetIndex": 0,
📊 共处理 146 条地区数据 "clip": true,
"zlevel": 0,
=== 名称转换记录 === "z": 2,
🔄 行 12: 晋宁县 → 晋宁区 "label": {
🔄 行 22: 马龙县 → 马龙区 "show": false,
🔄 行 28: 沾益县 → 沾益区 "margin": 8,
🔄 行 32: 江川县 → 江川区 "valueAnimation": false
🔄 行 33: 澄江县 → 澄江市 },
🔄 行 43: 腾冲县 → 腾冲市 "markLine": {
🔄 行 57: 水富县 → 水富市 "silent": false,
🔄 行 142: 泸水县 → 泸水市 "precision": 2,
🔄 行 147: 香格里拉县 → 香格里拉市 "label": {
📊 共检测到 9 项名称转换 "show": true,
"margin": 8,
❌ T3_SchoolCount 没有找到main函数 "valueAnimation": false
},
⚠️ T3_SchoolCount 执行失败,但继续执行后续工具... "data": [
{
================================================== "name": "平均值",
开始执行 T4_ClassCount "type": "average"
================================================== }
开始时间: 2025-09-10 14:23:27 ]
},
=== 名称转换记录 === "rippleEffect": {
🔄 行 12: 晋宁县 → 晋宁区 "show": true,
🔄 行 22: 马龙县 → 马龙区 "brushType": "stroke",
🔄 行 28: 沾益县 → 沾益区 "scale": 2.5,
🔄 行 32: 江川县 → 江川区 "period": 4
🔄 行 33: 澄江县 → 澄江市 }
🔄 行 43: 腾冲县 → 腾冲市 },
🔄 行 57: 水富县 → 水富市 {
🔄 行 142: 泸水县 → 泸水市 "type": "bar",
🔄 行 147: 香格里拉县 → 香格里拉市 "name": "农村人口",
📊 共检测到 9 项名称转换 "legendHoverLink": true,
✅ 所有区域名称均成功转换为全称 "data": [],
✅ 数据提取完成已保存至D:\dsWork\YunNanProject\Data\ClassCount.json "realtimeSort": false,
📊 共处理 146 条地区数据 "showBackground": false,
"stack": "stack1",
✅ T4_ClassCount 执行成功 "stackStrategy": "samesign",
结束时间: 2025-09-10 14:23:27 "cursor": "pointer",
耗时: 0.24 秒 "barMinHeight": 0,
"barCategoryGap": "20%",
================================================== "barGap": "30%",
开始执行 T5_ZhaoShengCount "large": false,
================================================== "largeThreshold": 400,
开始时间: 2025-09-10 14:23:27 "seriesLayoutBy": "column",
✅ 成功加载Excel文件D:\dsWork\YunNanProject\Doc\数据库-2015-2024-v2.xlsx "datasetIndex": 0,
✅ 开始处理招生数数据共149行数据 "clip": true,
🔄 已处理 10 条数据... "zlevel": 0,
🔄 已处理 20 条数据... "z": 2,
🔄 已处理 30 条数据... "label": {
🔄 已处理 40 条数据... "show": false,
🔄 已处理 50 条数据... "margin": 8,
🔄 已处理 60 条数据... "valueAnimation": false
🔄 已处理 70 条数据... },
🔄 已处理 80 条数据... "markLine": {
🔄 已处理 90 条数据... "silent": false,
🔄 已处理 100 条数据... "precision": 2,
🔄 已处理 110 条数据... "label": {
🔄 已处理 120 条数据... "show": true,
🔄 已处理 130 条数据... "margin": 8,
🔄 已处理 140 条数据... "valueAnimation": false
},
=== 名称转换记录 === "data": [
🔄 行 12: 晋宁县 → 晋宁区 {
🔄 行 22: 马龙县 → 马龙区 "name": "平均值",
🔄 行 28: 沾益县 → 沾益区 "type": "average"
🔄 行 32: 江川县 → 江川区 }
🔄 行 33: 澄江县 → 澄江市 ]
🔄 行 43: 腾冲县 → 腾冲市 },
🔄 行 57: 水富县 → 水富市 "rippleEffect": {
🔄 行 142: 泸水县 → 泸水市 "show": true,
🔄 行 147: 香格里拉县 → 香格里拉市 "brushType": "stroke",
📊 共检测到 9 项名称转换 "scale": 2.5,
✅ 所有区域名称均成功转换为全称 "period": 4
✅ 数据提取完成已保存至D:\dsWork\YunNanProject\Data\ZhaoShengCount.json }
📊 共处理 145 条地区数据 }
],
✅ T5_ZhaoShengCount 执行成功 "legend": [
结束时间: 2025-09-10 14:23:27 {
耗时: 0.26 秒 "data": [
"总人口",
================================================== "城镇人口",
开始执行 T6_ZaiXiaoShengCount "农村人口"
================================================== ],
开始时间: 2025-09-10 14:23:27 "selected": {},
✅ 开始处理在校生数数据共149行数据 "show": true,
🔄 已处理10条数据... "top": "5%",
🔄 已处理20条数据... "padding": 5,
🔄 已处理30条数据... "itemGap": 10,
🔄 已处理40条数据... "itemWidth": 25,
🔄 已处理50条数据... "itemHeight": 14,
🔄 已处理60条数据... "backgroundColor": "transparent",
🔄 已处理70条数据... "borderColor": "#ccc",
🔄 已处理80条数据... "borderRadius": 0,
🔄 已处理90条数据... "pageButtonItemGap": 5,
🔄 已处理100条数据... "pageButtonPosition": "end",
🔄 已处理110条数据... "pageFormatter": "{current}/{total}",
🔄 已处理120条数据... "pageIconColor": "#2f4554",
🔄 已处理130条数据... "pageIconInactiveColor": "#aaa",
🔄 已处理140条数据... "pageIconSize": 15,
✅ 数据提取完成已保存至D:\dsWork\YunNanProject\Data\ZaiXiaoShengCount.json "animationDurationUpdate": 800,
📊 共处理 145 条地区数据 "selector": false,
"selectorPosition": "auto",
=== 名称转换记录 === "selectorItemGap": 7,
🔄 行 5: 昆明市 → 昆明市 "selectorButtonGap": 10
🔄 行 6: 五华区 → 五华区 }
🔄 行 7: 盘龙区 → 盘龙区 ],
🔄 行 8: 官渡区 → 官渡区 "tooltip": {
🔄 行 9: 西山区 → 西山区 "show": true,
🔄 行 10: 东川区 → 东川区 "trigger": "axis",
🔄 行 11: 呈贡区 → 呈贡区 "triggerOn": "mousemove|click",
🔄 行 12: 晋宁县 → 晋宁区 "axisPointer": {
🔄 行 12: 晋宁县 → 晋宁区 "type": "shadow"
🔄 行 13: 富民县 → 富民县 },
🔄 行 14: 宜良县 → 宜良县 "showContent": true,
🔄 行 15: 石林彝族自治县 → 石林彝族自治县 "alwaysShowContent": false,
🔄 行 16: 嵩明县 → 嵩明县 "showDelay": 0,
🔄 行 17: 禄劝彝族苗族自治县 → 禄劝彝族苗族自治县 "hideDelay": 100,
🔄 行 18: 寻甸回族彝族自治县 → 寻甸回族彝族自治县 "enterable": false,
🔄 行 19: 安宁市 → 安宁市 "confine": false,
🔄 行 20: 曲靖市 → 曲靖市 "appendToBody": false,
🔄 行 21: 麒麟区 → 麒麟区 "transitionDuration": 0.4,
🔄 行 22: 马龙县 → 马龙区 "textStyle": {
🔄 行 22: 马龙县 → 马龙区 "fontSize": 14
🔄 行 23: 陆良县 → 陆良县 },
🔄 行 24: 师宗县 → 师宗县 "borderWidth": 0,
🔄 行 25: 罗平县 → 罗平县 "padding": 5,
🔄 行 26: 富源县 → 富源县 "order": "seriesAsc"
🔄 行 27: 会泽县 → 会泽县 },
🔄 行 28: 沾益县 → 沾益区 "xAxis": [
🔄 行 28: 沾益县 → 沾益区 {
🔄 行 29: 宣威市 → 宣威市 "show": true,
🔄 行 30: 玉溪市 → 玉溪市 "scale": false,
🔄 行 31: 红塔区 → 红塔区 "nameLocation": "end",
🔄 行 32: 江川县 → 江川区 "nameGap": 15,
🔄 行 32: 江川县 → 江川区 "gridIndex": 0,
🔄 行 33: 澄江县 → 澄江市 "axisLabel": {
🔄 行 33: 澄江县 → 澄江市 "show": true,
🔄 行 34: 通海县 → 通海县 "rotate": 45,
🔄 行 35: 华宁县 → 华宁县 "margin": 8,
🔄 行 36: 易门县 → 易门县 "valueAnimation": false
🔄 行 37: 峨山彝族自治县 → 峨山彝族自治县 },
🔄 行 38: 新平彝族傣族自治县 → 新平彝族傣族自治县 "inverse": false,
🔄 行 39: 元江哈尼族彝族傣族自治县 → 元江哈尼族彝族傣族自治县 "offset": 0,
🔄 行 40: 保山市 → 保山市 "splitNumber": 5,
🔄 行 41: 隆阳区 → 隆阳区 "minInterval": 0,
🔄 行 42: 施甸县 → 施甸县 "splitLine": {
🔄 行 43: 腾冲县 → 腾冲市 "show": true,
🔄 行 43: 腾冲县 → 腾冲市 "lineStyle": {
🔄 行 44: 龙陵县 → 龙陵县 "show": true,
🔄 行 45: 昌宁县 → 昌宁县 "width": 1,
🔄 行 46: 昭通市 → 昭通市 "opacity": 1,
🔄 行 47: 昭阳区 → 昭阳区 "curveness": 0,
🔄 行 48: 鲁甸县 → 鲁甸县 "type": "solid"
🔄 行 49: 巧家县 → 巧家县 }
🔄 行 50: 盐津县 → 盐津县 },
🔄 行 51: 大关县 → 大关县 "animation": true,
🔄 行 52: 永善县 → 永善县 "animationThreshold": 2000,
🔄 行 53: 绥江县 → 绥江县 "animationDuration": 1000,
🔄 行 54: 镇雄县 → 镇雄县 "animationEasing": "cubicOut",
🔄 行 55: 彝良县 → 彝良县 "animationDelay": 0,
🔄 行 56: 威信县 → 威信县 "animationDurationUpdate": 300,
🔄 行 57: 水富县 → 水富市 "animationEasingUpdate": "cubicOut",
🔄 行 57: 水富县 → 水富市 "animationDelayUpdate": 0,
🔄 行 58: 丽江市 → 丽江市 "data": []
🔄 行 59: 古城区 → 古城区 }
🔄 行 60: 玉龙纳西族自治县 → 玉龙纳西族自治县 ],
🔄 行 61: 永胜县 → 永胜县 "yAxis": [
🔄 行 62: 华坪县 → 华坪县 {
🔄 行 63: 宁蒗彝族自治县 → 宁蒗彝族自治县 "name": "人口数量(万人)",
🔄 行 64: 普洱市 → 普洱市 "show": true,
🔄 行 65: 思茅区 → 思茅区 "scale": false,
🔄 行 66: 宁洱哈尼族彝族自治县 → 宁洱哈尼族彝族自治县 "nameLocation": "middle",
🔄 行 67: 墨江哈尼族自治县 → 墨江哈尼族自治县 "nameGap": 40,
🔄 行 68: 景东彝族自治县 → 景东彝族自治县 "gridIndex": 0,
🔄 行 69: 景谷傣族彝族自治县 → 景谷傣族彝族自治县 "inverse": false,
🔄 行 70: 镇沅彝族哈尼族拉祜族自治县 → 镇沅彝族哈尼族拉祜族自治县 "offset": 0,
🔄 行 71: 江城哈尼族彝族自治县 → 江城哈尼族彝族自治县 "splitNumber": 5,
🔄 行 72: 孟连傣族拉祜族佤族自治县 → 孟连傣族拉祜族佤族自治县 "minInterval": 0,
🔄 行 73: 澜沧拉祜族自治县 → 澜沧拉祜族自治县 "splitLine": {
🔄 行 74: 西盟佤族自治县 → 西盟佤族自治县 "show": true,
🔄 行 75: 临沧市 → 临沧市 "lineStyle": {
🔄 行 76: 临翔区 → 临翔区 "show": true,
🔄 行 77: 凤庆县 → 凤庆县 "width": 1,
🔄 行 78: 云县 → 云县 "opacity": 1,
🔄 行 79: 永德县 → 永德县 "curveness": 0,
🔄 行 80: 镇康县 → 镇康县 "type": "solid"
🔄 行 81: 双江拉祜族佤族布朗族傣族自治县 → 双江拉祜族佤族布朗族傣族自治县 }
🔄 行 82: 耿马傣族佤族自治县 → 耿马傣族佤族自治县 },
🔄 行 83: 沧源佤族自治县 → 沧源佤族自治县 "animation": true,
🔄 行 84: 楚雄彝族自治州 → 楚雄彝族自治州 "animationThreshold": 2000,
🔄 行 85: 楚雄市 → 楚雄市 "animationDuration": 1000,
🔄 行 86: 双柏县 → 双柏县 "animationEasing": "cubicOut",
🔄 行 87: 牟定县 → 牟定县 "animationDelay": 0,
🔄 行 88: 南华县 → 南华县 "animationDurationUpdate": 300,
🔄 行 89: 姚安县 → 姚安县 "animationEasingUpdate": "cubicOut",
🔄 行 90: 大姚县 → 大姚县 "animationDelayUpdate": 0
🔄 行 91: 永仁县 → 永仁县 }
🔄 行 92: 元谋县 → 元谋县 ],
🔄 行 93: 武定县 → 武定县 "title": [
🔄 行 94: 禄丰县 → 禄丰县 {
🔄 行 95: 红河哈尼族彝族自治州 → 红河哈尼族彝族自治州 "show": true,
🔄 行 96: 个旧市 → 个旧市 "text": "云南省各州市人口分布图2024年",
🔄 行 97: 开远市 → 开远市 "target": "blank",
🔄 行 98: 蒙自市 → 蒙自市 "subtarget": "blank",
🔄 行 99: 弥勒市 → 弥勒市 "padding": 5,
🔄 行 100: 屏边苗族自治县 → 屏边苗族自治县 "itemGap": 10,
🔄 行 101: 建水县 → 建水县 "textAlign": "auto",
🔄 行 102: 石屏县 → 石屏县 "textVerticalAlign": "auto",
🔄 行 103: 泸西县 → 泸西县 "triggerEvent": false
🔄 行 104: 元阳县 → 元阳县 }
🔄 行 105: 红河县 → 红河县 ],
🔄 行 106: 金平苗族瑶族傣族自治县 → 金平苗族瑶族傣族自治县 "dataZoom": [
🔄 行 107: 绿春县 → 绿春县 {
🔄 行 108: 河口瑶族自治县 → 河口瑶族自治县 "show": true,
🔄 行 109: 文山壮族苗族自治州 → 文山壮族苗族自治州 "type": "slider",
🔄 行 110: 文山市 → 文山市 "showDetail": true,
🔄 行 111: 砚山县 → 砚山县 "showDataShadow": true,
🔄 行 112: 西畴县 → 西畴县 "realtime": true,
🔄 行 113: 麻栗坡县 → 麻栗坡县 "start": 20,
🔄 行 114: 马关县 → 马关县 "end": 80,
🔄 行 115: 丘北县 → 丘北县 "orient": "horizontal",
🔄 行 116: 广南县 → 广南县 "zoomLock": false,
🔄 行 117: 富宁县 → 富宁县 "filterMode": "filter"
🔄 行 118: 西双版纳傣族自治州 → 西双版纳傣族自治州 }
🔄 行 119: 景洪市 → 景洪市 ]
🔄 行 120: 勐海县 → 勐海县 }
🔄 行 121: 勐腊县 → 勐腊县
🔄 行 122: 大理白族自治州 → 大理白族自治州
🔄 行 123: 大理市 → 大理市
🔄 行 124: 漾濞彝族自治县 → 漾濞彝族自治县
🔄 行 125: 祥云县 → 祥云县
🔄 行 126: 宾川县 → 宾川县
🔄 行 127: 弥渡县 → 弥渡县
🔄 行 128: 南涧彝族自治县 → 南涧彝族自治县
🔄 行 129: 巍山彝族回族自治县 → 巍山彝族回族自治县
🔄 行 130: 永平县 → 永平县
🔄 行 131: 云龙县 → 云龙县
🔄 行 132: 洱源县 → 洱源县
🔄 行 133: 剑川县 → 剑川县
🔄 行 134: 鹤庆县 → 鹤庆县
🔄 行 135: 德宏傣族景颇族自治州 → 德宏傣族景颇族自治州
🔄 行 136: 瑞丽市 → 瑞丽市
🔄 行 137: 芒市 → 芒市
🔄 行 138: 梁河县 → 梁河县
🔄 行 139: 盈江县 → 盈江县
🔄 行 140: 陇川县 → 陇川县
🔄 行 141: 怒江傈僳族自治州 → 怒江傈僳族自治州
🔄 行 142: 泸水县 → 泸水市
🔄 行 142: 泸水县 → 泸水市
🔄 行 143: 福贡县 → 福贡县
🔄 行 144: 贡山独龙族怒族自治县 → 贡山独龙族怒族自治县
🔄 行 145: 兰坪白族普米族自治县 → 兰坪白族普米族自治县
🔄 行 146: 迪庆藏族自治州 → 迪庆藏族自治州
🔄 行 147: 香格里拉县 → 香格里拉市
🔄 行 147: 香格里拉县 → 香格里拉市
🔄 行 148: 德钦县 → 德钦县
🔄 行 149: 维西傈僳族自治县 → 维西傈僳族自治县
📊 共检测到 154 项名称转换
✅ 所有区域名称均成功转换为全称
💾 数据已保存至 D:\dsWork\YunNanProject\Data\ZaiXiaoShengCount.json
✅ T6_ZaiXiaoShengCount 执行成功
结束时间: 2025-09-10 14:23:27
耗时: 0.25 秒
==================================================
开始执行 T7_TeacherCount
==================================================
开始时间: 2025-09-10 14:23:27
✅ 开始处理教师数据共150行数据
✅ 数据提取完成已保存至D:\dsWork\YunNanProject\Data\TeacherCount.json
📊 共处理 146 条地区数据
=== 名称转换记录 ===
🔄 行 13: 晋宁县 → 晋宁区
🔄 行 23: 马龙县 → 马龙区
🔄 行 29: 沾益县 → 沾益区
🔄 行 33: 江川县 → 江川区
🔄 行 34: 澄江县 → 澄江市
🔄 行 44: 腾冲县 → 腾冲市
🔄 行 58: 水富县 → 水富市
🔄 行 143: 泸水县 → 泸水市
🔄 行 148: 香格里拉县 → 香格里拉市
📊 共检测到 9 项名称转换
✅ 所有区域名称均成功转换为全称
✅ T7_TeacherCount 执行成功
结束时间: 2025-09-10 14:23:28
耗时: 0.39 秒
==================================================
开始执行 T8_SchoolMianJi
==================================================
开始时间: 2025-09-10 14:23:28
✅ 学校面积数据提取完成已保存至D:\dsWork\YunNanProject\Data\SchoolArea.json
📊 共处理 146 条地区数据
=== 名称转换记录 ===
🔄 行 13: 晋宁县 → 晋宁区
🔄 行 23: 马龙县 → 马龙区
🔄 行 29: 沾益县 → 沾益区
🔄 行 33: 江川县 → 江川区
🔄 行 34: 澄江县 → 澄江市
🔄 行 44: 腾冲县 → 腾冲市
🔄 行 58: 水富县 → 水富市
🔄 行 143: 泸水县 → 泸水市
🔄 行 148: 香格里拉县 → 香格里拉市
📊 共检测到 9 项名称转换
❌ T8_SchoolMianJi 没有找到main函数
⚠️ T8_SchoolMianJi 执行失败,但继续执行后续工具...
==================================================
执行结果摘要
==================================================
T1_RenKou: ✅ 成功
T2_MaoRuXueLv: ✅ 成功
T3_SchoolCount: ❌ 失败
T4_ClassCount: ✅ 成功
T5_ZhaoShengCount: ✅ 成功
T6_ZaiXiaoShengCount: ✅ 成功
T7_TeacherCount: ✅ 成功
T8_SchoolMianJi: ❌ 失败
总计: 6/8 个工具执行成功
⚠️ 部分工具执行失败,请检查错误信息
进程已结束,退出代码为 0

View File

@@ -1,10 +1,11 @@
from fastapi import APIRouter from fastapi import APIRouter
import pyecharts import pyecharts
from pyecharts import options as opts from pyecharts import options as opts
from pyecharts.charts import Bar from pyecharts.charts import Bar, Line
from pyecharts.faker import Faker from pyecharts.faker import Faker
from pyecharts.globals import CurrentConfig from pyecharts.globals import CurrentConfig
import json import json
import os
# 创建 APIRouter 实例 # 创建 APIRouter 实例
router = APIRouter(prefix="/bigscreen", tags=["大屏展示"]) router = APIRouter(prefix="/bigscreen", tags=["大屏展示"])
@@ -13,9 +14,9 @@ router = APIRouter(prefix="/bigscreen", tags=["大屏展示"])
CurrentConfig.ONLINE_HOST = "https://gcore.jsdelivr.net/npm/echarts@6.0.0/dist/" CurrentConfig.ONLINE_HOST = "https://gcore.jsdelivr.net/npm/echarts@6.0.0/dist/"
# 定义一个 helloWorld 路由 # 定义一个 helloWorld 路由
@router.get("/hello") @router.get("/")
async def hello_world(): async def root():
return {"message": "helloWorld"} return {"message": "Welcome to YunNan Education World!"}
# 生成图表配置的函数 # 生成图表配置的函数
def generate_bar_chart_config(): def generate_bar_chart_config():
@@ -50,23 +51,65 @@ async def get_bar_chart_config():
chart_config = generate_bar_chart_config() chart_config = generate_bar_chart_config()
return chart_config return chart_config
# 定义一个带有参数的路由,可以自定义图表标题 # 读取人口数据
@router.get("/chart/bar/{title}") def load_population_data():
async def get_custom_bar_chart_config(title: str): try:
""" # 获取当前文件所在目录的父目录然后找到Data文件夹
获取自定义标题的柱状图配置 current_dir = os.path.dirname(os.path.abspath(__file__))
""" project_root = os.path.dirname(current_dir)
data_path = os.path.join(project_root, "Data", "RenKou.json")
with open(data_path, "r", encoding="utf-8") as f:
data = json.load(f)
return data
except Exception as e:
print(f"读取人口数据出错: {e}")
return []
# 生成人口数据图表配置
def generate_population_chart_config(year="2024"):
# 加载人口数据
population_data = load_population_data()
# 筛选出州市级数据(排除县级数据)
# 正确的格式是 9 位数字,且以 000 结尾但不以 000000 结尾
cities = [item for item in population_data if len(item["area_code"]) == 9 and item["area_code"].endswith("000") and not item["area_code"].endswith("000000")]
# 提取城市名称和人口数据
city_names = [city["area_name"] for city in cities]
total_populations = [city["total_population"].get(year, 0) for city in cities]
urban_populations = [city["urban_population"].get(year, 0) for city in cities]
rural_populations = [city["rural_population"].get(year, 0) for city in cities]
# 创建柱状图
c = ( c = (
Bar() Bar()
.add_xaxis(Faker.choose()) .add_xaxis(city_names)
.add_yaxis("商家A", Faker.values()) .add_yaxis("总人口", total_populations, stack="stack1")
.add_yaxis("商家B", Faker.values()) .add_yaxis("城镇人口", urban_populations, stack="stack1")
.set_global_opts(title_opts=opts.TitleOpts(title=title)) .add_yaxis("农村人口", rural_populations, stack="stack1")
.set_global_opts(
title_opts=opts.TitleOpts(title=f"云南省各州市人口分布图({year}年)"),
tooltip_opts=opts.TooltipOpts(
trigger="axis",
axis_pointer_type="shadow"
),
legend_opts=opts.LegendOpts(pos_top="5%"),
datazoom_opts=[opts.DataZoomOpts()],
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=45)
),
yaxis_opts=opts.AxisOpts(
name="人口数量(万人)",
name_location="middle",
name_gap=40
)
)
.set_series_opts( .set_series_opts(
label_opts=opts.LabelOpts(is_show=False), label_opts=opts.LabelOpts(is_show=False),
markline_opts=opts.MarkLineOpts( markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(y=50, name="yAxis=50")] data=[opts.MarkLineItem(type_="average", name="平均值")]
), )
) )
) )
@@ -77,3 +120,80 @@ async def get_custom_bar_chart_config(title: str):
options_json = json.loads(options_str) options_json = json.loads(options_str)
return options_json return options_json
# 生成城镇化率图表配置
def generate_urbanization_rate_chart_config():
# 加载人口数据
population_data = load_population_data()
# 筛选出州市级数据(排除县级数据)
# 正确的格式是 9 位数字,且以 000 结尾但不以 000000 结尾
cities = [item for item in population_data if len(item["area_code"]) == 9 and item["area_code"].endswith("000") and not item["area_code"].endswith("000000")]
# 提取城市名称和城镇化率数据
city_names = [city["area_name"] for city in cities]
# 创建折线图
line = (
Line()
.add_xaxis(city_names)
)
# 添加各年份的城镇化率数据
years = ["2020", "2021", "2022", "2023", "2024"]
for year in years:
urbanization_rates = [city["urbanization_rate"].get(year, 0) for city in cities]
line.add_yaxis(f"{year}", urbanization_rates,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
line.set_global_opts(
title_opts=opts.TitleOpts(title="云南省各州市城镇化率变化趋势"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
legend_opts=opts.LegendOpts(pos_top="5%"),
datazoom_opts=[opts.DataZoomOpts()],
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=45)
),
yaxis_opts=opts.AxisOpts(
name="城镇化率(%",
name_location="middle",
name_gap=40,
min_=0,
max_=100
)
)
# 获取图表的选项配置
options_str = line.dump_options_with_quotes()
# 将字符串转换为 JSON 对象
options_json = json.loads(options_str)
return options_json
# 定义一个返回人口数据图表配置的路由
@router.get("/population/chart/{year}")
async def get_population_chart_config(year: str = "2024"):
"""
获取人口数据图表配置
"""
chart_config = generate_population_chart_config(year)
return chart_config
# 定义一个返回城镇化率图表配置的路由
@router.get("/population/urbanization")
async def get_urbanization_rate_chart_config():
"""
获取城镇化率图表配置
"""
chart_config = generate_urbanization_rate_chart_config()
return chart_config
# 定义一个返回人口数据原始数据的路由
@router.get("/population/data")
async def get_population_data():
"""
获取人口数据原始数据
"""
population_data = load_population_data()
return {"data": population_data}

View File

@@ -38,7 +38,7 @@
margin-bottom: 20px; margin-bottom: 20px;
text-align: center; text-align: center;
} }
.controls input { .controls select, .controls input {
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ddd; border: 1px solid #ddd;
border-radius: 4px; border-radius: 4px;
@@ -51,6 +51,7 @@
border: none; border: none;
border-radius: 4px; border-radius: 4px;
cursor: pointer; cursor: pointer;
margin-right: 10px;
} }
.controls button:hover { .controls button:hover {
background-color: #66b1ff; background-color: #66b1ff;
@@ -60,6 +61,31 @@
color: #666; color: #666;
margin: 20px 0; margin: 20px 0;
} }
.tabs {
display: flex;
margin-bottom: 20px;
border-bottom: 1px solid #ddd;
}
.tab {
padding: 10px 20px;
cursor: pointer;
background-color: #f5f7fa;
border: 1px solid #ddd;
border-bottom: none;
border-radius: 4px 4px 0 0;
margin-right: 5px;
}
.tab.active {
background-color: #fff;
border-bottom: 1px solid #fff;
margin-bottom: -1px;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
</style> </style>
</head> </head>
<body> <body>
@@ -69,39 +95,127 @@
</div> </div>
<div class="chart-container"> <div class="chart-container">
<div class="tabs">
<div class="tab active" data-tab="population">人口数据图表</div>
<div class="tab" data-tab="urbanization">城镇化率图表</div>
<div class="tab" data-tab="demo">示例图表</div>
</div>
<div class="tab-content active" id="population-tab">
<h2>云南省各州市人口分布</h2>
<div class="controls">
<select id="yearSelect">
<option value="2020">2020年</option>
<option value="2021">2021年</option>
<option value="2022">2022年</option>
<option value="2023">2023年</option>
<option value="2024" selected>2024年</option>
</select>
<button id="loadPopulationChart">加载图表</button>
</div>
<div id="populationChart" class="chart"></div>
<div class="message" id="populationMessage">点击"加载图表"按钮获取数据</div>
</div>
<div class="tab-content" id="urbanization-tab">
<h2>云南省各州市城镇化率变化趋势</h2>
<div class="controls">
<button id="loadUrbanizationChart">加载图表</button>
</div>
<div id="urbanizationChart" class="chart"></div>
<div class="message" id="urbanizationMessage">点击"加载图表"按钮获取数据</div>
</div>
<div class="tab-content" id="demo-tab">
<h2>柱状图示例</h2> <h2>柱状图示例</h2>
<div class="controls"> <div class="controls">
<input type="text" id="chartTitle" placeholder="输入图表标题" value="Bar-MarkLine自定义"> <input type="text" id="chartTitle" placeholder="输入图表标题" value="Bar-MarkLine自定义">
<button id="loadChart">加载图表</button> <button id="loadDemoChart">加载图表</button>
</div> </div>
<div id="barChart" class="chart"></div> <div id="barChart" class="chart"></div>
<div class="message" id="message">点击"加载图表"按钮获取数据</div> <div class="message" id="demoMessage">点击"加载图表"按钮获取数据</div>
</div>
</div> </div>
<script> <script>
// 初始化图表 // 初始化图表
var populationChart = echarts.init(document.getElementById('populationChart'));
var urbanizationChart = echarts.init(document.getElementById('urbanizationChart'));
var barChart = echarts.init(document.getElementById('barChart')); var barChart = echarts.init(document.getElementById('barChart'));
// 显示加载中 // 显示加载中
function showLoading() { function showLoading(chart, messageElement) {
barChart.showLoading(); chart.showLoading();
document.getElementById('message').textContent = '正在加载数据...'; messageElement.textContent = '正在加载数据...';
} }
// 隐藏加载中 // 隐藏加载中
function hideLoading() { function hideLoading(chart) {
barChart.hideLoading(); chart.hideLoading();
} }
// 显示错误信息 // 显示错误信息
function showError(message) { function showError(messageElement, message) {
document.getElementById('message').textContent = '错误: ' + message; messageElement.textContent = '错误: ' + message;
console.error(message); console.error(message);
} }
// 加载图表数据 // 加载人口数据图表
function loadChartData() { function loadPopulationChartData() {
showLoading(); showLoading(populationChart, document.getElementById('populationMessage'));
// 获取选中的年份
var year = document.getElementById('yearSelect').value;
// 调用后端接口获取数据
fetch('/bigscreen/population/chart/' + year)
.then(response => {
if (!response.ok) {
throw new Error('网络响应异常');
}
return response.json();
})
.then(data => {
// 使用获取到的数据渲染图表
populationChart.setOption(data);
document.getElementById('populationMessage').textContent = '图表加载成功';
})
.catch(error => {
showError(document.getElementById('populationMessage'), error.message);
})
.finally(() => {
hideLoading(populationChart);
});
}
// 加载城镇化率图表
function loadUrbanizationRateChartData() {
showLoading(urbanizationChart, document.getElementById('urbanizationMessage'));
// 调用后端接口获取数据
fetch('/bigscreen/population/urbanization')
.then(response => {
if (!response.ok) {
throw new Error('网络响应异常');
}
return response.json();
})
.then(data => {
// 使用获取到的数据渲染图表
urbanizationChart.setOption(data);
document.getElementById('urbanizationMessage').textContent = '图表加载成功';
})
.catch(error => {
showError(document.getElementById('urbanizationMessage'), error.message);
})
.finally(() => {
hideLoading(urbanizationChart);
});
}
// 加载示例图表数据
function loadDemoChartData() {
showLoading(barChart, document.getElementById('demoMessage'));
// 获取图表标题 // 获取图表标题
var title = document.getElementById('chartTitle').value || 'Bar-MarkLine自定义'; var title = document.getElementById('chartTitle').value || 'Bar-MarkLine自定义';
@@ -117,27 +231,49 @@
.then(data => { .then(data => {
// 使用获取到的数据渲染图表 // 使用获取到的数据渲染图表
barChart.setOption(data); barChart.setOption(data);
document.getElementById('message').textContent = '图表加载成功'; document.getElementById('demoMessage').textContent = '图表加载成功';
}) })
.catch(error => { .catch(error => {
showError(error.message); showError(document.getElementById('demoMessage'), error.message);
}) })
.finally(() => { .finally(() => {
hideLoading(); hideLoading(barChart);
}); });
} }
// 页面加载完成后自动加载图表 // 页面加载完成后自动加载图表
window.addEventListener('DOMContentLoaded', function() { window.addEventListener('DOMContentLoaded', function() {
// 绑定标签页切换事件
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', function() {
// 移除所有标签页的active类
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
// 添加当前标签页的active类
this.classList.add('active');
document.getElementById(this.dataset.tab + '-tab').classList.add('active');
// 调整图表大小
populationChart.resize();
urbanizationChart.resize();
barChart.resize();
});
});
// 绑定按钮点击事件 // 绑定按钮点击事件
document.getElementById('loadChart').addEventListener('click', loadChartData); document.getElementById('loadPopulationChart').addEventListener('click', loadPopulationChartData);
document.getElementById('loadUrbanizationChart').addEventListener('click', loadUrbanizationRateChartData);
document.getElementById('loadDemoChart').addEventListener('click', loadDemoChartData);
// 自动加载图表 // 自动加载图表
loadChartData(); loadPopulationChartData();
}); });
// 窗口大小变化时,重新调整图表大小 // 窗口大小变化时,重新调整图表大小
window.addEventListener('resize', function() { window.addEventListener('resize', function() {
populationChart.resize();
urbanizationChart.resize();
barChart.resize(); barChart.resize();
}); });
</script> </script>