@mailwoman/tiger 1.0.0 → 4.13.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.
- package/out/sdk/fetch.d.ts +72 -0
- package/out/sdk/fetch.d.ts.map +1 -1
- package/out/sdk/fetch.js +267 -0
- package/out/sdk/fetch.js.map +1 -1
- package/out/sdk/index.d.ts +3 -0
- package/out/sdk/index.d.ts.map +1 -1
- package/out/sdk/index.js +3 -0
- package/out/sdk/index.js.map +1 -1
- package/out/sdk/redistricting.d.ts +57 -0
- package/out/sdk/redistricting.d.ts.map +1 -1
- package/out/sdk/redistricting.js +184 -0
- package/out/sdk/redistricting.js.map +1 -1
- package/out/sdk/schema.d.ts +88 -0
- package/out/sdk/schema.d.ts.map +1 -1
- package/out/sdk/schema.js +130 -0
- package/out/sdk/schema.js.map +1 -1
- package/out/sdk/state/TIGERTabulatedBlockEntity.d.ts +1 -1
- package/out/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -3
- package/sdk/fetch.ts +323 -0
- package/sdk/index.ts +3 -0
- package/sdk/redistricting.ts +223 -0
- package/sdk/schema.ts +203 -0
- package/sdk/initialize.sql +0 -161
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software.
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Pull TIGER geometry/attributes into a `node:sqlite` database via the Kysely
|
|
7
|
+
* {@link DatabaseClient}.
|
|
8
|
+
*
|
|
9
|
+
* Replaces the ad-hoc wget and the retired corpus TIGER build script. Pared down from isp-nexus's
|
|
10
|
+
* `generate-tiger-tiles.ts` (its per-level column mapping is the spec) into the playpen
|
|
11
|
+
* `repo-tools` idiom: an async generator of progress events, idempotent, no SpatiaLite.
|
|
12
|
+
*
|
|
13
|
+
* Three levels:
|
|
14
|
+
*
|
|
15
|
+
* - `tabblock20` (per state) — tabulation blocks → `tabblock20`, geometry as GeoJSON text.
|
|
16
|
+
* - `place` (per state) — incorporated/census places → `tiger_places` (attribute-only).
|
|
17
|
+
* - `addrfeat` (per county) — named street segments + ZIPs → `tiger_streets` (attribute-only).
|
|
18
|
+
*
|
|
19
|
+
* `tiger_streets` + `tiger_places` match the schema the corpus `tiger` adapter reads, so this is a
|
|
20
|
+
* drop-in replacement for the retired corpus TIGER build script.
|
|
21
|
+
*
|
|
22
|
+
* Flow per source unit: download (skips a valid cached zip) → unzip → stream `ogr2ogr -f
|
|
23
|
+
* GeoJSONSeq` (mapping shapefile columns to the schema, WGS84 for geometry levels) → batched
|
|
24
|
+
* inserts. Re-running a state replaces its rows.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Supported TIGER levels. `tabblock20` is per state + carries geometry; `place`/`addrfeat` are
|
|
28
|
+
* attribute-only.
|
|
29
|
+
*/
|
|
30
|
+
export type TIGERFetchLevel = "tabblock20" | "place" | "addrfeat";
|
|
31
|
+
export interface FetchTIGEROptions {
|
|
32
|
+
/** Two-digit state FIPS, e.g. `"06"`. */
|
|
33
|
+
stateFIPS: string;
|
|
34
|
+
/** TIGER level. Default `tabblock20`. */
|
|
35
|
+
level?: TIGERFetchLevel;
|
|
36
|
+
/** Vintage. Default 2020 for blocks (matches the 2020 P.L.), 2024 for place/addrfeat (current). */
|
|
37
|
+
vintage?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Output SQLite path. Default `<dataRoot>/tiger/tiger.db` (the name the corpus `tiger` adapter
|
|
40
|
+
* reads).
|
|
41
|
+
*/
|
|
42
|
+
outPath?: string;
|
|
43
|
+
/** Download cache + default output root. */
|
|
44
|
+
dataRoot?: string;
|
|
45
|
+
/** Optional three-digit county FIPS filter (blocks only — addrfeat is already per-county). */
|
|
46
|
+
county?: string;
|
|
47
|
+
/** Rows per insert. Default 1000. */
|
|
48
|
+
batchSize?: number;
|
|
49
|
+
}
|
|
50
|
+
export type FetchTIGEREvent = {
|
|
51
|
+
phase: "download";
|
|
52
|
+
file: string;
|
|
53
|
+
cached: boolean;
|
|
54
|
+
} | {
|
|
55
|
+
phase: "extract";
|
|
56
|
+
file: string;
|
|
57
|
+
} | {
|
|
58
|
+
phase: "load";
|
|
59
|
+
inserted: number;
|
|
60
|
+
total: number;
|
|
61
|
+
};
|
|
62
|
+
export interface FetchTIGERResult {
|
|
63
|
+
outPath: string;
|
|
64
|
+
table: string;
|
|
65
|
+
inserted: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Fetch one state's TIGER data at `level` into a SQLite DB. Yields progress; returns the final
|
|
69
|
+
* tally.
|
|
70
|
+
*/
|
|
71
|
+
export declare function fetchTIGER(options: FetchTIGEROptions): AsyncGenerator<FetchTIGEREvent, FetchTIGERResult>;
|
|
72
|
+
//# sourceMappingURL=fetch.d.ts.map
|
package/out/sdk/fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../sdk/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAiBH;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,OAAO,GAAG,UAAU,CAAA;AAajE,MAAM,WAAW,iBAAiB;IACjC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CAChB;
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../sdk/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAiBH;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,OAAO,GAAG,UAAU,CAAA;AAajE,MAAM,WAAW,iBAAiB;IACjC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CAChB;AA6GD;;;GAGG;AACH,wBAAuB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAAC,eAAe,EAAE,gBAAgB,CAAC,CA0H/G"}
|
package/out/sdk/fetch.js
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software.
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Pull TIGER geometry/attributes into a `node:sqlite` database via the Kysely
|
|
7
|
+
* {@link DatabaseClient}.
|
|
8
|
+
*
|
|
9
|
+
* Replaces the ad-hoc wget and the retired corpus TIGER build script. Pared down from isp-nexus's
|
|
10
|
+
* `generate-tiger-tiles.ts` (its per-level column mapping is the spec) into the playpen
|
|
11
|
+
* `repo-tools` idiom: an async generator of progress events, idempotent, no SpatiaLite.
|
|
12
|
+
*
|
|
13
|
+
* Three levels:
|
|
14
|
+
*
|
|
15
|
+
* - `tabblock20` (per state) — tabulation blocks → `tabblock20`, geometry as GeoJSON text.
|
|
16
|
+
* - `place` (per state) — incorporated/census places → `tiger_places` (attribute-only).
|
|
17
|
+
* - `addrfeat` (per county) — named street segments + ZIPs → `tiger_streets` (attribute-only).
|
|
18
|
+
*
|
|
19
|
+
* `tiger_streets` + `tiger_places` match the schema the corpus `tiger` adapter reads, so this is a
|
|
20
|
+
* drop-in replacement for the retired corpus TIGER build script.
|
|
21
|
+
*
|
|
22
|
+
* Flow per source unit: download (skips a valid cached zip) → unzip → stream `ogr2ogr -f
|
|
23
|
+
* GeoJSONSeq` (mapping shapefile columns to the schema, WGS84 for geometry levels) → batched
|
|
24
|
+
* inserts. Re-running a state replaces its rows.
|
|
25
|
+
*/
|
|
26
|
+
import { DatabaseClient } from "@mailwoman/core/kysley/client";
|
|
27
|
+
import { spawn } from "node:child_process";
|
|
28
|
+
import { createWriteStream, existsSync } from "node:fs";
|
|
29
|
+
import { mkdir, rename } from "node:fs/promises";
|
|
30
|
+
import { dirname, join } from "node:path";
|
|
31
|
+
import { createInterface } from "node:readline";
|
|
32
|
+
import { DatabaseSync } from "node:sqlite";
|
|
33
|
+
import { Readable } from "node:stream";
|
|
34
|
+
import { pipeline } from "node:stream/promises";
|
|
35
|
+
import { initializeTIGERSchema, TIGER_PRAGMAS } from "./schema.js";
|
|
36
|
+
const CENSUS_HOST = "https://www2.census.gov";
|
|
37
|
+
const DEFAULT_DATA_ROOT = process.env.MAILWOMAN_DATA_ROOT ?? "/mnt/playpen/mailwoman-data";
|
|
38
|
+
const LEVEL_DIR = {
|
|
39
|
+
tabblock20: "TABBLOCK20",
|
|
40
|
+
place: "PLACE",
|
|
41
|
+
addrfeat: "ADDRFEAT",
|
|
42
|
+
};
|
|
43
|
+
const LEVEL_TABLE = {
|
|
44
|
+
tabblock20: "tabblock20",
|
|
45
|
+
place: "tiger_places",
|
|
46
|
+
addrfeat: "tiger_streets",
|
|
47
|
+
};
|
|
48
|
+
/** The isp-nexus column map for `tabblock20`. Geometry rides along implicitly. */
|
|
49
|
+
function blockSelectSQL(layer, county) {
|
|
50
|
+
const where = county ? ` WHERE COUNTYFP20 = '${county}'` : "";
|
|
51
|
+
return (`SELECT GEOID20 AS GEOID, STATEFP20 AS state_code, COUNTYFP20 AS county_code, ` +
|
|
52
|
+
`SUBSTR(GEOID20, 6, 6) AS tract_code, ` +
|
|
53
|
+
`SUBSTR(GEOID20, 12, 1) AS block_group_code, BLOCKCE20 AS block_code, ` +
|
|
54
|
+
`UACE20 AS urbanized_area_code, UR20 AS urban_rural_code, ` +
|
|
55
|
+
`HOUSING20 AS housing_unit_count, ALAND20 AS land_area_sqm, AWATER20 AS water_area_sqm, ` +
|
|
56
|
+
`POP20 AS population FROM "${layer}"${where}`);
|
|
57
|
+
}
|
|
58
|
+
function selectSQL(level, layer, county) {
|
|
59
|
+
switch (level) {
|
|
60
|
+
case "tabblock20":
|
|
61
|
+
return blockSelectSQL(layer, county);
|
|
62
|
+
case "place":
|
|
63
|
+
return `SELECT GEOID AS geoid, NAME AS name, STATEFP AS statefp, LSAD AS lsad, NAMELSAD AS namelsad, CLASSFP AS classfp FROM "${layer}"`;
|
|
64
|
+
case "addrfeat":
|
|
65
|
+
// ADDRFEAT has no STATEFP column — injected per-row from the state we're fetching.
|
|
66
|
+
return `SELECT LINEARID AS linearid, FULLNAME AS fullname, ZIPL AS zipl, ZIPR AS zipr FROM "${layer}" WHERE FULLNAME IS NOT NULL AND FULLNAME != ''`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function buildRow(level, p, geometry, state) {
|
|
70
|
+
switch (level) {
|
|
71
|
+
case "place":
|
|
72
|
+
return {
|
|
73
|
+
geoid: String(p.geoid),
|
|
74
|
+
name: String(p.name ?? ""),
|
|
75
|
+
statefp: String(p.statefp ?? state),
|
|
76
|
+
lsad: p.lsad || null,
|
|
77
|
+
namelsad: p.namelsad || null,
|
|
78
|
+
classfp: p.classfp || null,
|
|
79
|
+
};
|
|
80
|
+
case "addrfeat":
|
|
81
|
+
return {
|
|
82
|
+
linearid: String(p.linearid),
|
|
83
|
+
fullname: String(p.fullname ?? ""),
|
|
84
|
+
zipl: p.zipl || null,
|
|
85
|
+
zipr: p.zipr || null,
|
|
86
|
+
statefp: state,
|
|
87
|
+
};
|
|
88
|
+
case "tabblock20":
|
|
89
|
+
return {
|
|
90
|
+
GEOID: String(p.GEOID),
|
|
91
|
+
state_code: String(p.state_code),
|
|
92
|
+
county_code: String(p.county_code),
|
|
93
|
+
tract_code: String(p.tract_code ?? ""),
|
|
94
|
+
block_group_code: String(p.block_group_code ?? ""),
|
|
95
|
+
block_code: String(p.block_code ?? ""),
|
|
96
|
+
urbanized_area_code: p.urbanized_area_code || null,
|
|
97
|
+
urban_rural_code: p.urban_rural_code || null,
|
|
98
|
+
housing_unit_count: Number(p.housing_unit_count ?? 0),
|
|
99
|
+
land_area_sqm: Number(p.land_area_sqm ?? 0),
|
|
100
|
+
water_area_sqm: Number(p.water_area_sqm ?? 0),
|
|
101
|
+
population: Number(p.population ?? 0),
|
|
102
|
+
geometry: JSON.stringify(geometry),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function runCapture(cmd, args) {
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
const child = spawn(cmd, args);
|
|
109
|
+
let out = "";
|
|
110
|
+
let err = "";
|
|
111
|
+
child.stdout.on("data", (d) => (out += d));
|
|
112
|
+
child.stderr.on("data", (d) => (err += d));
|
|
113
|
+
child.on("error", reject);
|
|
114
|
+
child.on("close", (code) => code === 0 ? resolve(out) : reject(new Error(`${cmd} exited ${code}: ${err.slice(0, 500)}`)));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async function downloadIfNeeded(url, dest) {
|
|
118
|
+
if (existsSync(dest)) {
|
|
119
|
+
try {
|
|
120
|
+
await runCapture("unzip", ["-tq", dest]);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// corrupt cache — re-download
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const tmp = dest + ".tmp";
|
|
128
|
+
const res = await fetch(url, { redirect: "follow" });
|
|
129
|
+
if (!res.ok || !res.body)
|
|
130
|
+
throw new Error(`HTTP ${res.status} fetching ${url}`);
|
|
131
|
+
await pipeline(Readable.fromWeb(res.body), createWriteStream(tmp));
|
|
132
|
+
await rename(tmp, dest);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
/** Scrape the ADDRFEAT directory listing for a state's county FIPS codes. */
|
|
136
|
+
async function discoverCounties(state, vintage) {
|
|
137
|
+
const res = await fetch(`${CENSUS_HOST}/geo/tiger/TIGER${vintage}/ADDRFEAT/`, { redirect: "follow" });
|
|
138
|
+
if (!res.ok)
|
|
139
|
+
throw new Error(`HTTP ${res.status} listing ADDRFEAT for vintage ${vintage}`);
|
|
140
|
+
const html = await res.text();
|
|
141
|
+
const re = new RegExp(`tl_${vintage}_${state}(\\d{3})_addrfeat\\.zip`, "g");
|
|
142
|
+
const counties = new Set();
|
|
143
|
+
for (let m = re.exec(html); m; m = re.exec(html))
|
|
144
|
+
counties.add(m[1]);
|
|
145
|
+
return [...counties].sort();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Fetch one state's TIGER data at `level` into a SQLite DB. Yields progress; returns the final
|
|
149
|
+
* tally.
|
|
150
|
+
*/
|
|
151
|
+
export async function* fetchTIGER(options) {
|
|
152
|
+
const level = options.level ?? "tabblock20";
|
|
153
|
+
const vintage = options.vintage ?? (level === "tabblock20" ? 2020 : 2024);
|
|
154
|
+
const dataRoot = options.dataRoot ?? DEFAULT_DATA_ROOT;
|
|
155
|
+
const batchSize = options.batchSize ?? 1000;
|
|
156
|
+
const state = options.stateFIPS;
|
|
157
|
+
const table = LEVEL_TABLE[level];
|
|
158
|
+
const cacheDir = join(dataRoot, "tiger", String(vintage), state);
|
|
159
|
+
// Default to a stable, vintage-agnostic `tiger.db` — the filename the corpus `tiger` adapter reads
|
|
160
|
+
// (run-corpus-build → `${ROOT}/tiger/tiger.db`). The vintage is a content detail, not a path one;
|
|
161
|
+
// the per-table idempotent delete keeps a re-fetch (newer vintage) clean. The download CACHE stays
|
|
162
|
+
// vintage-partitioned below so zips don't collide across vintages.
|
|
163
|
+
const outPath = options.outPath ?? join(dataRoot, "tiger", "tiger.db");
|
|
164
|
+
await mkdir(cacheDir, { recursive: true });
|
|
165
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
166
|
+
// Source units: one (per-state) for block/place; one per county for addrfeat.
|
|
167
|
+
const geoCodes = level === "addrfeat" ? await discoverCounties(state, vintage) : [""];
|
|
168
|
+
if (level === "addrfeat" && geoCodes.length === 0) {
|
|
169
|
+
throw new Error(`No ADDRFEAT counties found for state ${state} vintage ${vintage}`);
|
|
170
|
+
}
|
|
171
|
+
const db = new DatabaseSync(outPath);
|
|
172
|
+
db.exec(TIGER_PRAGMAS);
|
|
173
|
+
const kdb = new DatabaseClient({ database: db });
|
|
174
|
+
await initializeTIGERSchema(kdb);
|
|
175
|
+
const insertBatch = async (rows) => {
|
|
176
|
+
if (level === "tabblock20")
|
|
177
|
+
await kdb
|
|
178
|
+
.insertInto("tabblock20")
|
|
179
|
+
.values(rows)
|
|
180
|
+
.execute();
|
|
181
|
+
else if (level === "place")
|
|
182
|
+
await kdb
|
|
183
|
+
.insertInto("tiger_places")
|
|
184
|
+
.values(rows)
|
|
185
|
+
.execute();
|
|
186
|
+
else
|
|
187
|
+
await kdb
|
|
188
|
+
.insertInto("tiger_streets")
|
|
189
|
+
.values(rows)
|
|
190
|
+
.execute();
|
|
191
|
+
};
|
|
192
|
+
try {
|
|
193
|
+
// Idempotent re-run: drop this state's rows first (state_code for blocks, statefp otherwise).
|
|
194
|
+
if (level === "tabblock20")
|
|
195
|
+
await kdb.deleteFrom("tabblock20").where("state_code", "=", state).execute();
|
|
196
|
+
else if (level === "place")
|
|
197
|
+
await kdb.deleteFrom("tiger_places").where("statefp", "=", state).execute();
|
|
198
|
+
else
|
|
199
|
+
await kdb.deleteFrom("tiger_streets").where("statefp", "=", state).execute();
|
|
200
|
+
let inserted = 0;
|
|
201
|
+
let batch = [];
|
|
202
|
+
const flush = async () => {
|
|
203
|
+
if (!batch.length)
|
|
204
|
+
return;
|
|
205
|
+
const rows = batch;
|
|
206
|
+
batch = [];
|
|
207
|
+
await insertBatch(rows);
|
|
208
|
+
inserted += rows.length;
|
|
209
|
+
};
|
|
210
|
+
for (const geo of geoCodes) {
|
|
211
|
+
const unit = level === "addrfeat" ? state + geo : state;
|
|
212
|
+
const zipName = `tl_${vintage}_${unit}_${level}.zip`;
|
|
213
|
+
const zipPath = join(cacheDir, zipName);
|
|
214
|
+
const url = `${CENSUS_HOST}/geo/tiger/TIGER${vintage}/${LEVEL_DIR[level]}/${zipName}`;
|
|
215
|
+
const cached = await downloadIfNeeded(url, zipPath);
|
|
216
|
+
yield { phase: "download", file: zipName, cached };
|
|
217
|
+
await runCapture("unzip", ["-o", "-q", zipPath, "-d", cacheDir]);
|
|
218
|
+
const layer = `tl_${vintage}_${unit}_${level}`;
|
|
219
|
+
const shpPath = join(cacheDir, layer + ".shp");
|
|
220
|
+
yield { phase: "extract", file: layer + ".shp" };
|
|
221
|
+
const child = spawn("ogr2ogr", [
|
|
222
|
+
"-f",
|
|
223
|
+
"GeoJSONSeq",
|
|
224
|
+
"-t_srs",
|
|
225
|
+
"EPSG:4326",
|
|
226
|
+
"-sql",
|
|
227
|
+
selectSQL(level, layer, options.county),
|
|
228
|
+
"/vsistdout/",
|
|
229
|
+
shpPath,
|
|
230
|
+
], { stdio: ["ignore", "pipe", "pipe"] });
|
|
231
|
+
let stderr = "";
|
|
232
|
+
child.stderr.on("data", (d) => (stderr += d));
|
|
233
|
+
const exited = new Promise((resolve) => child.on("close", (code) => resolve(code ?? 0)));
|
|
234
|
+
for await (const line of createInterface({ input: child.stdout, crlfDelay: Infinity })) {
|
|
235
|
+
if (!line)
|
|
236
|
+
continue;
|
|
237
|
+
let feat;
|
|
238
|
+
try {
|
|
239
|
+
feat = JSON.parse(line);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (!feat.properties)
|
|
245
|
+
continue;
|
|
246
|
+
if (level === "tabblock20" && !feat.geometry)
|
|
247
|
+
continue;
|
|
248
|
+
batch.push(buildRow(level, feat.properties, feat.geometry, state));
|
|
249
|
+
if (batch.length >= batchSize) {
|
|
250
|
+
await flush();
|
|
251
|
+
yield { phase: "load", inserted, total: 0 };
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
await flush();
|
|
255
|
+
const code = await exited;
|
|
256
|
+
if (code !== 0)
|
|
257
|
+
throw new Error(`ogr2ogr exited ${code} on ${layer}: ${stderr.slice(0, 500)}`);
|
|
258
|
+
yield { phase: "load", inserted, total: 0 };
|
|
259
|
+
}
|
|
260
|
+
db.exec("PRAGMA wal_checkpoint(TRUNCATE);");
|
|
261
|
+
return { outPath, table, inserted };
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
await kdb.destroy();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=fetch.js.map
|
package/out/sdk/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../sdk/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../sdk/fetch.ts"],"names":[],"mappings":"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"}
|
package/out/sdk/index.d.ts
CHANGED
package/out/sdk/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA"}
|
package/out/sdk/index.js
CHANGED
package/out/sdk/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software.
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Pull a state's Census 2020 P.L. 94-171 redistricting counts (table P2 — Hispanic-or-Latino by
|
|
7
|
+
* race, per block) into the `pl_block` table of a TIGER {@link DatabaseClient} DB, keyed on the
|
|
8
|
+
* same 15-char block `GEOID` as {@link fetchTIGER}'s `tabblock20`. Join the two for block-level
|
|
9
|
+
* race + geometry (e.g. a dot-density map).
|
|
10
|
+
*
|
|
11
|
+
* Keyless public data. The per-state ZIP holds a pipe-delimited geographic header
|
|
12
|
+
* (`<st>geo<yr>.pl`) and three data segments; segment 1 (`<st>00001<yr>.pl`) carries P1 + P2. We
|
|
13
|
+
* join the header (filtered to SUMLEV 750 = block) to segment 1 by LOGRECNO. Field offsets are
|
|
14
|
+
* fixed by the 2020 P.L. layout (verified against the real files).
|
|
15
|
+
*
|
|
16
|
+
* https://www2.census.gov/programs-surveys/decennial/2020/data/01-Redistricting_File--PL_94-171/
|
|
17
|
+
*/
|
|
18
|
+
export interface FetchRedistrictingOptions {
|
|
19
|
+
/** Two-digit state FIPS, e.g. `"06"`. */
|
|
20
|
+
stateFIPS: string;
|
|
21
|
+
/** Decennial vintage. Default 2020 (the only P.L. 94-171 release this parses). */
|
|
22
|
+
vintage?: number;
|
|
23
|
+
/** Output SQLite path. Default `<dataRoot>/tiger/tiger.db` (same DB as `fetchTIGER`). */
|
|
24
|
+
outPath?: string;
|
|
25
|
+
/** Download cache + default output root. */
|
|
26
|
+
dataRoot?: string;
|
|
27
|
+
/** Optional three-digit county FIPS filter, e.g. `"059"`. */
|
|
28
|
+
county?: string;
|
|
29
|
+
/** Rows per insert. Default 2000. */
|
|
30
|
+
batchSize?: number;
|
|
31
|
+
}
|
|
32
|
+
export type FetchRedistrictingEvent = {
|
|
33
|
+
phase: "download";
|
|
34
|
+
file: string;
|
|
35
|
+
cached: boolean;
|
|
36
|
+
} | {
|
|
37
|
+
phase: "extract";
|
|
38
|
+
file: string;
|
|
39
|
+
} | {
|
|
40
|
+
phase: "header";
|
|
41
|
+
blocks: number;
|
|
42
|
+
} | {
|
|
43
|
+
phase: "load";
|
|
44
|
+
inserted: number;
|
|
45
|
+
total: number;
|
|
46
|
+
};
|
|
47
|
+
export interface FetchRedistrictingResult {
|
|
48
|
+
outPath: string;
|
|
49
|
+
table: string;
|
|
50
|
+
inserted: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Fetch one state's P.L. 94-171 block race counts into `pl_block`. Yields progress; returns the
|
|
54
|
+
* tally.
|
|
55
|
+
*/
|
|
56
|
+
export declare function fetchRedistricting(options: FetchRedistrictingOptions): AsyncGenerator<FetchRedistrictingEvent, FetchRedistrictingResult>;
|
|
57
|
+
//# sourceMappingURL=redistricting.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redistricting.d.ts","sourceRoot":"","sources":["../../sdk/redistricting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAwCH,MAAM,WAAW,yBAAyB;IACzC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CAChB;AAuCD;;;GAGG;AACH,wBAAuB,kBAAkB,CACxC,OAAO,EAAE,yBAAyB,GAChC,cAAc,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"redistricting.d.ts","sourceRoot":"","sources":["../../sdk/redistricting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAwCH,MAAM,WAAW,yBAAyB;IACzC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CAChB;AAuCD;;;GAGG;AACH,wBAAuB,kBAAkB,CACxC,OAAO,EAAE,yBAAyB,GAChC,cAAc,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,CAgGnE"}
|