{ "_readme": [ "驾驶舱部署配置模板。用法:复制成同目录的 config.json 再按环境填写 —— config.json 不入库(见根 .gitignore)。", "分层覆盖顺序(后者覆盖前者):内置默认 → 构建期 VITE_COCKPIT_* → 本文件 → 宿主注入的 globalThis.__COCKPIT_CONFIG__。", "启用本文件(默认不探测,免得每页刷 404):宿主页加一行 window.__COCKPIT_CONFIG_URL__ = 'auto',或构建期设 VITE_COCKPIT_CONFIG_URL=auto(也可以给绝对 URL 从后端拉)。", "dataSource 默认 mock:只有显式写 real 才会请求真实后端,mock 与真接口走同一个适配层(services/cockpitApi.js)。", "api.token / ws.token 是给开发与联调用的只读令牌;生产环境应由网关/反向代理在转发时补 Authorization 头,这里留空即可。", "本项目优先用内网离线数据:底图默认 natural-earth(Cesium 自带离线影像,无需账号/外网/密钥)。在线源(tianditu 需 tk、arcgis-imagery 免 key)只作为可选项。", "map.basemap.source 取值:none(不配底图)/ natural-earth(离线,推荐)/ xyz(任意 {z}/{x}/{y} 模板,本地或自建瓦片)/ tianditu(需 tk)/ arcgis-imagery(在线,免 key)。", "map.terrain.url 指向量化网格 DEM 目录(内含 layer.json);map.overlays[] 叠本地精细影像(TMS 用 {reverseY},bounds 填数据实际范围)。", "map.tilesets[] 是 3D Tiles / 倾斜摄影入口,每项一个 tileset.json 的 URL(没有根 tileset.json 的数据先别填;详见 docs/cockpit-deployment.md)。可选 maximumScreenSpaceError 控制几何误差,maximumDistance 控制批次距离剔除,loadDistance 控制批次懒加载距离,eager=false 可避免启动时初始化该批次;模型量大时优先拆成带 viewerRequestVolume 的小瓦片,远景粗模应与精模共用 GIS 足印,避免用道路填充模型代替建筑位置;运行时按距离加载并串行等待内容处理。", "map.ui.debug 控制界面形态:null(默认)= 跟随构建模式(开发构建显示诊断信息、生产构建自动收敛成干净形态);写 true 可在生产包里临时打开诊断读数。", "map.viewMode.pipeline 可调管线视图的倾角/距离系数/地形与模型的半透明程度。", "map.primaryArea.bounds 是主场景区矩形 [西, 南, 东, 北](度),与 map.overlays[].bounds 同口径;顺序必须自己写好(west altitudeFullM**,写反等于关掉这层保护(配置层会报 issue,但不替你改值)。altitudeSlewMs 是这层收口的**时间限速**,保证雾不会「一瞬间产生或消失」(返回全球时相机 range 跨 1.6e6 倍,不加限速就会跳变)。enabled=false 可整级关掉这层效果(限位不受影响)。", "map.grade 是一张图整幅调色(科技蓝滤镜):常驻全屏处理级,在雾之后执行(雾出的白也被统一成冷蓝调)。saturation/brightness/contrast 是色彩学三系数(1 = 原样),tint 是 #rrggbb 目标色调、tintStrength 是阴影向它混合的上限(实际权重随暗部加深,高光几乎不动)。刻意**不做** hue-rotate 双色:状态点的红/绿是第一线索,色相顺序不能动。enabled=false 可整级关掉;脏值一律退回代码默认。", "map.handover 是粗→精影像交接:全球/引导态隐藏精细影像,进区后等雾形成保护且瓦片可显示才渐显,返回反向交接(影像先收、雾后撤)。fadeMs 是渐显/收起时长(现为 380 ms:雾是距离雾、盖不住屏幕中心的脚下街区,渐显期间中心是「粗糙底图(陆地偏绿)↔ 精细影像」的混合,窗口越长那段绿越明显,故调短);minEdgeOcclusion 是相机到影像边处要求的雾遮蔽率(0–1,与 map.fog 的距离端点同源);requireTilesLoaded=false 可放宽『等瓦片』这一条。enabled=false 则精细层常显(回到交接之前的行为)。绝不承诺『边缘已被遮住』,那段观感请在真实画面上验收。", "map.locate.point/device 可覆盖完整定位视角的 heading/pitch/range(米);缺省点位 0/-55/500、设备 0/-55/150。设备档供后续设备联动票消费。", "map.cesium.enabled=false 可以让中央一张图退回临时影像兜底;map.cesium.baseUrl 只在把 Cesium 静态资源放到别处时才填(需绝对 URL)。", "ws.url 供票 15 的状态推送使用。" ], "version": 1, "dataSource": "mock", "api": { "baseUrl": "", "token": "" }, "ws": { "url": "", "token": "" }, "map": { "basemap": { "source": "natural-earth", "url": "", "subdomains": [], "minimumLevel": null, "maximumLevel": null, "credit": "" }, "tianditu": { "token": "", "layer": "img" }, "terrain": { "url": "", "requestVertexNormals": true }, "overlays": [], "tilesets": [], "overlap": { "maxFan": 10 }, "locate": { "point": { "heading": 0, "pitch": -55, "range": 500 }, "device": { "heading": 0, "pitch": -55, "range": 150 } }, "primaryArea": { "bounds": [110.328749941417, 28.3917230659234, 110.465779226663, 28.4913038992907] }, "fog": { "enabled": true, "startDistance": 18000, "endDistance": 42000, "color": "#bdcdd6", "fadeInMs": 800, "fadeOutMs": 400, "altitudeFullM": 20000, "altitudeZeroM": 42000, "altitudeSlewMs": 400 }, "handover": { "enabled": true, "fadeMs": 380, "minEdgeOcclusion": 0.9, "requireTilesLoaded": true }, "grade": { "enabled": true, "saturation": 0.82, "brightness": 0.96, "contrast": 1.08, "tint": "#2fa8ff", "tintStrength": 0.18 }, "ui": { "debug": null }, "cesium": { "enabled": true, "baseUrl": "" } } }