fix: register S-52 sprite images after style load
This commit is contained in:
@@ -651,6 +651,43 @@ let referenceStyleTemplate=null;
|
|||||||
let s52StyleTemplate=null;
|
let s52StyleTemplate=null;
|
||||||
let activeLeftStyleTemplate=null;
|
let activeLeftStyleTemplate=null;
|
||||||
let activeRightStyleTemplate=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){
|
function sanitizeReferenceStyle(raw){
|
||||||
const style=JSON.parse(JSON.stringify(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 || {});
|
const sources=Object.keys((leftMap.getStyle() || {}).sources || {});
|
||||||
if(sources.includes("cm95")){
|
if(sources.includes("cm95")){
|
||||||
|
try{
|
||||||
|
await ensureS52SpriteImages(leftMap);
|
||||||
|
}catch(err){
|
||||||
|
console.error(err);
|
||||||
|
setState(leftState,"S-52 sprite 注册失败:"+(err.message||err),"err");
|
||||||
|
}
|
||||||
installRuntimePreviewLayers(leftMap);
|
installRuntimePreviewLayers(leftMap);
|
||||||
setState(leftState,"当前 Production / S-52 style" + (debugRuntimePreview.checked ? " + runtime preview" : ""),"ok");
|
setState(leftState,"当前 Production / S-52 style" + (debugRuntimePreview.checked ? " + runtime preview" : ""),"ok");
|
||||||
}else if(sources.includes("navsea_delivery")){
|
}else if(sources.includes("navsea_delivery")){
|
||||||
setState(leftState,"当前 Production / extentfix style","ok");
|
setState(leftState,"当前 Production / extentfix style","ok");
|
||||||
}
|
}
|
||||||
applyDebugStyles();
|
applyDebugStyles();
|
||||||
|
refreshRuntimeRuleExecutor();
|
||||||
refreshLightArcFeatures();
|
refreshLightArcFeatures();
|
||||||
});
|
});
|
||||||
rightMap.on("style.load",applyDebugStyles);
|
rightMap.on("style.load",applyDebugStyles);
|
||||||
|
|||||||
Reference in New Issue
Block a user