feat: complete S-52 sounding lights and arc runtime
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user