fix: register S-52 sprite images after style load

This commit is contained in:
OpenAI Codex
2026-09-21 21:11:34 +08:00
parent 0e7770c284
commit 5217082034

View File

@@ -651,6 +651,43 @@ let referenceStyleTemplate=null;
let s52StyleTemplate=null;
let activeLeftStyleTemplate=null;
let activeRightStyleTemplate=null;
let s52SpriteAtlasPromise=null;
async function loadS52SpriteAtlas(){
if(s52SpriteAtlasPromise)return s52SpriteAtlasPromise;
s52SpriteAtlasPromise=(async function(){
const metaResponse=await fetch('/s52/sprite.json?v=current-release',{cache:'no-store'});
if(!metaResponse.ok)throw new Error('S-52 sprite JSON HTTP '+metaResponse.status);
const metadata=await metaResponse.json();
const image=await new Promise(function(resolve,reject){
const img=new Image();
img.onload=function(){resolve(img);};
img.onerror=function(){reject(new Error('S-52 sprite PNG load failed'));};
img.src='/s52/sprite.png?v=current-release';
});
return {metadata:metadata,image:image};
})();
return s52SpriteAtlasPromise;
}
async function ensureS52SpriteImages(map){
const atlas=await loadS52SpriteAtlas();
const canvas=document.createElement('canvas');
const ctx=canvas.getContext('2d',{willReadFrequently:true});
let added=0;
for(const [name,meta] of Object.entries(atlas.metadata)){
if(map.hasImage(name))continue;
const width=Number(meta.width)||0, height=Number(meta.height)||0;
if(width<=0||height<=0)continue;
canvas.width=width; canvas.height=height;
ctx.clearRect(0,0,width,height);
ctx.drawImage(atlas.image,Number(meta.x)||0,Number(meta.y)||0,width,height,0,0,width,height);
const pixels=ctx.getImageData(0,0,width,height);
map.addImage(name,pixels,{pixelRatio:Number(meta.pixelRatio)||1});
added++;
}
return added;
}
function sanitizeReferenceStyle(raw){
const style=JSON.parse(JSON.stringify(raw));
@@ -742,15 +779,22 @@ async function loadComparisonStyles(){
}
}
leftMap.on("style.load",function(){
leftMap.on("style.load",async function(){
const sources=Object.keys((leftMap.getStyle() || {}).sources || {});
if(sources.includes("cm95")){
try{
await ensureS52SpriteImages(leftMap);
}catch(err){
console.error(err);
setState(leftState,"S-52 sprite 注册失败:"+(err.message||err),"err");
}
installRuntimePreviewLayers(leftMap);
setState(leftState,"当前 Production / S-52 style" + (debugRuntimePreview.checked ? " + runtime preview" : ""),"ok");
}else if(sources.includes("navsea_delivery")){
setState(leftState,"当前 Production / extentfix style","ok");
}
applyDebugStyles();
refreshRuntimeRuleExecutor();
refreshLightArcFeatures();
});
rightMap.on("style.load",applyDebugStyles);