@chrtco/sdk 0.7.5 → 0.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -3248,18 +3248,37 @@ function depareFillExpression(ct = "DAY") {
3248
3248
  resolveColor("DEPDW", ct)
3249
3249
  ];
3250
3250
  }
3251
- function colourCodeCase(cases, fallback) {
3252
- const colourStr = ["to-string", ["coalesce", ["get", "COLOUR"], ["get", "colour"], ""]];
3251
+ function listAttrString(attr) {
3252
+ return ["to-string", ["coalesce", ["get", attr], ["get", attr.toLowerCase()], ""]];
3253
+ }
3254
+ function listAttrCase(attr, cases, fallback) {
3255
+ const attrStr = listAttrString(attr);
3253
3256
  const expr = ["case"];
3254
3257
  for (const [code, value] of cases) {
3255
- expr.push([">=", ["index-of", `"${code}"`, colourStr], 0], value);
3258
+ expr.push([">=", ["index-of", `"${code}"`, attrStr], 0], value);
3259
+ }
3260
+ for (const [code, value] of cases) {
3261
+ expr.push(["==", attrStr, code], value);
3256
3262
  }
3257
3263
  for (const [code, value] of cases) {
3258
- expr.push(["==", colourStr, code], value);
3264
+ expr.push(["==", attrStr, `[${code}]`], value);
3259
3265
  }
3260
3266
  expr.push(fallback);
3261
3267
  return expr;
3262
3268
  }
3269
+ function listAttrHas(attr, codes) {
3270
+ const attrStr = listAttrString(attr);
3271
+ const clauses = [];
3272
+ for (const code of codes) {
3273
+ clauses.push([">=", ["index-of", `"${code}"`, attrStr], 0]);
3274
+ clauses.push(["==", attrStr, code]);
3275
+ clauses.push(["==", attrStr, `[${code}]`]);
3276
+ }
3277
+ return ["any", ...clauses];
3278
+ }
3279
+ function colourCodeCase(cases, fallback) {
3280
+ return listAttrCase("COLOUR", cases, fallback);
3281
+ }
3263
3282
  function lightColor(props, ct = "DAY") {
3264
3283
  const raw = props.COLOUR ?? props.colour;
3265
3284
  const code = Array.isArray(raw) ? Number(raw[0]) : typeof raw === "string" && raw.startsWith("[") ? Number(JSON.parse(raw)[0]) : Number(raw ?? 0);
@@ -5296,9 +5315,12 @@ var NAUTICAL_SYMBOLS = [
5296
5315
  getSvg: landmarkSpire,
5297
5316
  group: "landmarks",
5298
5317
  description: "Church spire or steeple, conspicuous from seaward. Useful for visual fixing.",
5299
- s52PlRef: "LNDMRK17",
5318
+ // CATLMK 20 alone has no dedicated PL symbol (renders POSGEN01/03); church spires carry
5319
+ // FUNCTN 20/21 and render as the religious-building symbol BUIREL01 (BUIREL13 when conspicuous)
5320
+ s52PlRef: "BUIREL01",
5321
+ s57Class: "LNDMRK",
5300
5322
  attributeKey: "CATLMK",
5301
- attributeValue: 17,
5323
+ attributeValue: 20,
5302
5324
  renderSize: "32x32",
5303
5325
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Spire, building, position circle" }],
5304
5326
  lineStyles: [{ element: "Building outline", width: 0.8, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5313,9 +5335,11 @@ var NAUTICAL_SYMBOLS = [
5313
5335
  getSvg: landmarkTower,
5314
5336
  group: "landmarks",
5315
5337
  description: "Tower conspicuous from seaward. General-purpose landmark symbol.",
5316
- s52PlRef: "LNDMRK20",
5338
+ s52PlRef: "TOWERS01",
5339
+ s57Class: "LNDMRK",
5317
5340
  attributeKey: "CATLMK",
5318
- attributeValue: 20,
5341
+ attributeValue: 17,
5342
+ // TOWERS03 = conspicuous variant
5319
5343
  renderSize: "32x32",
5320
5344
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Tower body, cap, position circle" }],
5321
5345
  lineStyles: [{ element: "Tower outline", width: 0.8, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5330,9 +5354,10 @@ var NAUTICAL_SYMBOLS = [
5330
5354
  getSvg: landmarkChimney,
5331
5355
  group: "landmarks",
5332
5356
  description: "Industrial chimney or smokestack visible from the sea.",
5333
- s52PlRef: "LNDMRK01",
5357
+ s52PlRef: "CHIMNY01",
5358
+ s57Class: "LNDMRK",
5334
5359
  attributeKey: "CATLMK",
5335
- attributeValue: 1,
5360
+ attributeValue: 3,
5336
5361
  renderSize: "32x32",
5337
5362
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Chimney body, smoke, position circle" }],
5338
5363
  lineStyles: [{ element: "Body outline", width: 0.8, color: "#000000" }, { element: "Smoke plume", width: 1, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5347,9 +5372,10 @@ var NAUTICAL_SYMBOLS = [
5347
5372
  getSvg: landmarkFlagstaff,
5348
5373
  group: "landmarks",
5349
5374
  description: "Flagstaff or flagpole conspicuous from seaward.",
5350
- s52PlRef: "LNDMRK03",
5375
+ s52PlRef: "FLGSTF01",
5376
+ s57Class: "LNDMRK",
5351
5377
  attributeKey: "CATLMK",
5352
- attributeValue: 3,
5378
+ attributeValue: 5,
5353
5379
  renderSize: "32x32",
5354
5380
  colors: [
5355
5381
  { token: "CHBLK", hex: "#000000", usage: "Pole and position circle" },
@@ -5367,9 +5393,11 @@ var NAUTICAL_SYMBOLS = [
5367
5393
  getSvg: landmarkMonument,
5368
5394
  group: "landmarks",
5369
5395
  description: "Monument or memorial conspicuous from the sea.",
5370
- s52PlRef: "LNDMRK05",
5396
+ s52PlRef: "MONUMT12",
5397
+ s57Class: "LNDMRK",
5371
5398
  attributeKey: "CATLMK",
5372
- attributeValue: 5,
5399
+ attributeValue: 9,
5400
+ // MONUMT02 = non-conspicuous variant
5373
5401
  renderSize: "32x32",
5374
5402
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Monument body, base, position circle" }],
5375
5403
  lineStyles: [{ element: "Body outline", width: 0.8, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5384,9 +5412,10 @@ var NAUTICAL_SYMBOLS = [
5384
5412
  getSvg: landmarkWindmill,
5385
5413
  group: "landmarks",
5386
5414
  description: "Traditional windmill with rotating vanes. Conspicuous landmark.",
5387
- s52PlRef: "LNDMRK21",
5415
+ s52PlRef: "WNDMIL12",
5416
+ s57Class: "LNDMRK",
5388
5417
  attributeKey: "CATLMK",
5389
- attributeValue: 7,
5418
+ attributeValue: 18,
5390
5419
  renderSize: "32x32",
5391
5420
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Tower, vanes, hub, position circle" }],
5392
5421
  lineStyles: [{ element: "Tower", width: 1.5, color: "#000000" }, { element: "Vane arms", width: 1.2, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5401,9 +5430,10 @@ var NAUTICAL_SYMBOLS = [
5401
5430
  getSvg: landmarkWindTurbine,
5402
5431
  group: "landmarks",
5403
5432
  description: "Modern 3-blade wind turbine. Increasingly common offshore landmark.",
5404
- s52PlRef: "LNDMRK22",
5433
+ s52PlRef: "WIMCON11",
5434
+ s57Class: "LNDMRK",
5405
5435
  attributeKey: "CATLMK",
5406
- attributeValue: 26,
5436
+ attributeValue: 19,
5407
5437
  renderSize: "32x32",
5408
5438
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Tower, blades, hub, position circle" }],
5409
5439
  lineStyles: [{ element: "Tower", width: 1.5, color: "#000000" }, { element: "Blades", width: 1.2, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5418,9 +5448,11 @@ var NAUTICAL_SYMBOLS = [
5418
5448
  getSvg: landmarkDome,
5419
5449
  group: "landmarks",
5420
5450
  description: "Dome or cupola (e.g., observatory, mosque) visible from the sea.",
5421
- s52PlRef: "LNDMRK03",
5451
+ s52PlRef: "DOMES011",
5452
+ s57Class: "LNDMRK",
5422
5453
  attributeKey: "CATLMK",
5423
- attributeValue: 6,
5454
+ attributeValue: 15,
5455
+ // DOMES001 = non-conspicuous variant
5424
5456
  renderSize: "32x32",
5425
5457
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Dome, base, position circle" }],
5426
5458
  lineStyles: [{ element: "Base outline", width: 0.8, color: "#000000" }, { element: "Dome curve", width: 0.8, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5435,9 +5467,10 @@ var NAUTICAL_SYMBOLS = [
5435
5467
  getSvg: landmarkRadarScanner,
5436
5468
  group: "landmarks",
5437
5469
  description: "Radar scanner antenna conspicuous from seaward.",
5438
- s52PlRef: "LNDMRK12",
5470
+ s52PlRef: "RASCAN01",
5471
+ s57Class: "LNDMRK",
5439
5472
  attributeKey: "CATLMK",
5440
- attributeValue: 9,
5473
+ attributeValue: 16,
5441
5474
  renderSize: "32x32",
5442
5475
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Tower, scanner dish, position circle" }],
5443
5476
  lineStyles: [{ element: "Tower", width: 1.5, color: "#000000" }, { element: "Scanner frame", width: 1.5, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5452,9 +5485,10 @@ var NAUTICAL_SYMBOLS = [
5452
5485
  getSvg: landmarkDishAerial,
5453
5486
  group: "landmarks",
5454
5487
  description: "Satellite dish or parabolic antenna visible from the sea.",
5455
- s52PlRef: "LNDMRK12",
5488
+ s52PlRef: "DSHAER01",
5489
+ s57Class: "LNDMRK",
5456
5490
  attributeKey: "CATLMK",
5457
- attributeValue: 12,
5491
+ attributeValue: 4,
5458
5492
  renderSize: "32x32",
5459
5493
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Tower, dish, position circle" }],
5460
5494
  lineStyles: [{ element: "Tower", width: 1.5, color: "#000000" }, { element: "Dish curve", width: 1.5, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5469,9 +5503,10 @@ var NAUTICAL_SYMBOLS = [
5469
5503
  getSvg: landmarkWaterTower,
5470
5504
  group: "landmarks",
5471
5505
  description: "Water tower. Elevated tank on supporting structure, conspicuous landmark.",
5472
- s52PlRef: "LNDMRK19",
5473
- attributeKey: "CATLMK",
5474
- attributeValue: 15,
5506
+ s52PlRef: "TOWERS12",
5507
+ s57Class: "SILTNK",
5508
+ attributeKey: "CATSIL",
5509
+ attributeValue: 4,
5475
5510
  renderSize: "32x32",
5476
5511
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Tank, legs, position circle" }],
5477
5512
  lineStyles: [{ element: "Leg outlines", width: 1.2, color: "#000000" }, { element: "Tank outline", width: 0.8, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5486,9 +5521,11 @@ var NAUTICAL_SYMBOLS = [
5486
5521
  getSvg: landmarkRadioTvMast,
5487
5522
  group: "landmarks",
5488
5523
  description: "Radio or television transmission mast with horizontal cross-arms.",
5489
- s52PlRef: "LNDMRK10",
5524
+ // Radio/TV masts are CATLMK 7 (mast) + FUNCTN in S-57, so both mast entries share MSTCON04
5525
+ s52PlRef: "MSTCON04",
5526
+ s57Class: "LNDMRK",
5490
5527
  attributeKey: "CATLMK",
5491
- attributeValue: 8,
5528
+ attributeValue: 7,
5492
5529
  renderSize: "32x32",
5493
5530
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Mast, cross-arms, top, position circle" }],
5494
5531
  lineStyles: [{ element: "Main mast", width: 1.5, color: "#000000" }, { element: "Cross-arms", width: 0.8, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5503,9 +5540,12 @@ var NAUTICAL_SYMBOLS = [
5503
5540
  getSvg: landmarkCross,
5504
5541
  group: "landmarks",
5505
5542
  description: "Religious cross or calvary conspicuous from seaward.",
5506
- s52PlRef: "LNDMRK05",
5543
+ // The PL has no dedicated symbol for CATLMK 14 (cross/calvary) — S-52 falls back to the
5544
+ // generic position symbol POSGEN01 (POSGEN03 when conspicuous)
5545
+ s52PlRef: "POSGEN01",
5546
+ s57Class: "LNDMRK",
5507
5547
  attributeKey: "CATLMK",
5508
- attributeValue: 10,
5548
+ attributeValue: 14,
5509
5549
  renderSize: "32x32",
5510
5550
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Cross arms and position circle" }],
5511
5551
  lineStyles: [{ element: "Vertical arm", width: 2, color: "#000000" }, { element: "Horizontal arm", width: 2, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5520,9 +5560,11 @@ var NAUTICAL_SYMBOLS = [
5520
5560
  getSvg: landmarkMast,
5521
5561
  group: "landmarks",
5522
5562
  description: "General mast (not radio/TV). Pole with spherical top.",
5523
- s52PlRef: "LNDMRK10",
5563
+ s52PlRef: "MSTCON04",
5564
+ s57Class: "LNDMRK",
5524
5565
  attributeKey: "CATLMK",
5525
- attributeValue: 14,
5566
+ attributeValue: 7,
5567
+ // MSTCON14 = conspicuous variant
5526
5568
  renderSize: "32x32",
5527
5569
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Mast pole, top ball, position circle" }],
5528
5570
  lineStyles: [{ element: "Mast pole", width: 2, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5537,9 +5579,10 @@ var NAUTICAL_SYMBOLS = [
5537
5579
  getSvg: landmarkSilo,
5538
5580
  group: "landmarks",
5539
5581
  description: "Silo, grain elevator, or storage tank conspicuous from the sea.",
5540
- s52PlRef: "LNDMRK17",
5541
- attributeKey: "CATLMK",
5542
- attributeValue: 33,
5582
+ s52PlRef: "SILBUI01",
5583
+ s57Class: "SILTNK",
5584
+ attributeKey: "CATSIL",
5585
+ attributeValue: 1,
5543
5586
  renderSize: "32x32",
5544
5587
  colors: [{ token: "CHBLK", hex: "#000000", usage: "Body, dome top, position circle" }],
5545
5588
  lineStyles: [{ element: "Body outline", width: 0.8, color: "#000000" }, { element: "Dome curve", width: 0.8, color: "#000000" }, { element: "Position circle", width: 0.6, pattern: "2, 2", color: "#000000" }],
@@ -5941,27 +5984,18 @@ function getIconExpression(layerName) {
5941
5984
  ];
5942
5985
  }
5943
5986
  if (layerName === "LNDMRK") {
5944
- return [
5945
- "match",
5946
- ["coalesce", ["get", "CATLMK"], ["get", "catlmk"], 0],
5947
- 1,
5948
- "CAIRNS11",
5949
- // Cairn
5950
- 17,
5951
- "BCNTOW01",
5952
- // Tower
5953
- 18,
5954
- "LNDMRK18",
5987
+ return listAttrCase("CATLMK", [
5988
+ ["18", "LNDMRK18"],
5955
5989
  // Windmill (4-vane)
5956
- 19,
5957
- "LNDMRK19",
5990
+ ["19", "LNDMRK19"],
5958
5991
  // Wind motor / turbine (3-blade)
5959
- 20,
5960
- "BCNTOW01",
5992
+ ["1", "CAIRNS11"],
5993
+ // Cairn
5994
+ ["17", "BCNTOW01"],
5995
+ // Tower
5996
+ ["20", "BCNTOW01"]
5961
5997
  // Spire → tower
5962
- "BCNTOW01"
5963
- // Default: tower
5964
- ];
5998
+ ], "BCNTOW01");
5965
5999
  }
5966
6000
  if (layerName === "DAYMAR") {
5967
6001
  return [
@@ -6101,18 +6135,12 @@ function getIconExpression(layerName) {
6101
6135
  ];
6102
6136
  }
6103
6137
  if (layerName === "LIGHTS") {
6104
- return [
6105
- "match",
6106
- ["coalesce", ["get", "CATLIT"], ["get", "catlit"], 0],
6107
- 8,
6108
- "LIGHTS82",
6109
- // Aero light
6110
- 9,
6111
- "LIGHTS82",
6112
- // Air obstruction light
6113
- "LIGHTS11"
6114
- // Default: major light
6115
- ];
6138
+ return listAttrCase("CATLIT", [
6139
+ ["8", "LIGHTS82"],
6140
+ // Floodlight
6141
+ ["9", "LIGHTS82"]
6142
+ // Strip light
6143
+ ], "LIGHTS11");
6116
6144
  }
6117
6145
  return SYMBOL_MAP[layerName] ?? "";
6118
6146
  }
@@ -6804,6 +6832,11 @@ var LABEL_BEHAVIOR = {
6804
6832
  function getLabelBehavior(layerName) {
6805
6833
  return LABEL_BEHAVIOR[layerName] ?? "feature-band-gated";
6806
6834
  }
6835
+ var LABEL_ANCHOR_FILTER = [
6836
+ "!=",
6837
+ ["get", "_label_anchor"],
6838
+ false
6839
+ ];
6807
6840
  function getLabelConfig(layerName, opts = {}) {
6808
6841
  const ct = opts.colorTable ?? "DAY";
6809
6842
  switch (layerName) {
@@ -7595,6 +7628,18 @@ function preprocessSoundings(fc) {
7595
7628
  }
7596
7629
  return { type: "FeatureCollection", features };
7597
7630
  }
7631
+ function firstListCode(raw) {
7632
+ if (raw == null) return NaN;
7633
+ if (Array.isArray(raw)) return Number(raw[0]);
7634
+ if (typeof raw === "string" && raw.startsWith("[")) {
7635
+ try {
7636
+ const arr = JSON.parse(raw);
7637
+ if (Array.isArray(arr)) return Number(arr[0]);
7638
+ } catch {
7639
+ }
7640
+ }
7641
+ return Number(raw);
7642
+ }
7598
7643
  function preprocessLights(fc) {
7599
7644
  return {
7600
7645
  type: "FeatureCollection",
@@ -7603,7 +7648,7 @@ function preprocessLights(fc) {
7603
7648
  const parts = [];
7604
7649
  const litchr = Number(props.LITCHR);
7605
7650
  if (litchr && LITCHR_ABBR[litchr]) parts.push(LITCHR_ABBR[litchr]);
7606
- const colour = Number(props.COLOUR);
7651
+ const colour = firstListCode(props.COLOUR);
7607
7652
  if (colour && COLOUR_ABBR[colour]) parts.push(COLOUR_ABBR[colour]);
7608
7653
  const sigper = Number(props.SIGPER);
7609
7654
  if (sigper && sigper > 0) parts.push(sigper + "s");
@@ -7677,7 +7722,7 @@ function preprocessNavAids(fc) {
7677
7722
  const match = objnam.match(/(\d+[A-Z]?)\s*$/);
7678
7723
  if (!match) return f;
7679
7724
  const designation = match[1];
7680
- const colourCode = Number(props.COLOUR);
7725
+ const colourCode = firstListCode(props.COLOUR);
7681
7726
  const prefix = NAV_COLOUR_PREFIX[colourCode];
7682
7727
  const label = prefix ? `${prefix} "${designation}"` : `"${designation}"`;
7683
7728
  return {
@@ -8246,6 +8291,18 @@ var S101_FEATURES = [
8246
8291
  isNewInS101: false,
8247
8292
  attributes: ["categoryOfLandmark", "function", "visuallyConspicuous"]
8248
8293
  },
8294
+ {
8295
+ featureClass: "SiloStorageTank",
8296
+ name: "Silo / Storage Tank",
8297
+ s57Equivalent: "SILTNK",
8298
+ section: "E",
8299
+ group: "landmarks",
8300
+ category: "geo",
8301
+ description: "An enclosed structure for storing bulk solids or liquids (silo, grain elevator, water tower, tank). Often conspicuous and useful for position fixing.",
8302
+ portrayalRef: "SILTNK_S101",
8303
+ isNewInS101: false,
8304
+ attributes: ["categoryOfSiloTank", "colour", "visuallyConspicuous"]
8305
+ },
8249
8306
  // ── Section D: Bridges ──
8250
8307
  {
8251
8308
  featureClass: "Bridge",
@@ -9756,23 +9813,30 @@ function buildLayersForClass(objectClass, ct, sourceId = DEFAULT_REGION) {
9756
9813
  }
9757
9814
  if (objectClass === "LNDMRK" && resolved.type === "symbol") {
9758
9815
  const baseFilterParts = layer.filter && layer.filter[0] === "all" ? layer.filter.slice(1) : layer.filter ? [layer.filter] : [];
9759
- const catlmk = ["coalesce", ["get", "CATLMK"], ["get", "catlmk"], 0];
9760
- const isWind = ["any", ["==", catlmk, 18], ["==", catlmk, 19]];
9761
- const isLighthouse = ["==", catlmk, 17];
9816
+ const isWind = listAttrHas("CATLMK", ["18", "19"]);
9817
+ const isLighthouse = listAttrHas("CATLMK", ["17"]);
9762
9818
  const scaminFloor = scaminToMinZoom(entry?.scamin);
9763
9819
  const windLayer = {
9764
9820
  ...layer,
9765
9821
  id: `s52-${objectClass}-wind-symbol`,
9766
- filter: ["all", ...baseFilterParts, isWind]
9822
+ filter: ["all", ...baseFilterParts, isWind],
9823
+ // Explicit, not inherited: turbines share exact coordinates with
9824
+ // their aviation-light LIGHTS feature; without allow-overlap the
9825
+ // turbine icon loses collision to the LIGHTS flare and vanishes.
9826
+ // (The value currently also arrives via the entry-layout
9827
+ // spread-last chain, but that chain is fragile — see s52-lookup
9828
+ // LNDMRK entry — so the intent is pinned here.)
9829
+ layout: { ...layer.layout ?? {}, "icon-allow-overlap": true }
9767
9830
  };
9768
9831
  delete windLayer.minzoom;
9769
9832
  const lighthouseLayer = {
9770
9833
  ...layer,
9771
9834
  id: `s52-${objectClass}-lighthouse-symbol`,
9772
- filter: ["all", ...baseFilterParts, isLighthouse],
9835
+ filter: ["all", ...baseFilterParts, isLighthouse, ["!", isWind]],
9773
9836
  layout: {
9774
9837
  ...layer.layout ?? {},
9775
- "icon-image": "LIGHTHOUSE01"
9838
+ "icon-image": "LIGHTHOUSE01",
9839
+ "icon-allow-overlap": true
9776
9840
  }
9777
9841
  };
9778
9842
  delete lighthouseLayer.minzoom;
@@ -10653,7 +10717,7 @@ function buildLabelLayer2(objectClass, ct, sourceId = DEFAULT_REGION, depthUnits
10653
10717
  delete layer.filter;
10654
10718
  }
10655
10719
  if (getLabelBehavior(objectClass) === "orientation-cross-band") {
10656
- delete layer.filter;
10720
+ layer.filter = LABEL_ANCHOR_FILTER;
10657
10721
  }
10658
10722
  return layer;
10659
10723
  }