@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/atlas/browser.cjs +56 -32
- package/dist/atlas/browser.cjs.map +1 -1
- package/dist/atlas/browser.js +56 -32
- package/dist/atlas/browser.js.map +1 -1
- package/dist/index.cjs +139 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +139 -75
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -3248,18 +3248,37 @@ function depareFillExpression(ct = "DAY") {
|
|
|
3248
3248
|
resolveColor("DEPDW", ct)
|
|
3249
3249
|
];
|
|
3250
3250
|
}
|
|
3251
|
-
function
|
|
3252
|
-
|
|
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}"`,
|
|
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(["==",
|
|
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
|
-
|
|
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:
|
|
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: "
|
|
5338
|
+
s52PlRef: "TOWERS01",
|
|
5339
|
+
s57Class: "LNDMRK",
|
|
5317
5340
|
attributeKey: "CATLMK",
|
|
5318
|
-
attributeValue:
|
|
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: "
|
|
5357
|
+
s52PlRef: "CHIMNY01",
|
|
5358
|
+
s57Class: "LNDMRK",
|
|
5334
5359
|
attributeKey: "CATLMK",
|
|
5335
|
-
attributeValue:
|
|
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: "
|
|
5375
|
+
s52PlRef: "FLGSTF01",
|
|
5376
|
+
s57Class: "LNDMRK",
|
|
5351
5377
|
attributeKey: "CATLMK",
|
|
5352
|
-
attributeValue:
|
|
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: "
|
|
5396
|
+
s52PlRef: "MONUMT12",
|
|
5397
|
+
s57Class: "LNDMRK",
|
|
5371
5398
|
attributeKey: "CATLMK",
|
|
5372
|
-
attributeValue:
|
|
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: "
|
|
5415
|
+
s52PlRef: "WNDMIL12",
|
|
5416
|
+
s57Class: "LNDMRK",
|
|
5388
5417
|
attributeKey: "CATLMK",
|
|
5389
|
-
attributeValue:
|
|
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: "
|
|
5433
|
+
s52PlRef: "WIMCON11",
|
|
5434
|
+
s57Class: "LNDMRK",
|
|
5405
5435
|
attributeKey: "CATLMK",
|
|
5406
|
-
attributeValue:
|
|
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: "
|
|
5451
|
+
s52PlRef: "DOMES011",
|
|
5452
|
+
s57Class: "LNDMRK",
|
|
5422
5453
|
attributeKey: "CATLMK",
|
|
5423
|
-
attributeValue:
|
|
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: "
|
|
5470
|
+
s52PlRef: "RASCAN01",
|
|
5471
|
+
s57Class: "LNDMRK",
|
|
5439
5472
|
attributeKey: "CATLMK",
|
|
5440
|
-
attributeValue:
|
|
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: "
|
|
5488
|
+
s52PlRef: "DSHAER01",
|
|
5489
|
+
s57Class: "LNDMRK",
|
|
5456
5490
|
attributeKey: "CATLMK",
|
|
5457
|
-
attributeValue:
|
|
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: "
|
|
5473
|
-
|
|
5474
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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: "
|
|
5563
|
+
s52PlRef: "MSTCON04",
|
|
5564
|
+
s57Class: "LNDMRK",
|
|
5524
5565
|
attributeKey: "CATLMK",
|
|
5525
|
-
attributeValue:
|
|
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: "
|
|
5541
|
-
|
|
5542
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
5960
|
-
|
|
5992
|
+
["1", "CAIRNS11"],
|
|
5993
|
+
// Cairn
|
|
5994
|
+
["17", "BCNTOW01"],
|
|
5995
|
+
// Tower
|
|
5996
|
+
["20", "BCNTOW01"]
|
|
5961
5997
|
// Spire → tower
|
|
5962
|
-
|
|
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
|
-
"
|
|
6106
|
-
|
|
6107
|
-
|
|
6108
|
-
|
|
6109
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
9760
|
-
const
|
|
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
|
-
|
|
10720
|
+
layer.filter = LABEL_ANCHOR_FILTER;
|
|
10657
10721
|
}
|
|
10658
10722
|
return layer;
|
|
10659
10723
|
}
|