@mailwoman/cartographer 1.0.0

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.
Files changed (100) hide show
  1. package/README.md +3 -0
  2. package/base/buildings.ts +124 -0
  3. package/base/composition.ts +119 -0
  4. package/base/index.ts +10 -0
  5. package/base/layers.ts +52 -0
  6. package/base/terrain.ts +33 -0
  7. package/base/theme.ts +118 -0
  8. package/bdc/index.ts +395 -0
  9. package/coverage/index.ts +89 -0
  10. package/hspa/index.ts +20 -0
  11. package/index.ts +12 -0
  12. package/out/base/buildings.d.ts +11 -0
  13. package/out/base/buildings.d.ts.map +1 -0
  14. package/out/base/buildings.js +109 -0
  15. package/out/base/buildings.js.map +1 -0
  16. package/out/base/composition.d.ts +33 -0
  17. package/out/base/composition.d.ts.map +1 -0
  18. package/out/base/composition.js +86 -0
  19. package/out/base/composition.js.map +1 -0
  20. package/out/base/index.d.ts +10 -0
  21. package/out/base/index.d.ts.map +1 -0
  22. package/out/base/index.js +10 -0
  23. package/out/base/index.js.map +1 -0
  24. package/out/base/layers.d.ts +9 -0
  25. package/out/base/layers.d.ts.map +1 -0
  26. package/out/base/layers.js +49 -0
  27. package/out/base/layers.js.map +1 -0
  28. package/out/base/terrain.d.ts +20 -0
  29. package/out/base/terrain.d.ts.map +1 -0
  30. package/out/base/terrain.js +29 -0
  31. package/out/base/terrain.js.map +1 -0
  32. package/out/base/theme.d.ts +20 -0
  33. package/out/base/theme.d.ts.map +1 -0
  34. package/out/base/theme.js +103 -0
  35. package/out/base/theme.js.map +1 -0
  36. package/out/bdc/index.d.ts +27 -0
  37. package/out/bdc/index.d.ts.map +1 -0
  38. package/out/bdc/index.js +344 -0
  39. package/out/bdc/index.js.map +1 -0
  40. package/out/coverage/index.d.ts +58 -0
  41. package/out/coverage/index.d.ts.map +1 -0
  42. package/out/coverage/index.js +77 -0
  43. package/out/coverage/index.js.map +1 -0
  44. package/out/hspa/index.d.ts +12 -0
  45. package/out/hspa/index.d.ts.map +1 -0
  46. package/out/hspa/index.js +18 -0
  47. package/out/hspa/index.js.map +1 -0
  48. package/out/index.d.ts +12 -0
  49. package/out/index.d.ts.map +1 -0
  50. package/out/index.js +12 -0
  51. package/out/index.js.map +1 -0
  52. package/out/race-dots/index.d.ts +61 -0
  53. package/out/race-dots/index.d.ts.map +1 -0
  54. package/out/race-dots/index.js +59 -0
  55. package/out/race-dots/index.js.map +1 -0
  56. package/out/styles/index.d.ts +8 -0
  57. package/out/styles/index.d.ts.map +1 -0
  58. package/out/styles/index.js +8 -0
  59. package/out/styles/index.js.map +1 -0
  60. package/out/styles/layers.d.ts +33 -0
  61. package/out/styles/layers.d.ts.map +1 -0
  62. package/out/styles/layers.js +108 -0
  63. package/out/styles/layers.js.map +1 -0
  64. package/out/styles/sources.d.ts +22 -0
  65. package/out/styles/sources.d.ts.map +1 -0
  66. package/out/styles/sources.js +12 -0
  67. package/out/styles/sources.js.map +1 -0
  68. package/out/tiger/index.d.ts +11 -0
  69. package/out/tiger/index.d.ts.map +1 -0
  70. package/out/tiger/index.js +64 -0
  71. package/out/tiger/index.js.map +1 -0
  72. package/out/tiles/api.d.ts +20 -0
  73. package/out/tiles/api.d.ts.map +1 -0
  74. package/out/tiles/api.js +41 -0
  75. package/out/tiles/api.js.map +1 -0
  76. package/out/tiles/coords.d.ts +16 -0
  77. package/out/tiles/coords.d.ts.map +1 -0
  78. package/out/tiles/coords.js +34 -0
  79. package/out/tiles/coords.js.map +1 -0
  80. package/out/tiles/index.d.ts +9 -0
  81. package/out/tiles/index.d.ts.map +1 -0
  82. package/out/tiles/index.js +9 -0
  83. package/out/tiles/index.js.map +1 -0
  84. package/out/tiles/schema.d.ts +41 -0
  85. package/out/tiles/schema.d.ts.map +1 -0
  86. package/out/tiles/schema.js +7 -0
  87. package/out/tiles/schema.js.map +1 -0
  88. package/out/tsconfig.tsbuildinfo +1 -0
  89. package/package.json +46 -0
  90. package/race-dots/index.ts +68 -0
  91. package/styles/index.ts +8 -0
  92. package/styles/layers.ts +148 -0
  93. package/styles/sources.ts +26 -0
  94. package/tiger/index.ts +71 -0
  95. package/tiles/api.ts +53 -0
  96. package/tiles/coords.ts +46 -0
  97. package/tiles/index.ts +9 -0
  98. package/tiles/schema.ts +42 -0
  99. package/tsconfig.json +22 -0
  100. package/typedoc.json +4 -0
@@ -0,0 +1,344 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { TIGERLevel } from "@mailwoman/tiger";
7
+ import {} from "@maplibre/maplibre-gl-style-spec";
8
+ import { interpolateTurbo } from "d3-scale-chromatic";
9
+ import {} from "../styles/layers.js";
10
+ import { TileSetSourceID } from "../styles/sources.js";
11
+ /**
12
+ * Identifier for the Broadband Data Collection tile set.
13
+ */
14
+ export const BDCTileSetID = TileSetSourceID("bdc");
15
+ function createBDCBlockLayer(spec) {
16
+ return {
17
+ ...spec,
18
+ id: `bdc_${TIGERLevel.Block}_${spec.id}`,
19
+ source: BDCTileSetID,
20
+ "source-layer": `bdc_${TIGERLevel.Block}`,
21
+ minzoom: 12,
22
+ };
23
+ }
24
+ function createBDCTractLayer(spec) {
25
+ return {
26
+ ...spec,
27
+ id: `bdc_${TIGERLevel.Tract}_${spec.id}`,
28
+ source: BDCTileSetID,
29
+ "source-layer": `bdc_${TIGERLevel.Tract}`,
30
+ maxzoom: 12,
31
+ minzoom: 9,
32
+ };
33
+ }
34
+ function createBDCCountyLayer(spec) {
35
+ return {
36
+ ...spec,
37
+ id: `bdc_${TIGERLevel.County}_${spec.id}`,
38
+ source: BDCTileSetID,
39
+ "source-layer": `bdc_${TIGERLevel.County}`,
40
+ maxzoom: 9,
41
+ minzoom: 2,
42
+ };
43
+ }
44
+ export function createBDCLayer(spec) {
45
+ return [createBDCBlockLayer(spec), createBDCTractLayer(spec), createBDCCountyLayer(spec)];
46
+ }
47
+ const GIGABIT_BROADBAND_SPEED = 1000;
48
+ export const BroadbandDataCollectionLayers = [
49
+ {
50
+ afterID: "earth",
51
+ // metadata: {
52
+ // queryable: false,
53
+ // },
54
+ id: "blocks-underserved",
55
+ layout: {
56
+ visibility: "none",
57
+ },
58
+ "source-layer": `bdc_${TIGERLevel.Block}`,
59
+ source: BDCTileSetID,
60
+ type: "fill",
61
+ filter: [
62
+ // ---
63
+ "all",
64
+ ["in", 50, ["get", "technology_codes"]], // Fiber only
65
+ [">", ["get", "land_area_sqm"], 0],
66
+ // ["==", ["get", "UR"], "R"],
67
+ ],
68
+ paint: {
69
+ // "fill-extrusion-height": [
70
+ // // Our extrusion height represents the magnitude of broadband underservice,
71
+ // // e.g. How many people are underserved per square meter of land area.
72
+ // "let",
73
+ // "population_density",
74
+ // ["/", ["to-number", ["get", "population"]], ["to-number", ["get", "land_area_sqm"]]],
75
+ // ["*", ["var", "population_density"], 10000],
76
+ // ],
77
+ "fill-color": "hsl(60deg, 100%, 50%)",
78
+ "fill-opacity": [
79
+ // Underserved areas are emphasized to their level importance,
80
+ // relative to the impact of the underservice.
81
+ "let",
82
+ "internet_speed_impact",
83
+ ["/", ["to-number", ["get", "average_download_speed"]], GIGABIT_BROADBAND_SPEED],
84
+ [
85
+ // ---
86
+ "interpolate",
87
+ ["linear"],
88
+ ["var", "internet_speed_impact"],
89
+ 0,
90
+ 0.1,
91
+ 1,
92
+ 0.5,
93
+ ],
94
+ ],
95
+ },
96
+ // layout: {
97
+ // visibility: "none",
98
+ // },
99
+ },
100
+ {
101
+ afterID: "blocks-underserved",
102
+ id: "bdc-boundary-blocks",
103
+ layout: {
104
+ visibility: "none",
105
+ },
106
+ metadata: {
107
+ queryable: false,
108
+ },
109
+ "source-layer": `bdc_${TIGERLevel.Block}`,
110
+ source: BDCTileSetID,
111
+ type: "line",
112
+ // filter: [">=", ["get", "ALAND"], 0],
113
+ minzoom: 9,
114
+ paint: {
115
+ "line-color": "#000",
116
+ "line-width": 1,
117
+ "line-dasharray": [2, 2],
118
+ },
119
+ },
120
+ {
121
+ afterID: "blocks-underserved",
122
+ metadata: {
123
+ queryable: false,
124
+ },
125
+ id: "blocks-underserved-ratio-label",
126
+ "source-layer": `bdc_${TIGERLevel.Block}`,
127
+ source: BDCTileSetID,
128
+ type: "symbol",
129
+ filter: [
130
+ // ---
131
+ "all",
132
+ // ["in", 50, ["get", "technology_codes"]], // Fiber only
133
+ [">", ["get", "land_area_sqm"], 0],
134
+ // ["==", ["get", "UR"], "R"],
135
+ ],
136
+ paint: {
137
+ "text-color": "black",
138
+ "text-halo-color": "white",
139
+ "text-halo-width": 1,
140
+ },
141
+ layout: {
142
+ visibility: "none",
143
+ "text-field": [
144
+ "concat",
145
+ ["number-format", ["get", "average_download_speed"], { "min-fraction-digits": 0, "max-fraction-digits": 2 }],
146
+ " Mbps",
147
+ ],
148
+ "text-size": 10,
149
+ "text-offset": [0, 0],
150
+ "text-anchor": "center",
151
+ "text-font": ["Fira Code Regular"],
152
+ },
153
+ },
154
+ ...createBDCLayer({
155
+ id: "coverage-fiber-label",
156
+ beforeID: "places_subplace",
157
+ filter: [
158
+ // ---
159
+ "all",
160
+ ["==", ["get", "provider_id"], 131425],
161
+ // ["in", 50, ["get", "technology_codes"]],
162
+ ],
163
+ type: "symbol",
164
+ layout: {
165
+ visibility: "none",
166
+ "text-field": [
167
+ "concat",
168
+ ["number-format", ["get", "average_download_speed"], { "min-fraction-digits": 0, "max-fraction-digits": 2 }],
169
+ " Mbps",
170
+ ],
171
+ "text-size": [
172
+ // ---
173
+ "let",
174
+ "multiplier",
175
+ // We scale the text size based on the average download speed.
176
+ // By default, we're no smaller than 14, Any speed above the gigabit threshold
177
+ // acts as a multiplier for the text size.
178
+ // ---
179
+ ["/", ["get", "average_download_speed"], GIGABIT_BROADBAND_SPEED / 4],
180
+ ["+", 14, ["var", "multiplier"]],
181
+ ],
182
+ "text-offset": [0, 0],
183
+ "text-line-height": 1.2,
184
+ "text-pitch-alignment": "viewport",
185
+ "text-variable-anchor": ["center"],
186
+ "text-padding": 10,
187
+ "text-anchor": "center",
188
+ "text-font": ["Fira Code Medium"],
189
+ },
190
+ paint: {
191
+ "text-halo-width": 2,
192
+ "text-halo-color": [
193
+ // ---
194
+ "interpolate",
195
+ ["exponential", 0.5],
196
+ ["get", "average_download_speed"],
197
+ GIGABIT_BROADBAND_SPEED / 4,
198
+ "#fff",
199
+ GIGABIT_BROADBAND_SPEED,
200
+ "#000",
201
+ ],
202
+ "text-color": [
203
+ // ---
204
+ "interpolate",
205
+ ["exponential", 0.25],
206
+ ["get", "average_download_speed"],
207
+ GIGABIT_BROADBAND_SPEED / 4,
208
+ interpolateTurbo(0),
209
+ GIGABIT_BROADBAND_SPEED / 2,
210
+ interpolateTurbo(0.25),
211
+ GIGABIT_BROADBAND_SPEED,
212
+ interpolateTurbo(0.5),
213
+ GIGABIT_BROADBAND_SPEED * 2,
214
+ interpolateTurbo(0.75),
215
+ GIGABIT_BROADBAND_SPEED * 4,
216
+ interpolateTurbo(1),
217
+ ],
218
+ },
219
+ }),
220
+ {
221
+ afterID: "blocks-underserved",
222
+ type: "line",
223
+ source: "composite",
224
+ id: "lm-routes",
225
+ paint: {
226
+ "line-color": "#ff009c",
227
+ "line-width": [
228
+ "interpolate",
229
+ ["exponential", 1.6],
230
+ ["zoom"],
231
+ // ---
232
+ 3,
233
+ 0,
234
+ 6,
235
+ 1.1,
236
+ 12,
237
+ 1.6,
238
+ 15,
239
+ 5,
240
+ 18,
241
+ 15,
242
+ ],
243
+ },
244
+ layout: {
245
+ "line-cap": "round",
246
+ },
247
+ "source-layer": "CENTURYLINK_ROUTE",
248
+ },
249
+ ...createBDCLayer({
250
+ afterID: "earth",
251
+ id: "coverage-fiber-heat",
252
+ filter: [
253
+ // ---
254
+ "all",
255
+ ["==", ["get", "provider_id"], 131425],
256
+ ],
257
+ minzoom: 10,
258
+ type: "heatmap",
259
+ layout: {
260
+ visibility: "none",
261
+ },
262
+ paint: {
263
+ "heatmap-color": [
264
+ // ---
265
+ "interpolate",
266
+ ["linear"],
267
+ ["heatmap-density"],
268
+ ...Array.from({ length: 10 }, (_, i) => {
269
+ return [i / 10, interpolateTurbo(i / 10)];
270
+ }).flat(),
271
+ ],
272
+ "heatmap-radius": [
273
+ // ---
274
+ "interpolate",
275
+ ["linear"],
276
+ ["zoom"],
277
+ 10,
278
+ 5,
279
+ 15,
280
+ 20,
281
+ ],
282
+ "heatmap-weight": [
283
+ // ---
284
+ "*",
285
+ ["get", "land_area_sqm"],
286
+ 0.00001,
287
+ ],
288
+ },
289
+ }),
290
+ {
291
+ maxzoom: 13,
292
+ beforeID: "places_locality",
293
+ type: "circle",
294
+ id: "datacenter-marker",
295
+ source: "composite",
296
+ "source-layer": "DataCentersCombined20220921",
297
+ paint: {
298
+ "circle-color": "red",
299
+ "circle-stroke-color": "hsl(0, 0%, 100%)",
300
+ "circle-stroke-width": 2,
301
+ "circle-radius": ["interpolate", ["linear"], ["zoom"], 2, 3, 12, 5],
302
+ "circle-opacity": ["interpolate", ["linear"], ["zoom"], 2, 0.84, 3, 1, 22, 1],
303
+ },
304
+ layout: {
305
+ visibility: "none",
306
+ },
307
+ },
308
+ {
309
+ maxzoom: 13,
310
+ minzoom: 8,
311
+ afterID: "datacenter-marker",
312
+ id: "datacenter-label",
313
+ type: "symbol",
314
+ source: "composite",
315
+ "source-layer": "DataCentersCombined20220921",
316
+ layout: {
317
+ // visibility: "none",
318
+ "text-field": ["get", "Category"],
319
+ "text-size": 12,
320
+ "text-anchor": "top",
321
+ "text-offset": [0, 0.5],
322
+ // "text-allow-overlap": true,
323
+ "text-font": ["Fira Code Regular"],
324
+ },
325
+ paint: {
326
+ "text-color": "#fff",
327
+ "text-halo-color": "#fb8429",
328
+ "text-halo-width": 1,
329
+ "text-opacity": [
330
+ // We fade out the outline at higher zoom levels
331
+ "interpolate",
332
+ ["linear"],
333
+ ["zoom"],
334
+ 1,
335
+ 0.01,
336
+ 6,
337
+ 0.5,
338
+ 16,
339
+ 1,
340
+ ],
341
+ },
342
+ },
343
+ ];
344
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../bdc/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * The "fog of war" address-COVERAGE overlay. An H3 hexbin tileset (built by
7
+ * `scripts/build-coverage-tiles.ts`) shades each area by how much address-point data we hold:
8
+ * covered → clear (the basemap shows through), empty → opaque gray fog. Answers "where do we need
9
+ * more data" at a glance, and reveals the "looks covered until you zoom in, then it goes gray" gaps.
10
+ *
11
+ * Each cell carries TWO baked fog values in [0,1] (0 = covered, 1 = empty), so the same tiles drive
12
+ * either reading without a rebuild:
13
+ * • `fog_opt` — optimistic: partial coverage lifted toward clear, so a region "looks covered" when
14
+ * zoomed out and the gaps only surface on zoom-in.
15
+ * • `fog` — honest: true coverage fraction, so the gap is visible even at low zoom.
16
+ * We expose each as its OWN default-off fill layer (`coverage-opt-fog`, `coverage-honest-fog`) so the
17
+ * demo's LayerToggleControl gives each its own checkbox — pick the reading you want, no extra UI.
18
+ *
19
+ * Served as XYZ vector tiles by the tile worker from `nexus-assets/tiles/coverage-us-v4.pmtiles` (same
20
+ * as `basemap-v4`); the consumer passes its TileJSON URL (`tiles.sister.software/coverage-us-v4.json`)
21
+ * to `createCoverageSource`.
22
+ */
23
+ import type { FillLayerSpecification, VectorSourceSpecification } from "@maplibre/maplibre-gl-style-spec";
24
+ import { TileSetSourceID } from "../styles/sources.js";
25
+ export declare const CoverageTileSetID: TileSetSourceID<"coverage-us-v4">;
26
+ /**
27
+ * The single source-layer the coverage PMTiles ships (see `build-coverage-tiles.ts` → tippecanoe `-l`).
28
+ */
29
+ export declare const COVERAGE_SOURCE_LAYER = "coverage";
30
+ /**
31
+ * Fog tint — a near-black indigo reading as "unknown / unsurveyed". Pushed dark (vs a mid indigo) so it
32
+ * holds contrast over the demo's terrain+hillshade basemap, which is itself dark-green over forest where
33
+ * a lighter fog would simply vanish.
34
+ */
35
+ export declare const COVERAGE_FOG_COLOR = "#663399";
36
+ /**
37
+ * Opacity of a fully-empty (`fog = 1`) cell. Covered cells scale down from here toward transparent.
38
+ */
39
+ export declare const COVERAGE_MAX_FOG_OPACITY = 0.9;
40
+ /**
41
+ * Layer IDs, exported so the demo (toggle wiring, imperative add) and tests can reference them.
42
+ */
43
+ export declare const CoverageLayerID: {
44
+ readonly optimistic: "coverage-opt-fog";
45
+ readonly honest: "coverage-honest-fog";
46
+ };
47
+ /**
48
+ * Build the coverage source spec from the tile worker's TileJSON endpoint
49
+ * (`https://tiles.sister.software/coverage-us-v4.json`).
50
+ */
51
+ export declare function createCoverageSource(url: string): VectorSourceSpecification;
52
+ /**
53
+ * The two default-off fog fills (optimistic + honest). Plain MapLibre specs — the demo adds them
54
+ * imperatively on map-load with a `beforeId` of the first symbol layer, so the fog sits beneath place
55
+ * labels but above basemap geometry (roads/water vanish under fog where we have no data).
56
+ */
57
+ export declare const CoverageLayers: FillLayerSpecification[];
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../coverage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACX,sBAAsB,EACtB,yBAAyB,EACzB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,eAAO,MAAM,iBAAiB,mCAAoC,CAAA;AAElE;;GAEG;AACH,eAAO,MAAM,qBAAqB,aAAa,CAAA;AAE/C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAA;AAE3C;;GAEG;AACH,eAAO,MAAM,wBAAwB,MAAM,CAAA;AAE3C;;GAEG;AACH,eAAO,MAAM,eAAe;;;CAGlB,CAAA;AAEV;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAE3E;AAkBD;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,sBAAsB,EAGlD,CAAA"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * The "fog of war" address-COVERAGE overlay. An H3 hexbin tileset (built by
7
+ * `scripts/build-coverage-tiles.ts`) shades each area by how much address-point data we hold:
8
+ * covered → clear (the basemap shows through), empty → opaque gray fog. Answers "where do we need
9
+ * more data" at a glance, and reveals the "looks covered until you zoom in, then it goes gray" gaps.
10
+ *
11
+ * Each cell carries TWO baked fog values in [0,1] (0 = covered, 1 = empty), so the same tiles drive
12
+ * either reading without a rebuild:
13
+ * • `fog_opt` — optimistic: partial coverage lifted toward clear, so a region "looks covered" when
14
+ * zoomed out and the gaps only surface on zoom-in.
15
+ * • `fog` — honest: true coverage fraction, so the gap is visible even at low zoom.
16
+ * We expose each as its OWN default-off fill layer (`coverage-opt-fog`, `coverage-honest-fog`) so the
17
+ * demo's LayerToggleControl gives each its own checkbox — pick the reading you want, no extra UI.
18
+ *
19
+ * Served as XYZ vector tiles by the tile worker from `nexus-assets/tiles/coverage-us-v4.pmtiles` (same
20
+ * as `basemap-v4`); the consumer passes its TileJSON URL (`tiles.sister.software/coverage-us-v4.json`)
21
+ * to `createCoverageSource`.
22
+ */
23
+ import { TileSetSourceID } from "../styles/sources.js";
24
+ export const CoverageTileSetID = TileSetSourceID("coverage-us-v4");
25
+ /**
26
+ * The single source-layer the coverage PMTiles ships (see `build-coverage-tiles.ts` → tippecanoe `-l`).
27
+ */
28
+ export const COVERAGE_SOURCE_LAYER = "coverage";
29
+ /**
30
+ * Fog tint — a near-black indigo reading as "unknown / unsurveyed". Pushed dark (vs a mid indigo) so it
31
+ * holds contrast over the demo's terrain+hillshade basemap, which is itself dark-green over forest where
32
+ * a lighter fog would simply vanish.
33
+ */
34
+ export const COVERAGE_FOG_COLOR = "#663399"; // Rebecca Purple
35
+ /**
36
+ * Opacity of a fully-empty (`fog = 1`) cell. Covered cells scale down from here toward transparent.
37
+ */
38
+ export const COVERAGE_MAX_FOG_OPACITY = 0.9;
39
+ /**
40
+ * Layer IDs, exported so the demo (toggle wiring, imperative add) and tests can reference them.
41
+ */
42
+ export const CoverageLayerID = {
43
+ optimistic: "coverage-opt-fog",
44
+ honest: "coverage-honest-fog",
45
+ };
46
+ /**
47
+ * Build the coverage source spec from the tile worker's TileJSON endpoint
48
+ * (`https://tiles.sister.software/coverage-us-v4.json`).
49
+ */
50
+ export function createCoverageSource(url) {
51
+ return { type: "vector", url };
52
+ }
53
+ function fogFill(id, fogProperty) {
54
+ return {
55
+ id,
56
+ type: "fill",
57
+ source: CoverageTileSetID,
58
+ "source-layer": COVERAGE_SOURCE_LAYER,
59
+ // Default OFF — an overlay, surfaced via the layer toggle, never on by default.
60
+ layout: { visibility: "none" },
61
+ paint: {
62
+ "fill-color": COVERAGE_FOG_COLOR,
63
+ // Opacity tracks the cell's fog value; coalesce guards a missing prop to 0 (fully clear).
64
+ "fill-opacity": ["*", ["coalesce", ["to-number", ["get", fogProperty]], 0], COVERAGE_MAX_FOG_OPACITY],
65
+ },
66
+ };
67
+ }
68
+ /**
69
+ * The two default-off fog fills (optimistic + honest). Plain MapLibre specs — the demo adds them
70
+ * imperatively on map-load with a `beforeId` of the first symbol layer, so the fog sits beneath place
71
+ * labels but above basemap geometry (roads/water vanish under fog where we have no data).
72
+ */
73
+ export const CoverageLayers = [
74
+ fogFill(CoverageLayerID.optimistic, "fog_opt"),
75
+ fogFill(CoverageLayerID.honest, "fog"),
76
+ ];
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../coverage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAA;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAA;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAA,CAAC,iBAAiB;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAA;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,UAAU,EAAE,kBAAkB;IAC9B,MAAM,EAAE,qBAAqB;CACpB,CAAA;AAEV;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;AAC/B,CAAC;AAED,SAAS,OAAO,CAAC,EAAU,EAAE,WAA8B;IAC1D,OAAO;QACN,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,iBAAiB;QACzB,cAAc,EAAE,qBAAqB;QACrC,gFAAgF;QAChF,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;QAC9B,KAAK,EAAE;YACN,YAAY,EAAE,kBAAkB;YAChC,0FAA0F;YAC1F,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,wBAAwB,CAAC;SACrG;KACD,CAAA;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAA6B;IACvD,OAAO,CAAC,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC;IAC9C,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;CACtC,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { TileSetSourceID } from "../styles/sources.js";
7
+ /**
8
+ * Identifier for the Health Service Provider Access tile set.
9
+ */
10
+ export declare const HSPATileSetID: TileSetSourceID<"HPSA_PNTPC_SHP_DET_CUR_VX">;
11
+ export declare const MUATileSetID: TileSetSourceID<"MUA_CMPPC_SHP_DET_CUR_VX">;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../hspa/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD;;GAEG;AACH,eAAO,MAAM,aAAa,8CAA+C,CAAA;AACzE,eAAO,MAAM,YAAY,6CAA8C,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ // import { LayerSpecificationListInput } from "../styles/layers.js"
7
+ import { TileSetSourceID } from "../styles/sources.js";
8
+ /**
9
+ * Identifier for the Health Service Provider Access tile set.
10
+ */
11
+ export const HSPATileSetID = TileSetSourceID("HPSA_PNTPC_SHP_DET_CUR_VX");
12
+ export const MUATileSetID = TileSetSourceID("MUA_CMPPC_SHP_DET_CUR_VX");
13
+ // export const MUALayers: LayerSpecificationListInput[] = [
14
+ // {
15
+ // "id": ""
16
+ // },
17
+ // ]
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../hspa/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oEAAoE;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC,2BAA2B,CAAC,CAAA;AACzE,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,0BAA0B,CAAC,CAAA;AAEvE,4DAA4D;AAC5D,KAAK;AACL,aAAa;AACb,MAAM;AACN,IAAI"}
package/out/index.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ export * from "./base/index.js";
7
+ export * from "./bdc/index.js";
8
+ export * from "./hspa/index.js";
9
+ export * from "./styles/index.js";
10
+ export * from "./tiger/index.js";
11
+ export * from "./tiles/index.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
package/out/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ export * from "./base/index.js";
7
+ export * from "./bdc/index.js";
8
+ export * from "./hspa/index.js";
9
+ export * from "./styles/index.js";
10
+ export * from "./tiger/index.js";
11
+ export * from "./tiles/index.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Race-by-dot-density overlay — the Cooper Center "Racial Dot Map" reading, on the demo. One dot
7
+ * per ~N people, placed at random inside its Census block (built by `scripts/census/race-dots.ts`
8
+ * + tippecanoe), colored by 2020 P.L. 94-171 race/ethnicity category.
9
+ *
10
+ * The PMTiles ships a single `dots` source-layer carrying a `cat` property; we expose each category
11
+ * as its OWN default-off circle layer (filtered on `cat`) so the demo's LayerToggleControl gives
12
+ * each its own checkbox — show the full mosaic, or isolate one group's geography, no extra UI.
13
+ * Same idiom as the coverage overlay.
14
+ *
15
+ * Served as XYZ vector tiles by the tile worker from `nexus-assets/tiles/race-dots-la.pmtiles`; the
16
+ * consumer passes its TileJSON URL (`tiles.sister.software/race-dots-la.json`) to
17
+ * `createRaceDotsSource`.
18
+ *
19
+ * The dot is a _representation_, not a record: a random position inside the block, standing in for
20
+ * ~N real people of that category. It says nothing about any individual address.
21
+ */
22
+ import type { CircleLayerSpecification, VectorSourceSpecification } from "@maplibre/maplibre-gl-style-spec";
23
+ import { TileSetSourceID } from "../styles/sources.js";
24
+ export declare const RaceDotsTileSetID: TileSetSourceID<"race-dots-la">;
25
+ /** The single source-layer the race-dots PMTiles ships (tippecanoe `-l dots`). */
26
+ export declare const RACE_DOTS_SOURCE_LAYER = "dots";
27
+ /** The togglable categories. Each becomes its own default-off layer + LayerToggleControl checkbox. */
28
+ export declare const RaceDotsCategories: readonly [{
29
+ readonly id: "race-dots-white";
30
+ readonly label: "Race · White";
31
+ readonly color: "#1f78b4";
32
+ readonly match: readonly ["white"];
33
+ }, {
34
+ readonly id: "race-dots-black";
35
+ readonly label: "Race · Black";
36
+ readonly color: "#33a02c";
37
+ readonly match: readonly ["black"];
38
+ }, {
39
+ readonly id: "race-dots-hispanic";
40
+ readonly label: "Race · Hispanic";
41
+ readonly color: "#ff7f00";
42
+ readonly match: readonly ["hispanic"];
43
+ }, {
44
+ readonly id: "race-dots-asian";
45
+ readonly label: "Race · Asian";
46
+ readonly color: "#e31a1c";
47
+ readonly match: readonly ["asian"];
48
+ }, {
49
+ readonly id: "race-dots-other";
50
+ readonly label: "Race · Other";
51
+ readonly color: "#8c6d31";
52
+ readonly match: readonly ["aian", "nhpi", "other", "multi"];
53
+ }];
54
+ /** Build the race-dots source spec from the tile worker's TileJSON endpoint. */
55
+ export declare function createRaceDotsSource(url: string): VectorSourceSpecification;
56
+ /**
57
+ * One default-off circle layer per category. Plain MapLibre specs — the demo adds them imperatively
58
+ * on map-load with a `beforeId` of the first symbol layer, so the dots sit beneath place labels.
59
+ */
60
+ export declare const RaceDotsLayers: CircleLayerSpecification[];
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../race-dots/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AAC3G,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,eAAO,MAAM,iBAAiB,iCAAkC,CAAA;AAEhE,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,SAAS,CAAA;AAE5C,sGAAsG;AACtG,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;EAMrB,CAAA;AAEV,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAE3E;AAmBD;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,wBAAwB,EAEpD,CAAA"}