feat: complete S-52 sounding lights and arc runtime

This commit is contained in:
OpenAI Codex
2026-09-21 06:28:23 +08:00
parent bea74ddfeb
commit 89653ea4dd
4 changed files with 96 additions and 24 deletions

View File

@@ -430,6 +430,11 @@ function lightArcPoint(feature){
}
function refreshLightArcFeatures(){
if(runtimeRuleExecutor && runtimeRuleExecutor.caFeatures.length){
lightArcFeatures=runtimeRuleExecutor.caFeatures.slice();
scheduleLightArcDraw();
return;
}
if(!leftMap || !leftMap.getSource("cm95") || !leftMap.isSourceLoaded("cm95")){
lightArcFeatures=[];
scheduleLightArcDraw();
@@ -530,25 +535,37 @@ function drawCaLeg(ctx,x,y,length,degrees,bearing){
ctx.stroke();
ctx.restore();
}
function caScaleMetrics(props,coord,canvasWidth,canvasHeight){
let args=CM95S52Runtime.jsonValue(props.runtime_args_json,[]);
if(args.length<8)args=[
props.s52_arc_outline_color,numericProp(props,"s52_arc_outline_width",4),
props.s52_arc_color,numericProp(props,"s52_arc_width",1),
numericProp(props,"s52_arc_start_deg",0),numericProp(props,"s52_arc_end_deg",360),
numericProp(props,"s52_arc_radius_mm",0),numericProp(props,"s52_arc_sector_radius_mm",0)
];
return CM95S52Runtime.caScaleMetrics(args,coord,{
width:canvasWidth,height:canvasHeight,zoom:leftMap.getZoom(),pixelsPerMm:CSS_PX_PER_MM
});
}
function drawLightArcFeature(ctx,feature,bearing,width,height){
const props=feature.properties || {};
const coord=lightArcPoint(feature);
if(!coord)return;
const point=leftMap.project(coord);
const radius=numericProp(props,"s52_arc_radius_mm",0)*CSS_PX_PER_MM;
const args=CM95S52Runtime.jsonValue(props.runtime_args_json,[]);
const metrics=caScaleMetrics(props,coord,width,height);
const radius=metrics.radius;
if(radius<=0)return;
const sectorRadius=numericProp(props,"s52_arc_sector_radius_mm",0)*CSS_PX_PER_MM;
const sectorRadius=metrics.sectorRadius;
const margin=Math.max(radius,sectorRadius)+12;
if(point.x<-margin || point.x>width+margin || point.y<-margin || point.y>height+margin)return;
const start=numericProp(props,"s52_arc_start_deg",0);
let end=numericProp(props,"s52_arc_end_deg",360);
const start=args.length>=8 ? Number(args[4]) : numericProp(props,"s52_arc_start_deg",0);
let end=args.length>=8 ? Number(args[5]) : numericProp(props,"s52_arc_end_deg",360);
if(end<=start)end+=360;
const arcColor=CA_COLOR[props.s52_arc_color] || CA_COLOR.CHMGD;
const outlineColor=CA_COLOR[props.s52_arc_outline_color] || CA_COLOR.OUTLW;
const outlineWidth=numericProp(props,"s52_arc_outline_width",4);
const colorWidth=CSS_PX_PER_MM;
drawCaArc(ctx,point.x,point.y,radius,start,end,bearing,outlineColor,colorWidth+outlineWidth);
drawCaArc(ctx,point.x,point.y,radius,start,end,bearing,arcColor,colorWidth);
const arcColor=CA_COLOR[args.length>=8?args[2]:props.s52_arc_color] || CA_COLOR.CHMGD;
const outlineColor=CA_COLOR[args.length>=8?args[0]:props.s52_arc_outline_color] || CA_COLOR.OUTLW;
drawCaArc(ctx,point.x,point.y,radius,start,end,bearing,outlineColor,metrics.arcWidth+metrics.outlineWidth);
drawCaArc(ctx,point.x,point.y,radius,start,end,bearing,arcColor,metrics.arcWidth);
if(sectorRadius>0){
drawCaLeg(ctx,point.x,point.y,sectorRadius,start,bearing);
drawCaLeg(ctx,point.x,point.y,sectorRadius,end,bearing);
@@ -723,13 +740,13 @@ leftMap.on("sourcedata",function(e){
if(!e || e.sourceId!=="cm95")return;
if(debugRuntimePreview.checked)updateRuntimeSafetyContour();
if(e.isSourceLoaded){
refreshLightArcFeatures();
refreshRuntimeRuleExecutor();
refreshLightArcFeatures();
}
});
leftMap.on("idle",function(){
refreshLightArcFeatures();
refreshRuntimeRuleExecutor();
refreshLightArcFeatures();
});
leftMap.on("render",scheduleLightArcDraw);
leftMap.on("resize",scheduleLightArcDraw);