@hebcal/geo-sqlite 5.10.5 → 5.11.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/dist/geodb.js ADDED
@@ -0,0 +1,451 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { existsSync } from 'node:fs';
3
+ import QuickLRU from 'quick-lru';
4
+ import { Location } from '@hebcal/core';
5
+ import { stateNames } from '@hebcal/cities';
6
+ import { transliterate } from 'transliteration';
7
+ import city2geonameid from './city2geonameid.json.js';
8
+ import { munge } from './munge.js';
9
+ import { version } from './pkgVersion.js';
10
+ const GEONAME_SQL = `SELECT
11
+ g.name as name,
12
+ g.asciiname as asciiname,
13
+ g.country as cc,
14
+ c.country as country,
15
+ a.asciiname as admin1,
16
+ g.latitude as latitude,
17
+ g.longitude as longitude,
18
+ g.population as population,
19
+ g.gtopo30 as elevation,
20
+ g.timezone as timezone
21
+ FROM geoname g
22
+ LEFT JOIN country c on g.country = c.iso
23
+ LEFT JOIN admin1 a on g.country||'.'||g.admin1 = a.key
24
+ WHERE g.geonameid = ?
25
+ `;
26
+ const GEONAME_ALL_SQL = `SELECT
27
+ g.geonameid as geonameid,
28
+ g.name as name,
29
+ g.asciiname as asciiname,
30
+ g.country as cc,
31
+ c.country as country,
32
+ a.asciiname as admin1,
33
+ g.latitude as latitude,
34
+ g.longitude as longitude,
35
+ g.population as population,
36
+ g.gtopo30 as elevation,
37
+ g.timezone as timezone
38
+ FROM geoname g
39
+ LEFT JOIN country c on g.country = c.iso
40
+ LEFT JOIN admin1 a on g.country||'.'||g.admin1 = a.key
41
+ `;
42
+ const ZIPCODE_SQL = `SELECT ZipCode,CityMixedCase,State,Latitude,Longitude,Elevation,
43
+ TimeZone,DayLightSaving,Population
44
+ FROM ZIPCodes_Primary WHERE ZipCode = ?`;
45
+ const ZIPCODE_ALL_SQL = `SELECT ZipCode,CityMixedCase,State,Latitude,Longitude,Elevation,
46
+ TimeZone,DayLightSaving,Population
47
+ FROM ZIPCodes_Primary`;
48
+ const ZIP_COMPLETE_SQL = `SELECT ZipCode,CityMixedCase,State,Latitude,Longitude,TimeZone,DayLightSaving,Population
49
+ FROM ZIPCodes_Primary
50
+ WHERE ZipCode >= ? AND ZipCode < ?
51
+ ORDER BY Population DESC
52
+ LIMIT 10`;
53
+ const ZIP_FULLTEXT_COMPLETE_SQL = `SELECT ZipCode
54
+ FROM ZIPCodes_CityFullText5
55
+ WHERE ZIPCodes_CityFullText5 MATCH ?
56
+ ORDER BY Population DESC
57
+ LIMIT 20`;
58
+ const GEONAME_COMPLETE_SQL = `SELECT geonameid, longname, city, admin1, country
59
+ FROM geoname_fulltext
60
+ WHERE geoname_fulltext MATCH ?
61
+ ORDER BY population DESC
62
+ LIMIT 20`;
63
+ /** Wrapper around sqlite databases */
64
+ export class GeoDb {
65
+ logger;
66
+ zipsDb;
67
+ geonamesDb;
68
+ /** @internal */
69
+ zipCache;
70
+ /** @internal */
71
+ geonamesCache;
72
+ legacyCities;
73
+ countryNames;
74
+ zipStmt;
75
+ geonamesStmt;
76
+ zipCompStmt;
77
+ geonamesCompStmt;
78
+ zipFulltextCompStmt;
79
+ constructor(logger, zipsFilename, geonamesFilename, options) {
80
+ this.logger = logger;
81
+ if (logger)
82
+ logger.info(`GeoDb: opening ${zipsFilename}...`);
83
+ if (!existsSync(zipsFilename)) {
84
+ throw new Error(`GeoDb: ${zipsFilename} does not exist`);
85
+ }
86
+ this.zipsDb = new DatabaseSync(zipsFilename);
87
+ if (logger)
88
+ logger.info(`GeoDb: opening ${geonamesFilename}...`);
89
+ if (!existsSync(geonamesFilename)) {
90
+ throw new Error(`GeoDb: ${geonamesFilename} does not exist`);
91
+ }
92
+ this.geonamesDb = new DatabaseSync(geonamesFilename);
93
+ this.zipStmt = this.zipsDb.prepare(ZIPCODE_SQL);
94
+ const zipsCacheSize = options?.zipsCacheSize || 150;
95
+ this.zipCache = new QuickLRU({
96
+ maxSize: zipsCacheSize,
97
+ });
98
+ this.geonamesStmt = this.geonamesDb.prepare(GEONAME_SQL);
99
+ const geonamesCacheSize = options?.geonamesCacheSize || 750;
100
+ this.geonamesCache = new QuickLRU({
101
+ maxSize: geonamesCacheSize,
102
+ });
103
+ this.legacyCities = new Map();
104
+ for (const [name, id] of Object.entries(city2geonameid)) {
105
+ this.legacyCities.set(munge(name), id);
106
+ }
107
+ const stmt = this.geonamesDb.prepare("SELECT ISO, Country FROM country WHERE Country <> ''");
108
+ const rows = stmt.all();
109
+ const map = new Map();
110
+ for (const row of rows) {
111
+ map.set(row.ISO, row.Country);
112
+ }
113
+ this.countryNames = map;
114
+ if (logger)
115
+ logger.info(`GeoDb: ${map.size} countries, ${this.legacyCities.size} legacy cities`);
116
+ }
117
+ /** Closes database handles */
118
+ close() {
119
+ this.zipsDb.close();
120
+ this.geonamesDb.close();
121
+ }
122
+ /** @private */
123
+ static munge(s) {
124
+ return munge(s);
125
+ }
126
+ lookupZip(zip) {
127
+ const zip5 = zip.trim().substring(0, 5);
128
+ const found = this.zipCache.get(zip5);
129
+ if (found !== undefined)
130
+ return found;
131
+ const result = this.zipStmt.get(zip5);
132
+ if (!result) {
133
+ if (this.logger)
134
+ this.logger.warn(`GeoDb: unknown zipcode=${zip5}`);
135
+ this.zipCache.set(zip5, null);
136
+ return null;
137
+ }
138
+ result.ZipCode = String(zip5);
139
+ const location = this.makeZipLocation(result);
140
+ this.zipCache.set(zip5, location);
141
+ return location;
142
+ }
143
+ /** @private */
144
+ makeZipLocation(result) {
145
+ const zip = result.ZipCode;
146
+ const tz = result.TimeZone;
147
+ const tzid = Location.getUsaTzid(result.State, +tz, result.DayLightSaving);
148
+ const cityDescr = `${result.CityMixedCase}, ${result.State} ${zip}`;
149
+ const elevation = result?.Elevation > 0 ? result.Elevation : 0;
150
+ const location = new Location(result.Latitude, result.Longitude, false, tzid, cityDescr, 'US', zip, elevation);
151
+ location.admin1 = location.state = result.State;
152
+ location.stateName = stateNames[location.state];
153
+ location.geo = 'zip';
154
+ location.zip = zip;
155
+ location.population = result.Population;
156
+ return location;
157
+ }
158
+ lookupGeoname(geonameid) {
159
+ geonameid = +geonameid;
160
+ if (!geonameid)
161
+ return null;
162
+ if (geonameid === 293396) {
163
+ geonameid = 293397;
164
+ }
165
+ const found = this.geonamesCache.get(geonameid);
166
+ if (found !== undefined)
167
+ return found;
168
+ const result = this.geonamesStmt.get(geonameid);
169
+ if (!result) {
170
+ if (this.logger)
171
+ this.logger.warn(`GeoDb: unknown geonameid=${geonameid}`);
172
+ this.geonamesCache.set(geonameid, null);
173
+ return null;
174
+ }
175
+ const location = this.makeGeonameLocation(geonameid, result);
176
+ this.geonamesCache.set(geonameid, location);
177
+ return location;
178
+ }
179
+ /**
180
+ * Convenience wrapper of the `transliterate` function from `transliteration` npm package.
181
+ * Transliterate the string `source` and return the result.
182
+ */
183
+ static transliterate(source, options) {
184
+ return transliterate(source, options);
185
+ }
186
+ /**
187
+ * Builds a city description from geonameid string components
188
+ * @param cityName e.g. 'Tel Aviv' or 'Chicago'
189
+ * @param admin1 e.g. 'England' or 'Massachusetts'
190
+ * @param countryName full country name, e.g. 'Israel' or 'United States'
191
+ */
192
+ static geonameCityDescr(cityName, admin1, countryName) {
193
+ if (countryName === 'United States')
194
+ countryName = 'USA';
195
+ if (countryName === 'United Kingdom')
196
+ countryName = 'UK';
197
+ let cityDescr = cityName;
198
+ if (countryName !== 'Israel' && admin1 && !admin1.includes(cityName)) {
199
+ const tlitCityName = transliterate(cityName);
200
+ const tlitAdmin1 = transliterate(admin1);
201
+ if (!tlitAdmin1.includes(tlitCityName)) {
202
+ cityDescr += ', ' + admin1;
203
+ }
204
+ }
205
+ if (countryName) {
206
+ cityDescr += ', ' + countryName;
207
+ }
208
+ return cityDescr;
209
+ }
210
+ /** @private */
211
+ makeGeonameLocation(geonameid, result) {
212
+ const country = result.country || '';
213
+ const admin1 = result.admin1 || '';
214
+ const cityDescr = GeoDb.geonameCityDescr(result.name, admin1, country);
215
+ const elevation = result?.elevation && result.elevation > 0 ? result.elevation : 0;
216
+ const location = new Location(result.latitude, result.longitude, result.cc === 'IL', result.timezone, cityDescr, result.cc, geonameid, elevation);
217
+ location.geo = 'geoname';
218
+ location.geonameid = geonameid;
219
+ location.asciiname = result.asciiname;
220
+ if (admin1) {
221
+ location.admin1 = admin1;
222
+ }
223
+ if (result.population) {
224
+ location.population = result.population;
225
+ }
226
+ return location;
227
+ }
228
+ lookupLegacyCity(cityName) {
229
+ const name = munge(cityName);
230
+ const geonameid = this.legacyCities.get(name);
231
+ if (geonameid) {
232
+ return this.lookupGeoname(geonameid);
233
+ }
234
+ else {
235
+ const location = Location.lookup(cityName);
236
+ if (location) {
237
+ return location;
238
+ }
239
+ if (this.logger)
240
+ this.logger.warn(`GeoDb: unknown city=${cityName}`);
241
+ return null;
242
+ }
243
+ }
244
+ /** @private */
245
+ static zipResultToObj(res) {
246
+ const obj = {
247
+ id: String(res.ZipCode),
248
+ value: `${res.CityMixedCase}, ${res.State} ${res.ZipCode}`,
249
+ admin1: res.State,
250
+ asciiname: res.CityMixedCase,
251
+ country: 'United States',
252
+ cc: 'US',
253
+ latitude: res.Latitude,
254
+ longitude: res.Longitude,
255
+ timezone: Location.getUsaTzid(res.State, +res.TimeZone, res.DayLightSaving),
256
+ population: res.Population,
257
+ geo: 'zip',
258
+ };
259
+ if (res.Elevation && res.Elevation > 0) {
260
+ obj.elevation = res.Elevation;
261
+ }
262
+ return obj;
263
+ }
264
+ /**
265
+ * Generates autocomplete results based on a query string
266
+ */
267
+ autoComplete(qraw, latlong = false) {
268
+ qraw = qraw.trim();
269
+ if (qraw.length === 0) {
270
+ return [];
271
+ }
272
+ const firstCharCode = qraw.charCodeAt(0);
273
+ if (firstCharCode >= 48 && firstCharCode <= 57) {
274
+ // special-case PK query instead of full-table scan
275
+ if (GeoDb.is5DigitZip(qraw)) {
276
+ const loc = this.lookupZip(qraw);
277
+ return loc ? [GeoDb.zipLocToAutocomplete(loc)] : [];
278
+ }
279
+ if (!this.zipCompStmt) {
280
+ this.zipCompStmt = this.zipsDb.prepare(ZIP_COMPLETE_SQL);
281
+ }
282
+ // this is a ZIP code prefix, a string with 1-4 digits
283
+ const zipA = qraw.substring(0, 5);
284
+ const zipB = zipA === '9' ? 'A' : String(+zipA + 1).padStart(zipA.length, '0');
285
+ return this.zipCompStmt.all(zipA, zipB).map(GeoDb.zipResultToObj);
286
+ }
287
+ else {
288
+ if (!this.geonamesCompStmt) {
289
+ this.geonamesCompStmt = this.geonamesDb.prepare(GEONAME_COMPLETE_SQL);
290
+ }
291
+ qraw = qraw.replaceAll('"', '""');
292
+ const geoRows0 = this.geonamesCompStmt.all(`{longname} : "${qraw}" *`);
293
+ const ids = new Set();
294
+ const geoRows = [];
295
+ for (const row of geoRows0) {
296
+ const id = row.geonameid;
297
+ if (!ids.has(id)) {
298
+ ids.add(id);
299
+ geoRows.push(row);
300
+ }
301
+ }
302
+ const geoMatches = geoRows.map(res => {
303
+ const loc = this.lookupGeoname(res.geonameid);
304
+ return this.geonameLocToAutocomplete(loc, res);
305
+ });
306
+ if (!this.zipFulltextCompStmt) {
307
+ this.zipFulltextCompStmt = this.zipsDb.prepare(ZIP_FULLTEXT_COMPLETE_SQL);
308
+ }
309
+ const zipRows = this.zipFulltextCompStmt.all(`{longname} : "${qraw}" *`);
310
+ const zipMatches = zipRows.map(res => {
311
+ const loc = this.lookupZip(res.ZipCode);
312
+ return GeoDb.zipLocToAutocomplete(loc);
313
+ });
314
+ const values = this.mergeZipGeo(zipMatches, geoMatches);
315
+ values.sort((a, b) => (b.population ?? 0) - (a.population ?? 0));
316
+ const topN = values.slice(0, 12);
317
+ if (!latlong) {
318
+ for (const val of topN) {
319
+ delete val.latitude;
320
+ delete val.longitude;
321
+ delete val.timezone;
322
+ delete val.population;
323
+ }
324
+ }
325
+ return topN;
326
+ }
327
+ }
328
+ /** @private */
329
+ geonameLocToAutocomplete(loc, res) {
330
+ const cc = loc.getCountryCode();
331
+ const country = res.country || this.countryNames.get(cc) || '';
332
+ const admin1 = loc.admin1 || '';
333
+ const obj = {
334
+ id: res.geonameid,
335
+ value: loc.getName(),
336
+ admin1,
337
+ country,
338
+ cc,
339
+ latitude: loc.latitude,
340
+ longitude: loc.longitude,
341
+ timezone: loc.getTzid(),
342
+ geo: 'geoname',
343
+ };
344
+ if (loc.population) {
345
+ obj.population = loc.population;
346
+ }
347
+ if (res.city !== loc.asciiname) {
348
+ obj.name = res.city;
349
+ }
350
+ if (loc.asciiname) {
351
+ obj.asciiname = loc.asciiname;
352
+ }
353
+ if (country) {
354
+ obj.country = country;
355
+ }
356
+ if (admin1) {
357
+ obj.admin1 = admin1;
358
+ }
359
+ return obj;
360
+ }
361
+ /** @private */
362
+ static zipLocToAutocomplete(loc) {
363
+ return {
364
+ id: loc.zip,
365
+ value: loc.getName(),
366
+ admin1: loc.admin1,
367
+ asciiname: loc.getShortName(),
368
+ country: 'United States',
369
+ cc: 'US',
370
+ latitude: loc.latitude,
371
+ longitude: loc.longitude,
372
+ timezone: loc.getTzid(),
373
+ population: loc.population,
374
+ geo: 'zip',
375
+ };
376
+ }
377
+ /**
378
+ * GeoNames matches takes priority over USA ZIP code matches
379
+ * @private
380
+ */
381
+ mergeZipGeo(zipMatches, geoMatches) {
382
+ const zlen = zipMatches.length;
383
+ const glen = geoMatches.length;
384
+ if (zlen && !glen) {
385
+ return zipMatches;
386
+ }
387
+ else if (glen && !zlen) {
388
+ return geoMatches;
389
+ }
390
+ const map = new Map();
391
+ for (const obj of zipMatches) {
392
+ const key = [obj.asciiname, stateNames[obj.admin1 ?? ''], obj.cc].join('|');
393
+ if (!map.has(key)) {
394
+ map.set(key, obj);
395
+ }
396
+ }
397
+ for (const obj of geoMatches) {
398
+ const key = [obj.asciiname, obj.admin1, obj.cc].join('|');
399
+ map.set(key, obj);
400
+ }
401
+ return Array.from(map.values());
402
+ }
403
+ /** Reads entire ZIP database and caches in-memory */
404
+ cacheZips() {
405
+ const start = Date.now();
406
+ const stmt = this.zipsDb.prepare(ZIPCODE_ALL_SQL);
407
+ const rows = stmt.all();
408
+ this.zipCache = new Map(); // replace QuickLRU
409
+ for (const row of rows) {
410
+ const location = this.makeZipLocation(row);
411
+ this.zipCache.set(row.ZipCode, location);
412
+ }
413
+ const end = Date.now();
414
+ if (this.logger)
415
+ this.logger.info(`GeoDb: cached ${rows.length} ZIP codes in ${end - start}ms`);
416
+ }
417
+ /** Reads entire geonames database and caches in-memory */
418
+ cacheGeonames() {
419
+ const start = Date.now();
420
+ const stmt = this.geonamesDb.prepare(GEONAME_ALL_SQL);
421
+ const rows = stmt.all();
422
+ this.geonamesCache = new Map(); // replace QuickLRU
423
+ for (const row of rows) {
424
+ const location = this.makeGeonameLocation(row.geonameid, row);
425
+ this.geonamesCache.set(row.geonameid, location);
426
+ }
427
+ const end = Date.now();
428
+ if (this.logger)
429
+ this.logger.info(`GeoDb: cached ${rows.length} geonames in ${end - start}ms`);
430
+ }
431
+ /** Returns the version of the GeoDb package */
432
+ static version() {
433
+ return version;
434
+ }
435
+ static is5DigitZip(str) {
436
+ if (typeof str !== 'string') {
437
+ return false;
438
+ }
439
+ const s = str.trim();
440
+ if (s.length < 5) {
441
+ return false;
442
+ }
443
+ for (let i = 0; i < 5; i++) {
444
+ if (s.charCodeAt(i) > 57 || s.charCodeAt(i) < 48) {
445
+ return false;
446
+ }
447
+ }
448
+ return true;
449
+ }
450
+ }
451
+ //# sourceMappingURL=geodb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geodb.js","sourceRoot":"","sources":["../src/geodb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { GeoDb } from './geodb.js';
2
+ export type { AutoComplete, GeoDbOptions } from './geodb.js';
3
+ export { buildGeonamesSqlite } from './build-geonames-sqlite.js';
4
+ export type { BuildGeonamesSqliteOptions } from './build-geonames-sqlite.js';
5
+ export { makeZipsSqlite } from './make-zips-sqlite.js';