{"id":3669,"date":"2025-08-06T20:48:57","date_gmt":"2025-08-06T12:48:57","guid":{"rendered":"https:\/\/blog.kangyue.pro\/?p=3669"},"modified":"2025-08-06T21:54:46","modified_gmt":"2025-08-06T13:54:46","slug":"ai%e7%94%9f%e6%88%90%e7%9a%84%e5%85%a8%e5%9b%bd%e5%9c%b0%e5%9b%be%ef%bc%88%e5%90%ab%e7%9c%81%e5%b8%82%e8%be%b9%e7%95%8c%ef%bc%89","status":"publish","type":"post","link":"https:\/\/blog.kangyue.pro\/?p=3669","title":{"rendered":"AI\u751f\u6210\u7684\u5168\u56fd\u5730\u56fe\uff08\u542b\u7701\u5e02\u8fb9\u754c\uff09"},"content":{"rendered":"\n<h1 class=\"wp-block-heading has-text-align-center\">\ud83d\uddfa\ufe0f\u6210\u54c1\u5c55\u793a<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/tool.kangyue.pro\/map2\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/tool.kangyue.pro\/map2\/<\/a><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1024\" style=\"aspect-ratio: 1272 \/ 1024;\" width=\"1272\" controls src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/map2_x264.mp4\"><\/video><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1279\" height=\"905\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/image-9.png\" alt=\"\" class=\"wp-image-3682\" style=\"width:457px;height:auto\" srcset=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/image-9.png 1279w, https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/image-9-768x543.png 768w\" sizes=\"auto, (max-width: 1279px) 100vw, 1279px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">\ud83d\udcd0\u8bbe\u8ba1<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u653f\u533a<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u540c\u7684\u7701\u4efd\u7528\u4e0d\u540c\u7684\u989c\u8272<\/li>\n\n\n\n<li>\u4ea6\u5305\u542b\u5730\u7ea7\u884c\u653f\u533a\u8fb9\u754c\uff0c\u5176\u4e2d\u7701\u4f1a\uff08\u9996\u5e9c\uff09\u7528\u6df1\u8272<\/li>\n\n\n\n<li>\u5b9e\u73b0\u540c\u65f6\u5c55\u793a\u4e24\u7ea7\u884c\u653f\u533a\u7684\u8fb9\u754c<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u63a7\u5236\/\u6548\u679c<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6eda\u8f6e\u63a7\u5236\u7f29\u653e<\/li>\n\n\n\n<li>\u9ed8\u8ba4\u4e0d\u663e\u793a\u6240\u6709\u7701\u5e02\u540d\uff0c\u4e5f\u53ef\u52fe\u9009\u590d\u9009\u6846\u4ee5\u5c55\u793a\n<ul class=\"wp-block-list\">\n<li>\u521d\u59cb\u4ec5\u5c55\u793a\u7701\u4efd\u540d<\/li>\n\n\n\n<li>\u5f53\u7f29\u653e\u5230\u4e00\u5b9a\u7ea7\u522b\u65f6\uff0c\u540c\u65f6\u5c55\u793a\u5730\u7ea7\u884c\u653f\u533a\u540d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u6307\u9488\u6ed1\u81f3\u5904\uff0c\u6709\u9ad8\u4eae\u6548\u679c<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">\ud83d\udcdc\u4ee3\u7801<\/h1>\n\n\n\t\t<div class='wp-block-bch-code-highlight  align' id='bhcCodeHighlight-395ea070-1' data-attributes='{&quot;cId&quot;:&quot;395ea070-1&quot;,&quot;language&quot;:&quot;html&quot;,&quot;code&quot;:&quot;&lt;!DOCTYPE html&gt;\\n&lt;html lang=\\&quot;zh-CN\\&quot;&gt;\\n&lt;head&gt;\\n    &lt;meta charset=\\&quot;UTF-8\\&quot;&gt;\\n    &lt;meta name=\\&quot;viewport\\&quot; content=\\&quot;width=device-width, initial-scale=1.0\\&quot;&gt;\\n    &lt;title&gt;\\u4e2d\\u56fd\\u7701\\u5e02\\u5730\\u56fe&lt;\\\/title&gt;\\n    &lt;link rel=\\&quot;stylesheet\\&quot; href=\\&quot;https:\\\/\\\/unpkg.com\\\/leaflet@1.9.4\\\/dist\\\/leaflet.css\\&quot; \\\/&gt;\\n    &lt;style&gt;\\n        html, body, #map {\\n            margin: 0;\\n            padding: 0;\\n            height: 100%;\\n            width: 100%;\\n            background: #f0f0f0;\\n        }\\n        #labelToggle {\\n            position: absolute;\\n            top: 10px;\\n            right: 10px;\\n            z-index: 1000;\\n            background: white;\\n            padding: 5px;\\n            border-radius: 3px;\\n        }\\n        #audioControls {\\n            position: absolute;\\n            top: 40px;\\n            right: 10px;\\n            z-index: 1000;\\n            background: white;\\n            padding: 5px;\\n            border-radius: 3px;\\n            display: flex;\\n            flex-direction: column;\\n            gap: 5px;\\n        }\\n\\t\\t\\t#lyrics {\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\ttop: 120px;\\n\\t\\t\\t\\tright: 10px;\\n\\t\\t\\t\\tz-index: 1000;\\n\\t\\t\\t\\tbackground: rgba(0, 0, 0, 0.5);\\\/* \\u6b4c\\u8bcd\\u80cc\\u666f\\u9ed1\\u6846\\u900f\\u660e\\u5ea6\\uff0c\\u8d8a\\u5c0f\\u8d8a\\u900f\\u660e *\\\/\\n\\t\\t\\t\\tpadding: 10px;\\n\\t\\t\\t\\tborder-radius: 3px;\\n\\t\\t\\t\\tmax-height: 350px;\\n\\t\\t\\t\\twidth: 320px;  \\\/* \\u56fa\\u5b9a\\u5bbd\\u5ea6 *\\\/\\n\\t\\t\\t\\toverflow-y: auto;\\n\\t\\t\\t\\tfont-size: 16px;\\n\\t\\t\\t\\tcolor: white;\\n\\t\\t\\t\\tscrollbar-width: none;\\n\\t\\t\\t\\t-ms-overflow-style: none;\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t\\t#lyrics::-webkit-scrollbar {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t\\t#lyrics div {\\n\\t\\t\\t\\tmargin: 5px 0;\\n\\t\\t\\t}\\n\\t\\t\\t#lyrics .highlight {\\n\\t\\t\\t\\tfont-size: 28px; \\\/* \\u589e\\u5927\\u5b57\\u53f7 *\\\/\\n\\t\\t\\t\\tanimation: colorChange 9s infinite; \\\/* \\u52a8\\u6001\\u5f69\\u8272\\u53d8\\u5316 *\\\/\\n\\t\\t\\t}\\n\\t\\t\\t@keyframes colorChange {\\n\\t\\t\\t\\t0% { color: #ff69b4; }\\n\\t\\t\\t\\t33% { color: #00ff00; }\\n\\t\\t\\t\\t66% { color: #1e90ff; }\\n\\t\\t\\t\\t100% { color: #ff69b4; }\\n\\t\\t\\t}\\n        }\\n        #lyrics::-webkit-scrollbar {\\n            display: none;\\n        }\\n        #lyrics div {\\n            margin: 5px 0;\\n        }\\n        #lyrics .highlight {\\n            font-size: 28px;\\n            color: #ff69b4;\\n        }\\n        .province-label span {\\n            font-size: 14px;\\n            font-weight: bold;\\n            color: #000;\\n        }\\n        .city-label span {\\n            font-size: 12px;\\n            color: #333;\\n        }\\n    &lt;\\\/style&gt;\\n&lt;\\\/head&gt;\\n&lt;body&gt;\\n    &lt;div id=\\&quot;labelToggle\\&quot;&gt;\\n        &lt;input type=\\&quot;checkbox\\&quot; id=\\&quot;showLabels\\&quot;&gt;\\n        &lt;label for=\\&quot;showLabels\\&quot;&gt;\\u663e\\u793a\\u5730\\u540d&lt;\\\/label&gt;\\n    &lt;\\\/div&gt;\\n    &lt;div id=\\&quot;audioControls\\&quot;&gt;\\n        &lt;button id=\\&quot;playPause\\&quot;&gt;\\u64ad\\u653e\\u97f3\\u4e50&lt;\\\/button&gt;\\n        &lt;button id=\\&quot;nextTrack\\&quot;&gt;\\u4e0b\\u4e00\\u9996&lt;\\\/button&gt;\\n        &lt;audio id=\\&quot;audioPlayer\\&quot; src=\\&quot;msc\\\/1.webm\\&quot;&gt;&lt;\\\/audio&gt;\\n    &lt;\\\/div&gt;\\n    &lt;div id=\\&quot;lyrics\\&quot;&gt;&lt;\\\/div&gt;\\n    &lt;div id=\\&quot;map\\&quot;&gt;&lt;\\\/div&gt;\\n    &lt;script src=\\&quot;https:\\\/\\\/unpkg.com\\\/leaflet@1.9.4\\\/dist\\\/leaflet.js\\&quot;&gt;&lt;\\\/script&gt;\\n    &lt;script&gt;\\n        var map = L.map(&#039;map&#039;, {\\n            zoomControl: true,\\n            attributionControl: false\\n        }).setView([34.3416, 108.9398], 5);\\n\\n        var provinceColors = {\\n            &#039;\\u6cb3\\u5357\\u7701&#039;: { baseColor: &#039;#0000CC&#039;, capitalColor: &#039;#000066&#039;, cityColors: [&#039;#1E90FF&#039;, &#039;#4682B4&#039;, &#039;#87CEEB&#039;] },\\n            &#039;\\u6cb3\\u5317\\u7701&#039;: { baseColor: &#039;#FF8C00&#039;, capitalColor: &#039;#CC4500&#039;, cityColors: [&#039;#FF4500&#039;, &#039;#FFA500&#039;, &#039;#FFB266&#039;] },\\n            &#039;\\u9655\\u897f\\u7701&#039;: { baseColor: &#039;#CC0000&#039;, capitalColor: &#039;#990000&#039;, cityColors: [&#039;#FF3333&#039;, &#039;#FF6666&#039;, &#039;#FF9999&#039;] },\\n            &#039;\\u5b89\\u5fbd\\u7701&#039;: { baseColor: &#039;#006600&#039;, capitalColor: &#039;#003300&#039;, cityColors: [&#039;#32CD32&#039;, &#039;#66CDAA&#039;, &#039;#90EE90&#039;] },\\n            &#039;\\u5317\\u4eac\\u5e02&#039;: { baseColor: &#039;#FF3399&#039;, capitalColor: &#039;#990066&#039;, cityColors: [&#039;#FF3399&#039;] },\\n            &#039;\\u5929\\u6d25\\u5e02&#039;: { baseColor: &#039;#CC0066&#039;, capitalColor: &#039;#990066&#039;, cityColors: [&#039;#CC0066&#039;] },\\n            &#039;\\u4e0a\\u6d77\\u5e02&#039;: { baseColor: &#039;#FF6699&#039;, capitalColor: &#039;#990066&#039;, cityColors: [&#039;#FF6699&#039;] },\\n            &#039;\\u91cd\\u5e86\\u5e02&#039;: { baseColor: &#039;#CC0066&#039;, capitalColor: &#039;#990066&#039;, cityColors: [&#039;#CC0066&#039;] },\\n            &#039;\\u8d35\\u5dde\\u7701&#039;: { baseColor: &#039;#CC9900&#039;, capitalColor: &#039;#996600&#039;, cityColors: [&#039;#FFCC66&#039;, &#039;#FFDB4D&#039;, &#039;#FFE066&#039;] },\\n            &#039;\\u5c71\\u4e1c\\u7701&#039;: { baseColor: &#039;#660099&#039;, capitalColor: &#039;#4B0082&#039;, cityColors: [&#039;#9932CC&#039;, &#039;#BA55D3&#039;, &#039;#CC99CC&#039;] },\\n            &#039;\\u5c71\\u897f\\u7701&#039;: { baseColor: &#039;#4682B4&#039;, capitalColor: &#039;#2F4F4F&#039;, cityColors: [&#039;#6495ED&#039;, &#039;#87CEEB&#039;, &#039;#B0C4DE&#039;] },\\n            &#039;\\u8fbd\\u5b81\\u7701&#039;: { baseColor: &#039;#228B22&#039;, capitalColor: &#039;#006400&#039;, cityColors: [&#039;#32CD32&#039;, &#039;#66CDAA&#039;, &#039;#90EE90&#039;] },\\n            &#039;\\u5409\\u6797\\u7701&#039;: { baseColor: &#039;#9932CC&#039;, capitalColor: &#039;#4B0082&#039;, cityColors: [&#039;#BA55D3&#039;, &#039;#CC99CC&#039;, &#039;#DDA0DD&#039;] },\\n            &#039;\\u9ed1\\u9f99\\u6c5f\\u7701&#039;: { baseColor: &#039;#CC3300&#039;, capitalColor: &#039;#800000&#039;, cityColors: [&#039;#FF4500&#039;, &#039;#FF6347&#039;, &#039;#FF7F50&#039;] },\\n            &#039;\\u6c5f\\u82cf\\u7701&#039;: { baseColor: &#039;#00B7EB&#039;, capitalColor: &#039;#00688B&#039;, cityColors: [&#039;#20B2AA&#039;, &#039;#48D1CC&#039;, &#039;#87CEEB&#039;] },\\n            &#039;\\u6d59\\u6c5f\\u7701&#039;: { baseColor: &#039;#CC00CC&#039;, capitalColor: &#039;#990099&#039;, cityColors: [&#039;#DA70D6&#039;, &#039;#EE82EE&#039;, &#039;#D8BFD8&#039;] },\\n            &#039;\\u798f\\u5efa\\u7701&#039;: { baseColor: &#039;#99CC00&#039;, capitalColor: &#039;#669900&#039;, cityColors: [&#039;#7CFC00&#039;, &#039;#90EE90&#039;, &#039;#ADFF2F&#039;] },\\n            &#039;\\u6c5f\\u897f\\u7701&#039;: { baseColor: &#039;#FF4500&#039;, capitalColor: &#039;#CD5C5C&#039;, cityColors: [&#039;#FA8072&#039;, &#039;#E9967A&#039;, &#039;#FF8C00&#039;] },\\n            &#039;\\u5e7f\\u4e1c\\u7701&#039;: { baseColor: &#039;#00CC66&#039;, capitalColor: &#039;#00994D&#039;, cityColors: [&#039;#3CB371&#039;, &#039;#66CDAA&#039;, &#039;#90EE90&#039;] },\\n            &#039;\\u6e56\\u5357\\u7701&#039;: { baseColor: &#039;#99CC00&#039;, capitalColor: &#039;#669900&#039;, cityColors: [&#039;#ADFF2F&#039;, &#039;#7FFF00&#039;, &#039;#90EE90&#039;] },\\n            &#039;\\u6e56\\u5317\\u7701&#039;: { baseColor: &#039;#FFD700&#039;, capitalColor: &#039;#DAA520&#039;, cityColors: [&#039;#FFCC66&#039;, &#039;#FFDB4D&#039;, &#039;#FFE066&#039;] },\\n            &#039;\\u5e7f\\u897f\\u58ee\\u65cf\\u81ea\\u6cbb\\u533a&#039;: { baseColor: &#039;#FF8C00&#039;, capitalColor: &#039;#FF7F50&#039;, cityColors: [&#039;#F08080&#039;, &#039;#FA8072&#039;, &#039;#FF8C00&#039;] },\\n            &#039;\\u6d77\\u5357\\u7701&#039;: { baseColor: &#039;#20B2AA&#039;, capitalColor: &#039;#008B8B&#039;, cityColors: [&#039;#48D1CC&#039;, &#039;#00CED1&#039;, &#039;#AFEEEE&#039;] },\\n            &#039;\\u56db\\u5ddd\\u7701&#039;: { baseColor: &#039;#FFCC99&#039;, capitalColor: &#039;#FFB266&#039;, cityColors: [&#039;#FFDEAD&#039;, &#039;#FFE4C4&#039;, &#039;#FFF8DC&#039;] },\\n            &#039;\\u4e91\\u5357\\u7701&#039;: { baseColor: &#039;#6A5ACD&#039;, capitalColor: &#039;#483D8B&#039;, cityColors: [&#039;#7B68EE&#039;, &#039;#9370DB&#039;, &#039;#D8BFD8&#039;] },\\n            &#039;\\u7518\\u8083\\u7701&#039;: { baseColor: &#039;#CC3300&#039;, capitalColor: &#039;#800000&#039;, cityColors: [&#039;#FF4500&#039;, &#039;#FF6347&#039;, &#039;#FF7F50&#039;] },\\n            &#039;\\u9752\\u6d77\\u7701&#039;: { baseColor: &#039;#00CC66&#039;, capitalColor: &#039;#00994D&#039;, cityColors: [&#039;#3CB371&#039;, &#039;#66CDAA&#039;, &#039;#90EE90&#039;] },\\n            &#039;\\u5b81\\u590f\\u56de\\u65cf\\u81ea\\u6cbb\\u533a&#039;: { baseColor: &#039;#4682B4&#039;, capitalColor: &#039;#2F4F4F&#039;, cityColors: [&#039;#6495ED&#039;, &#039;#87CEEB&#039;, &#039;#B0C4DE&#039;] },\\n            &#039;\\u65b0\\u7586\\u7ef4\\u543e\\u5c14\\u81ea\\u6cbb\\u533a&#039;: { baseColor: &#039;#FF3399&#039;, capitalColor: &#039;#990066&#039;, cityColors: [&#039;#FF6699&#039;, &#039;#EE1289&#039;, &#039;#FF1493&#039;] },\\n            &#039;\\u5185\\u8499\\u53e4\\u81ea\\u6cbb\\u533a&#039;: { baseColor: &#039;#CC9900&#039;, capitalColor: &#039;#996600&#039;, cityColors: [&#039;#FFCC66&#039;, &#039;#FFDB4D&#039;, &#039;#FFE066&#039;] },\\n            &#039;\\u897f\\u85cf\\u81ea\\u6cbb\\u533a&#039;: { baseColor: &#039;#9932CC&#039;, capitalColor: &#039;#4B0082&#039;, cityColors: [&#039;#BA55D3&#039;, &#039;#CC99CC&#039;, &#039;#DDA0DD&#039;] }\\n        };\\n\\n        var capitalCities = {\\n            &#039;\\u6cb3\\u5317\\u7701&#039;: &#039;\\u77f3\\u5bb6\\u5e84\\u5e02&#039;,\\n            &#039;\\u5c71\\u897f\\u7701&#039;: &#039;\\u592a\\u539f\\u5e02&#039;,\\n            &#039;\\u8fbd\\u5b81\\u7701&#039;: &#039;\\u6c88\\u9633\\u5e02&#039;,\\n            &#039;\\u5409\\u6797\\u7701&#039;: &#039;\\u957f\\u6625\\u5e02&#039;,\\n            &#039;\\u9ed1\\u9f99\\u6c5f\\u7701&#039;: &#039;\\u54c8\\u5c14\\u6ee8\\u5e02&#039;,\\n            &#039;\\u6c5f\\u82cf\\u7701&#039;: &#039;\\u5357\\u4eac\\u5e02&#039;,\\n            &#039;\\u6d59\\u6c5f\\u7701&#039;: &#039;\\u676d\\u5dde\\u5e02&#039;,\\n            &#039;\\u5b89\\u5fbd\\u7701&#039;: &#039;\\u5408\\u80a5\\u5e02&#039;,\\n            &#039;\\u798f\\u5efa\\u7701&#039;: &#039;\\u798f\\u5dde\\u5e02&#039;,\\n            &#039;\\u6c5f\\u897f\\u7701&#039;: &#039;\\u5357\\u660c\\u5e02&#039;,\\n            &#039;\\u5c71\\u4e1c\\u7701&#039;: &#039;\\u6d4e\\u5357\\u5e02&#039;,\\n            &#039;\\u6cb3\\u5357\\u7701&#039;: &#039;\\u90d1\\u5dde\\u5e02&#039;,\\n            &#039;\\u6e56\\u5317\\u7701&#039;: &#039;\\u6b66\\u6c49\\u5e02&#039;,\\n            &#039;\\u6e56\\u5357\\u7701&#039;: &#039;\\u957f\\u6c99\\u5e02&#039;,\\n            &#039;\\u5e7f\\u4e1c\\u7701&#039;: &#039;\\u5e7f\\u5dde\\u5e02&#039;,\\n            &#039;\\u6d77\\u5357\\u7701&#039;: &#039;\\u6d77\\u53e3\\u5e02&#039;,\\n            &#039;\\u56db\\u5ddd\\u7701&#039;: &#039;\\u6210\\u90fd\\u5e02&#039;,\\n            &#039;\\u8d35\\u5dde\\u7701&#039;: &#039;\\u8d35\\u9633\\u5e02&#039;,\\n            &#039;\\u4e91\\u5357\\u7701&#039;: &#039;\\u6606\\u660e\\u5e02&#039;,\\n            &#039;\\u9655\\u897f\\u7701&#039;: &#039;\\u897f\\u5b89\\u5e02&#039;,\\n            &#039;\\u7518\\u8083\\u7701&#039;: &#039;\\u5170\\u5dde\\u5e02&#039;,\\n            &#039;\\u9752\\u6d77\\u7701&#039;: &#039;\\u897f\\u5b81\\u5e02&#039;,\\n            &#039;\\u5185\\u8499\\u53e4\\u81ea\\u6cbb\\u533a&#039;: &#039;\\u547c\\u548c\\u6d69\\u7279\\u5e02&#039;,\\n            &#039;\\u5e7f\\u897f\\u58ee\\u65cf\\u81ea\\u6cbb\\u533a&#039;: &#039;\\u5357\\u5b81\\u5e02&#039;,\\n            &#039;\\u897f\\u85cf\\u81ea\\u6cbb\\u533a&#039;: &#039;\\u62c9\\u8428\\u5e02&#039;,\\n            &#039;\\u5b81\\u590f\\u56de\\u65cf\\u81ea\\u6cbb\\u533a&#039;: &#039;\\u94f6\\u5ddd\\u5e02&#039;,\\n            &#039;\\u65b0\\u7586\\u7ef4\\u543e\\u5c14\\u81ea\\u6cbb\\u533a&#039;: &#039;\\u4e4c\\u9c81\\u6728\\u9f50\\u5e02&#039;,\\n            &#039;\\u5317\\u4eac\\u5e02&#039;: &#039;\\u4e1c\\u57ce\\u533a&#039;,\\n            &#039;\\u4e0a\\u6d77\\u5e02&#039;: &#039;\\u9ec4\\u6d66\\u533a&#039;,\\n            &#039;\\u5929\\u6d25\\u5e02&#039;: &#039;\\u548c\\u5e73\\u533a&#039;,\\n            &#039;\\u91cd\\u5e86\\u5e02&#039;: &#039;\\u6e1d\\u4e2d\\u533a&#039;\\n        };\\n\\n        function getCityColor(provinceName, cityName) {\\n            var province = provinceColors[provinceName];\\n            if (!province) return &#039;#CCCCCC&#039;;\\n            if (cityName === capitalCities[provinceName]) return province.capitalColor;\\n            return province.cityColors[Math.floor(Math.random() * province.cityColors.length)];\\n        }\\n\\n        function provinceStyle(feature) {\\n            var color = provinceColors[feature.properties.name]?.baseColor || &#039;#CCCCCC&#039;;\\n            return {\\n                fillColor: color,\\n                weight: 2,\\n                opacity: 1,\\n                color: &#039;white&#039;,\\n                dashArray: &#039;3&#039;,\\n                fillOpacity: 0.5\\n            };\\n        }\\n\\n        function cityStyle(feature) {\\n            var provinceName = getProvinceForCity(feature.properties.name);\\n            var color = getCityColor(provinceName, feature.properties.name);\\n            return {\\n                fillColor: color,\\n                weight: 1,\\n                opacity: 1,\\n                color: &#039;white&#039;,\\n                fillOpacity: 0.6\\n            };\\n        }\\n\\n        function getProvinceForCity(cityName) {\\n            for (var province in capitalCities) {\\n                if (cityName === capitalCities[province]) return province;\\n            }\\n            var cityToProvince = {};\\n            return cityToProvince[cityName] || &#039;\\u672a\\u77e5\\u7701\\u4efd&#039;;\\n        }\\n\\n        let highlightedLayer = null;\\n\\n        function highlightFeature(e) {\\n            var layer = e.target;\\n            if (layer.feature.properties.level === &#039;city&#039;) {\\n                if (highlightedLayer &amp;&amp; highlightedLayer !== layer) {\\n                    cityLayer.resetStyle(highlightedLayer);\\n                }\\n                layer.setStyle({\\n                    weight: 3,\\n                    color: &#039;#666&#039;,\\n                    fillOpacity: 0.7\\n                });\\n                layer.bringToFront();\\n                var center = layer.getBounds().getCenter();\\n                var popup = L.popup()\\n                    .setLatLng(center)\\n                    .setContent(layer.feature.properties.name)\\n                    .openOn(map);\\n                highlightedLayer = layer;\\n            }\\n        }\\n\\n        function resetHighlight(e) {\\n            var layer = e.target;\\n            if (layer.feature.properties.level === &#039;city&#039; &amp;&amp; layer === highlightedLayer) {\\n                cityLayer.resetStyle(layer);\\n                highlightedLayer = null;\\n                map.closePopup();\\n            }\\n        }\\n\\n        function zoomToFeature(e) {\\n            map.fitBounds(e.target.getBounds());\\n        }\\n\\n        function onEachFeature(feature, layer) {\\n            layer.feature.properties.level = layer.feature.properties.level || (provinceColors[feature.properties.name] ? &#039;province&#039; : &#039;city&#039;);\\n            layer.on({\\n                mouseover: highlightFeature,\\n                mouseout: resetHighlight,\\n                click: zoomToFeature\\n            });\\n        }\\n\\n        let provinceLayer, cityLayer, provinceLabels, cityLabels;\\n\\n        function addProvinceLabels() {\\n            provinceLabels = L.layerGroup().addTo(map);\\n            provinceLayer.eachLayer(function(layer) {\\n                var name = layer.feature.properties.name;\\n                if ([&#039;\\u9999\\u6e2f\\u7279\\u522b\\u884c\\u653f\\u533a&#039;, &#039;\\u6fb3\\u95e8\\u7279\\u522b\\u884c\\u653f\\u533a&#039;, &#039;\\u53f0\\u6e7e\\u7701&#039;].includes(name)) return;\\n                var center = layer.getBounds().getCenter();\\n                var label = L.marker(center, {\\n                    icon: L.divIcon({\\n                        className: &#039;province-label&#039;,\\n                        html: `&lt;span&gt;${name}&lt;\\\/span&gt;`,\\n                        iconSize: [0, 0]\\n                    })\\n                }).addTo(provinceLabels);\\n            });\\n        }\\n\\n        function addCityLabels() {\\n            cityLabels = L.layerGroup().addTo(map);\\n            cityLayer.eachLayer(function(layer) {\\n                var center = layer.getBounds().getCenter();\\n                var label = L.marker(center, {\\n                    icon: L.divIcon({\\n                        className: &#039;city-label&#039;,\\n                        html: `&lt;span&gt;${layer.feature.properties.name}&lt;\\\/span&gt;`,\\n                        iconSize: [0, 0]\\n                    })\\n                }).addTo(cityLabels);\\n            });\\n        }\\n\\n        function updateLabels() {\\n            if (document.getElementById(&#039;showLabels&#039;).checked) {\\n                if (!provinceLabels) addProvinceLabels();\\n                if (map.getZoom() &gt;= 7 &amp;&amp; !cityLabels) addCityLabels();\\n                else if (map.getZoom() &lt; 7 &amp;&amp; cityLabels) {\\n                    map.removeLayer(cityLabels);\\n                    cityLabels = null;\\n                }\\n            } else {\\n                if (provinceLabels) {\\n                    map.removeLayer(provinceLabels);\\n                    provinceLabels = null;\\n                }\\n                if (cityLabels) {\\n                    map.removeLayer(cityLabels);\\n                    cityLabels = null;\\n                }\\n            }\\n        }\\n\\n        fetch(&#039;.\\\/\\u4e2d\\u56fd_\\u7701.geojson&#039;)\\n            .then(response =&gt; {\\n                if (!response.ok) throw new Error(&#039;\\u65e0\\u6cd5\\u52a0\\u8f7d\\u7701\\u4efd GeoJSON&#039;);\\n                return response.json();\\n            })\\n            .then(data =&gt; {\\n                provinceLayer = L.geoJSON(data, {\\n                    style: provinceStyle,\\n                    onEachFeature: onEachFeature\\n                }).addTo(map);\\n                console.log(&#039;\\u7701\\u4efd\\u6570\\u636e\\u52a0\\u8f7d\\u6210\\u529f&#039;);\\n            })\\n            .catch(error =&gt; {\\n                console.error(&#039;\\u52a0\\u8f7d\\u7701\\u4efd GeoJSON \\u5931\\u8d25:&#039;, error);\\n                alert(&#039;\\u65e0\\u6cd5\\u52a0\\u8f7d\\u7701\\u4efd\\u6570\\u636e\\uff0c\\u8bf7\\u68c0\\u67e5 \\u4e2d\\u56fd_\\u7701.geojson \\u6587\\u4ef6\\u662f\\u5426\\u5728\\u540c\\u7ea7\\u76ee\\u5f55&#039;);\\n            });\\n\\n        fetch(&#039;.\\\/\\u4e2d\\u56fd_\\u5e02.geojson&#039;)\\n            .then(response =&gt; {\\n                if (!response.ok) throw new Error(&#039;\\u65e0\\u6cd5\\u52a0\\u8f7d\\u57ce\\u5e02 GeoJSON&#039;);\\n                return response.json();\\n            })\\n            .then(data =&gt; {\\n                cityLayer = L.geoJSON(data, {\\n                    style: cityStyle,\\n                    onEachFeature: onEachFeature\\n                }).addTo(map);\\n                console.log(&#039;\\u57ce\\u5e02\\u6570\\u636e\\u52a0\\u8f7d\\u6210\\u529f&#039;);\\n            })\\n            .catch(error =&gt; {\\n                console.error(&#039;\\u52a0\\u8f7d\\u57ce\\u5e02 GeoJSON \\u5931\\u8d25:&#039;, error);\\n                alert(&#039;\\u65e0\\u6cd5\\u52a0\\u8f7d\\u57ce\\u5e02\\u6570\\u636e\\uff0c\\u8bf7\\u68c0\\u67e5 \\u4e2d\\u56fd_\\u5e02.geojson \\u6587\\u4ef6\\u662f\\u5426\\u5728\\u540c\\u7ea7\\u76ee\\u5f55&#039;);\\n            });\\n\\n        document.getElementById(&#039;showLabels&#039;).addEventListener(&#039;change&#039;, updateLabels);\\n        map.on(&#039;zoomend&#039;, updateLabels);\\n\\n        const audioPlayer = document.getElementById(&#039;audioPlayer&#039;);\\n        const playPauseBtn = document.getElementById(&#039;playPause&#039;);\\n        const nextTrackBtn = document.getElementById(&#039;nextTrack&#039;);\\n        const lyricsContainer = document.getElementById(&#039;lyrics&#039;);\\n        const tracks = [&#039;msc\\\/1.webm&#039;, &#039;msc\\\/2.webm&#039;, &#039;msc\\\/3.webm&#039;, &#039;msc\\\/4.mp3&#039;];\\n        let currentTrack = 0;\\n        let isPlaying = false;\\n        let lyrics = [];\\n        let lastHighlightedIndex = -1;\\n\\n        async function loadLyrics() {\\n            if (tracks[currentTrack] === &#039;msc\\\/1.webm&#039;) {\\n                try {\\n                    const response = await fetch(&#039;msc\\\/1.lrc&#039;);\\n                    const text = await response.text();\\n                    lyrics = parseLrc(text);\\n                    displayLyrics();\\n                    lyricsContainer.style.display = &#039;block&#039;;\\n                } catch (error) {\\n                    console.error(&#039;\\u52a0\\u8f7d\\u6b4c\\u8bcd\\u5931\\u8d25:&#039;, error);\\n                    lyrics = [];\\n                    lyricsContainer.innerHTML = &#039;&#039;;\\n                    lyricsContainer.style.display = &#039;none&#039;;\\n                }\\n            } else {\\n                lyrics = [];\\n                lyricsContainer.innerHTML = &#039;&#039;;\\n                lyricsContainer.style.display = &#039;none&#039;;\\n            }\\n        }\\n\\n        function parseLrc(lrcContent) {\\n            const lines = lrcContent.split(&#039;\\\\n&#039;);\\n            const result = [];\\n            const timeRegex = \\\/\\\\[(\\\\d{2}):(\\\\d{2})\\\\.(\\\\d{2})\\\\](.*)\\\/;\\n            lines.forEach(line =&gt; {\\n                const match = line.match(timeRegex);\\n                if (match) {\\n                    const minutes = parseInt(match[1]);\\n                    const seconds = parseInt(match[2]);\\n                    const centiseconds = parseInt(match[3]);\\n                    const time = minutes * 60 + seconds + centiseconds \\\/ 100;\\n                    result.push({ time, text: match[4].trim() });\\n                }\\n            });\\n            return result.sort((a, b) =&gt; a.time - b.time);\\n        }\\n\\n        function displayLyrics() {\\n            lyricsContainer.innerHTML = lyrics.map((line, index) =&gt; \\n                `&lt;div id=\\&quot;lyric-${index}\\&quot;&gt;${line.text}&lt;\\\/div&gt;`\\n            ).join(&#039;&#039;);\\n        }\\n\\n        function updateLyrics() {\\n            if (tracks[currentTrack] !== &#039;msc\\\/1.webm&#039; || !isPlaying) return;\\n            const currentTime = audioPlayer.currentTime;\\n            let currentIndex = -1;\\n            for (let i = 0; i &lt; lyrics.length; i++) {\\n                if (currentTime &gt;= lyrics[i].time) {\\n                    currentIndex = i;\\n                } else {\\n                    break;\\n                }\\n            }\\n            if (currentIndex !== lastHighlightedIndex) {\\n                if (lastHighlightedIndex &gt;= 0) {\\n                    const lastLine = document.getElementById(`lyric-${lastHighlightedIndex}`);\\n                    if (lastLine) lastLine.classList.remove(&#039;highlight&#039;);\\n                }\\n                if (currentIndex &gt;= 0) {\\n                    const currentLine = document.getElementById(`lyric-${currentIndex}`);\\n                    if (currentLine) {\\n                        currentLine.classList.add(&#039;highlight&#039;);\\n                        currentLine.scrollIntoView({ behavior: &#039;smooth&#039;, block: &#039;center&#039; });\\n                    }\\n                }\\n                lastHighlightedIndex = currentIndex;\\n            }\\n        }\\n\\n        function togglePlayPause() {\\n            if (isPlaying) {\\n                audioPlayer.pause();\\n                playPauseBtn.textContent = &#039;\\u64ad\\u653e\\u97f3\\u4e50&#039;;\\n            } else {\\n                audioPlayer.play();\\n                playPauseBtn.textContent = &#039;\\u6682\\u505c\\u97f3\\u4e50&#039;;\\n            }\\n            isPlaying = !isPlaying;\\n            updateLyrics();\\n        }\\n\\n        function nextTrack() {\\n            currentTrack = (currentTrack + 1) % tracks.length;\\n            audioPlayer.src = tracks[currentTrack];\\n            loadLyrics();\\n            if (isPlaying) {\\n                audioPlayer.play();\\n            }\\n        }\\n\\n        playPauseBtn.addEventListener(&#039;click&#039;, togglePlayPause);\\n        nextTrackBtn.addEventListener(&#039;click&#039;, nextTrack);\\n        audioPlayer.addEventListener(&#039;ended&#039;, nextTrack);\\n        audioPlayer.addEventListener(&#039;timeupdate&#039;, updateLyrics);\\n        audioPlayer.addEventListener(&#039;play&#039;, () =&gt; loadLyrics());\\n    &lt;\\\/script&gt;\\n&lt;\\\/body&gt;\\n&lt;\\\/html&gt;&quot;,&quot;theme&quot;:&quot;twilight&quot;,&quot;codeTypo&quot;:{&quot;desktop&quot;:9,&quot;tablet&quot;:15,&quot;mobile&quot;:14},&quot;height&quot;:{&quot;desktop&quot;:&quot;300px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;align&quot;:&quot;&quot;,&quot;lineNumbers&quot;:true,&quot;clipBoard&quot;:true,&quot;wordWrap&quot;:true,&quot;width&quot;:{&quot;desktop&quot;:&quot;100%&quot;,&quot;tablet&quot;:&quot;100%&quot;,&quot;mobile&quot;:&quot;100%&quot;},&quot;padding&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;background&quot;:{&quot;color&quot;:&quot;#d3cfcf42&quot;},&quot;layout&quot;:{&quot;align&quot;:&quot;left&quot;},&quot;border&quot;:{&quot;color&quot;:&quot;#000&quot;,&quot;style&quot;:&quot;solid&quot;,&quot;width&quot;:&quot;0px&quot;},&quot;shadow&quot;:[],&quot;alignment&quot;:&quot;center&quot;,&quot;clipBoardColors&quot;:{&quot;color&quot;:&quot;#fff&quot;,&quot;bg&quot;:&quot;#00000024&quot;}}'><\/div>\r\n\r\n\t\t\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">\ud83d\udccd\u5730\u56fe\u8fb9\u754c<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u77e2\u91cf\u56fe\u6570\u636e<\/h3>\n\n\n\n<p>github\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/GaryBikini\/ChinaAdminDivisonSHP\">https:\/\/github.com\/GaryBikini\/ChinaAdminDivisonSHP<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u683c\u5f0f\u8f6c\u6362\u5de5\u5177<\/h3>\n\n\n\n<p><em>Shapefile\u5230GeoJSON\u8f6c\u6362\u5668<\/em>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/products.aspose.app\/gis\/zh\/conversion\/shapefile-to-geojson\">https:\/\/products.aspose.app\/gis\/zh\/conversion\/shapefile-to-geojson<\/a><\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">\ud83e\udde0\u7528\u5230\u7684AI\u5de5\u5177<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">html\u4ee3\u7801<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Grok\uff08<em>\u4e3b\u8981<\/em>\uff09<\/li>\n\n\n\n<li>Gemini\uff08<em>\u6b21\u8981<\/em>\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u97f3\u4e50<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ChatGPT\uff08<em>\u6b4c\u8bcd\u521b\u4f5c<\/em>\uff09<\/li>\n\n\n\n<li><a href=\"https:\/\/www.lzltool.com\/audio-lrc\">LRC\u65f6\u95f4\u8f74<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/suno.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Suno<\/a>\uff08<em>\u4eba\u58f0\u53ca\u4f34\u594f\u7684\u97f3\u9891<\/em>\uff09<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1706\" height=\"863\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/image-8.png\" alt=\"\" class=\"wp-image-3670\" srcset=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/image-8.png 1706w, https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/image-8-768x389.png 768w, https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/08\/image-8-1536x777.png 1536w\" sizes=\"auto, (max-width: 1706px) 100vw, 1706px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\uddfa\ufe0f\u6210\u54c1\u5c55\u793a \ud83d\udcd0\u8bbe\u8ba1 \u653f\u533a \u63a7\u5236\/\u6548\u679c \ud83d\udcdc\u4ee3\u7801 \ud83d\udccd\u5730\u56fe\u8fb9\u754c \u77e2\u91cf\u56fe\u6570\u636e github\uff1a \u683c\u5f0f\u8f6c\u6362\u5de5\u5177 Shap [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3669","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts\/3669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3669"}],"version-history":[{"count":14,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts\/3669\/revisions"}],"predecessor-version":[{"id":3686,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts\/3669\/revisions\/3686"}],"wp:attachment":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}