# 原始碼與圖資重建 公開專案:https://github.com/icemiku-AS/circle-taiwan 本次部署的對應原始碼:/source-code.tar.gz 授權:/license.txt 與 /data-notes.txt GitHub 完整下載已含圖資。 若使用網站的 source-code.tar.gz,先以 tar -xzf source-code.tar.gz 解到空目錄。 將下列 JavaScript 存為 restore-data.mjs,置於解開後的根目錄: ```js import assert from 'node:assert/strict'; import { readFile, writeFile } from 'node:fs/promises'; import { createHash } from 'node:crypto'; import { gunzipSync } from 'node:zlib'; const base = new URL(process.argv[2]); const sha = bytes => createHash('sha256').update(bytes).digest('hex'); const geography = JSON.parse(await readFile('data/manifest.json', 'utf8')); const basemap = JSON.parse(await readFile('data/basemap-manifest.json', 'utf8')); const display = JSON.parse(await readFile('data/display-tiles/manifest.json', 'utf8')); const inputs = [ ['taiwan.json', 'source-data/taiwan.json.gz.bin', geography.outputSha256, true], ['basemap.json.gz', 'source-data/basemap.json.gz.bin', basemap.vectorsSha256], ['terrain.bin.gz', 'source-data/terrain.bin.gz.bin', basemap.terrainFileSha256] ]; for (const tile of [...display.levels, ...(display.terrain?.levels || [])].flatMap(level => level.tiles)) { assert.match(tile.file, /^(terrain-)?[0-9]+-[12]-[0-9]+-[0-9]+\.webp$/); assert.match(tile.sha256, /^[a-f0-9]{64}$/); inputs.push(['display-tiles/' + tile.file, 'assets/blobs/' + tile.sha256 + '.bin', tile.sha256]); } for (const [file, url, hash, compressed] of inputs) { const response = await fetch(new URL(url, base)); assert.ok(response.ok, '下載失敗:' + file); const body = Buffer.from(await response.arrayBuffer()); const bytes = compressed ? gunzipSync(body) : body; assert.equal(sha(bytes), hash, '雜湊不符:' + file); await writeFile('data/' + file, bytes); } console.log('圖資還原完成'); ``` 執行 node restore-data.mjs https://提供此來源包的網站/,逐檔核對雜湊後還原。 接著執行 npm install、npm start。 正式計分使用原始向量;顯示圖塊僅用於地形、道路與水系。