@mailwoman/tiger 5.9.0 → 5.10.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 (80) hide show
  1. package/block-group.ts +4 -4
  2. package/class-code.ts +168 -166
  3. package/constants.ts +35 -28
  4. package/county-subdivision.ts +4 -4
  5. package/county.ts +4 -4
  6. package/files.ts +41 -32
  7. package/functional-status.ts +16 -14
  8. package/geoid.ts +13 -11
  9. package/index.ts +12 -12
  10. package/legal-statistical-area.ts +140 -137
  11. package/out/block-group.d.ts +4 -4
  12. package/out/class-code.d.ts +167 -166
  13. package/out/class-code.d.ts.map +1 -1
  14. package/out/class-code.js +166 -167
  15. package/out/class-code.js.map +1 -1
  16. package/out/constants.d.ts +31 -28
  17. package/out/constants.d.ts.map +1 -1
  18. package/out/constants.js +23 -26
  19. package/out/constants.js.map +1 -1
  20. package/out/county-subdivision.d.ts +4 -4
  21. package/out/county.d.ts +4 -4
  22. package/out/files.d.ts +35 -33
  23. package/out/files.d.ts.map +1 -1
  24. package/out/files.js +19 -21
  25. package/out/files.js.map +1 -1
  26. package/out/functional-status.d.ts +15 -14
  27. package/out/functional-status.d.ts.map +1 -1
  28. package/out/functional-status.js +14 -15
  29. package/out/functional-status.js.map +1 -1
  30. package/out/geoid.d.ts +20 -19
  31. package/out/geoid.d.ts.map +1 -1
  32. package/out/geoid.js +10 -11
  33. package/out/geoid.js.map +1 -1
  34. package/out/index.d.ts +12 -12
  35. package/out/legal-statistical-area.d.ts +138 -137
  36. package/out/legal-statistical-area.d.ts.map +1 -1
  37. package/out/legal-statistical-area.js +137 -138
  38. package/out/legal-statistical-area.js.map +1 -1
  39. package/out/sdk/index.d.ts +4 -4
  40. package/out/sdk/state/TIGERTabulatedBlockEntity.d.ts +1 -2
  41. package/out/sdk/state/TIGERTabulatedBlockEntity.d.ts.map +1 -1
  42. package/out/sdk/state/index.d.ts +3 -3
  43. package/out/state.d.ts +302 -297
  44. package/out/state.d.ts.map +1 -1
  45. package/out/state.js +181 -186
  46. package/out/state.js.map +1 -1
  47. package/out/tabulation-block.d.ts +3 -3
  48. package/out/tabulation-block.d.ts.map +1 -1
  49. package/out/tools/index.d.ts +15 -0
  50. package/out/tools/index.d.ts.map +1 -0
  51. package/out/tools/index.js +15 -0
  52. package/out/tools/index.js.map +1 -0
  53. package/out/tools/race-dots-map.d.ts +29 -5
  54. package/out/tools/race-dots-map.d.ts.map +1 -1
  55. package/out/tools/race-dots-map.js +53 -64
  56. package/out/tools/race-dots-map.js.map +1 -1
  57. package/out/tools/race-dots.d.ts +27 -7
  58. package/out/tools/race-dots.d.ts.map +1 -1
  59. package/out/tools/race-dots.js +85 -89
  60. package/out/tools/race-dots.js.map +1 -1
  61. package/out/tools/serve-range.d.ts +23 -4
  62. package/out/tools/serve-range.d.ts.map +1 -1
  63. package/out/tools/serve-range.js +47 -36
  64. package/out/tools/serve-range.js.map +1 -1
  65. package/out/tract.d.ts +3 -3
  66. package/out/tract.d.ts.map +1 -1
  67. package/out/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +31 -6
  69. package/sdk/fetch.ts +2 -2
  70. package/sdk/index.ts +4 -4
  71. package/sdk/redistricting.ts +2 -2
  72. package/sdk/state/index.ts +3 -3
  73. package/state.ts +193 -183
  74. package/tabulation-block.ts +20 -20
  75. package/tools/index.ts +15 -0
  76. package/tools/race-dots-map.ts +79 -70
  77. package/tools/race-dots.ts +127 -104
  78. package/tools/serve-range.ts +69 -38
  79. package/tract.ts +12 -12
  80. package/tsconfig.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA"}
@@ -8,12 +8,36 @@
8
8
  * inlined here, à la `registry/map-html.ts`) under a circle layer of the dots, colored by race
9
9
  * category. The dots PMTiles is read client-side via the `pmtiles` protocol.
10
10
  *
11
- * Each dot is one of `--per` people of a category, placed at random inside its Census block — a
11
+ * Each dot is one of `per` people of a category, placed at random inside its Census block — a
12
12
  * representation, not a record about any address. Serve over localhost (the house tile server
13
- * CORS-restricts to localhost + the docs domains).
13
+ * CORS-restricts to localhost + the docs domains) — `mailwoman tiger race-dots-map --serve` wires
14
+ * {@linkcode serveWithRangeSupport} for exactly this.
14
15
  *
15
- * Run: node --experimental-strip-types scripts/census/race-dots-map.ts\
16
- * --pmtiles-url http://localhost:8899/race-dots-oc.pmtiles --out /tmp/race-dots-oc.html
16
+ * Run: `mailwoman tiger race-dots-map --pmtiles-url
17
+ * http://localhost:8899/race-dots-oc.pmtiles --out /tmp/race-dots-oc.html`
17
18
  */
18
- export {};
19
+ /** Options for {@linkcode raceDotsMap}. */
20
+ export interface RaceDotsMapOptions {
21
+ /** Dots tileset URL the page reads client-side. Default `http://localhost:8899/race-dots-oc.pmtiles`. */
22
+ pmtilesURL?: string;
23
+ /** Output HTML path. Default `/tmp/race-dots-oc.html`. */
24
+ out?: string;
25
+ /** People represented by one dot (title/legend copy only). Default 5. */
26
+ per?: number;
27
+ /** Page title. Default derives from `per`. */
28
+ title?: string;
29
+ /** Initial map center longitude. Default -117.83 (Orange County, CA). */
30
+ lng?: number;
31
+ /** Initial map center latitude. Default 33.68. */
32
+ lat?: number;
33
+ /** Initial map zoom. Default 9.4. */
34
+ zoom?: number;
35
+ }
36
+ /** Result of {@linkcode raceDotsMap}. */
37
+ export interface RaceDotsMapResult {
38
+ outPath: string;
39
+ pmtilesURL: string;
40
+ }
41
+ /** Race-dots MapLibre page writer — see the module doc. */
42
+ export declare function raceDotsMap(options?: RaceDotsMapOptions, report?: (line: string) => void): Promise<RaceDotsMapResult>;
19
43
  //# sourceMappingURL=race-dots-map.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"race-dots-map.d.ts","sourceRoot":"","sources":["../../tools/race-dots-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
1
+ {"version":3,"file":"race-dots-map.d.ts","sourceRoot":"","sources":["../../tools/race-dots-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IAClC,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CAClB;AAkCD,2DAA2D;AAC3D,wBAAsB,WAAW,CAChC,OAAO,GAAE,kBAAuB,EAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CA6F5B"}
@@ -8,40 +8,15 @@
8
8
  * inlined here, à la `registry/map-html.ts`) under a circle layer of the dots, colored by race
9
9
  * category. The dots PMTiles is read client-side via the `pmtiles` protocol.
10
10
  *
11
- * Each dot is one of `--per` people of a category, placed at random inside its Census block — a
11
+ * Each dot is one of `per` people of a category, placed at random inside its Census block — a
12
12
  * representation, not a record about any address. Serve over localhost (the house tile server
13
- * CORS-restricts to localhost + the docs domains).
13
+ * CORS-restricts to localhost + the docs domains) — `mailwoman tiger race-dots-map --serve` wires
14
+ * {@linkcode serveWithRangeSupport} for exactly this.
14
15
  *
15
- * Run: node --experimental-strip-types scripts/census/race-dots-map.ts\
16
- * --pmtiles-url http://localhost:8899/race-dots-oc.pmtiles --out /tmp/race-dots-oc.html
16
+ * Run: `mailwoman tiger race-dots-map --pmtiles-url
17
+ * http://localhost:8899/race-dots-oc.pmtiles --out /tmp/race-dots-oc.html`
17
18
  */
18
19
  import { writeFileSync } from "node:fs";
19
- import { parseArgs } from "node:util";
20
- import { layers, namedFlavor } from "@protomaps/basemaps";
21
- // Loose scan parity with the retired local argv helpers: unknown flags tolerated.
22
- const { values: rawValues } = parseArgs({
23
- options: {
24
- lat: { type: "string" },
25
- lng: { type: "string" },
26
- out: { type: "string" },
27
- per: { type: "string" },
28
- "pmtiles-url": { type: "string" },
29
- title: { type: "string" },
30
- zoom: { type: "string" },
31
- },
32
- strict: false,
33
- allowPositionals: true,
34
- });
35
- // Typed view: strict:false loosens TS inference, but declared options always parse to their schema type.
36
- const values = rawValues;
37
- const PMTILES_URL = values["pmtiles-url"] || "http://localhost:8899/race-dots-oc.pmtiles";
38
- const OUT = values["out"] || "/tmp/race-dots-oc.html";
39
- const PER = Number(values["per"] || "5");
40
- const PER_PHRASE = PER === 1 ? "one dot is one person" : `one dot ≈ ${PER} people`;
41
- const TITLE = values["title"] || `Race in Orange County, CA — ${PER_PHRASE} (2020 Census)`;
42
- const CENTER_LNG = Number(values["lng"] || "-117.83");
43
- const CENTER_LAT = Number(values["lat"] || "33.68");
44
- const ZOOM = Number(values["zoom"] || "9.4");
45
20
  const MAPLIBRE_VERSION = "5.24.0";
46
21
  const MAPLIBRE_JS_SRI = "sha384-5+cfbwT0iiub6VsQAdn6yz16nr6sDiQoHx6tm4O8OVYXHYOxcffFmCJBL0dgdvGp";
47
22
  const MAPLIBRE_CSS_SRI = "sha384-uTttxo/aOKbdE5RlD/SPzSDoDmNvGlUYPjONi2MN/b7c9HPSvW07OIuyP7uL6jxK";
@@ -71,39 +46,51 @@ const CATEGORY_LABEL = {
71
46
  other: "Other (non-Hispanic)",
72
47
  multi: "Two or more races",
73
48
  };
74
- const colorMatch = ["match", ["get", "cat"]];
75
- for (const [cat, color] of Object.entries(CATEGORY_COLOR)) {
76
- colorMatch.push(cat, color);
77
- }
78
- colorMatch.push("#9e9e9e");
79
- const style = {
80
- version: 8,
81
- glyphs: GLYPHS_URL,
82
- sprite: SPRITE_URL,
83
- sources: {
84
- [BASEMAP_SOURCE_ID]: { type: "vector", url: BASEMAP_TILEJSON_URL },
85
- dots: { type: "vector", url: "pmtiles://" + PMTILES_URL },
86
- },
87
- layers: [
88
- ...layers(BASEMAP_SOURCE_ID, namedFlavor("light"), { lang: "en" }),
89
- {
90
- id: "race-dots",
91
- type: "circle",
92
- source: "dots",
93
- "source-layer": "dots",
94
- paint: {
95
- "circle-radius": ["interpolate", ["linear"], ["zoom"], 4, 0.7, 9, 1.7, 12, 2.8, 16, 4.5],
96
- "circle-color": colorMatch,
97
- "circle-opacity": 0.85,
98
- },
49
+ /** Race-dots MapLibre page writer — see the module doc. */
50
+ export async function raceDotsMap(options = {}, report) {
51
+ const PMTILES_URL = options.pmtilesURL || "http://localhost:8899/race-dots-oc.pmtiles";
52
+ const OUT = options.out || "/tmp/race-dots-oc.html";
53
+ const PER = options.per ?? 5;
54
+ const PER_PHRASE = PER === 1 ? "one dot is one person" : `one dot ≈ ${PER} people`;
55
+ const TITLE = options.title || `Race in Orange County, CA — ${PER_PHRASE} (2020 Census)`;
56
+ const CENTER_LNG = options.lng ?? -117.83;
57
+ const CENTER_LAT = options.lat ?? 33.68;
58
+ const ZOOM = options.zoom ?? 9.4;
59
+ // Heavy dep (devDependency — operator tooling), lazy-imported so loading the tools barrel stays cheap.
60
+ const { layers, namedFlavor } = await import("@protomaps/basemaps");
61
+ const colorMatch = ["match", ["get", "cat"]];
62
+ for (const [cat, color] of Object.entries(CATEGORY_COLOR)) {
63
+ colorMatch.push(cat, color);
64
+ }
65
+ colorMatch.push("#9e9e9e");
66
+ const style = {
67
+ version: 8,
68
+ glyphs: GLYPHS_URL,
69
+ sprite: SPRITE_URL,
70
+ sources: {
71
+ [BASEMAP_SOURCE_ID]: { type: "vector", url: BASEMAP_TILEJSON_URL },
72
+ dots: { type: "vector", url: "pmtiles://" + PMTILES_URL },
99
73
  },
100
- ],
101
- };
102
- const legendRows = Object.keys(CATEGORY_COLOR)
103
- .map((c) => `<div><i style="background:${CATEGORY_COLOR[c]}"></i>${CATEGORY_LABEL[c]}</div>`)
104
- .join("");
105
- // The client script avoids template literals / `${` so it survives this outer template verbatim.
106
- const html = `<!doctype html>
74
+ layers: [
75
+ ...layers(BASEMAP_SOURCE_ID, namedFlavor("light"), { lang: "en" }),
76
+ {
77
+ id: "race-dots",
78
+ type: "circle",
79
+ source: "dots",
80
+ "source-layer": "dots",
81
+ paint: {
82
+ "circle-radius": ["interpolate", ["linear"], ["zoom"], 4, 0.7, 9, 1.7, 12, 2.8, 16, 4.5],
83
+ "circle-color": colorMatch,
84
+ "circle-opacity": 0.85,
85
+ },
86
+ },
87
+ ],
88
+ };
89
+ const legendRows = Object.keys(CATEGORY_COLOR)
90
+ .map((c) => `<div><i style="background:${CATEGORY_COLOR[c]}"></i>${CATEGORY_LABEL[c]}</div>`)
91
+ .join("");
92
+ // The client script avoids template literals / `${` so it survives this outer template verbatim.
93
+ const html = `<!doctype html>
107
94
  <html lang="en">
108
95
  <head>
109
96
  <meta charset="utf-8" />
@@ -142,6 +129,8 @@ const html = `<!doctype html>
142
129
  </body>
143
130
  </html>
144
131
  `;
145
- writeFileSync(OUT, html);
146
- console.error(`[written] ${OUT} (pmtiles: ${PMTILES_URL})`);
132
+ writeFileSync(OUT, html);
133
+ report?.(`[written] ${OUT} (pmtiles: ${PMTILES_URL})`);
134
+ return { outPath: OUT, pmtilesURL: PMTILES_URL };
135
+ }
147
136
  //# sourceMappingURL=race-dots-map.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"race-dots-map.js","sourceRoot":"","sources":["../../tools/race-dots-map.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"race-dots-map.js","sourceRoot":"","sources":["../../tools/race-dots-map.ts"],"names":[],"mappings":"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"}
@@ -7,19 +7,39 @@
7
7
  * `mailwoman tiger` CLI produces.
8
8
  *
9
9
  * Reads `tabblock20 ⋈ pl_block` (block geometry + Census 2020 P.L. 94-171 table P2 counts) and
10
- * scatters one dot per `--per` people uniformly at random inside each block, tagged with its
10
+ * scatters one dot per `per` people uniformly at random inside each block, tagged with its
11
11
  * race/ethnicity category. Output is NDJSON (one GeoJSON Point Feature per line, with a
12
12
  * `tippecanoe` layer hint) ready for `tippecanoe -o race-dots.pmtiles`.
13
13
  *
14
14
  * Point-in-polygon uses `@turf/boolean-contains` (ships with `@mailwoman/tiger`). The dot is a
15
15
  * _representation_, not a record: a random position inside the block it belongs to, standing in
16
- * for `--per` real people of that category. It says nothing about any individual address.
16
+ * for `per` real people of that category. It says nothing about any individual address.
17
17
  *
18
- * Build the input DB first: mailwoman tiger fetch --state 06 --county 059 --out tiger-oc.db
19
- * mailwoman tiger redistricting --state 06 --county 059 --out tiger-oc.db
18
+ * Build the input DB first: `mailwoman tiger fetch --state 06 --county 059 --out tiger-oc.db` then
19
+ * `mailwoman tiger redistricting --state 06 --county 059 --out tiger-oc.db`.
20
20
  *
21
- * Run: node --experimental-strip-types scripts/census/race-dots.ts\
22
- * --db tiger-oc.db --per 10 --out /tmp/race-dots.ndjson
21
+ * Run: `mailwoman tiger race-dots --db tiger-oc.db --per 10 --out /tmp/race-dots.ndjson`
23
22
  */
24
- export {};
23
+ /** Options for {@linkcode raceDots}. */
24
+ export interface RaceDotsOptions {
25
+ /** TIGER SQLite DB (`tabblock20` ⋈ `pl_block`). Default `$MAILWOMAN_DATA_ROOT/tiger/tiger-oc.db`. */
26
+ db?: string;
27
+ /** Output NDJSON path. Default `/tmp/race-dots.ndjson`. */
28
+ out?: string;
29
+ /** People represented by one dot. Default 10. */
30
+ per?: number;
31
+ /** Tippecanoe layer name. Default `dots`. */
32
+ layer?: string;
33
+ }
34
+ /** Result of {@linkcode raceDots}. */
35
+ export interface RaceDotsResult {
36
+ outPath: string;
37
+ dots: number;
38
+ skipped: number;
39
+ blocks: number;
40
+ /** Dots emitted per P2 category. */
41
+ totals: Record<string, number>;
42
+ }
43
+ /** Race-by-dot-density NDJSON builder — see the module doc. */
44
+ export declare function raceDots(options?: RaceDotsOptions, report?: (line: string) => void): Promise<RaceDotsResult>;
25
45
  //# sourceMappingURL=race-dots.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"race-dots.d.ts","sourceRoot":"","sources":["../../tools/race-dots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
1
+ {"version":3,"file":"race-dots.d.ts","sourceRoot":"","sources":["../../tools/race-dots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC/B,qGAAqG;IACrG,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B;AAmCD,+DAA+D;AAC/D,wBAAsB,QAAQ,CAC7B,OAAO,GAAE,eAAoB,EAC7B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,cAAc,CAAC,CA0GzB"}
@@ -7,37 +7,22 @@
7
7
  * `mailwoman tiger` CLI produces.
8
8
  *
9
9
  * Reads `tabblock20 ⋈ pl_block` (block geometry + Census 2020 P.L. 94-171 table P2 counts) and
10
- * scatters one dot per `--per` people uniformly at random inside each block, tagged with its
10
+ * scatters one dot per `per` people uniformly at random inside each block, tagged with its
11
11
  * race/ethnicity category. Output is NDJSON (one GeoJSON Point Feature per line, with a
12
12
  * `tippecanoe` layer hint) ready for `tippecanoe -o race-dots.pmtiles`.
13
13
  *
14
14
  * Point-in-polygon uses `@turf/boolean-contains` (ships with `@mailwoman/tiger`). The dot is a
15
15
  * _representation_, not a record: a random position inside the block it belongs to, standing in
16
- * for `--per` real people of that category. It says nothing about any individual address.
16
+ * for `per` real people of that category. It says nothing about any individual address.
17
17
  *
18
- * Build the input DB first: mailwoman tiger fetch --state 06 --county 059 --out tiger-oc.db
19
- * mailwoman tiger redistricting --state 06 --county 059 --out tiger-oc.db
18
+ * Build the input DB first: `mailwoman tiger fetch --state 06 --county 059 --out tiger-oc.db` then
19
+ * `mailwoman tiger redistricting --state 06 --county 059 --out tiger-oc.db`.
20
20
  *
21
- * Run: node --experimental-strip-types scripts/census/race-dots.ts\
22
- * --db tiger-oc.db --per 10 --out /tmp/race-dots.ndjson
21
+ * Run: `mailwoman tiger race-dots --db tiger-oc.db --per 10 --out /tmp/race-dots.ndjson`
23
22
  */
24
23
  import { createWriteStream } from "node:fs";
25
24
  import { DatabaseSync } from "node:sqlite";
26
- import { parseArgs } from "node:util";
27
25
  import { dataRootPath } from "@mailwoman/core/utils";
28
- import booleanContains from "@turf/boolean-contains";
29
- // Loose scan parity with the retired local argv helpers: unknown flags tolerated.
30
- const { values: rawValues } = parseArgs({
31
- options: { db: { type: "string" }, layer: { type: "string" }, out: { type: "string" }, per: { type: "string" } },
32
- strict: false,
33
- allowPositionals: true,
34
- });
35
- // Typed view: strict:false loosens TS inference, but declared options always parse to their schema type.
36
- const values = rawValues;
37
- const DB = values["db"] || dataRootPath("tiger", "tiger-oc.db");
38
- const OUT = values["out"] || "/tmp/race-dots.ndjson";
39
- const PER = Number(values["per"] || "10"); // people represented by one dot
40
- const LAYER = values["layer"] || "dots";
41
26
  // The eight P2 categories (columns in pl_block) that partition each block's population.
42
27
  const CATEGORIES = ["hispanic", "white", "black", "asian", "aian", "nhpi", "other", "multi"];
43
28
  function bbox(rings) {
@@ -58,80 +43,91 @@ function bbox(rings) {
58
43
  }
59
44
  return [minX, minY, maxX, maxY];
60
45
  }
61
- // A block geometry is one or more polygons. Pick a sub-polygon weighted by bbox area, then
62
- // rejection-sample inside it with a turf containment test (handles holes + winding correctly).
63
- function randomPointIn(polys, areas, totalArea) {
64
- let r = Math.random() * totalArea;
65
- let pick = 0;
66
- while (pick < polys.length - 1 && (r -= areas[pick]) > 0) {
67
- pick++;
68
- }
69
- const poly = polys[pick];
70
- const polyFeature = {
71
- type: "Feature",
72
- geometry: { type: "Polygon", coordinates: poly },
73
- properties: {},
74
- };
75
- const [minX, minY, maxX, maxY] = bbox(poly);
76
- for (let tries = 0; tries < 60; tries++) {
77
- const x = minX + Math.random() * (maxX - minX);
78
- const y = minY + Math.random() * (maxY - minY);
79
- const pt = { type: "Feature", geometry: { type: "Point", coordinates: [x, y] }, properties: {} };
80
- if (booleanContains(polyFeature, pt))
81
- return [x, y];
82
- }
83
- return null;
84
- }
85
- const db = new DatabaseSync(DB, { readOnly: true });
86
- const rows = db
87
- .prepare(`SELECT b.geometry AS geometry, ${CATEGORIES.map((c) => `p.${c} AS ${c}`).join(", ")}
88
- FROM tabblock20 b JOIN pl_block p ON b.GEOID = p.GEOID
89
- WHERE p.pop_total > 0`)
90
- .all();
91
- db.close();
92
- const out = createWriteStream(OUT);
93
- const totals = new Map();
94
- let dots = 0, skipped = 0;
95
- for (const row of rows) {
96
- let geom;
97
- try {
98
- geom = JSON.parse(row.geometry);
99
- }
100
- catch {
101
- continue;
46
+ /** Race-by-dot-density NDJSON builder — see the module doc. */
47
+ export async function raceDots(options = {}, report) {
48
+ const DB = options.db || dataRootPath("tiger", "tiger-oc.db");
49
+ const OUT = options.out || "/tmp/race-dots.ndjson";
50
+ const PER = options.per ?? 10; // people represented by one dot
51
+ const LAYER = options.layer || "dots";
52
+ // Heavy dep, lazy-imported so loading the tools barrel stays cheap.
53
+ const { default: booleanContains } = await import("@turf/boolean-contains");
54
+ // A block geometry is one or more polygons. Pick a sub-polygon weighted by bbox area, then
55
+ // rejection-sample inside it with a turf containment test (handles holes + winding correctly).
56
+ function randomPointIn(polys, areas, totalArea) {
57
+ let r = Math.random() * totalArea;
58
+ let pick = 0;
59
+ while (pick < polys.length - 1 && (r -= areas[pick]) > 0) {
60
+ pick++;
61
+ }
62
+ const poly = polys[pick];
63
+ const polyFeature = {
64
+ type: "Feature",
65
+ geometry: { type: "Polygon", coordinates: poly },
66
+ properties: {},
67
+ };
68
+ const [minX, minY, maxX, maxY] = bbox(poly);
69
+ for (let tries = 0; tries < 60; tries++) {
70
+ const x = minX + Math.random() * (maxX - minX);
71
+ const y = minY + Math.random() * (maxY - minY);
72
+ const pt = { type: "Feature", geometry: { type: "Point", coordinates: [x, y] }, properties: {} };
73
+ if (booleanContains(polyFeature, pt))
74
+ return [x, y];
75
+ }
76
+ return null;
102
77
  }
103
- const polys = geom.type === "Polygon" ? [geom.coordinates] : geom.coordinates;
104
- const areas = polys.map((p) => {
105
- const [a, b, c, d] = bbox(p);
106
- return Math.max((c - a) * (d - b), 1e-12);
107
- });
108
- const totalArea = areas.reduce((s, a) => s + a, 0);
109
- for (const cat of CATEGORIES) {
110
- const people = row[cat];
111
- if (people <= 0)
78
+ const db = new DatabaseSync(DB, { readOnly: true });
79
+ const rows = db
80
+ .prepare(`SELECT b.geometry AS geometry, ${CATEGORIES.map((c) => `p.${c} AS ${c}`).join(", ")}
81
+ FROM tabblock20 b JOIN pl_block p ON b.GEOID = p.GEOID
82
+ WHERE p.pop_total > 0`)
83
+ .all();
84
+ db.close();
85
+ const out = createWriteStream(OUT);
86
+ const totals = new Map();
87
+ let dots = 0, skipped = 0;
88
+ for (const row of rows) {
89
+ let geom;
90
+ try {
91
+ geom = JSON.parse(row.geometry);
92
+ }
93
+ catch {
112
94
  continue;
113
- const exact = people / PER;
114
- const n = Math.floor(exact) + (Math.random() < exact - Math.floor(exact) ? 1 : 0);
115
- for (let k = 0; k < n; k++) {
116
- const pt = randomPointIn(polys, areas, totalArea);
117
- if (!pt) {
118
- skipped++;
95
+ }
96
+ const polys = geom.type === "Polygon" ? [geom.coordinates] : geom.coordinates;
97
+ const areas = polys.map((p) => {
98
+ const [a, b, c, d] = bbox(p);
99
+ return Math.max((c - a) * (d - b), 1e-12);
100
+ });
101
+ const totalArea = areas.reduce((s, a) => s + a, 0);
102
+ for (const cat of CATEGORIES) {
103
+ const people = row[cat];
104
+ if (people <= 0)
119
105
  continue;
106
+ const exact = people / PER;
107
+ const n = Math.floor(exact) + (Math.random() < exact - Math.floor(exact) ? 1 : 0);
108
+ for (let k = 0; k < n; k++) {
109
+ const pt = randomPointIn(polys, areas, totalArea);
110
+ if (!pt) {
111
+ skipped++;
112
+ continue;
113
+ }
114
+ out.write(JSON.stringify({
115
+ type: "Feature",
116
+ tippecanoe: { layer: LAYER },
117
+ properties: { cat },
118
+ geometry: { type: "Point", coordinates: [Math.round(pt[0] * 1e5) / 1e5, Math.round(pt[1] * 1e5) / 1e5] },
119
+ }) + "\n");
120
+ dots++;
121
+ totals.set(cat, (totals.get(cat) ?? 0) + 1);
120
122
  }
121
- out.write(JSON.stringify({
122
- type: "Feature",
123
- tippecanoe: { layer: LAYER },
124
- properties: { cat },
125
- geometry: { type: "Point", coordinates: [Math.round(pt[0] * 1e5) / 1e5, Math.round(pt[1] * 1e5) / 1e5] },
126
- }) + "\n");
127
- dots++;
128
- totals.set(cat, (totals.get(cat) ?? 0) + 1);
129
123
  }
130
124
  }
131
- }
132
- out.end();
133
- console.error(`[done] ${dots} dots from ${rows.length} blocks (1 dot ≈ ${PER} people); ${skipped} skipped`);
134
- for (const [cat, n] of [...totals.entries()].sort((a, b) => b[1] - a[1])) {
135
- console.error(` ${n.toString().padStart(7)} ${cat}`);
125
+ out.end();
126
+ await new Promise((resolve) => out.on("finish", () => resolve()));
127
+ report?.(`[done] ${dots} dots from ${rows.length} blocks (1 dot ≈ ${PER} people); ${skipped} skipped`);
128
+ for (const [cat, n] of [...totals.entries()].sort((a, b) => b[1] - a[1])) {
129
+ report?.(` ${n.toString().padStart(7)} ${cat}`);
130
+ }
131
+ return { outPath: OUT, dots, skipped, blocks: rows.length, totals: Object.fromEntries(totals) };
136
132
  }
137
133
  //# sourceMappingURL=race-dots.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"race-dots.js","sourceRoot":"","sources":["../../tools/race-dots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,eAAe,MAAM,wBAAwB,CAAA;AAEpD,kFAAkF;AAClF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACvC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAChH,MAAM,EAAE,KAAK;IACb,gBAAgB,EAAE,IAAI;CACtB,CAAC,CAAA;AACF,yGAAyG;AACzG,MAAM,MAAM,GAAG,SAAwE,CAAA;AACvF,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;AAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAA;AACpD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAA,CAAC,gCAAgC;AAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAA;AAEvC,wFAAwF;AACxF,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,CAAA;AAKrG,SAAS,IAAI,CAAC,KAAoB;IACjC,IAAI,IAAI,GAAG,QAAQ,EAClB,IAAI,GAAG,QAAQ,EACf,IAAI,GAAG,CAAC,QAAQ,EAChB,IAAI,GAAG,CAAC,QAAQ,CAAA;IAEjB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;QAChC,IAAI,CAAE,GAAG,IAAI,EAAE,CAAC;YACf,IAAI,GAAG,CAAE,CAAA;QACV,CAAC;QAED,IAAI,CAAE,GAAG,IAAI,EAAE,CAAC;YACf,IAAI,GAAG,CAAE,CAAA;QACV,CAAC;QAED,IAAI,CAAE,GAAG,IAAI,EAAE,CAAC;YACf,IAAI,GAAG,CAAE,CAAA;QACV,CAAC;QAED,IAAI,CAAE,GAAG,IAAI,EAAE,CAAC;YACf,IAAI,GAAG,CAAE,CAAA;QACV,CAAC;IACF,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,2FAA2F;AAC3F,+FAA+F;AAC/F,SAAS,aAAa,CAAC,KAAsB,EAAE,KAAe,EAAE,SAAiB;IAChF,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAA;IACjC,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,IAAI,EAAE,CAAA;IACP,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAE,CAAA;IACzB,MAAM,WAAW,GAAG;QACnB,IAAI,EAAE,SAAkB;QACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,WAAW,EAAE,IAAI,EAAE;QACzD,UAAU,EAAE,EAAE;KACd,CAAA;IACD,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IAE3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;QAC9C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAkB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;QAElH,IAAI,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AACnD,MAAM,IAAI,GAAG,EAAE;KACb,OAAO,CACP,kCAAkC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;yBAE7D,CACvB;KACA,GAAG,EAA+E,CAAA;AACpF,EAAE,CAAC,KAAK,EAAE,CAAA;AAEV,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;AAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;AACxC,IAAI,IAAI,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,CAAA;AAEZ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IACxB,IAAI,IAA4C,CAAA;IAEhD,IAAI,CAAC;QACJ,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACR,SAAQ;IACT,CAAC;IACD,MAAM,KAAK,GACV,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAA4B,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,WAA+B,CAAA;IACtG,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAE5B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAElD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QAEvB,IAAI,MAAM,IAAI,CAAC;YAAE,SAAQ;QACzB,MAAM,KAAK,GAAG,MAAM,GAAG,GAAG,CAAA;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YAEjD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACT,OAAO,EAAE,CAAA;gBACT,SAAQ;YACT,CAAC;YACD,GAAG,CAAC,KAAK,CACR,IAAI,CAAC,SAAS,CAAC;gBACd,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC5B,UAAU,EAAE,EAAE,GAAG,EAAE;gBACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;aACxG,CAAC,GAAG,IAAI,CACT,CAAA;YACD,IAAI,EAAE,CAAA;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5C,CAAC;IACF,CAAC;AACF,CAAC;AAED,GAAG,CAAC,GAAG,EAAE,CAAA;AACT,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,cAAc,IAAI,CAAC,MAAM,oBAAoB,GAAG,aAAa,OAAO,UAAU,CAAC,CAAA;AAE3G,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;AACvD,CAAC"}
1
+ {"version":3,"file":"race-dots.js","sourceRoot":"","sources":["../../tools/race-dots.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,29 @@
5
5
  *
6
6
  * Minimal static file server that honours HTTP Range requests (206) — Python's `http.server` does
7
7
  * not, and PMTiles reads via Range, so it can't be served by it. Used to preview/render a local
8
- * `.pmtiles` tileset (e.g. the race-dot map). Not for production; the deployed tiles go through
9
- * the tile worker.
8
+ * `.pmtiles` tileset (e.g. the race-dot map, via `mailwoman tiger race-dots-map --serve`). Not for
9
+ * production; the deployed tiles go through the tile worker.
10
10
  *
11
- * Run: node scripts/census/serve-range.ts [dir=/tmp] [port=8899]
11
+ * Internal helper module — no standalone command.
12
12
  */
13
- export {};
13
+ import { type Server } from "node:http";
14
+ /** Options for {@linkcode serveWithRangeSupport}. */
15
+ export interface ServeRangeOptions {
16
+ /** Directory to serve. Default `/tmp`. */
17
+ dir?: string;
18
+ /** Port to listen on. Default 8899. */
19
+ port?: number;
20
+ }
21
+ /** A running range-capable static server, resolved once listening. */
22
+ export interface RangeServer {
23
+ dir: string;
24
+ port: number;
25
+ server: Server;
26
+ close: () => void;
27
+ }
28
+ /**
29
+ * Serve `dir` over localhost with HTTP Range support. Resolves once the server is listening; the caller owns the
30
+ * lifetime (`close()` to stop — commands typically hold the process open instead).
31
+ */
32
+ export declare function serveWithRangeSupport(options?: ServeRangeOptions, report?: (line: string) => void): Promise<RangeServer>;
14
33
  //# sourceMappingURL=serve-range.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve-range.d.ts","sourceRoot":"","sources":["../../tools/serve-range.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
1
+ {"version":3,"file":"serve-range.d.ts","sourceRoot":"","sources":["../../tools/serve-range.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAA;AAGhG,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IACjC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,IAAI,CAAA;CACjB;AAUD;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,GAAE,iBAAsB,EAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,WAAW,CAAC,CA2CtB"}