@tileflow/maps 0.1.0-alpha.18 → 0.1.0-alpha.19

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.js CHANGED
@@ -556,22 +556,43 @@ var baedekerPathLabel = {
556
556
  ])
557
557
  }
558
558
  };
559
- function landcoverPattern(target, pattern, classes, options = {}) {
560
- const classSelector = {
561
- field: "class",
562
- kind: "in",
563
- values: classes
564
- };
565
- const selector = options.subclasses ? {
566
- kind: "all",
567
- selectors: [classSelector, { field: "subclass", kind: "in", values: options.subclasses }]
568
- } : classSelector;
559
+ function groundClass(...classes) {
560
+ return { field: "class", kind: "in", values: classes };
561
+ }
562
+ var gardenGround = {
563
+ kind: "all",
564
+ selectors: [
565
+ groundClass("garden"),
566
+ { kind: "not", selector: { field: "type", kind: "in", values: ["flowerbed"] } }
567
+ ]
568
+ };
569
+ var urbanParkGround = {
570
+ kind: "any",
571
+ selectors: [
572
+ {
573
+ kind: "all",
574
+ selectors: [
575
+ groundClass("park"),
576
+ {
577
+ kind: "not",
578
+ selector: {
579
+ field: "type",
580
+ kind: "in",
581
+ values: ["recreation_ground", "village_green", "zoo"]
582
+ }
583
+ }
584
+ ]
585
+ },
586
+ gardenGround
587
+ ]
588
+ };
589
+ function landcoverPattern(target, pattern, ground, options = {}) {
569
590
  const minZoom = options.minZoom ?? 9;
570
591
  return renderPass({
571
592
  placement: { above: target },
572
- feature: "landcover",
593
+ feature: options.feature ?? "landuse",
573
594
  renderer: "fill",
574
- selector,
595
+ selector: ground,
575
596
  style: {
576
597
  minZoom,
577
598
  opacity: zoom.linear([
@@ -625,8 +646,6 @@ var baedekerTheme = defineOfficialTheme({
625
646
  },
626
647
  buildings: {
627
648
  active: baedekerPalette.buildingActive,
628
- businessCorridor: baedekerPalette.building,
629
- businessCorridorOutline: baedekerPalette.buildingOutline,
630
649
  civic: "#C77659",
631
650
  commercial: "#C97E60",
632
651
  destination: baedekerPalette.buildingActive,
@@ -675,6 +694,8 @@ var baedekerTheme = defineOfficialTheme({
675
694
  wood: baedekerPalette.wood
676
695
  },
677
696
  landuse: {
697
+ activity: baedekerPalette.building,
698
+ activityOutline: baedekerPalette.buildingOutline,
678
699
  cemetery: "#D0D0B5",
679
700
  civic: "#E2D2BB",
680
701
  commercial: "#E3D0BB",
@@ -842,10 +863,6 @@ var baedeker = bindOfficialMapTheme(
842
863
  }),
843
864
  buildings: withRenderStack(
844
865
  buildings({
845
- businessCorridor: {
846
- fill: { visible: false },
847
- outline: { visible: false }
848
- },
849
866
  flat: {
850
867
  fill: {
851
868
  color: baedekerPalette.building,
@@ -1060,6 +1077,10 @@ var baedeker = bindOfficialMapTheme(
1060
1077
  }),
1061
1078
  land: withRenderStack(
1062
1079
  land({
1080
+ activityAreas: {
1081
+ fill: { visible: false },
1082
+ outline: { visible: false }
1083
+ },
1063
1084
  background: { opacity: 1, pattern: "baedeker-paper-grain" },
1064
1085
  globalLandcover: {
1065
1086
  color: expr.match(
@@ -1148,43 +1169,43 @@ var baedeker = bindOfficialMapTheme(
1148
1169
  rockHachures: landcoverPattern(
1149
1170
  "land.landcover.rock.fill",
1150
1171
  "baedeker-hachures",
1151
- ["rock"],
1172
+ groundClass("rock"),
1152
1173
  { minZoom: 8, opacity: 0.44 }
1153
1174
  ),
1154
1175
  scrubHachures: landcoverPattern(
1155
1176
  "land.landcover.scrub.fill",
1156
1177
  "baedeker-hachures",
1157
- ["grass"],
1158
- { minZoom: 9, opacity: 0.34, subclasses: ["scrub"] }
1178
+ groundClass("scrub"),
1179
+ { minZoom: 9, opacity: 0.34 }
1159
1180
  ),
1160
1181
  orchardTexture: landcoverPattern(
1161
1182
  "land.landcover.urbanPark.fill",
1162
1183
  "baedeker-orchard",
1163
- ["grass"],
1164
- { minZoom: 11, opacity: 0.58, subclasses: ["garden", "orchard"] }
1184
+ gardenGround,
1185
+ { minZoom: 11, opacity: 0.58 }
1165
1186
  ),
1166
1187
  sandTexture: landcoverPattern(
1167
1188
  "land.landcover.sand.fill",
1168
1189
  "baedeker-sand",
1169
- ["sand", "beach"],
1190
+ groundClass("sand"),
1170
1191
  { minZoom: 9, opacity: 0.48 }
1171
1192
  ),
1172
1193
  wetlandTexture: landcoverPattern(
1173
1194
  "land.landcover.wetland.fill",
1174
1195
  "baedeker-wetland",
1175
- ["wetland"],
1176
- { minZoom: 9, opacity: 0.56 }
1196
+ groundClass("wetland"),
1197
+ { feature: "landuseOverlay", minZoom: 9, opacity: 0.56 }
1177
1198
  ),
1178
1199
  parkStipple: landcoverPattern(
1179
1200
  "land.landcover.urbanPark.fill",
1180
1201
  "baedeker-park-stipple",
1181
- ["grass"],
1182
- { minZoom: 10, opacity: 0.74, subclasses: ["park", "garden"] }
1202
+ urbanParkGround,
1203
+ { minZoom: 10, opacity: 0.74 }
1183
1204
  ),
1184
1205
  woodStipple: landcoverPattern(
1185
1206
  "land.landcover.wood.fill",
1186
1207
  "baedeker-park-stipple",
1187
- ["wood", "forest"],
1208
+ groundClass("wood"),
1188
1209
  { minZoom: 9, opacity: 0.5 }
1189
1210
  ),
1190
1211
  residentialTexture: landusePattern(
@@ -1580,14 +1601,7 @@ var baedeker = bindOfficialMapTheme(
1580
1601
  placement: { above: "water.bodies.fill" },
1581
1602
  feature: "water",
1582
1603
  renderer: "fill",
1583
- selector: {
1584
- coerce: "number",
1585
- fallback: 0,
1586
- field: "intermittent",
1587
- kind: "compare",
1588
- operator: "ne",
1589
- value: 1
1590
- },
1604
+ selector: { field: "intermittent", kind: "compare", operator: "ne", value: true },
1591
1605
  style: {
1592
1606
  minZoom: 7,
1593
1607
  opacity: zoom.linear([
@@ -1602,14 +1616,7 @@ var baedeker = bindOfficialMapTheme(
1602
1616
  placement: { above: "water.intermittent.bodies.fill" },
1603
1617
  feature: "water",
1604
1618
  renderer: "fill",
1605
- selector: {
1606
- coerce: "number",
1607
- fallback: 0,
1608
- field: "intermittent",
1609
- kind: "compare",
1610
- operator: "eq",
1611
- value: 1
1612
- },
1619
+ selector: { field: "intermittent", kind: "compare", operator: "eq", value: true },
1613
1620
  style: {
1614
1621
  minZoom: 9,
1615
1622
  opacity: 0.36,
@@ -1792,8 +1799,8 @@ var blueprintPrimaryPoiLabel = {
1792
1799
  opacity: 0.68
1793
1800
  }
1794
1801
  };
1795
- var blueprintPoiFilterRank = expr2.toNumber(expr2.get(field2("poiFilterRank")), 6);
1796
- var blueprintPoiSizeRank = expr2.toNumber(expr2.get(field2("poiSizeRank")), 17);
1802
+ var blueprintPoiFilterRank = expr2.toNumber(expr2.get(field2("filterrank")), 6);
1803
+ var blueprintPoiSizeRank = expr2.toNumber(expr2.get(field2("sizerank")), 17);
1797
1804
  var blueprintPoiPlacementPriority = expr2.add(
1798
1805
  expr2.multiply(blueprintPoiFilterRank, 17),
1799
1806
  blueprintPoiSizeRank
@@ -1801,7 +1808,7 @@ var blueprintPoiPlacementPriority = expr2.add(
1801
1808
  var blueprintPoiCalloutName = expr2.coalesce(
1802
1809
  expr2.get(field2("name")),
1803
1810
  expr2.get(field2("nameLatin")),
1804
- expr2.get(field2("nameEnglish")),
1811
+ expr2.get(field2("nameEn")),
1805
1812
  ""
1806
1813
  );
1807
1814
  var prominentBuildingSelector = {
@@ -1834,7 +1841,7 @@ var prominentBuildingSelector = {
1834
1841
  selectors: [
1835
1842
  {
1836
1843
  fallback: "",
1837
- field: "buildingTone",
1844
+ field: "tone",
1838
1845
  kind: "compare",
1839
1846
  operator: "eq",
1840
1847
  value: "destination"
@@ -1844,14 +1851,14 @@ var prominentBuildingSelector = {
1844
1851
  selectors: [
1845
1852
  {
1846
1853
  fallback: "",
1847
- field: "buildingTone",
1854
+ field: "tone",
1848
1855
  kind: "in",
1849
1856
  values: ["active", "commercial"]
1850
1857
  },
1851
1858
  {
1852
1859
  coerce: "number",
1853
1860
  fallback: 0,
1854
- field: "renderHeight",
1861
+ field: "height",
1855
1862
  kind: "compare",
1856
1863
  operator: "gte",
1857
1864
  value: 24
@@ -1866,10 +1873,10 @@ var prominentBuildingSelector = {
1866
1873
  }
1867
1874
  ]
1868
1875
  };
1869
- function technicalLandPattern(target, feature, pattern, selector, minZoom, opacity) {
1876
+ function technicalLandPattern(target, pattern, selector, minZoom, opacity) {
1870
1877
  return renderPass2({
1871
1878
  placement: { above: target },
1872
- feature,
1879
+ feature: "landuse",
1873
1880
  renderer: "fill",
1874
1881
  selector,
1875
1882
  style: {
@@ -1909,8 +1916,6 @@ var blueprintTheme = defineOfficialTheme({
1909
1916
  },
1910
1917
  buildings: {
1911
1918
  active: blueprintPalette.buildingInk,
1912
- businessCorridor: blueprintPalette.building,
1913
- businessCorridorOutline: blueprintPalette.buildingMuted,
1914
1919
  civic: blueprintPalette.buildingInk,
1915
1920
  commercial: blueprintPalette.building,
1916
1921
  destination: blueprintPalette.buildingInk,
@@ -1959,6 +1964,8 @@ var blueprintTheme = defineOfficialTheme({
1959
1964
  wood: blueprintPalette.park
1960
1965
  },
1961
1966
  landuse: {
1967
+ activity: blueprintPalette.building,
1968
+ activityOutline: blueprintPalette.buildingMuted,
1962
1969
  cemetery: blueprintPalette.landDetail,
1963
1970
  civic: blueprintPalette.landDetail,
1964
1971
  commercial: blueprintPalette.landDetail,
@@ -2176,10 +2183,6 @@ var blueprint = bindOfficialMapTheme(
2176
2183
  }),
2177
2184
  buildings: withRenderStack2(
2178
2185
  buildings2({
2179
- businessCorridor: {
2180
- fill: { visible: false },
2181
- outline: { visible: false }
2182
- },
2183
2186
  flat: {
2184
2187
  fill: {
2185
2188
  color: blueprintPalette.building,
@@ -2274,11 +2277,11 @@ var blueprint = bindOfficialMapTheme(
2274
2277
  kind: "all",
2275
2278
  selectors: [
2276
2279
  prominentBuildingSelector,
2277
- { field: "renderHeight", kind: "has" },
2280
+ { field: "height", kind: "has" },
2278
2281
  {
2279
2282
  coerce: "number",
2280
2283
  fallback: 0,
2281
- field: "renderHeight",
2284
+ field: "height",
2282
2285
  kind: "compare",
2283
2286
  operator: "gte",
2284
2287
  value: 24
@@ -2294,7 +2297,7 @@ var blueprint = bindOfficialMapTheme(
2294
2297
  color: blueprintPalette.annotation,
2295
2298
  field: expr2.concat(
2296
2299
  "H \u2248 ",
2297
- expr2.toString(expr2.toNumber(expr2.get(field2("renderHeight")), 0)),
2300
+ expr2.toString(expr2.toNumber(expr2.get(field2("height")), 0)),
2298
2301
  " M"
2299
2302
  ),
2300
2303
  font: "Noto Sans Regular",
@@ -2515,6 +2518,10 @@ var blueprint = bindOfficialMapTheme(
2515
2518
  }),
2516
2519
  land: withRenderStack2(
2517
2520
  land2({
2521
+ activityAreas: {
2522
+ fill: { visible: false },
2523
+ outline: { visible: false }
2524
+ },
2518
2525
  background: { opacity: 1, pattern: "blueprint-grid" },
2519
2526
  globalLandcover: {
2520
2527
  color: expr2.match(
@@ -2650,36 +2657,56 @@ var blueprint = bindOfficialMapTheme(
2650
2657
  {
2651
2658
  landscapeHatch: technicalLandPattern(
2652
2659
  "land.landcover.wood.fill",
2653
- "landcover",
2654
2660
  "blueprint-landscape-hatch",
2655
2661
  {
2656
2662
  fallback: "",
2657
2663
  field: "class",
2658
2664
  kind: "in",
2659
- values: ["wood", "forest"]
2665
+ values: ["wood"]
2660
2666
  },
2661
2667
  11,
2662
2668
  0.2
2663
2669
  ),
2664
2670
  parkHatch: technicalLandPattern(
2665
2671
  "land.landcover.urbanPark.fill",
2666
- "landcover",
2667
2672
  "blueprint-landscape-hatch",
2673
+ // The parks and gardens the land module draws as urban parks.
2668
2674
  {
2669
- kind: "all",
2675
+ kind: "any",
2670
2676
  selectors: [
2671
2677
  {
2672
- fallback: "",
2673
- field: "class",
2674
- kind: "compare",
2675
- operator: "eq",
2676
- value: "grass"
2678
+ kind: "all",
2679
+ selectors: [
2680
+ { fallback: "", field: "class", kind: "compare", operator: "eq", value: "park" },
2681
+ {
2682
+ kind: "not",
2683
+ selector: {
2684
+ fallback: "",
2685
+ field: "type",
2686
+ kind: "in",
2687
+ values: ["recreation_ground", "village_green", "zoo"]
2688
+ }
2689
+ }
2690
+ ]
2677
2691
  },
2678
2692
  {
2679
- fallback: "",
2680
- field: "subclass",
2681
- kind: "in",
2682
- values: ["park", "garden"]
2693
+ kind: "all",
2694
+ selectors: [
2695
+ {
2696
+ fallback: "",
2697
+ field: "class",
2698
+ kind: "compare",
2699
+ operator: "eq",
2700
+ value: "garden"
2701
+ },
2702
+ {
2703
+ fallback: "",
2704
+ field: "type",
2705
+ kind: "compare",
2706
+ operator: "ne",
2707
+ value: "flowerbed"
2708
+ }
2709
+ ]
2683
2710
  }
2684
2711
  ]
2685
2712
  },
@@ -2688,20 +2715,25 @@ var blueprint = bindOfficialMapTheme(
2688
2715
  ),
2689
2716
  recreationHatch: technicalLandPattern(
2690
2717
  "land.landuse.recreation.fill",
2691
- "landuse",
2692
2718
  "blueprint-landscape-hatch",
2693
2719
  {
2694
- fallback: "",
2695
- field: "class",
2696
- kind: "in",
2697
- values: ["pitch", "track", "playground", "zoo"]
2720
+ kind: "any",
2721
+ selectors: [
2722
+ { fallback: "", field: "class", kind: "in", values: ["pitch", "playground"] },
2723
+ {
2724
+ kind: "all",
2725
+ selectors: [
2726
+ { fallback: "", field: "class", kind: "compare", operator: "eq", value: "park" },
2727
+ { fallback: "", field: "type", kind: "compare", operator: "eq", value: "zoo" }
2728
+ ]
2729
+ }
2730
+ ]
2698
2731
  },
2699
2732
  12,
2700
2733
  0.16
2701
2734
  ),
2702
2735
  industrialHatch: technicalLandPattern(
2703
2736
  "land.landuse.industrial.fill",
2704
- "landuse",
2705
2737
  "blueprint-building-hatch",
2706
2738
  {
2707
2739
  fallback: "",
@@ -2830,7 +2862,7 @@ var blueprint = bindOfficialMapTheme(
2830
2862
  architecturalCallouts: renderPass2({
2831
2863
  // Above every POI label: the first category listed is the top POI layer.
2832
2864
  placement: { above: "poi.transport.label" },
2833
- feature: "poi",
2865
+ feature: "poiLabel",
2834
2866
  renderer: "symbol",
2835
2867
  selector: {
2836
2868
  kind: "all",
@@ -2838,7 +2870,7 @@ var blueprint = bindOfficialMapTheme(
2838
2870
  { geometry: "point", kind: "geometry" },
2839
2871
  {
2840
2872
  fallback: "",
2841
- field: "poiCategory",
2873
+ field: "class",
2842
2874
  kind: "compare",
2843
2875
  operator: "eq",
2844
2876
  value: "landmark"
@@ -2848,14 +2880,14 @@ var blueprint = bindOfficialMapTheme(
2848
2880
  selectors: [
2849
2881
  { field: "name", kind: "has" },
2850
2882
  { field: "nameLatin", kind: "has" },
2851
- { field: "nameEnglish", kind: "has" }
2883
+ { field: "nameEn", kind: "has" }
2852
2884
  ]
2853
2885
  },
2854
- { field: "poiFilterRank", kind: "has" },
2886
+ { field: "filterrank", kind: "has" },
2855
2887
  {
2856
2888
  coerce: "number",
2857
2889
  fallback: 6,
2858
- field: "poiFilterRank",
2890
+ field: "filterrank",
2859
2891
  kind: "compare",
2860
2892
  operator: "gte",
2861
2893
  value: 0
@@ -2863,16 +2895,16 @@ var blueprint = bindOfficialMapTheme(
2863
2895
  {
2864
2896
  coerce: "number",
2865
2897
  fallback: 6,
2866
- field: "poiFilterRank",
2898
+ field: "filterrank",
2867
2899
  kind: "compare",
2868
2900
  operator: "lte",
2869
2901
  value: 1
2870
2902
  },
2871
- { field: "poiSizeRank", kind: "has" },
2903
+ { field: "sizerank", kind: "has" },
2872
2904
  {
2873
2905
  coerce: "number",
2874
2906
  fallback: 17,
2875
- field: "poiSizeRank",
2907
+ field: "sizerank",
2876
2908
  kind: "compare",
2877
2909
  operator: "gte",
2878
2910
  value: 0
@@ -2880,7 +2912,7 @@ var blueprint = bindOfficialMapTheme(
2880
2912
  {
2881
2913
  coerce: "number",
2882
2914
  fallback: 17,
2883
- field: "poiSizeRank",
2915
+ field: "sizerank",
2884
2916
  kind: "compare",
2885
2917
  operator: "lte",
2886
2918
  value: 8
@@ -3114,14 +3146,14 @@ var blueprint = bindOfficialMapTheme(
3114
3146
  },
3115
3147
  {
3116
3148
  fallback: "",
3117
- field: "brunnel",
3149
+ field: "structure",
3118
3150
  kind: "compare",
3119
3151
  operator: "ne",
3120
3152
  value: "bridge"
3121
3153
  },
3122
3154
  {
3123
3155
  fallback: "",
3124
- field: "brunnel",
3156
+ field: "structure",
3125
3157
  kind: "compare",
3126
3158
  operator: "ne",
3127
3159
  value: "tunnel"
@@ -3312,14 +3344,7 @@ var blueprint = bindOfficialMapTheme(
3312
3344
  placement: { above: "water.bodies.fill" },
3313
3345
  feature: "water",
3314
3346
  renderer: "fill",
3315
- selector: {
3316
- coerce: "number",
3317
- fallback: 0,
3318
- field: "intermittent",
3319
- kind: "compare",
3320
- operator: "ne",
3321
- value: 1
3322
- },
3347
+ selector: { field: "intermittent", kind: "compare", operator: "ne", value: true },
3323
3348
  style: {
3324
3349
  minZoom: 7,
3325
3350
  opacity: zoom2.linear([
@@ -3334,14 +3359,7 @@ var blueprint = bindOfficialMapTheme(
3334
3359
  placement: { above: "water.intermittent.bodies.fill" },
3335
3360
  feature: "water",
3336
3361
  renderer: "fill",
3337
- selector: {
3338
- coerce: "number",
3339
- fallback: 0,
3340
- field: "intermittent",
3341
- kind: "compare",
3342
- operator: "eq",
3343
- value: 1
3344
- },
3362
+ selector: { field: "intermittent", kind: "compare", operator: "eq", value: true },
3345
3363
  style: {
3346
3364
  minZoom: 9,
3347
3365
  opacity: 0.2,
@@ -3492,7 +3510,7 @@ function streetName(minZoom, major = false) {
3492
3510
  function destination(image2, minZoom, color, featured = false, role = "caption") {
3493
3511
  const park = role === "park";
3494
3512
  const station = role === "station";
3495
- const principalPark = expr3.lte(expr3.toNumber(expr3.get(field3("poiSizeRank")), 16), 4);
3513
+ const principalPark = expr3.lte(expr3.toNumber(expr3.get(field3("sizerank")), 16), 4);
3496
3514
  return {
3497
3515
  minZoom,
3498
3516
  icon: {
@@ -3532,9 +3550,9 @@ function destination(image2, minZoom, color, featured = false, role = "caption")
3532
3550
  }
3533
3551
  };
3534
3552
  }
3535
- function texture(above, feature, selector, pattern, minZoom, opacity) {
3553
+ function texture(above, selector, pattern, minZoom, opacity) {
3536
3554
  return renderPass3({
3537
- feature,
3555
+ feature: "landuse",
3538
3556
  placement: { above },
3539
3557
  renderer: "fill",
3540
3558
  selector,
@@ -3548,7 +3566,7 @@ function texture(above, feature, selector, pattern, minZoom, opacity) {
3548
3566
  }
3549
3567
  });
3550
3568
  }
3551
- var buildingTone = expr3.coalesce(expr3.get(field3("buildingTone")), "generic");
3569
+ var buildingTone = expr3.coalesce(expr3.get(field3("tone")), "generic");
3552
3570
  var buildingColor = expr3.match(
3553
3571
  buildingTone,
3554
3572
  [
@@ -3607,7 +3625,7 @@ var destinationSchedule = {
3607
3625
  },
3608
3626
  {
3609
3627
  kind: "compare",
3610
- field: "poiFilterRank",
3628
+ field: "filterrank",
3611
3629
  coerce: "number",
3612
3630
  fallback: 6,
3613
3631
  operator: "lte",
@@ -3751,6 +3769,7 @@ var civica = bindOfficialMapTheme(
3751
3769
  modules: {
3752
3770
  land: withRenderStack3(
3753
3771
  land3({
3772
+ activityAreas: { fill: { visible: false }, outline: { visible: false } },
3754
3773
  background: { color: ink.paper },
3755
3774
  globalLandcover: {
3756
3775
  minZoom: 0,
@@ -3819,12 +3838,31 @@ var civica = bindOfficialMapTheme(
3819
3838
  {
3820
3839
  parkGroves: texture(
3821
3840
  "land.landcover.urbanPark.fill",
3822
- "landcover",
3841
+ // The parks and gardens the land module draws as urban parks.
3823
3842
  {
3824
- kind: "all",
3843
+ kind: "any",
3825
3844
  selectors: [
3826
- { kind: "in", field: "class", values: ["grass"] },
3827
- { kind: "in", field: "subclass", values: ["park", "garden", "orchard"] }
3845
+ {
3846
+ kind: "all",
3847
+ selectors: [
3848
+ { kind: "in", field: "class", values: ["park"] },
3849
+ {
3850
+ kind: "not",
3851
+ selector: {
3852
+ kind: "in",
3853
+ field: "type",
3854
+ values: ["recreation_ground", "village_green", "zoo"]
3855
+ }
3856
+ }
3857
+ ]
3858
+ },
3859
+ {
3860
+ kind: "all",
3861
+ selectors: [
3862
+ { kind: "in", field: "class", values: ["garden"] },
3863
+ { kind: "not", selector: { kind: "in", field: "type", values: ["flowerbed"] } }
3864
+ ]
3865
+ }
3828
3866
  ]
3829
3867
  },
3830
3868
  "civica-park-groves",
@@ -3833,23 +3871,20 @@ var civica = bindOfficialMapTheme(
3833
3871
  ),
3834
3872
  woodlandGroves: texture(
3835
3873
  "land.landcover.wood.fill",
3836
- "landcover",
3837
- { kind: "in", field: "class", values: ["wood", "forest"] },
3874
+ { kind: "in", field: "class", values: ["wood"] },
3838
3875
  "civica-park-groves",
3839
3876
  19,
3840
3877
  0.18
3841
3878
  ),
3842
3879
  orchardRows: texture(
3843
3880
  "land.landcover.grass.fill",
3844
- "landcover",
3845
- { kind: "in", field: "subclass", values: ["orchard", "vineyard"] },
3881
+ { kind: "in", field: "class", values: ["orchard", "vineyard"] },
3846
3882
  "civica-orchard",
3847
3883
  19,
3848
3884
  0.2
3849
3885
  ),
3850
3886
  industrialHatch: texture(
3851
3887
  "land.landuse.industrial.fill",
3852
- "landuse",
3853
3888
  { kind: "in", field: "class", values: ["industrial"] },
3854
3889
  "civica-industrial-hatch",
3855
3890
  20,
@@ -3924,7 +3959,6 @@ var civica = bindOfficialMapTheme(
3924
3959
  buildings: withRenderStack3(
3925
3960
  buildings3({
3926
3961
  mode: "flat",
3927
- businessCorridor: { fill: { visible: false }, outline: { visible: false } },
3928
3962
  flat: {
3929
3963
  fill: {
3930
3964
  color: buildingColor,
@@ -4278,12 +4312,12 @@ var civica = bindOfficialMapTheme(
4278
4312
  selector: {
4279
4313
  kind: "all",
4280
4314
  selectors: [
4281
- { kind: "in", field: "poiCategory", values: [category] },
4282
- { kind: "has", field: "poiFilterRank" },
4283
- { kind: "has", field: "poiSizeRank" },
4315
+ { kind: "in", field: "class", values: [category] },
4316
+ { kind: "has", field: "filterrank" },
4317
+ { kind: "has", field: "sizerank" },
4284
4318
  {
4285
4319
  kind: "compare",
4286
- field: "poiFilterRank",
4320
+ field: "filterrank",
4287
4321
  coerce: "number",
4288
4322
  fallback: 6,
4289
4323
  operator: "lte",
@@ -4297,7 +4331,7 @@ var civica = bindOfficialMapTheme(
4297
4331
  },
4298
4332
  {
4299
4333
  kind: "compare",
4300
- field: "poiFilterRank",
4334
+ field: "filterrank",
4301
4335
  coerce: "number",
4302
4336
  fallback: -1,
4303
4337
  operator: "gte",
@@ -4305,7 +4339,7 @@ var civica = bindOfficialMapTheme(
4305
4339
  },
4306
4340
  {
4307
4341
  kind: "compare",
4308
- field: "poiSizeRank",
4342
+ field: "sizerank",
4309
4343
  coerce: "number",
4310
4344
  fallback: -1,
4311
4345
  operator: "gte",
@@ -4313,7 +4347,7 @@ var civica = bindOfficialMapTheme(
4313
4347
  },
4314
4348
  {
4315
4349
  kind: "compare",
4316
- field: "poiSizeRank",
4350
+ field: "sizerank",
4317
4351
  coerce: "number",
4318
4352
  fallback: 17,
4319
4353
  operator: "lte",
@@ -4330,14 +4364,14 @@ var civica = bindOfficialMapTheme(
4330
4364
  selectors: [
4331
4365
  {
4332
4366
  kind: "compare",
4333
- field: "poiFilterRank",
4367
+ field: "filterrank",
4334
4368
  coerce: "number",
4335
4369
  operator: "lte",
4336
4370
  value: 1
4337
4371
  },
4338
4372
  {
4339
4373
  kind: "compare",
4340
- field: "poiSizeRank",
4374
+ field: "sizerank",
4341
4375
  coerce: "number",
4342
4376
  operator: "lt",
4343
4377
  value: 16
@@ -4350,7 +4384,7 @@ var civica = bindOfficialMapTheme(
4350
4384
  ...category === "transport" ? [
4351
4385
  {
4352
4386
  kind: "not",
4353
- selector: { kind: "in", field: "poiType", values: ["airport"] }
4387
+ selector: { kind: "in", field: "type", values: ["airport"] }
4354
4388
  },
4355
4389
  {
4356
4390
  kind: "step",
@@ -4358,7 +4392,7 @@ var civica = bindOfficialMapTheme(
4358
4392
  kind: "not",
4359
4393
  selector: {
4360
4394
  kind: "in",
4361
- field: "poiType",
4395
+ field: "type",
4362
4396
  values: ["public_transit_facility"]
4363
4397
  }
4364
4398
  },
@@ -4499,6 +4533,61 @@ import {
4499
4533
  withRenderStack as withRenderStack4,
4500
4534
  zoom as zoom4
4501
4535
  } from "@tileflow/core";
4536
+
4537
+ // src/official/world-roads.ts
4538
+ var worldRoadClasses = {
4539
+ motorway: ["motorway"],
4540
+ trunk: ["trunk"],
4541
+ primary: ["primary"],
4542
+ secondary: ["secondary"],
4543
+ tertiary: ["tertiary"],
4544
+ minor: ["street"],
4545
+ service: ["service", "busway"],
4546
+ track: ["track", "raceway"],
4547
+ pathway: ["path"],
4548
+ footway: ["path"],
4549
+ cycleway: ["path"],
4550
+ steps: ["path"],
4551
+ pedestrian: ["pedestrian"]
4552
+ };
4553
+ var worldConstructionTypes = {
4554
+ motorway: ["motorway", "motorway_link"],
4555
+ trunk: ["trunk", "trunk_link"],
4556
+ primary: ["primary", "primary_link"],
4557
+ secondary: ["secondary", "secondary_link"],
4558
+ tertiary: ["tertiary", "tertiary_link"],
4559
+ minor: ["street", "residential", "unclassified", "living_street", "road"],
4560
+ service: ["service", "busway"],
4561
+ track: ["track", "raceway"],
4562
+ pathway: ["path", "bridleway", "corridor"],
4563
+ footway: ["footway"],
4564
+ cycleway: ["cycleway"],
4565
+ steps: ["steps"],
4566
+ pedestrian: ["pedestrian"]
4567
+ };
4568
+ function worldConstructionSelector(...roadClasses) {
4569
+ return {
4570
+ kind: "all",
4571
+ selectors: [
4572
+ { kind: "compare", field: "class", operator: "eq", value: "construction" },
4573
+ {
4574
+ kind: "in",
4575
+ field: "type",
4576
+ values: [...new Set(roadClasses.flatMap((roadClass) => worldConstructionTypes[roadClass]))]
4577
+ }
4578
+ ]
4579
+ };
4580
+ }
4581
+ function worldRoadSelector(roadClasses, options = {}) {
4582
+ const inService = {
4583
+ kind: "in",
4584
+ field: "class",
4585
+ values: [...new Set(roadClasses.flatMap((roadClass) => worldRoadClasses[roadClass]))]
4586
+ };
4587
+ return options.construction ? { kind: "any", selectors: [inService, worldConstructionSelector(...roadClasses)] } : inService;
4588
+ }
4589
+
4590
+ // src/official/map-1777-roads.ts
4502
4591
  var majorWidths = [
4503
4592
  [3, 0.8],
4504
4593
  [12, 3.2],
@@ -4570,11 +4659,6 @@ var carriageways = [
4570
4659
  "service",
4571
4660
  "track"
4572
4661
  ];
4573
- var aliases = {
4574
- minor: ["residential", "unclassified"],
4575
- service: ["busway", "bus_guideway"],
4576
- track: ["raceway"]
4577
- };
4578
4662
  var restrictedAccess = expr4.all(
4579
4663
  expr4.has(field4("access")),
4580
4664
  expr4.not(
@@ -4590,17 +4674,18 @@ var restrictedAccess = expr4.all(
4590
4674
  )
4591
4675
  )
4592
4676
  );
4593
- function roadSelector(classes, structure, extra = []) {
4677
+ function roadSelector(roads7, structure, extra = []) {
4594
4678
  return {
4595
4679
  kind: "all",
4596
4680
  selectors: [
4597
4681
  { kind: "geometry", geometry: "line" },
4598
- { kind: "in", field: "class", values: classes },
4599
- structure === "bridge" ? { kind: "compare", field: "brunnel", operator: "eq", value: "bridge" } : { kind: "not", selector: { kind: "in", field: "brunnel", values: ["bridge", "tunnel"] } },
4682
+ roads7,
4683
+ structure === "bridge" ? { kind: "compare", field: "structure", operator: "eq", value: "bridge" } : { kind: "not", selector: { kind: "in", field: "structure", values: ["bridge", "tunnel"] } },
4600
4684
  ...extra
4601
4685
  ]
4602
4686
  };
4603
4687
  }
4688
+ var link = { kind: "compare", field: "link", operator: "eq", value: true };
4604
4689
  function withMap1777RoadDetail(module, stack) {
4605
4690
  const detail = {};
4606
4691
  for (const roadClass of carriageways) {
@@ -4614,11 +4699,8 @@ function withMap1777RoadDetail(module, stack) {
4614
4699
  [
4615
4700
  // Preserve the domain's first-match width rules, including service ways.
4616
4701
  { when: restrictedAccess, value: base },
4617
- {
4618
- when: expr4.eq(expr4.toNumber(expr4.get(field4("expressway")), 0), 1),
4619
- value: base * 1.06
4620
- },
4621
- { when: expr4.eq(expr4.get(field4("ramp")), 1), value: base * 0.72 },
4702
+ { when: expr4.eq(expr4.get(field4("expressway")), true), value: base * 1.06 },
4703
+ { when: expr4.eq(expr4.get(field4("link")), true), value: base * 0.72 },
4622
4704
  ...roadClass === "service" ? Object.entries({
4623
4705
  alley: 0.82,
4624
4706
  crossover: 0.62,
@@ -4639,8 +4721,8 @@ function withMap1777RoadDetail(module, stack) {
4639
4721
  ...stops.slice(1)
4640
4722
  ]);
4641
4723
  };
4642
- const ordinary = [roadClass, ...aliases[roadClass] ?? []];
4643
- const construction = ordinary.filter((name) => name === roadClass || name === "raceway").map((name) => `${name}_construction`);
4724
+ const ordinary = worldRoadSelector([roadClass]);
4725
+ const construction = worldConstructionSelector(roadClass);
4644
4726
  const highway = roadClass === "motorway" || roadClass === "trunk";
4645
4727
  for (const phase of ["casing", "fill"]) {
4646
4728
  const paint = road.surface?.[phase];
@@ -4651,7 +4733,7 @@ function withMap1777RoadDetail(module, stack) {
4651
4733
  selector: roadSelector(
4652
4734
  ordinary,
4653
4735
  "surface",
4654
- highway && phase === "fill" ? [{ kind: "compare", field: "ramp", operator: "ne", value: 1 }] : []
4736
+ highway && phase === "fill" ? [{ kind: "compare", field: "link", operator: "ne", value: true }] : []
4655
4737
  ),
4656
4738
  style: {}
4657
4739
  });
@@ -4680,17 +4762,8 @@ function withMap1777RoadDetail(module, stack) {
4680
4762
  detail[`${roadClass}-bridge-ordinary`] = refineRenderTarget2({
4681
4763
  target: `roads.classes.${roadClass}.bridge.fill`,
4682
4764
  renderer: "line",
4683
- selector: roadSelector([...ordinary, ...construction], "bridge", [
4684
- {
4685
- kind: "not",
4686
- selector: {
4687
- kind: "all",
4688
- selectors: [
4689
- { kind: "in", field: "class", values: ordinary },
4690
- { kind: "compare", field: "ramp", operator: "eq", value: 1 }
4691
- ]
4692
- }
4693
- }
4765
+ selector: roadSelector(worldRoadSelector([roadClass], { construction: true }), "bridge", [
4766
+ { kind: "not", selector: { kind: "all", selectors: [ordinary, link] } }
4694
4767
  ]),
4695
4768
  style: {}
4696
4769
  });
@@ -4700,9 +4773,7 @@ function withMap1777RoadDetail(module, stack) {
4700
4773
  renderer: "line",
4701
4774
  // Receiving carriageways cover the end of a link in the same band.
4702
4775
  placement: { below: `roads.classes.track.${structure}.fill` },
4703
- selector: roadSelector(ordinary, structure, [
4704
- { kind: "compare", field: "ramp", operator: "eq", value: 1 }
4705
- ]),
4776
+ selector: roadSelector(ordinary, structure, [link]),
4706
4777
  style: {
4707
4778
  ...fill,
4708
4779
  width: width(0),
@@ -4712,7 +4783,7 @@ function withMap1777RoadDetail(module, stack) {
4712
4783
  [
4713
4784
  { when: restrictedAccess, value: 0.9 },
4714
4785
  { when: expr4.eq(expr4.get(field4("surface")), "unpaved"), value: 0.82 },
4715
- { when: expr4.eq(expr4.toNumber(expr4.get(field4("indoor")), 0), 1), value: 0.72 }
4786
+ { when: expr4.eq(expr4.get(field4("indoor")), true), value: 0.72 }
4716
4787
  ],
4717
4788
  0.94
4718
4789
  )
@@ -4992,14 +5063,11 @@ function map1777RoadStyle(roadClass, fillColor, casingColor, minZoom, options =
4992
5063
  }
4993
5064
  var map1777BuildingHeight = expr5.max(
4994
5065
  0,
4995
- expr5.toNumber(expr5.coalesce(expr5.get(field5("renderHeight")), 5), 5)
5066
+ expr5.toNumber(expr5.coalesce(expr5.get(field5("height")), 5), 5)
4996
5067
  );
4997
5068
  var map1777BuildingBase = expr5.max(
4998
5069
  0,
4999
- expr5.min(
5000
- expr5.toNumber(expr5.coalesce(expr5.get(field5("renderMinHeight")), 0), 0),
5001
- map1777BuildingHeight
5002
- )
5070
+ expr5.min(expr5.toNumber(expr5.coalesce(expr5.get(field5("minHeight")), 0), 0), map1777BuildingHeight)
5003
5071
  );
5004
5072
  function map1777PathStyle(roadClass, color, minZoom, dash) {
5005
5073
  const style = map1777RoadStyle(roadClass, color, map1777Palette.roadCasing, minZoom, {
@@ -5060,9 +5128,9 @@ var map1777PathLabel = {
5060
5128
  ])
5061
5129
  }
5062
5130
  };
5063
- function map1777StreetName(style, classes, subclasses) {
5131
+ function map1777StreetName(style, roadClasses) {
5064
5132
  return renderPass5({
5065
- feature: "roadName",
5133
+ feature: "roadLabel",
5066
5134
  renderer: "symbol",
5067
5135
  requirements: ["roads"],
5068
5136
  placement: "below-buildings",
@@ -5070,8 +5138,7 @@ function map1777StreetName(style, classes, subclasses) {
5070
5138
  kind: "all",
5071
5139
  selectors: [
5072
5140
  { field: "name", kind: "has" },
5073
- { field: "class", kind: "in", values: classes },
5074
- ...subclasses ? [{ field: "subclass", kind: "in", values: subclasses }] : []
5141
+ worldRoadSelector(roadClasses, { construction: true })
5075
5142
  ]
5076
5143
  },
5077
5144
  style: {
@@ -5081,29 +5148,49 @@ function map1777StreetName(style, classes, subclasses) {
5081
5148
  field: expr5.coalesce(
5082
5149
  expr5.get(field5("name")),
5083
5150
  expr5.get(field5("nameLatin")),
5084
- expr5.get(field5("nameEnglish"))
5151
+ expr5.get(field5("nameEn"))
5085
5152
  )
5086
5153
  }
5087
5154
  }
5088
5155
  });
5089
5156
  }
5090
5157
  var map1777FieldVariant = expr5.modulo(expr5.toNumber(expr5.id(), 0), 3);
5091
- function landcoverPattern2(target, pattern, classes, options = {}) {
5092
- const classSelector = {
5093
- field: "class",
5094
- kind: "in",
5095
- values: classes
5096
- };
5097
- const selector = options.subclasses ? {
5098
- kind: "all",
5099
- selectors: [classSelector, { field: "subclass", kind: "in", values: options.subclasses }]
5100
- } : classSelector;
5158
+ function groundClass2(...classes) {
5159
+ return { field: "class", kind: "in", values: classes };
5160
+ }
5161
+ var urbanParkGround2 = {
5162
+ kind: "any",
5163
+ selectors: [
5164
+ {
5165
+ kind: "all",
5166
+ selectors: [
5167
+ groundClass2("park"),
5168
+ {
5169
+ kind: "not",
5170
+ selector: {
5171
+ field: "type",
5172
+ kind: "in",
5173
+ values: ["recreation_ground", "village_green", "zoo"]
5174
+ }
5175
+ }
5176
+ ]
5177
+ },
5178
+ {
5179
+ kind: "all",
5180
+ selectors: [
5181
+ groundClass2("garden"),
5182
+ { kind: "not", selector: { field: "type", kind: "in", values: ["flowerbed"] } }
5183
+ ]
5184
+ }
5185
+ ]
5186
+ };
5187
+ function landcoverPattern2(target, pattern, ground, options = {}) {
5101
5188
  const minZoom = options.minZoom ?? 9;
5102
5189
  return renderPass5({
5103
5190
  placement: { above: target },
5104
- feature: "landcover",
5191
+ feature: options.feature ?? "landuse",
5105
5192
  renderer: "fill",
5106
- selector,
5193
+ selector: ground,
5107
5194
  style: {
5108
5195
  minZoom,
5109
5196
  opacity: zoom5.linear([
@@ -5162,8 +5249,6 @@ var map1777Theme = defineOfficialTheme({
5162
5249
  },
5163
5250
  buildings: {
5164
5251
  active: map1777Palette.buildingActive,
5165
- businessCorridor: map1777Palette.building,
5166
- businessCorridorOutline: map1777Palette.buildingOutline,
5167
5252
  civic: "#AF4C42",
5168
5253
  commercial: "#C25B4D",
5169
5254
  destination: map1777Palette.buildingActive,
@@ -5212,6 +5297,8 @@ var map1777Theme = defineOfficialTheme({
5212
5297
  wood: map1777Palette.wood
5213
5298
  },
5214
5299
  landuse: {
5300
+ activity: map1777Palette.building,
5301
+ activityOutline: map1777Palette.buildingOutline,
5215
5302
  cemetery: "#BCC99D",
5216
5303
  civic: "#E8DCC3",
5217
5304
  commercial: "#E5D4BC",
@@ -5372,10 +5459,6 @@ var map1777Day = bindOfficialMapTheme(
5372
5459
  edgeColor: map1777Palette.buildingOutline,
5373
5460
  colorVariation: 0.035
5374
5461
  },
5375
- businessCorridor: {
5376
- fill: { visible: false },
5377
- outline: { visible: false }
5378
- },
5379
5462
  flat: {
5380
5463
  fill: {
5381
5464
  color: map1777Palette.building,
@@ -5430,14 +5513,8 @@ var map1777Day = bindOfficialMapTheme(
5430
5513
  placement: { above: "buildings.flat.outline" },
5431
5514
  feature: "building",
5432
5515
  renderer: "extrusion",
5433
- selector: {
5434
- kind: "all",
5435
- selectors: [
5436
- { field: "hide3d", kind: "compare", operator: "ne", value: true },
5437
- { field: "hide3d", kind: "compare", operator: "ne", value: 1 },
5438
- { field: "hide3d", kind: "compare", operator: "ne", value: "1" }
5439
- ]
5440
- },
5516
+ // A footprint whose parts draw it in 3D says `extrude: false`.
5517
+ selector: { field: "extrude", kind: "compare", operator: "ne", value: false },
5441
5518
  style: {
5442
5519
  base: map1777BuildingBase,
5443
5520
  color: map1777Palette.building,
@@ -5613,51 +5690,46 @@ var map1777Day = bindOfficialMapTheme(
5613
5690
  {
5614
5691
  // Own these ground labels here: replacing the roads module must not
5615
5692
  // leave refinements pointing at optional road-label contributions.
5616
- roadPaths: map1777StreetName(
5617
- map1777PathLabel,
5618
- ["path", "path_construction"],
5619
- ["path", "bridleway", "corridor", "footway", "cycleway", "steps", "pedestrian"]
5620
- ),
5621
- roadTrack: map1777StreetName(map1777PathLabel, [
5622
- "track",
5623
- "raceway",
5624
- "track_construction",
5625
- "raceway_construction"
5693
+ roadPaths: map1777StreetName(map1777PathLabel, [
5694
+ "pathway",
5695
+ "footway",
5696
+ "cycleway",
5697
+ "steps",
5698
+ "pedestrian"
5626
5699
  ]),
5700
+ roadTrack: map1777StreetName(map1777PathLabel, ["track"]),
5627
5701
  roadService: map1777StreetName(
5628
5702
  { ...map1777RoadLabel, minZoom: 16, priority: 48, spacing: 340 },
5629
- ["service", "busway", "bus_guideway", "service_construction"]
5703
+ ["service"]
5630
5704
  ),
5631
- roadMinor: map1777StreetName({ ...map1777RoadLabel, minZoom: 14 }, [
5632
- "minor",
5633
- "residential",
5634
- "unclassified",
5635
- "minor_construction"
5636
- ]),
5705
+ roadMinor: map1777StreetName({ ...map1777RoadLabel, minZoom: 14 }, ["minor"]),
5637
5706
  roadTertiary: map1777StreetName({ ...map1777RoadLabel, minZoom: 12, priority: 72 }, [
5638
- "tertiary",
5639
- "tertiary_construction"
5707
+ "tertiary"
5640
5708
  ]),
5641
5709
  roadSecondary: map1777StreetName(
5642
5710
  { ...map1777RoadLabel, minZoom: 11, priority: 80, spacing: 360 },
5643
- ["secondary", "secondary_construction"]
5711
+ ["secondary"]
5644
5712
  ),
5645
5713
  roadPrimary: map1777StreetName(
5646
5714
  { ...map1777RoadLabel, minZoom: 10, priority: 86, spacing: 360 },
5647
- ["primary", "primary_construction"]
5715
+ ["primary"]
5648
5716
  ),
5649
5717
  roadTrunk: map1777StreetName(
5650
5718
  { ...map1777RoadLabel, minZoom: 9, priority: 90, spacing: 400 },
5651
- ["trunk", "trunk_construction"]
5719
+ ["trunk"]
5652
5720
  ),
5653
5721
  roadMotorway: map1777StreetName(
5654
5722
  { ...map1777RoadLabel, minZoom: 8, priority: 94, spacing: 400 },
5655
- ["motorway", "motorway_construction"]
5723
+ ["motorway"]
5656
5724
  )
5657
5725
  }
5658
5726
  ),
5659
5727
  land: withRenderStack5(
5660
5728
  land4({
5729
+ activityAreas: {
5730
+ fill: { visible: false },
5731
+ outline: { visible: false }
5732
+ },
5661
5733
  background: { opacity: 1, pattern: "map-1777-paper-grain" },
5662
5734
  globalLandcover: {
5663
5735
  color: expr5.match(
@@ -5768,36 +5840,37 @@ var map1777Day = bindOfficialMapTheme(
5768
5840
  ],
5769
5841
  token3.image("land.field.hatch")
5770
5842
  ),
5771
- ["farmland"],
5843
+ groundClass2("farmland", "orchard", "vineyard"),
5772
5844
  { minZoom: 8, opacity: 0.82 }
5773
5845
  ),
5774
- heathTexture: landcoverPattern2("land.landcover.scrub.fill", "map-1777-heath", ["grass"], {
5775
- minZoom: 9,
5776
- opacity: 0.72,
5777
- subclasses: ["scrub"]
5778
- }),
5846
+ heathTexture: landcoverPattern2(
5847
+ "land.landcover.scrub.fill",
5848
+ "map-1777-heath",
5849
+ groundClass2("scrub"),
5850
+ { minZoom: 9, opacity: 0.72 }
5851
+ ),
5779
5852
  orchardTexture: landcoverPattern2(
5780
5853
  "land.landcover.urbanPark.fill",
5781
5854
  "map-1777-orchard",
5782
- ["grass"],
5783
- { minZoom: 11, opacity: 0.64, subclasses: ["park", "garden"] }
5855
+ urbanParkGround2,
5856
+ { minZoom: 11, opacity: 0.64 }
5784
5857
  ),
5785
5858
  sandTexture: landcoverPattern2(
5786
5859
  "land.landcover.sand.fill",
5787
5860
  "map-1777-sand",
5788
- ["sand", "beach"],
5861
+ groundClass2("sand"),
5789
5862
  { minZoom: 9, opacity: 0.72 }
5790
5863
  ),
5791
5864
  wetlandTexture: landcoverPattern2(
5792
5865
  "land.landcover.wetland.fill",
5793
5866
  "map-1777-wetland",
5794
- ["wetland"],
5795
- { minZoom: 9, opacity: 0.78 }
5867
+ groundClass2("wetland"),
5868
+ { feature: "landuseOverlay", minZoom: 9, opacity: 0.78 }
5796
5869
  ),
5797
5870
  woodTexture: landcoverPattern2(
5798
5871
  "land.landcover.wood.fill",
5799
5872
  "map-1777-woodland",
5800
- ["wood", "forest"],
5873
+ groundClass2("wood"),
5801
5874
  { minZoom: 8, opacity: 0.82 }
5802
5875
  ),
5803
5876
  residentialTexture: landusePattern2(
@@ -6146,14 +6219,7 @@ var map1777Day = bindOfficialMapTheme(
6146
6219
  placement: { below: "water.bodies.outline" },
6147
6220
  feature: "water",
6148
6221
  renderer: "line",
6149
- selector: {
6150
- coerce: "number",
6151
- fallback: 0,
6152
- field: "intermittent",
6153
- kind: "compare",
6154
- operator: "ne",
6155
- value: 1
6156
- },
6222
+ selector: { field: "intermittent", kind: "compare", operator: "ne", value: true },
6157
6223
  style: {
6158
6224
  color: map1777Palette.waterBank,
6159
6225
  minZoom: 9,
@@ -6171,14 +6237,7 @@ var map1777Day = bindOfficialMapTheme(
6171
6237
  placement: { above: "water.bodies.fill" },
6172
6238
  feature: "water",
6173
6239
  renderer: "fill",
6174
- selector: {
6175
- coerce: "number",
6176
- fallback: 0,
6177
- field: "intermittent",
6178
- kind: "compare",
6179
- operator: "ne",
6180
- value: 1
6181
- },
6240
+ selector: { field: "intermittent", kind: "compare", operator: "ne", value: true },
6182
6241
  style: {
6183
6242
  minZoom: 7,
6184
6243
  opacity: zoom5.linear([
@@ -6193,14 +6252,7 @@ var map1777Day = bindOfficialMapTheme(
6193
6252
  placement: { above: "water.intermittent.bodies.fill" },
6194
6253
  feature: "water",
6195
6254
  renderer: "fill",
6196
- selector: {
6197
- coerce: "number",
6198
- fallback: 0,
6199
- field: "intermittent",
6200
- kind: "compare",
6201
- operator: "eq",
6202
- value: 1
6203
- },
6255
+ selector: { field: "intermittent", kind: "compare", operator: "eq", value: true },
6204
6256
  style: {
6205
6257
  minZoom: 9,
6206
6258
  opacity: 0.2,
@@ -6309,8 +6361,6 @@ function createSiegfriedTheme(id, colorScheme, palette) {
6309
6361
  },
6310
6362
  buildings: {
6311
6363
  active: palette.ink,
6312
- businessCorridor: palette.paper,
6313
- businessCorridorOutline: palette.ink,
6314
6364
  civic: palette.ink,
6315
6365
  commercial: palette.ink,
6316
6366
  destination: palette.ink,
@@ -6359,6 +6409,8 @@ function createSiegfriedTheme(id, colorScheme, palette) {
6359
6409
  wood: palette.paper
6360
6410
  },
6361
6411
  landuse: {
6412
+ activity: palette.paper,
6413
+ activityOutline: palette.ink,
6362
6414
  cemetery: palette.paper,
6363
6415
  civic: palette.paper,
6364
6416
  commercial: palette.paper,
@@ -6579,13 +6631,13 @@ function landcoverFilter(classes, options = {}) {
6579
6631
  values: classes
6580
6632
  };
6581
6633
  const selectors = [classSelector];
6582
- if (options.subclasses) {
6583
- selectors.push({ field: "subclass", kind: "in", values: options.subclasses });
6634
+ if (options.types) {
6635
+ selectors.push({ field: "type", kind: "in", values: options.types });
6584
6636
  }
6585
- if (options.excludeSubclasses) {
6637
+ if (options.excludeTypes) {
6586
6638
  selectors.push({
6587
- branches: [{ result: false, values: options.excludeSubclasses }],
6588
- field: "subclass",
6639
+ branches: [{ result: false, values: options.excludeTypes }],
6640
+ field: "type",
6589
6641
  kind: "match",
6590
6642
  otherwise: true
6591
6643
  });
@@ -6596,7 +6648,7 @@ function landcoverPattern3(target, pattern, classes, options = {}) {
6596
6648
  const minZoom = options.minZoom ?? 9;
6597
6649
  return renderPass6({
6598
6650
  placement: { above: target },
6599
- feature: "landcover",
6651
+ feature: options.feature ?? "landuse",
6600
6652
  renderer: "fill",
6601
6653
  selector: landcoverFilter(classes, options),
6602
6654
  style: {
@@ -6612,7 +6664,7 @@ function landcoverPattern3(target, pattern, classes, options = {}) {
6612
6664
  function postContourLandcoverPattern(target, pattern, classes, options) {
6613
6665
  return renderPass6({
6614
6666
  placement: { above: target },
6615
- feature: "landcover",
6667
+ feature: "landuse",
6616
6668
  renderer: "fill",
6617
6669
  requirements: ["land"],
6618
6670
  selector: landcoverFilter(classes, options),
@@ -6722,10 +6774,6 @@ var siegfried = bindOfficialMapTheme(
6722
6774
  }
6723
6775
  }),
6724
6776
  buildings: buildings5({
6725
- businessCorridor: {
6726
- fill: { visible: false },
6727
- outline: { visible: false }
6728
- },
6729
6777
  flat: {
6730
6778
  fill: {
6731
6779
  color: siegfriedPalette.ink,
@@ -6967,6 +7015,10 @@ var siegfried = bindOfficialMapTheme(
6967
7015
  }),
6968
7016
  land: withRenderStack6(
6969
7017
  land5({
7018
+ activityAreas: {
7019
+ fill: { visible: false },
7020
+ outline: { visible: false }
7021
+ },
6970
7022
  background: { opacity: 1, pattern: siegfriedVisual.pattern["paper-grain"] },
6971
7023
  globalLandcover: { visible: false },
6972
7024
  landcover: {
@@ -7022,26 +7074,26 @@ var siegfried = bindOfficialMapTheme(
7022
7074
  forestPattern: landcoverPattern3(
7023
7075
  "land.landcover.wood.outline",
7024
7076
  siegfriedVisual.pattern.forest,
7025
- ["wood", "forest"],
7077
+ ["wood"],
7026
7078
  { minZoom: 8, opacity: 0.84 }
7027
7079
  ),
7028
7080
  gravelPattern: landcoverPattern3(
7029
7081
  "land.landcover.sand.fill",
7030
7082
  siegfriedVisual.pattern.gravel,
7031
- ["sand", "beach"],
7083
+ ["sand"],
7032
7084
  { minZoom: 10, opacity: 0.64 }
7033
7085
  ),
7034
7086
  orchardPattern: landcoverPattern3(
7035
7087
  "land.landcover.urbanPark.fill",
7036
7088
  siegfriedVisual.pattern.orchard,
7037
- ["grass"],
7038
- { minZoom: 12, opacity: 0.62, subclasses: ["garden", "orchard"] }
7089
+ ["garden"],
7090
+ { excludeTypes: ["flowerbed"], minZoom: 12, opacity: 0.62 }
7039
7091
  ),
7040
7092
  wetlandPattern: landcoverPattern3(
7041
7093
  "land.landcover.wetland.fill",
7042
7094
  siegfriedVisual.pattern.wetland,
7043
7095
  ["wetland"],
7044
- { minZoom: 9, opacity: 0.8 }
7096
+ { feature: "landuseOverlay", minZoom: 9, opacity: 0.8 }
7045
7097
  )
7046
7098
  }
7047
7099
  ),
@@ -7275,7 +7327,7 @@ var siegfried = bindOfficialMapTheme(
7275
7327
  {
7276
7328
  rockMask: renderPass6({
7277
7329
  placement: { below: "water.bodies.fill" },
7278
- feature: "landcover",
7330
+ feature: "landuse",
7279
7331
  renderer: "fill",
7280
7332
  requirements: ["land"],
7281
7333
  selector: { field: "class", kind: "in", values: ["rock"] },
@@ -7290,7 +7342,7 @@ var siegfried = bindOfficialMapTheme(
7290
7342
  siegfriedVisual.pattern.rock,
7291
7343
  ["rock"],
7292
7344
  {
7293
- excludeSubclasses: ["scree", "talus"],
7345
+ excludeTypes: ["scree", "talus"],
7294
7346
  minZoom: 9,
7295
7347
  opacity: 0.9
7296
7348
  }
@@ -7302,23 +7354,23 @@ var siegfried = bindOfficialMapTheme(
7302
7354
  {
7303
7355
  minZoom: 10,
7304
7356
  opacity: 0.82,
7305
- subclasses: ["scree", "talus"]
7357
+ types: ["scree", "talus"]
7306
7358
  }
7307
7359
  ),
7308
7360
  glacierMask: renderPass6({
7309
7361
  placement: { below: "water.bodies.fill" },
7310
- feature: "landcover",
7362
+ feature: "landuse",
7311
7363
  renderer: "fill",
7312
7364
  requirements: ["land"],
7313
- selector: { field: "class", kind: "in", values: ["ice", "glacier"] },
7365
+ selector: { field: "class", kind: "in", values: ["ice"] },
7314
7366
  style: { color: siegfriedPalette.paper, minZoom: 7, opacity: 0.98 }
7315
7367
  }),
7316
7368
  glacierPattern: renderPass6({
7317
7369
  placement: { above: "water.render.glacierMask" },
7318
- feature: "landcover",
7370
+ feature: "landuse",
7319
7371
  renderer: "fill",
7320
7372
  requirements: ["land"],
7321
- selector: { field: "class", kind: "in", values: ["ice", "glacier"] },
7373
+ selector: { field: "class", kind: "in", values: ["ice"] },
7322
7374
  style: {
7323
7375
  minZoom: 8,
7324
7376
  opacity: zoom6.linear([
@@ -7331,10 +7383,10 @@ var siegfried = bindOfficialMapTheme(
7331
7383
  }),
7332
7384
  glacierOutline: renderPass6({
7333
7385
  placement: { above: "water.render.glacierPattern" },
7334
- feature: "landcover",
7386
+ feature: "landuse",
7335
7387
  renderer: "line",
7336
7388
  requirements: ["land"],
7337
- selector: { field: "class", kind: "in", values: ["ice", "glacier"] },
7389
+ selector: { field: "class", kind: "in", values: ["ice"] },
7338
7390
  style: {
7339
7391
  cap: "round",
7340
7392
  color: siegfriedPalette.blue,
@@ -7348,14 +7400,7 @@ var siegfried = bindOfficialMapTheme(
7348
7400
  placement: { above: "water.bodies.outline" },
7349
7401
  feature: "water",
7350
7402
  renderer: "fill",
7351
- selector: {
7352
- coerce: "number",
7353
- fallback: 0,
7354
- field: "intermittent",
7355
- kind: "compare",
7356
- operator: "ne",
7357
- value: 1
7358
- },
7403
+ selector: { field: "intermittent", kind: "compare", operator: "ne", value: true },
7359
7404
  style: {
7360
7405
  minZoom: 7,
7361
7406
  opacity: zoom6.linear([
@@ -7370,14 +7415,7 @@ var siegfried = bindOfficialMapTheme(
7370
7415
  placement: { above: "water.intermittent.bodies.fill" },
7371
7416
  feature: "water",
7372
7417
  renderer: "fill",
7373
- selector: {
7374
- coerce: "number",
7375
- fallback: 0,
7376
- field: "intermittent",
7377
- kind: "compare",
7378
- operator: "eq",
7379
- value: 1
7380
- },
7418
+ selector: { field: "intermittent", kind: "compare", operator: "eq", value: true },
7381
7419
  style: {
7382
7420
  minZoom: 9,
7383
7421
  opacity: 0.22,
@@ -7797,6 +7835,8 @@ var soundings = bindOfficialMapTheme(
7797
7835
  water: "all"
7798
7836
  }),
7799
7837
  land: land6({
7838
+ // Buildings are off, and so are the areas where their activity concentrates.
7839
+ activityAreas: { fill: { visible: false }, outline: { visible: false } },
7800
7840
  background: { opacity: 1, pattern: "soundings-paper-grain" },
7801
7841
  globalLandcover: {
7802
7842
  color: expr7.match(
@@ -7913,7 +7953,7 @@ var soundings = bindOfficialMapTheme(
7913
7953
  // Ferry names are operational context, not a recommended track.
7914
7954
  ferryLabels: renderPass7({
7915
7955
  placement: { above: "transit.ferry" },
7916
- feature: "roadName",
7956
+ feature: "roadLabel",
7917
7957
  renderer: "symbol",
7918
7958
  selector: {
7919
7959
  kind: "all",
@@ -7924,7 +7964,7 @@ var soundings = bindOfficialMapTheme(
7924
7964
  kind: "any",
7925
7965
  selectors: [
7926
7966
  { field: "class", kind: "compare", operator: "eq", value: "ferry" },
7927
- { field: "subclass", kind: "compare", operator: "eq", value: "ferry" }
7967
+ { field: "type", kind: "compare", operator: "eq", value: "ferry" }
7928
7968
  ]
7929
7969
  }
7930
7970
  ]
@@ -8108,7 +8148,7 @@ var soundings = bindOfficialMapTheme(
8108
8148
  kind: "any",
8109
8149
  selectors: [
8110
8150
  { field: "class", kind: "compare", operator: "eq", value: "pier" },
8111
- { field: "subclass", kind: "compare", operator: "eq", value: "pier" }
8151
+ { field: "type", kind: "compare", operator: "eq", value: "pier" }
8112
8152
  ]
8113
8153
  },
8114
8154
  style: {
@@ -8136,7 +8176,7 @@ var soundings = bindOfficialMapTheme(
8136
8176
  kind: "any",
8137
8177
  selectors: [
8138
8178
  { field: "class", kind: "compare", operator: "eq", value: "pier" },
8139
- { field: "subclass", kind: "compare", operator: "eq", value: "pier" }
8179
+ { field: "type", kind: "compare", operator: "eq", value: "pier" }
8140
8180
  ]
8141
8181
  },
8142
8182
  style: {
@@ -8159,14 +8199,7 @@ var soundings = bindOfficialMapTheme(
8159
8199
  placement: { above: "water.bodies.fill" },
8160
8200
  feature: "water",
8161
8201
  renderer: "fill",
8162
- selector: {
8163
- coerce: "number",
8164
- fallback: 0,
8165
- field: "intermittent",
8166
- kind: "compare",
8167
- operator: "ne",
8168
- value: 1
8169
- },
8202
+ selector: { field: "intermittent", kind: "compare", operator: "ne", value: true },
8170
8203
  style: {
8171
8204
  minZoom: 7,
8172
8205
  opacity: zoom7.linear([
@@ -8181,14 +8214,7 @@ var soundings = bindOfficialMapTheme(
8181
8214
  placement: { above: "water.intermittent.bodies.fill" },
8182
8215
  feature: "water",
8183
8216
  renderer: "fill",
8184
- selector: {
8185
- coerce: "number",
8186
- fallback: 0,
8187
- field: "intermittent",
8188
- kind: "compare",
8189
- operator: "eq",
8190
- value: 1
8191
- },
8217
+ selector: { field: "intermittent", kind: "compare", operator: "eq", value: true },
8192
8218
  style: { minZoom: 9, opacity: 0.16, pattern: "soundings-water-dots" }
8193
8219
  })
8194
8220
  }
@@ -8299,6 +8325,12 @@ import {
8299
8325
  zoom as zoom11
8300
8326
  } from "@tileflow/core";
8301
8327
 
8328
+ // src/official/streets-climate.ts
8329
+ var streetsClimateImage = Object.freeze({
8330
+ url: "https://api.tileflow.dev/base/2a01d3fc884ee9aea013c506a7e4625b5d869e45f1c467e63cc0829f2e7314a1/images/streets-climate-v1.png",
8331
+ sha256: "bede2213b0ba74d77111fe182458ee30d219b989a9c11fe5ce121de1c549dfc4"
8332
+ });
8333
+
8302
8334
  // src/official/streets-ground-and-access.ts
8303
8335
  import { expr as expr9, field as field8, renderPass as renderPass8, token as token5, zoom as zoom9 } from "@tileflow/core";
8304
8336
  var streetsDayGroundColors = {
@@ -8321,12 +8353,13 @@ var streetsDayGroundColors = {
8321
8353
  "roads.accessOverview": "#D7D3CE"
8322
8354
  };
8323
8355
  var streetsAgriculturalColor = expr9.match(
8324
- expr9.get(field8("subclass")),
8325
- [
8326
- { labels: "orchard", value: token5.color("landcover.orchard") },
8327
- { labels: "plant_nursery", value: token5.color("landcover.nursery") }
8328
- ],
8329
- token5.color("landcover.farmland")
8356
+ expr9.get(field8("class")),
8357
+ [{ labels: "orchard", value: token5.color("landcover.orchard") }],
8358
+ expr9.match(
8359
+ expr9.get(field8("type")),
8360
+ [{ labels: "plant_nursery", value: token5.color("landcover.nursery") }],
8361
+ token5.color("landcover.farmland")
8362
+ )
8330
8363
  );
8331
8364
  var streetsGroundBackground = zoom9.linear([
8332
8365
  [10, token5.color("surface.background.overview")],
@@ -8342,7 +8375,7 @@ var streetsAccessOverview = renderPass8({
8342
8375
  selectors: [
8343
8376
  { kind: "geometry", geometry: "line" },
8344
8377
  { kind: "in", field: "class", values: ["track", "service"] },
8345
- { kind: "compare", field: "brunnel", operator: "ne", value: "tunnel" }
8378
+ { kind: "compare", field: "structure", operator: "ne", value: "tunnel" }
8346
8379
  ]
8347
8380
  },
8348
8381
  style: {
@@ -8390,7 +8423,12 @@ function overviewWidth(width, local) {
8390
8423
  const factor = value[i] === 10 ? 1.12 : value[i] === 12 ? local ? 1.125 : 1.25 : value[i] === 14 ? 1.08 : 1;
8391
8424
  if (factor !== 1) {
8392
8425
  const authored = value[i + 1];
8393
- value[i + 1] = ["case", ["==", ["get", field9("ramp")], 1], authored, ["*", authored, factor]];
8426
+ value[i + 1] = [
8427
+ "case",
8428
+ ["==", ["get", field9("link")], true],
8429
+ authored,
8430
+ ["*", authored, factor]
8431
+ ];
8394
8432
  }
8395
8433
  }
8396
8434
  return { ...width, value };
@@ -8466,7 +8504,7 @@ function streetsOverviewRoads(roads7) {
8466
8504
  selectors: [
8467
8505
  { kind: "geometry", geometry: "line" },
8468
8506
  { kind: "in", field: "class", values: ["motorway", "trunk"] },
8469
- { kind: "compare", field: "brunnel", operator: "ne", value: "tunnel" }
8507
+ { kind: "compare", field: "structure", operator: "ne", value: "tunnel" }
8470
8508
  ]
8471
8509
  },
8472
8510
  style: {
@@ -8501,18 +8539,18 @@ function streetsOverviewRoads(roads7) {
8501
8539
  }
8502
8540
 
8503
8541
  // src/official/streets-cartography.ts
8504
- var visibleBuilding = {
8505
- kind: "all",
8506
- selectors: [
8507
- { field: "hide3d", kind: "compare", operator: "ne", value: true },
8508
- { field: "hide3d", kind: "compare", operator: "ne", value: 1 },
8509
- { field: "hide3d", kind: "compare", operator: "ne", value: "1" },
8510
- { field: "hide3d", kind: "compare", operator: "ne", value: "true" }
8542
+ var activityOpacity = expr10.interpolate(
8543
+ { kind: "linear" },
8544
+ expr10.toNumber(expr10.coalesce(expr10.get(field10("activity")), 1), 1),
8545
+ [
8546
+ [1, 0.4],
8547
+ [5, 1]
8511
8548
  ]
8512
- };
8549
+ );
8550
+ var visibleBuilding = { field: "extrude", kind: "compare", operator: "ne", value: false };
8513
8551
  function buildingColor2(outline = false, raised = false) {
8514
8552
  return expr10.match(
8515
- expr10.get(field10("buildingTone")),
8553
+ expr10.get(field10("tone")),
8516
8554
  [
8517
8555
  {
8518
8556
  labels: ["commercial", "active"],
@@ -8561,8 +8599,29 @@ function withStreetsCartography(base) {
8561
8599
  land: withRenderStack8(
8562
8600
  {
8563
8601
  ...withoutStack(land8),
8564
- // The climate underlay is paused until it has a shared URL and visibility-aware loading.
8565
- // Its source, generator and attribution are retained in assets/streets/climate.
8602
+ globalLandcoverUnderlay: {
8603
+ url: streetsClimateImage.url,
8604
+ coordinates: [
8605
+ [-180, 85.0511287798066],
8606
+ [180, 85.0511287798066],
8607
+ [180, -85.0511287798066],
8608
+ [-180, -85.0511287798066]
8609
+ ],
8610
+ attribution: 'Climate context: <a href="https://doi.org/10.1038/s41597-023-02549-6">Beck et al. (2023)</a>, <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>; colours and smoothing adapted by Tileflow',
8611
+ maxZoom: 11,
8612
+ opacity: zoom11.linear([
8613
+ [0, token7.number("land.climate.opacity")],
8614
+ [7, token7.number("land.climate.opacity")],
8615
+ [8, token7.number("land.climate.opacity85")],
8616
+ [9, token7.number("land.climate.opacity78")],
8617
+ [10, token7.number("land.climate.opacity")],
8618
+ [10.5, token7.number("land.climate.opacity55")],
8619
+ [10.75, token7.number("land.climate.opacity25")],
8620
+ [11, 0]
8621
+ ])
8622
+ },
8623
+ // Streets draws activity areas in its own pass below, fading them out under buildings.
8624
+ activityAreas: { fill: { visible: false }, outline: { visible: false } },
8566
8625
  background: { ...land8.background, color: streetsGroundBackground },
8567
8626
  landcover: {
8568
8627
  ...land8.landcover,
@@ -8574,17 +8633,19 @@ function withStreetsCartography(base) {
8574
8633
  },
8575
8634
  {
8576
8635
  ...landStack,
8577
- businessArea: renderPass10({
8636
+ // Where shops, food, services and offices concentrate: stronger with the area's
8637
+ // activity level, from 1 to 5, until buildings take over.
8638
+ activityAreas: renderPass10({
8578
8639
  placement: { above: "land.landuse.residential.fill" },
8579
- feature: "landuse",
8640
+ feature: "landuseOverlay",
8580
8641
  renderer: "fill",
8581
- selector: { field: "class", kind: "compare", operator: "eq", value: "business_area" },
8642
+ selector: { field: "class", kind: "compare", operator: "eq", value: "activity_area" },
8582
8643
  style: {
8583
- color: token7.color("landuse.businessCorridor"),
8644
+ color: token7.color("landuse.activity"),
8584
8645
  minZoom: 11,
8585
- opacity: zoom11.linear([
8586
- [15, 1],
8587
- [15.5, 0.75],
8646
+ opacity: expr10.interpolate({ kind: "linear" }, expr10.zoom(), [
8647
+ [15, activityOpacity],
8648
+ [15.5, expr10.multiply(activityOpacity, 0.75)],
8588
8649
  [16.25, 0]
8589
8650
  ])
8590
8651
  }
@@ -8685,7 +8746,14 @@ import {
8685
8746
  withRenderStack as withRenderStack9
8686
8747
  } from "@tileflow/core";
8687
8748
  function withStreetsConstruction(module, stack) {
8688
- const constructionPath = expr11.eq(expr11.get(field11("class")), "path_construction");
8749
+ const constructionPath = expr11.all(
8750
+ expr11.eq(expr11.get(field11("class")), "construction"),
8751
+ expr11.match(
8752
+ expr11.get(field11("type")),
8753
+ [{ labels: [...worldConstructionTypes.pathway, "footway", "cycleway", "steps"], value: true }],
8754
+ false
8755
+ )
8756
+ );
8689
8757
  const marks = Object.fromEntries(
8690
8758
  [
8691
8759
  "motorway",
@@ -8704,16 +8772,12 @@ function withStreetsConstruction(module, stack) {
8704
8772
  kind: "all",
8705
8773
  selectors: [
8706
8774
  { kind: "geometry", geometry: "line" },
8707
- {
8708
- kind: "in",
8709
- field: "class",
8710
- values: roadClass === "track" ? ["track_construction", "raceway_construction"] : [`${roadClass}_construction`]
8711
- },
8712
- { kind: "compare", field: "brunnel", operator: "ne", value: "bridge" },
8713
- { kind: "compare", field: "brunnel", operator: "ne", value: "tunnel" },
8775
+ worldConstructionSelector(roadClass),
8776
+ { kind: "compare", field: "structure", operator: "ne", value: "bridge" },
8777
+ { kind: "compare", field: "structure", operator: "ne", value: "tunnel" },
8714
8778
  {
8715
8779
  kind: "step",
8716
- fallback: { kind: "compare", field: "ramp", operator: "ne", value: 1 },
8780
+ fallback: { kind: "compare", field: "link", operator: "ne", value: true },
8717
8781
  stops: [{ zoom: 12, selector: { kind: "literal", value: true } }]
8718
8782
  }
8719
8783
  ]
@@ -9073,7 +9137,7 @@ function streetsPoiImage() {
9073
9137
  return {
9074
9138
  labels: category,
9075
9139
  value: first ? expr12.match(
9076
- expr12.get(field12("poiType")),
9140
+ expr12.get(field12("type")),
9077
9141
  [first, ...rest],
9078
9142
  categoryRole
9079
9143
  ) : categoryRole
@@ -9088,7 +9152,7 @@ function streetsPoiImage() {
9088
9152
  expr12.get(field12("mode")),
9089
9153
  [firstMode, ...otherModes],
9090
9154
  expr12.match(
9091
- expr12.get(field12("poiCategory")),
9155
+ expr12.get(field12("class")),
9092
9156
  [firstCategory, ...otherCategories],
9093
9157
  token9.image("poi.landmark")
9094
9158
  )
@@ -9100,7 +9164,7 @@ function streetsPoiImage() {
9100
9164
  return expr12.case(
9101
9165
  [
9102
9166
  {
9103
- when: expr12.eq(expr12.get(field12("poiCategory")), "transport"),
9167
+ when: expr12.eq(expr12.get(field12("class")), "transport"),
9104
9168
  value: expr12.match(
9105
9169
  expr12.get(field12("network")),
9106
9170
  [firstNetwork, ...otherNetworks],
@@ -9387,7 +9451,7 @@ var rows = [
9387
9451
  ]
9388
9452
  ],
9389
9453
  [
9390
- "landuse.commercial landuse.businessCorridor buildings.businessCorridor",
9454
+ "landuse.commercial landuse.activity",
9391
9455
  [
9392
9456
  "#FFDDBF",
9393
9457
  "#FEECDF",
@@ -10376,8 +10440,6 @@ var streetsDayColors = {
10376
10440
  "boundaries.maritime": "#FF668C",
10377
10441
  "boundaries.regional": "#FF809A",
10378
10442
  "buildings.active": "#EBECDE",
10379
- "buildings.businessCorridor": "#F9EFDD",
10380
- "buildings.businessCorridorOutline": "#D7D1C2",
10381
10443
  "buildings.civic": "#EBECDE",
10382
10444
  "buildings.commercial": "#EBECDE",
10383
10445
  "buildings.contactShadow": "#888378",
@@ -10458,8 +10520,8 @@ var streetsDayColors = {
10458
10520
  "landcover.villageGreen": "#ABEFBF",
10459
10521
  "landcover.wetland": "#C1F2CF",
10460
10522
  "landcover.wood": "#9BE1AF",
10461
- "landuse.businessCorridor": "#F9EFDD",
10462
- "landuse.businessCorridorOutline": "#E0DAC9",
10523
+ "landuse.activity": "#F9EFDD",
10524
+ "landuse.activityOutline": "#E0DAC9",
10463
10525
  "landuse.cemetery": "#BCECCB",
10464
10526
  "landuse.civic": "#F0F2EE",
10465
10527
  "landuse.commercial": "#F9EFDD",
@@ -10774,9 +10836,11 @@ function streetsCartographyThemes(base) {
10774
10836
  ["roads.path.groundOpacity", 1],
10775
10837
  ["labels.shield.spacing11", 420],
10776
10838
  ["labels.shield.spacing13", 480],
10839
+ // Only daylight shows the climate; the other appearances keep the same layer clear,
10840
+ // so every appearance shares one cartography.
10777
10841
  ...[100, 85, 78, 55, 25].map((value) => [
10778
10842
  `land.climate.opacity${value === 100 ? "" : value}`,
10779
- value / 100
10843
+ name === "light" ? value / 100 : 0
10780
10844
  ])
10781
10845
  ])
10782
10846
  }
@@ -10822,11 +10886,11 @@ var defaultLighting = {
10822
10886
  sun: {
10823
10887
  azimuth: 180,
10824
10888
  altitude: 70,
10825
- color: "#FFF5E8",
10826
- intensity: 0.3,
10827
- shadowIntensity: 0.8
10889
+ color: "#FFFFFF",
10890
+ intensity: 0.2,
10891
+ shadowIntensity: 1
10828
10892
  },
10829
- ambient: { color: "#E2EBF7", intensity: 0.7 }
10893
+ ambient: { color: "#FFFFFF", intensity: 0.8 }
10830
10894
  },
10831
10895
  dusk: {
10832
10896
  sun: {
@@ -10866,7 +10930,7 @@ var fadedLighting = withLightColors({
10866
10930
  sun: "rgb(252.513725, 222.937729, 169.273879)",
10867
10931
  ambient: "rgb(254, 244.681815, 235.980392)"
10868
10932
  },
10869
- day: { sun: "#FFF8EF", ambient: "#EBF0F8" },
10933
+ day: { sun: "#FFFFFF", ambient: "#FFFFFF" },
10870
10934
  dusk: {
10871
10935
  sun: "rgb(252.513725, 217.250027, 164.945083)",
10872
10936
  ambient: "rgb(87.776471, 97.427724, 126.419608)"
@@ -11222,8 +11286,6 @@ var streetsLightColors = {
11222
11286
  "boundaries.maritime": "#648AA4",
11223
11287
  "boundaries.regional": "#CE9698",
11224
11288
  "buildings.active": "#EFEADD",
11225
- "buildings.businessCorridor": "#F4E6D8",
11226
- "buildings.businessCorridorOutline": "#DCCFC3",
11227
11289
  "buildings.civic": "#EFEADD",
11228
11290
  "buildings.commercial": "#EFEADD",
11229
11291
  "buildings.destination": "#EFEADD",
@@ -11296,8 +11358,8 @@ var streetsLightColors = {
11296
11358
  "landcover.villageGreen": "#C2E7B5",
11297
11359
  "landcover.wetland": "#D7E9DE",
11298
11360
  "landcover.wood": "#A7DFA0",
11299
- "landuse.businessCorridor": "#FBEDE2",
11300
- "landuse.businessCorridorOutline": "#E6D8CA",
11361
+ "landuse.activity": "#FBEDE2",
11362
+ "landuse.activityOutline": "#E6D8CA",
11301
11363
  "landuse.cemetery": "#CCE5C6",
11302
11364
  "landuse.civic": "#F5F1F0",
11303
11365
  "landuse.commercial": "#FBEDE2",
@@ -11390,8 +11452,6 @@ var streetsDarkColors = {
11390
11452
  "boundaries.maritime": "#8192B3",
11391
11453
  "boundaries.regional": "#76586D",
11392
11454
  "buildings.active": "#373743",
11393
- "buildings.businessCorridor": "#45424E",
11394
- "buildings.businessCorridorOutline": "#56515A",
11395
11455
  "buildings.civic": "#2C2E3D",
11396
11456
  "buildings.commercial": "#2C2E3D",
11397
11457
  "buildings.destination": "#3A3947",
@@ -11459,8 +11519,8 @@ var streetsDarkColors = {
11459
11519
  "landcover.villageGreen": "#46564D",
11460
11520
  "landcover.wetland": "#33474A",
11461
11521
  "landcover.wood": "#34453F",
11462
- "landuse.businessCorridor": "#45424E",
11463
- "landuse.businessCorridorOutline": "#5A5561",
11522
+ "landuse.activity": "#45424E",
11523
+ "landuse.activityOutline": "#5A5561",
11464
11524
  "landuse.cemetery": "#45534D",
11465
11525
  "landuse.civic": "#2D3043",
11466
11526
  "landuse.commercial": "#45424E",
@@ -11632,8 +11692,6 @@ function calibratedStreetsColors(preset, theme) {
11632
11692
  }
11633
11693
  if (role === "buildings.extrusion")
11634
11694
  return { ...parseStreetsColor(profile.extrusion), a: color.a };
11635
- if (role.startsWith("buildings.businessCorridor"))
11636
- return shift(base["landuse.commercial"], profile.commercial);
11637
11695
  if (role.startsWith("buildings.") || role === "surface.building")
11638
11696
  return shift(base["buildings.fill"], profile.building);
11639
11697
  if (role === "labels.ferryHalo") return water8();
@@ -11658,7 +11716,7 @@ function calibratedStreetsColors(preset, theme) {
11658
11716
  if (role.startsWith("roads.")) return shift(base["roads.default"], profile.road);
11659
11717
  if (role.startsWith("landuse.recreation"))
11660
11718
  return shift(base["landuse.recreation"], profile.sport);
11661
- if (role.startsWith("landuse.businessCorridor") || role === "landuse.commercial")
11719
+ if (role.startsWith("landuse.activity") || role === "landuse.commercial")
11662
11720
  return shift(base["landuse.commercial"], profile.commercial);
11663
11721
  const green = role.startsWith("landcover.") && !/(?:^|\.)(?:barren|ice|rock|sand|snow|urban)$/.test(role);
11664
11722
  if (green || role === "surface.park" || role === "landuse.cemetery")
@@ -11889,8 +11947,8 @@ var streetsVisual = {
11889
11947
  ),
11890
11948
  landuse: Object.fromEntries(
11891
11949
  [
11892
- "businessCorridor",
11893
- "businessCorridorOutline",
11950
+ "activity",
11951
+ "activityOutline",
11894
11952
  "cemetery",
11895
11953
  "civic",
11896
11954
  "commercial",
@@ -12323,8 +12381,8 @@ var streetsSurfacePalette = {
12323
12381
  [14, streetsVisual.surface.background]
12324
12382
  ]),
12325
12383
  barren: streetsVisual.landcover.barren,
12326
- businessCorridor: streetsVisual.landuse.businessCorridor,
12327
- businessCorridorOutline: streetsVisual.landuse.businessCorridorOutline,
12384
+ activity: streetsVisual.landuse.activity,
12385
+ activityOutline: streetsVisual.landuse.activityOutline,
12328
12386
  cemetery: streetsVisual.landuse.cemetery,
12329
12387
  civic: streetsVisual.landuse.civic,
12330
12388
  crop: streetsVisual.landcover.farmland,
@@ -12410,8 +12468,8 @@ var protectedAreaOpacity = zoom13.linear([
12410
12468
  [6, 1]
12411
12469
  ]);
12412
12470
  function streetsPoiStyle(category) {
12413
- const filterRank = expr14.toNumber(expr14.get(field14("poiFilterRank")), 6);
12414
- const sizeRank = expr14.toNumber(expr14.get(field14("poiSizeRank")), 17);
12471
+ const filterRank = expr14.toNumber(expr14.get(field14("filterrank")), 6);
12472
+ const sizeRank = expr14.toNumber(expr14.get(field14("sizerank")), 17);
12415
12473
  const featured = expr14.all(expr14.lte(filterRank, 0), expr14.lt(sizeRank, 5));
12416
12474
  const featuredDetail = expr14.all(expr14.lte(filterRank, 1), expr14.lt(sizeRank, 13));
12417
12475
  return {
@@ -12493,19 +12551,17 @@ var buildingOutlineColor = mapboxBuildingPalette.outline;
12493
12551
  var building3dColor = streetsVisual.building.extrusion;
12494
12552
  var buildingShadowColor = streetsVisual.building.shadow;
12495
12553
  var visibleBuilding3dSelector = {
12496
- kind: "all",
12497
- selectors: [
12498
- { field: "hide3d", kind: "compare", operator: "ne", value: true },
12499
- { field: "hide3d", kind: "compare", operator: "ne", value: 1 },
12500
- { field: "hide3d", kind: "compare", operator: "ne", value: "1" }
12501
- ]
12554
+ field: "extrude",
12555
+ kind: "compare",
12556
+ operator: "ne",
12557
+ value: false
12502
12558
  };
12503
12559
  var groundedBuilding3dSelector = {
12504
12560
  kind: "all",
12505
12561
  selectors: [
12506
12562
  visibleBuilding3dSelector,
12507
12563
  {
12508
- field: "renderMinHeight",
12564
+ field: "minHeight",
12509
12565
  coerce: "number",
12510
12566
  fallback: 0,
12511
12567
  kind: "compare",
@@ -12515,9 +12571,9 @@ var groundedBuilding3dSelector = {
12515
12571
  {
12516
12572
  kind: "any",
12517
12573
  selectors: [
12518
- { kind: "not", selector: { kind: "has", field: "renderHeight" } },
12574
+ { kind: "not", selector: { kind: "has", field: "height" } },
12519
12575
  {
12520
- field: "renderHeight",
12576
+ field: "height",
12521
12577
  coerce: "number",
12522
12578
  fallback: 5,
12523
12579
  kind: "compare",
@@ -12528,16 +12584,10 @@ var groundedBuilding3dSelector = {
12528
12584
  }
12529
12585
  ]
12530
12586
  };
12531
- var building3dHeight = expr14.max(
12532
- 0,
12533
- expr14.toNumber(expr14.coalesce(expr14.get(field14("renderHeight")), 5), 5)
12534
- );
12587
+ var building3dHeight = expr14.max(0, expr14.toNumber(expr14.coalesce(expr14.get(field14("height")), 5), 5));
12535
12588
  var building3dBase = expr14.max(
12536
12589
  0,
12537
- expr14.min(
12538
- expr14.toNumber(expr14.coalesce(expr14.get(field14("renderMinHeight")), 0), 0),
12539
- building3dHeight
12540
- )
12590
+ expr14.min(expr14.toNumber(expr14.coalesce(expr14.get(field14("minHeight")), 0), 0), building3dHeight)
12541
12591
  );
12542
12592
  var roadLineCap = zoom13.step([
12543
12593
  [3, "butt"],
@@ -12556,7 +12606,7 @@ var pathLineJoin = zoom13.step([
12556
12606
  [16, "round"]
12557
12607
  ]);
12558
12608
  var circularRoadBaseWidth = expr14.match(
12559
- expr14.coalesce(expr14.get(field14("class")), "minor"),
12609
+ expr14.coalesce(expr14.get(field14("class")), "street"),
12560
12610
  [
12561
12611
  { labels: "motorway", value: 6 },
12562
12612
  { labels: "trunk", value: 5.5 },
@@ -12586,14 +12636,13 @@ var tunnelBorderWidth = 1;
12586
12636
  function roadWidth(widths2, oneWayScale, rampWidths) {
12587
12637
  const augmentedWidths = [...widths2].sort(([left], [right]) => left - right);
12588
12638
  const widthOutput = (level, width) => {
12589
- const ordinaryWidth = oneWayScale === 1 ? width : expr14.match(
12590
- expr14.get(field14("oneway")),
12591
- [{ labels: [1, -1], value: width * oneWayScale }],
12639
+ const ordinaryWidth = oneWayScale === 1 ? width : expr14.case(
12640
+ [{ when: expr14.eq(expr14.get(field14("oneway")), true), value: width * oneWayScale }],
12592
12641
  width
12593
12642
  );
12594
12643
  const rampWidth = rampWidths ? sampleRoadWidth(rampWidths, level) : void 0;
12595
12644
  const surfaceWidth = rampWidth === void 0 ? ordinaryWidth : expr14.case(
12596
- [{ when: expr14.eq(expr14.get(field14("ramp")), 1), value: rampWidth }],
12645
+ [{ when: expr14.eq(expr14.get(field14("link")), true), value: rampWidth }],
12597
12646
  ordinaryWidth
12598
12647
  );
12599
12648
  return surfaceWidth;
@@ -12633,7 +12682,7 @@ function roadCasingWidth(major) {
12633
12682
  return expr14.interpolate({ kind: "exponential", base: 1.5 }, expr14.zoom(), [
12634
12683
  [
12635
12684
  14,
12636
- major ? expr14.case([{ when: expr14.eq(expr14.get(field14("ramp")), 1), value: 0.8 }], 1) : 0.8
12685
+ major ? expr14.case([{ when: expr14.eq(expr14.get(field14("link")), true), value: 0.8 }], 1) : 0.8
12637
12686
  ],
12638
12687
  [22, 2]
12639
12688
  ]);
@@ -12697,7 +12746,7 @@ function rankAtMost(value) {
12697
12746
  return {
12698
12747
  coerce: "number",
12699
12748
  fallback: 99,
12700
- field: "rank",
12749
+ field: "symbolrank",
12701
12750
  kind: "compare",
12702
12751
  operator: "lte",
12703
12752
  value
@@ -12707,7 +12756,7 @@ var namedCitySelector = {
12707
12756
  kind: "all",
12708
12757
  selectors: [
12709
12758
  { field: "name", kind: "has" },
12710
- { field: "class", kind: "compare", operator: "eq", value: "city" },
12759
+ { field: "type", kind: "compare", operator: "eq", value: "city" },
12711
12760
  {
12712
12761
  kind: "any",
12713
12762
  selectors: [
@@ -12736,7 +12785,7 @@ function streetsBoundaryRenderStack() {
12736
12785
  return {
12737
12786
  admin2Background: renderPass13({
12738
12787
  placement: { below: "boundaries.admin4" },
12739
- feature: "boundary",
12788
+ feature: "admin",
12740
12789
  renderer: "line",
12741
12790
  selector: {
12742
12791
  kind: "all",
@@ -12778,7 +12827,7 @@ function streetsBoundaryRenderStack() {
12778
12827
  }),
12779
12828
  admin4Background: renderPass13({
12780
12829
  placement: { below: "boundaries.admin4" },
12781
- feature: "boundary",
12830
+ feature: "admin",
12782
12831
  renderer: "line",
12783
12832
  selector: {
12784
12833
  kind: "all",
@@ -12825,7 +12874,7 @@ function streetsBoundaryRenderStack() {
12825
12874
  // metro zooms onward, so Streets adds it as an explicit semantic pass.
12826
12875
  admin6: renderPass13({
12827
12876
  placement: { above: "boundaries.admin4" },
12828
- feature: "boundary",
12877
+ feature: "admin",
12829
12878
  renderer: "line",
12830
12879
  selector: {
12831
12880
  kind: "all",
@@ -12869,14 +12918,14 @@ function streetsBoundaryRenderStack() {
12869
12918
  function streetsLandRenderStack() {
12870
12919
  return {
12871
12920
  // Core orders general cover, parks, lawn detail and mapped built surfaces.
12872
- // Streets adds only its own business-corridor treatment.
12873
- businessArea: renderPass13({
12921
+ // Streets adds only its own activity-area treatment.
12922
+ activityAreas: renderPass13({
12874
12923
  placement: { above: "land.landuse.residential.fill" },
12875
- feature: "landuse",
12924
+ feature: "landuseOverlay",
12876
12925
  renderer: "fill",
12877
- selector: { field: "class", kind: "compare", operator: "eq", value: "business_area" },
12926
+ selector: { field: "class", kind: "compare", operator: "eq", value: "activity_area" },
12878
12927
  style: {
12879
- color: streetsSurfacePalette.businessCorridor,
12928
+ color: streetsSurfacePalette.activity,
12880
12929
  minZoom: 11,
12881
12930
  opacity: 1
12882
12931
  }
@@ -13045,7 +13094,7 @@ function streetsBuildingRenderStack() {
13045
13094
  function streetsLabelRenderStack() {
13046
13095
  return {
13047
13096
  ferry: renderPass13({
13048
- feature: "roadName",
13097
+ feature: "roadLabel",
13049
13098
  placement: "below-labels",
13050
13099
  renderer: "symbol",
13051
13100
  selector: {
@@ -13057,7 +13106,7 @@ function streetsLabelRenderStack() {
13057
13106
  kind: "any",
13058
13107
  selectors: [
13059
13108
  { field: "class", kind: "compare", operator: "eq", value: "ferry" },
13060
- { field: "subclass", kind: "compare", operator: "eq", value: "ferry" }
13109
+ { field: "type", kind: "compare", operator: "eq", value: "ferry" }
13061
13110
  ]
13062
13111
  }
13063
13112
  ]
@@ -13088,14 +13137,14 @@ function streetsLabelRenderStack() {
13088
13137
  }),
13089
13138
  settlementMarker: renderPass13({
13090
13139
  placement: { below: "labels.places.city" },
13091
- feature: "place",
13140
+ feature: "placeLabel",
13092
13141
  renderer: "circle",
13093
13142
  selector: namedCitySelector,
13094
13143
  style: {
13095
13144
  color: streetsVisual.label.settlement,
13096
13145
  maxZoom: 8,
13097
13146
  minZoom: 2,
13098
- radius: expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 3, [
13147
+ radius: expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 3, [
13099
13148
  [3, 2.5],
13100
13149
  [7, 2]
13101
13150
  ]),
@@ -13132,7 +13181,7 @@ function streetsLabelRenderStack() {
13132
13181
  {
13133
13182
  field: "class",
13134
13183
  kind: "in",
13135
- values: ["state", "province", "aboriginal_lands"]
13184
+ values: ["state", "territory"]
13136
13185
  },
13137
13186
  {
13138
13187
  fallback: rankAtMost(1),
@@ -13159,7 +13208,7 @@ function streetsLabelRenderStack() {
13159
13208
  kind: "all",
13160
13209
  selectors: [
13161
13210
  { field: "name", kind: "has" },
13162
- { field: "class", kind: "compare", operator: "eq", value: "town" },
13211
+ { field: "type", kind: "compare", operator: "eq", value: "town" },
13163
13212
  {
13164
13213
  fallback: rankAtMost(7),
13165
13214
  kind: "step",
@@ -13180,7 +13229,7 @@ function streetsLabelRenderStack() {
13180
13229
  kind: "all",
13181
13230
  selectors: [
13182
13231
  { field: "name", kind: "has" },
13183
- { field: "class", kind: "compare", operator: "eq", value: "village" },
13232
+ { field: "type", kind: "compare", operator: "eq", value: "village" },
13184
13233
  {
13185
13234
  fallback: { kind: "literal", value: false },
13186
13235
  kind: "step",
@@ -13203,7 +13252,7 @@ function streetsLabelRenderStack() {
13203
13252
  selectors: [
13204
13253
  { field: "name", kind: "has" },
13205
13254
  {
13206
- field: "class",
13255
+ field: "type",
13207
13256
  kind: "in",
13208
13257
  values: ["suburb", "neighbourhood", "quarter", "borough"]
13209
13258
  },
@@ -13238,7 +13287,14 @@ function cityRoadSurfaceColor(roadClass) {
13238
13287
  expr14.case(
13239
13288
  [
13240
13289
  {
13241
- when: expr14.eq(expr14.get(field14("class")), `${roadClass}_construction`),
13290
+ when: expr14.all(
13291
+ expr14.eq(expr14.get(field14("class")), "construction"),
13292
+ expr14.match(
13293
+ expr14.get(field14("type")),
13294
+ [{ labels: [...worldConstructionTypes[roadClass]], value: true }],
13295
+ false
13296
+ )
13297
+ ),
13242
13298
  value: roadSurfaceColor
13243
13299
  },
13244
13300
  {
@@ -13266,16 +13322,12 @@ function streetsRoadEligibility() {
13266
13322
  kind: "all",
13267
13323
  selectors: [
13268
13324
  { kind: "geometry", geometry: "line" },
13269
- {
13270
- kind: "in",
13271
- field: "class",
13272
- values: [roadClass, `${roadClass}_construction`]
13273
- },
13325
+ worldRoadSelector([roadClass], { construction: true }),
13274
13326
  {
13275
13327
  kind: "compare",
13276
- field: "ramp",
13328
+ field: "link",
13277
13329
  operator: phase === "rampFill" ? "eq" : "ne",
13278
- value: 1
13330
+ value: true
13279
13331
  },
13280
13332
  {
13281
13333
  kind: "step",
@@ -13286,8 +13338,8 @@ function streetsRoadEligibility() {
13286
13338
  selector: {
13287
13339
  kind: "all",
13288
13340
  selectors: [
13289
- { kind: "compare", field: "brunnel", operator: "ne", value: "tunnel" },
13290
- { kind: "compare", field: "brunnel", operator: "ne", value: "bridge" }
13341
+ { kind: "compare", field: "structure", operator: "ne", value: "tunnel" },
13342
+ { kind: "compare", field: "structure", operator: "ne", value: "bridge" }
13291
13343
  ]
13292
13344
  }
13293
13345
  }
@@ -13345,10 +13397,8 @@ function streetsRoadRenderStack() {
13345
13397
  ]),
13346
13398
  padding: 0,
13347
13399
  pitchAlignment: "map",
13348
- rotate: expr14.case(
13349
- [{ when: expr14.eq(expr14.get(field14("oneway")), -1), value: 180 }],
13350
- 0
13351
- ),
13400
+ // World orients one-way geometry in the direction of travel.
13401
+ rotate: 0,
13352
13402
  rotationAlignment: "map",
13353
13403
  size: expr14.interpolate({ kind: "linear" }, expr14.zoom(), [
13354
13404
  [15, 0.38],
@@ -13366,10 +13416,7 @@ function streetsRoadRenderStack() {
13366
13416
  ]),
13367
13417
  text: {
13368
13418
  allowOverlap: true,
13369
- field: expr14.case(
13370
- [{ when: expr14.eq(expr14.get(field14("oneway")), -1), value: "\u2190" }],
13371
- "\u2192"
13372
- ),
13419
+ field: "\u2192",
13373
13420
  ignorePlacement: true,
13374
13421
  keepUpright: false,
13375
13422
  opacity: 0,
@@ -13560,14 +13607,23 @@ function roadLabelStyle(kind, minZoom) {
13560
13607
  // Resolve dense parallel streets by road hierarchy, not incidental tile order.
13561
13608
  // All classes share this expression so the compiler retains one collision network.
13562
13609
  priority: expr14.match(
13563
- expr14.coalesce(expr14.get(field14("class")), "minor"),
13610
+ // A road under construction ranks as the road it becomes.
13611
+ expr14.case(
13612
+ [
13613
+ {
13614
+ when: expr14.eq(expr14.get(field14("class")), "construction"),
13615
+ value: expr14.coalesce(expr14.get(field14("type")), "")
13616
+ }
13617
+ ],
13618
+ expr14.coalesce(expr14.get(field14("class")), "street")
13619
+ ),
13564
13620
  [
13565
- { labels: ["motorway", "motorway_construction"], value: 6 },
13566
- { labels: ["trunk", "trunk_construction"], value: 5 },
13567
- { labels: ["primary", "primary_construction"], value: 4 },
13568
- { labels: ["secondary", "secondary_construction"], value: 3 },
13569
- { labels: ["tertiary", "tertiary_construction"], value: 2 },
13570
- { labels: ["minor", "minor_construction"], value: 1 }
13621
+ { labels: [...worldConstructionTypes.motorway], value: 6 },
13622
+ { labels: [...worldConstructionTypes.trunk], value: 5 },
13623
+ { labels: [...worldConstructionTypes.primary], value: 4 },
13624
+ { labels: [...worldConstructionTypes.secondary], value: 3 },
13625
+ { labels: [...worldConstructionTypes.tertiary], value: 2 },
13626
+ { labels: [...worldConstructionTypes.minor], value: 1 }
13571
13627
  ],
13572
13628
  0
13573
13629
  ),
@@ -14056,7 +14112,7 @@ var streetsBase = bindOfficialMapTheme(
14056
14112
  }
14057
14113
  },
14058
14114
  modifiers: {
14059
- // Optional keys: construction, expressway, indoor, official, ramp, unpaved.
14115
+ // Optional keys: construction, expressway, indoor, ramp, unpaved.
14060
14116
  // Treatments accept enabled, widthScale, surface, tunnel, and bridge;
14061
14117
  // phases accept color, opacity, dash, blur, gapWidth, offset, and width.
14062
14118
  expressway: { widthScale: expresswayWidthScale },
@@ -14479,13 +14535,6 @@ var streetsBase = bindOfficialMapTheme(
14479
14535
  )
14480
14536
  }
14481
14537
  },
14482
- businessCorridor: {
14483
- // This compatibility layer contains selected building footprints,
14484
- // not ground. Streets renders the derived business_area class through
14485
- // landuse instead.
14486
- fill: { visible: false },
14487
- outline: { visible: false }
14488
- },
14489
14538
  flat: {
14490
14539
  fill: {
14491
14540
  color: buildingFillColor,
@@ -14618,14 +14667,14 @@ var streetsBase = bindOfficialMapTheme(
14618
14667
  [
14619
14668
  [
14620
14669
  1,
14621
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 11, [
14670
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 11, [
14622
14671
  [4, 9],
14623
14672
  [5, 8]
14624
14673
  ])
14625
14674
  ],
14626
14675
  [
14627
14676
  9,
14628
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 22, [
14677
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 22, [
14629
14678
  [4, 19],
14630
14679
  [5, 17]
14631
14680
  ])
@@ -14653,14 +14702,14 @@ var streetsBase = bindOfficialMapTheme(
14653
14702
  [
14654
14703
  [
14655
14704
  4,
14656
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 9, [
14705
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 9, [
14657
14706
  [6, 8],
14658
14707
  [7, 7]
14659
14708
  ])
14660
14709
  ],
14661
14710
  [
14662
14711
  9,
14663
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 21, [
14712
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 21, [
14664
14713
  [6, 16],
14665
14714
  [7, 14]
14666
14715
  ])
@@ -14673,7 +14722,7 @@ var streetsBase = bindOfficialMapTheme(
14673
14722
  city: {
14674
14723
  minZoom: 2,
14675
14724
  maxZoom: 15,
14676
- priority: expr14.subtract(100, expr14.coalesce(expr14.get(field14("rank")), 20)),
14725
+ priority: expr14.subtract(100, expr14.coalesce(expr14.get(field14("symbolrank")), 20)),
14677
14726
  text: {
14678
14727
  color: zoom13.linear([
14679
14728
  [2, streetsOverviewPalette.label],
@@ -14694,24 +14743,27 @@ var streetsBase = bindOfficialMapTheme(
14694
14743
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
14695
14744
  expr14.zoom(),
14696
14745
  [
14697
- [3, expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 13, [[6, 11]])],
14746
+ [
14747
+ 3,
14748
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 13, [[6, 11]])
14749
+ ],
14698
14750
  [
14699
14751
  6,
14700
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 18, [
14752
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 18, [
14701
14753
  [6, 16],
14702
14754
  [7, 14]
14703
14755
  ])
14704
14756
  ],
14705
14757
  [
14706
14758
  8,
14707
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 20, [
14759
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 20, [
14708
14760
  [9, 16],
14709
14761
  [10, 14]
14710
14762
  ])
14711
14763
  ],
14712
14764
  [
14713
14765
  15,
14714
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 24, [
14766
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 24, [
14715
14767
  [9, 20],
14716
14768
  [12, 16],
14717
14769
  [15, 14]
@@ -14726,7 +14778,7 @@ var streetsBase = bindOfficialMapTheme(
14726
14778
  town: {
14727
14779
  minZoom: 2,
14728
14780
  maxZoom: 13,
14729
- priority: expr14.subtract(80, expr14.coalesce(expr14.get(field14("rank")), 20)),
14781
+ priority: expr14.subtract(80, expr14.coalesce(expr14.get(field14("symbolrank")), 20)),
14730
14782
  text: {
14731
14783
  color: streetsVisual.label.settlement,
14732
14784
  haloColor: streetsVisual.label.placeHalo,
@@ -14743,17 +14795,20 @@ var streetsBase = bindOfficialMapTheme(
14743
14795
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
14744
14796
  expr14.zoom(),
14745
14797
  [
14746
- [3, expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 11, [[9, 10]])],
14798
+ [
14799
+ 3,
14800
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 11, [[9, 10]])
14801
+ ],
14747
14802
  [
14748
14803
  6,
14749
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 14, [
14804
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 14, [
14750
14805
  [9, 12],
14751
14806
  [12, 10]
14752
14807
  ])
14753
14808
  ],
14754
14809
  [
14755
14810
  8,
14756
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 16, [
14811
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 16, [
14757
14812
  [9, 14],
14758
14813
  [12, 12],
14759
14814
  [15, 10]
@@ -14761,7 +14816,7 @@ var streetsBase = bindOfficialMapTheme(
14761
14816
  ],
14762
14817
  [
14763
14818
  13,
14764
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 22, [
14819
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 22, [
14765
14820
  [9, 20],
14766
14821
  [12, 16],
14767
14822
  [15, 14]
@@ -14785,7 +14840,7 @@ var streetsBase = bindOfficialMapTheme(
14785
14840
  village: {
14786
14841
  minZoom: 2,
14787
14842
  maxZoom: 13,
14788
- priority: expr14.subtract(65, expr14.coalesce(expr14.get(field14("rank")), 20)),
14843
+ priority: expr14.subtract(65, expr14.coalesce(expr14.get(field14("symbolrank")), 20)),
14789
14844
  text: {
14790
14845
  color: streetsVisual.label.settlement,
14791
14846
  haloColor: streetsVisual.label.placeHalo,
@@ -14802,17 +14857,20 @@ var streetsBase = bindOfficialMapTheme(
14802
14857
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
14803
14858
  expr14.zoom(),
14804
14859
  [
14805
- [3, expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 11, [[9, 10]])],
14860
+ [
14861
+ 3,
14862
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 11, [[9, 10]])
14863
+ ],
14806
14864
  [
14807
14865
  6,
14808
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 14, [
14866
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 14, [
14809
14867
  [9, 12],
14810
14868
  [12, 10]
14811
14869
  ])
14812
14870
  ],
14813
14871
  [
14814
14872
  8,
14815
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 16, [
14873
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 16, [
14816
14874
  [9, 14],
14817
14875
  [12, 12],
14818
14876
  [15, 10]
@@ -14820,7 +14878,7 @@ var streetsBase = bindOfficialMapTheme(
14820
14878
  ],
14821
14879
  [
14822
14880
  13,
14823
- expr14.step(expr14.coalesce(expr14.get(field14("rank")), 99), 22, [
14881
+ expr14.step(expr14.coalesce(expr14.get(field14("symbolrank")), 99), 22, [
14824
14882
  [9, 20],
14825
14883
  [12, 16],
14826
14884
  [15, 14]
@@ -14844,7 +14902,7 @@ var streetsBase = bindOfficialMapTheme(
14844
14902
  neighborhood: {
14845
14903
  minZoom: 10,
14846
14904
  maxZoom: 15,
14847
- priority: expr14.subtract(65, expr14.coalesce(expr14.get(field14("rank")), 20)),
14905
+ priority: expr14.subtract(65, expr14.coalesce(expr14.get(field14("symbolrank")), 20)),
14848
14906
  text: {
14849
14907
  font: streetsVisual.font.default,
14850
14908
  color: streetsVisual.label.neighborhood,
@@ -14852,7 +14910,7 @@ var streetsBase = bindOfficialMapTheme(
14852
14910
  haloBlur: 0,
14853
14911
  haloWidth: 1.3,
14854
14912
  letterSpacing: expr14.match(
14855
- expr14.get(field14("class")),
14913
+ expr14.get(field14("type")),
14856
14914
  [{ labels: "suburb", value: 0.15 }],
14857
14915
  0.05
14858
14916
  ),
@@ -14866,7 +14924,7 @@ var streetsBase = bindOfficialMapTheme(
14866
14924
  [
14867
14925
  11,
14868
14926
  expr14.match(
14869
- expr14.get(field14("class")),
14927
+ expr14.get(field14("type")),
14870
14928
  [{ labels: "suburb", value: 12 }],
14871
14929
  11.5
14872
14930
  )
@@ -14874,7 +14932,7 @@ var streetsBase = bindOfficialMapTheme(
14874
14932
  [
14875
14933
  15,
14876
14934
  expr14.match(
14877
- expr14.get(field14("class")),
14935
+ expr14.get(field14("type")),
14878
14936
  [{ labels: "suburb", value: 16 }],
14879
14937
  15
14880
14938
  )