diff --git a/Log/1.log b/Log/1.log index 494e685..38d64ca 100644 --- a/Log/1.log +++ b/Log/1.log @@ -1,419 +1,316 @@ -C:\Users\Administrator\.conda\envs\yunnan\python.exe D:\dsWork\YunNanProject\Tools\Full_Original.py -开始执行全部数据处理工具 (T1-T8) -当前工作目录: D:\dsWork\YunNanProject\Tools -切换到工具目录: D:\dsWork\YunNanProject\Tools - -================================================== -开始执行 T1_RenKou -================================================== -开始时间: 2025-09-10 14:23:24 - -=== 名称转换记录 === -🔄 行 14: 石林县 → 石林彝族自治县 -🔄 行 16: 禄劝县 → 禄劝彝族苗族自治县 -🔄 行 17: 寻甸县 → 寻甸回族彝族自治县 -🔄 行 32: 澄江县 → 澄江市 -🔄 行 36: 峨山县 → 峨山彝族自治县 -🔄 行 37: 新平县 → 新平彝族傣族自治县 -🔄 行 38: 元江县 → 元江哈尼族彝族傣族自治县 -🔄 行 59: 玉龙县 → 玉龙纳西族自治县 -🔄 行 62: 宁蒗县 → 宁蒗彝族自治县 -🔄 行 65: 宁洱县 → 宁洱哈尼族彝族自治县 -🔄 行 66: 墨江县 → 墨江哈尼族自治县 -🔄 行 67: 景东县 → 景东彝族自治县 -🔄 行 68: 景谷县 → 景谷傣族彝族自治县 -🔄 行 69: 镇沅县 → 镇沅彝族哈尼族拉祜族自治县 -🔄 行 70: 江城县 → 江城哈尼族彝族自治县 -🔄 行 71: 孟连县 → 孟连傣族拉祜族佤族自治县 -🔄 行 72: 澜沧县 → 澜沧拉祜族自治县 -🔄 行 73: 西盟县 → 西盟佤族自治县 -🔄 行 80: 双江县 → 双江拉祜族佤族布朗族傣族自治县 -🔄 行 81: 耿马县 → 耿马傣族佤族自治县 -🔄 行 82: 沧源县 → 沧源佤族自治县 -🔄 行 83: 楚雄州 → 楚雄彝族自治州 -🔄 行 85: 禄丰市 → 禄丰县 -🔄 行 94: 红河州 → 红河哈尼族彝族自治州 -🔄 行 99: 屏边县 → 屏边苗族自治县 -🔄 行 105: 金平县 → 金平苗族瑶族傣族自治县 -🔄 行 107: 河口县 → 河口瑶族自治县 -🔄 行 108: 文山州 → 文山壮族苗族自治州 -🔄 行 117: 西双版纳州 → 西双版纳傣族自治州 -🔄 行 121: 大理州 → 大理白族自治州 -🔄 行 123: 漾濞县 → 漾濞彝族自治县 -🔄 行 127: 南涧县 → 南涧彝族自治县 -🔄 行 128: 巍山县 → 巍山彝族回族自治县 -🔄 行 134: 德宏州 → 德宏傣族景颇族自治州 -🔄 行 140: 怒江州 → 怒江傈僳族自治州 -🔄 行 143: 贡山县 → 贡山独龙族怒族自治县 -🔄 行 144: 兰坪县 → 兰坪白族普米族自治县 -🔄 行 145: 迪庆州 → 迪庆藏族自治州 -🔄 行 148: 维西县 → 维西傈僳族自治县 -📊 共检测到 39 项名称转换 -✅ 所有区域名称均成功转换为全称 -✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\RenKou.json -📊 共处理 146 条地区数据 - -✅ T1_RenKou 执行成功 -结束时间: 2025-09-10 14:23:26 -耗时: 2.31 秒 - -================================================== -开始执行 T2_MaoRuXueLv -================================================== -开始时间: 2025-09-10 14:23:26 -✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\MaoRuXueLv.json -📊 共处理 146 条地区数据 - -=== 名称转换记录 === -🔄 行 13: 晋宁县 → 晋宁区 -🔄 行 23: 马龙县 → 马龙区 -🔄 行 29: 沾益县 → 沾益区 -🔄 行 33: 江川县 → 江川区 -🔄 行 34: 澄江县 → 澄江市 -🔄 行 44: 腾冲县 → 腾冲市 -🔄 行 58: 水富县 → 水富市 -🔄 行 143: 泸水县 → 泸水市 -🔄 行 148: 香格里拉县 → 香格里拉市 -📊 共检测到 9 项名称转换 -✅ 所有区域名称均成功转换为全称 - -✅ T2_MaoRuXueLv 执行成功 -结束时间: 2025-09-10 14:23:26 -耗时: 0.15 秒 - -================================================== -开始执行 T3_SchoolCount -================================================== -开始时间: 2025-09-10 14:23:26 -✅ 学校数数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\SchoolCount.json -📊 共处理 146 条地区数据 - -=== 名称转换记录 === -🔄 行 12: 晋宁县 → 晋宁区 -🔄 行 22: 马龙县 → 马龙区 -🔄 行 28: 沾益县 → 沾益区 -🔄 行 32: 江川县 → 江川区 -🔄 行 33: 澄江县 → 澄江市 -🔄 行 43: 腾冲县 → 腾冲市 -🔄 行 57: 水富县 → 水富市 -🔄 行 142: 泸水县 → 泸水市 -🔄 行 147: 香格里拉县 → 香格里拉市 -📊 共检测到 9 项名称转换 - -❌ T3_SchoolCount 没有找到main函数 - -⚠️ T3_SchoolCount 执行失败,但继续执行后续工具... - -================================================== -开始执行 T4_ClassCount -================================================== -开始时间: 2025-09-10 14:23:27 - -=== 名称转换记录 === -🔄 行 12: 晋宁县 → 晋宁区 -🔄 行 22: 马龙县 → 马龙区 -🔄 行 28: 沾益县 → 沾益区 -🔄 行 32: 江川县 → 江川区 -🔄 行 33: 澄江县 → 澄江市 -🔄 行 43: 腾冲县 → 腾冲市 -🔄 行 57: 水富县 → 水富市 -🔄 行 142: 泸水县 → 泸水市 -🔄 行 147: 香格里拉县 → 香格里拉市 -📊 共检测到 9 项名称转换 -✅ 所有区域名称均成功转换为全称 -✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\ClassCount.json -📊 共处理 146 条地区数据 - -✅ T4_ClassCount 执行成功 -结束时间: 2025-09-10 14:23:27 -耗时: 0.24 秒 - -================================================== -开始执行 T5_ZhaoShengCount -================================================== -开始时间: 2025-09-10 14:23:27 -✅ 成功加载Excel文件:D:\dsWork\YunNanProject\Doc\数据库-2015-2024-v2.xlsx -✅ 开始处理招生数数据,共149行数据 -🔄 已处理 10 条数据... -🔄 已处理 20 条数据... -🔄 已处理 30 条数据... -🔄 已处理 40 条数据... -🔄 已处理 50 条数据... -🔄 已处理 60 条数据... -🔄 已处理 70 条数据... -🔄 已处理 80 条数据... -🔄 已处理 90 条数据... -🔄 已处理 100 条数据... -🔄 已处理 110 条数据... -🔄 已处理 120 条数据... -🔄 已处理 130 条数据... -🔄 已处理 140 条数据... - -=== 名称转换记录 === -🔄 行 12: 晋宁县 → 晋宁区 -🔄 行 22: 马龙县 → 马龙区 -🔄 行 28: 沾益县 → 沾益区 -🔄 行 32: 江川县 → 江川区 -🔄 行 33: 澄江县 → 澄江市 -🔄 行 43: 腾冲县 → 腾冲市 -🔄 行 57: 水富县 → 水富市 -🔄 行 142: 泸水县 → 泸水市 -🔄 行 147: 香格里拉县 → 香格里拉市 -📊 共检测到 9 项名称转换 -✅ 所有区域名称均成功转换为全称 -✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\ZhaoShengCount.json -📊 共处理 145 条地区数据 - -✅ T5_ZhaoShengCount 执行成功 -结束时间: 2025-09-10 14:23:27 -耗时: 0.26 秒 - -================================================== -开始执行 T6_ZaiXiaoShengCount -================================================== -开始时间: 2025-09-10 14:23:27 -✅ 开始处理在校生数数据,共149行数据 -🔄 已处理10条数据... -🔄 已处理20条数据... -🔄 已处理30条数据... -🔄 已处理40条数据... -🔄 已处理50条数据... -🔄 已处理60条数据... -🔄 已处理70条数据... -🔄 已处理80条数据... -🔄 已处理90条数据... -🔄 已处理100条数据... -🔄 已处理110条数据... -🔄 已处理120条数据... -🔄 已处理130条数据... -🔄 已处理140条数据... -✅ 数据提取完成,已保存至:D:\dsWork\YunNanProject\Data\ZaiXiaoShengCount.json -📊 共处理 145 条地区数据 - -=== 名称转换记录 === -🔄 行 5: 昆明市 → 昆明市 -🔄 行 6: 五华区 → 五华区 -🔄 行 7: 盘龙区 → 盘龙区 -🔄 行 8: 官渡区 → 官渡区 -🔄 行 9: 西山区 → 西山区 -🔄 行 10: 东川区 → 东川区 -🔄 行 11: 呈贡区 → 呈贡区 -🔄 行 12: 晋宁县 → 晋宁区 -🔄 行 12: 晋宁县 → 晋宁区 -🔄 行 13: 富民县 → 富民县 -🔄 行 14: 宜良县 → 宜良县 -🔄 行 15: 石林彝族自治县 → 石林彝族自治县 -🔄 行 16: 嵩明县 → 嵩明县 -🔄 行 17: 禄劝彝族苗族自治县 → 禄劝彝族苗族自治县 -🔄 行 18: 寻甸回族彝族自治县 → 寻甸回族彝族自治县 -🔄 行 19: 安宁市 → 安宁市 -🔄 行 20: 曲靖市 → 曲靖市 -🔄 行 21: 麒麟区 → 麒麟区 -🔄 行 22: 马龙县 → 马龙区 -🔄 行 22: 马龙县 → 马龙区 -🔄 行 23: 陆良县 → 陆良县 -🔄 行 24: 师宗县 → 师宗县 -🔄 行 25: 罗平县 → 罗平县 -🔄 行 26: 富源县 → 富源县 -🔄 行 27: 会泽县 → 会泽县 -🔄 行 28: 沾益县 → 沾益区 -🔄 行 28: 沾益县 → 沾益区 -🔄 行 29: 宣威市 → 宣威市 -🔄 行 30: 玉溪市 → 玉溪市 -🔄 行 31: 红塔区 → 红塔区 -🔄 行 32: 江川县 → 江川区 -🔄 行 32: 江川县 → 江川区 -🔄 行 33: 澄江县 → 澄江市 -🔄 行 33: 澄江县 → 澄江市 -🔄 行 34: 通海县 → 通海县 -🔄 行 35: 华宁县 → 华宁县 -🔄 行 36: 易门县 → 易门县 -🔄 行 37: 峨山彝族自治县 → 峨山彝族自治县 -🔄 行 38: 新平彝族傣族自治县 → 新平彝族傣族自治县 -🔄 行 39: 元江哈尼族彝族傣族自治县 → 元江哈尼族彝族傣族自治县 -🔄 行 40: 保山市 → 保山市 -🔄 行 41: 隆阳区 → 隆阳区 -🔄 行 42: 施甸县 → 施甸县 -🔄 行 43: 腾冲县 → 腾冲市 -🔄 行 43: 腾冲县 → 腾冲市 -🔄 行 44: 龙陵县 → 龙陵县 -🔄 行 45: 昌宁县 → 昌宁县 -🔄 行 46: 昭通市 → 昭通市 -🔄 行 47: 昭阳区 → 昭阳区 -🔄 行 48: 鲁甸县 → 鲁甸县 -🔄 行 49: 巧家县 → 巧家县 -🔄 行 50: 盐津县 → 盐津县 -🔄 行 51: 大关县 → 大关县 -🔄 行 52: 永善县 → 永善县 -🔄 行 53: 绥江县 → 绥江县 -🔄 行 54: 镇雄县 → 镇雄县 -🔄 行 55: 彝良县 → 彝良县 -🔄 行 56: 威信县 → 威信县 -🔄 行 57: 水富县 → 水富市 -🔄 行 57: 水富县 → 水富市 -🔄 行 58: 丽江市 → 丽江市 -🔄 行 59: 古城区 → 古城区 -🔄 行 60: 玉龙纳西族自治县 → 玉龙纳西族自治县 -🔄 行 61: 永胜县 → 永胜县 -🔄 行 62: 华坪县 → 华坪县 -🔄 行 63: 宁蒗彝族自治县 → 宁蒗彝族自治县 -🔄 行 64: 普洱市 → 普洱市 -🔄 行 65: 思茅区 → 思茅区 -🔄 行 66: 宁洱哈尼族彝族自治县 → 宁洱哈尼族彝族自治县 -🔄 行 67: 墨江哈尼族自治县 → 墨江哈尼族自治县 -🔄 行 68: 景东彝族自治县 → 景东彝族自治县 -🔄 行 69: 景谷傣族彝族自治县 → 景谷傣族彝族自治县 -🔄 行 70: 镇沅彝族哈尼族拉祜族自治县 → 镇沅彝族哈尼族拉祜族自治县 -🔄 行 71: 江城哈尼族彝族自治县 → 江城哈尼族彝族自治县 -🔄 行 72: 孟连傣族拉祜族佤族自治县 → 孟连傣族拉祜族佤族自治县 -🔄 行 73: 澜沧拉祜族自治县 → 澜沧拉祜族自治县 -🔄 行 74: 西盟佤族自治县 → 西盟佤族自治县 -🔄 行 75: 临沧市 → 临沧市 -🔄 行 76: 临翔区 → 临翔区 -🔄 行 77: 凤庆县 → 凤庆县 -🔄 行 78: 云县 → 云县 -🔄 行 79: 永德县 → 永德县 -🔄 行 80: 镇康县 → 镇康县 -🔄 行 81: 双江拉祜族佤族布朗族傣族自治县 → 双江拉祜族佤族布朗族傣族自治县 -🔄 行 82: 耿马傣族佤族自治县 → 耿马傣族佤族自治县 -🔄 行 83: 沧源佤族自治县 → 沧源佤族自治县 -🔄 行 84: 楚雄彝族自治州 → 楚雄彝族自治州 -🔄 行 85: 楚雄市 → 楚雄市 -🔄 行 86: 双柏县 → 双柏县 -🔄 行 87: 牟定县 → 牟定县 -🔄 行 88: 南华县 → 南华县 -🔄 行 89: 姚安县 → 姚安县 -🔄 行 90: 大姚县 → 大姚县 -🔄 行 91: 永仁县 → 永仁县 -🔄 行 92: 元谋县 → 元谋县 -🔄 行 93: 武定县 → 武定县 -🔄 行 94: 禄丰县 → 禄丰县 -🔄 行 95: 红河哈尼族彝族自治州 → 红河哈尼族彝族自治州 -🔄 行 96: 个旧市 → 个旧市 -🔄 行 97: 开远市 → 开远市 -🔄 行 98: 蒙自市 → 蒙自市 -🔄 行 99: 弥勒市 → 弥勒市 -🔄 行 100: 屏边苗族自治县 → 屏边苗族自治县 -🔄 行 101: 建水县 → 建水县 -🔄 行 102: 石屏县 → 石屏县 -🔄 行 103: 泸西县 → 泸西县 -🔄 行 104: 元阳县 → 元阳县 -🔄 行 105: 红河县 → 红河县 -🔄 行 106: 金平苗族瑶族傣族自治县 → 金平苗族瑶族傣族自治县 -🔄 行 107: 绿春县 → 绿春县 -🔄 行 108: 河口瑶族自治县 → 河口瑶族自治县 -🔄 行 109: 文山壮族苗族自治州 → 文山壮族苗族自治州 -🔄 行 110: 文山市 → 文山市 -🔄 行 111: 砚山县 → 砚山县 -🔄 行 112: 西畴县 → 西畴县 -🔄 行 113: 麻栗坡县 → 麻栗坡县 -🔄 行 114: 马关县 → 马关县 -🔄 行 115: 丘北县 → 丘北县 -🔄 行 116: 广南县 → 广南县 -🔄 行 117: 富宁县 → 富宁县 -🔄 行 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 +{ + "animation": true, + "animationThreshold": 2000, + "animationDuration": 1000, + "animationEasing": "cubicOut", + "animationDelay": 0, + "animationDurationUpdate": 300, + "animationEasingUpdate": "cubicOut", + "animationDelayUpdate": 0, + "aria": { + "enabled": false + }, + "color": [ + "#5470c6", + "#91cc75", + "#fac858", + "#ee6666", + "#73c0de", + "#3ba272", + "#fc8452", + "#9a60b4", + "#ea7ccc" + ], + "series": [ + { + "type": "bar", + "name": "总人口", + "legendHoverLink": true, + "data": [], + "realtimeSort": false, + "showBackground": false, + "stack": "stack1", + "stackStrategy": "samesign", + "cursor": "pointer", + "barMinHeight": 0, + "barCategoryGap": "20%", + "barGap": "30%", + "large": false, + "largeThreshold": 400, + "seriesLayoutBy": "column", + "datasetIndex": 0, + "clip": true, + "zlevel": 0, + "z": 2, + "label": { + "show": false, + "margin": 8, + "valueAnimation": false + }, + "markLine": { + "silent": false, + "precision": 2, + "label": { + "show": true, + "margin": 8, + "valueAnimation": false + }, + "data": [ + { + "name": "平均值", + "type": "average" + } + ] + }, + "rippleEffect": { + "show": true, + "brushType": "stroke", + "scale": 2.5, + "period": 4 + } + }, + { + "type": "bar", + "name": "城镇人口", + "legendHoverLink": true, + "data": [], + "realtimeSort": false, + "showBackground": false, + "stack": "stack1", + "stackStrategy": "samesign", + "cursor": "pointer", + "barMinHeight": 0, + "barCategoryGap": "20%", + "barGap": "30%", + "large": false, + "largeThreshold": 400, + "seriesLayoutBy": "column", + "datasetIndex": 0, + "clip": true, + "zlevel": 0, + "z": 2, + "label": { + "show": false, + "margin": 8, + "valueAnimation": false + }, + "markLine": { + "silent": false, + "precision": 2, + "label": { + "show": true, + "margin": 8, + "valueAnimation": false + }, + "data": [ + { + "name": "平均值", + "type": "average" + } + ] + }, + "rippleEffect": { + "show": true, + "brushType": "stroke", + "scale": 2.5, + "period": 4 + } + }, + { + "type": "bar", + "name": "农村人口", + "legendHoverLink": true, + "data": [], + "realtimeSort": false, + "showBackground": false, + "stack": "stack1", + "stackStrategy": "samesign", + "cursor": "pointer", + "barMinHeight": 0, + "barCategoryGap": "20%", + "barGap": "30%", + "large": false, + "largeThreshold": 400, + "seriesLayoutBy": "column", + "datasetIndex": 0, + "clip": true, + "zlevel": 0, + "z": 2, + "label": { + "show": false, + "margin": 8, + "valueAnimation": false + }, + "markLine": { + "silent": false, + "precision": 2, + "label": { + "show": true, + "margin": 8, + "valueAnimation": false + }, + "data": [ + { + "name": "平均值", + "type": "average" + } + ] + }, + "rippleEffect": { + "show": true, + "brushType": "stroke", + "scale": 2.5, + "period": 4 + } + } + ], + "legend": [ + { + "data": [ + "总人口", + "城镇人口", + "农村人口" + ], + "selected": {}, + "show": true, + "top": "5%", + "padding": 5, + "itemGap": 10, + "itemWidth": 25, + "itemHeight": 14, + "backgroundColor": "transparent", + "borderColor": "#ccc", + "borderRadius": 0, + "pageButtonItemGap": 5, + "pageButtonPosition": "end", + "pageFormatter": "{current}/{total}", + "pageIconColor": "#2f4554", + "pageIconInactiveColor": "#aaa", + "pageIconSize": 15, + "animationDurationUpdate": 800, + "selector": false, + "selectorPosition": "auto", + "selectorItemGap": 7, + "selectorButtonGap": 10 + } + ], + "tooltip": { + "show": true, + "trigger": "axis", + "triggerOn": "mousemove|click", + "axisPointer": { + "type": "shadow" + }, + "showContent": true, + "alwaysShowContent": false, + "showDelay": 0, + "hideDelay": 100, + "enterable": false, + "confine": false, + "appendToBody": false, + "transitionDuration": 0.4, + "textStyle": { + "fontSize": 14 + }, + "borderWidth": 0, + "padding": 5, + "order": "seriesAsc" + }, + "xAxis": [ + { + "show": true, + "scale": false, + "nameLocation": "end", + "nameGap": 15, + "gridIndex": 0, + "axisLabel": { + "show": true, + "rotate": 45, + "margin": 8, + "valueAnimation": false + }, + "inverse": false, + "offset": 0, + "splitNumber": 5, + "minInterval": 0, + "splitLine": { + "show": true, + "lineStyle": { + "show": true, + "width": 1, + "opacity": 1, + "curveness": 0, + "type": "solid" + } + }, + "animation": true, + "animationThreshold": 2000, + "animationDuration": 1000, + "animationEasing": "cubicOut", + "animationDelay": 0, + "animationDurationUpdate": 300, + "animationEasingUpdate": "cubicOut", + "animationDelayUpdate": 0, + "data": [] + } + ], + "yAxis": [ + { + "name": "人口数量(万人)", + "show": true, + "scale": false, + "nameLocation": "middle", + "nameGap": 40, + "gridIndex": 0, + "inverse": false, + "offset": 0, + "splitNumber": 5, + "minInterval": 0, + "splitLine": { + "show": true, + "lineStyle": { + "show": true, + "width": 1, + "opacity": 1, + "curveness": 0, + "type": "solid" + } + }, + "animation": true, + "animationThreshold": 2000, + "animationDuration": 1000, + "animationEasing": "cubicOut", + "animationDelay": 0, + "animationDurationUpdate": 300, + "animationEasingUpdate": "cubicOut", + "animationDelayUpdate": 0 + } + ], + "title": [ + { + "show": true, + "text": "云南省各州市人口分布图(2024年)", + "target": "blank", + "subtarget": "blank", + "padding": 5, + "itemGap": 10, + "textAlign": "auto", + "textVerticalAlign": "auto", + "triggerEvent": false + } + ], + "dataZoom": [ + { + "show": true, + "type": "slider", + "showDetail": true, + "showDataShadow": true, + "realtime": true, + "start": 20, + "end": 80, + "orient": "horizontal", + "zoomLock": false, + "filterMode": "filter" + } + ] +} \ No newline at end of file diff --git a/Routes/BigScreen.py b/Routes/BigScreen.py index a218ec8..a9bc1b4 100644 --- a/Routes/BigScreen.py +++ b/Routes/BigScreen.py @@ -1,10 +1,11 @@ from fastapi import APIRouter import pyecharts from pyecharts import options as opts -from pyecharts.charts import Bar +from pyecharts.charts import Bar, Line from pyecharts.faker import Faker from pyecharts.globals import CurrentConfig import json +import os # 创建 APIRouter 实例 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/" # 定义一个 helloWorld 路由 -@router.get("/hello") -async def hello_world(): - return {"message": "helloWorld"} +@router.get("/") +async def root(): + return {"message": "Welcome to YunNan Education World!"} # 生成图表配置的函数 def generate_bar_chart_config(): @@ -50,23 +51,65 @@ async def get_bar_chart_config(): chart_config = generate_bar_chart_config() return chart_config -# 定义一个带有参数的路由,可以自定义图表标题 -@router.get("/chart/bar/{title}") -async def get_custom_bar_chart_config(title: str): - """ - 获取自定义标题的柱状图配置 - """ +# 读取人口数据 +def load_population_data(): + 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 = ( Bar() - .add_xaxis(Faker.choose()) - .add_yaxis("商家A", Faker.values()) - .add_yaxis("商家B", Faker.values()) - .set_global_opts(title_opts=opts.TitleOpts(title=title)) + .add_xaxis(city_names) + .add_yaxis("总人口", total_populations, stack="stack1") + .add_yaxis("城镇人口", urban_populations, stack="stack1") + .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( label_opts=opts.LabelOpts(is_show=False), 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) 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} diff --git a/Routes/__pycache__/BigScreen.cpython-310.pyc b/Routes/__pycache__/BigScreen.cpython-310.pyc index 9927c50..5afa766 100644 Binary files a/Routes/__pycache__/BigScreen.cpython-310.pyc and b/Routes/__pycache__/BigScreen.cpython-310.pyc differ diff --git a/static/index.html b/static/index.html index 2016e22..5a49cda 100644 --- a/static/index.html +++ b/static/index.html @@ -38,7 +38,7 @@ margin-bottom: 20px; text-align: center; } - .controls input { + .controls select, .controls input { padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; @@ -51,6 +51,7 @@ border: none; border-radius: 4px; cursor: pointer; + margin-right: 10px; } .controls button:hover { background-color: #66b1ff; @@ -60,6 +61,31 @@ color: #666; 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; + }
@@ -69,39 +95,127 @@