text-to-map 1.0.3 → 1.0.5

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.
@@ -1,6 +1,6 @@
1
- import { downloadAndImportAllLatestAddressPoints } from "../open-data-sync/address-points";
1
+ import { downloadAndImportAddressPoints } from "../open-data-sync/address-points";
2
2
  console.time("downloadAndImportAllLatestAddressPoints");
3
- downloadAndImportAllLatestAddressPoints()
3
+ downloadAndImportAddressPoints()
4
4
  .then(() => {
5
5
  console.timeEnd("downloadAndImportAllLatestAddressPoints");
6
6
  })
@@ -1,5 +1,5 @@
1
- import { downloadAndImportAllSchools } from "../open-data-sync/schools";
2
- downloadAndImportAllSchools({ tmpDir: "tmp" })
1
+ import { downloadAndImportSchools } from "../open-data-sync/schools";
2
+ downloadAndImportSchools({ tmpDir: "tmp" })
3
3
  .then(() => {
4
4
  console.log("Completed");
5
5
  })
@@ -1,6 +1,6 @@
1
- import { downloadAndImportAllStreets } from "../open-data-sync/streets";
1
+ import { downloadAndImportStreets } from "../open-data-sync/streets";
2
2
  console.time("downloadAndImportAllStreets");
3
- downloadAndImportAllStreets({})
3
+ downloadAndImportStreets({})
4
4
  .then(() => {
5
5
  console.timeEnd("downloadAndImportAllStreets");
6
6
  })
@@ -1,4 +1,4 @@
1
- import jtsk2wgs84 from "@arodax/jtsk2wgs84";
1
+ import jtsk2wgs84 from "../utils/jtsk2wgs84";
2
2
  import { AddressPointType, createSingleLineAddress } from "czech-address";
3
3
  import { SeriesType, isNegativeSeriesSpec, isRange, isSeriesSpecArray, isWholeMunicipalitySmdLine, } from "../street-markdown/types";
4
4
  import { findClosestString } from "../utils/helpers";
@@ -216,7 +216,7 @@ const filterAddressPointsByRanges = (addressPoints, seriesSpec) => {
216
216
  var _a;
217
217
  if (isRange(range)) {
218
218
  const number = getNumberByType(seriesSpec.type, addressPoint);
219
- return (isInRange(number, seriesSpec.type !== SeriesType.Descriptive
219
+ return (isInRange(number, seriesSpec.type !== SeriesType.Description
220
220
  ? (_a = addressPoint.orientationalNumberLetter) !== null && _a !== void 0 ? _a : null
221
221
  : null, range) && fitsType(number, seriesSpec.type));
222
222
  }
@@ -252,13 +252,13 @@ export const isInRange = (number, letter, range) => {
252
252
  return satisfiesFrom && satisfiesTo;
253
253
  };
254
254
  export const fitsType = (number, type) => {
255
- return (type === SeriesType.Descriptive ||
255
+ return (type === SeriesType.Description ||
256
256
  type === SeriesType.All ||
257
257
  (type === SeriesType.Odd && number % 2 === 1) ||
258
258
  (type === SeriesType.Even && number % 2 === 0));
259
259
  };
260
260
  export const equalsFullStreetNumber = (fullStreetNumber, addressPoint) => {
261
- return (fullStreetNumber.descriptiveNumber.number === addressPoint.houseNumber &&
261
+ return (fullStreetNumber.descriptionNumber.number === addressPoint.houseNumber &&
262
262
  fullStreetNumber.orientationalNumber.number ===
263
263
  addressPoint.orientationalNumber &&
264
264
  ((!fullStreetNumber.orientationalNumber.letter &&
@@ -268,7 +268,7 @@ export const equalsFullStreetNumber = (fullStreetNumber, addressPoint) => {
268
268
  };
269
269
  const getNumberByType = (type, addressPoint) => {
270
270
  var _a;
271
- return type === SeriesType.Descriptive
271
+ return type === SeriesType.Description
272
272
  ? addressPoint.houseNumber
273
273
  : (_a = addressPoint.orientationalNumber) !== null && _a !== void 0 ? _a : null;
274
274
  };
@@ -303,7 +303,7 @@ const rowToAddressPoint = (row) => {
303
303
  if (row.district_name !== null) {
304
304
  point.district = row.district_name;
305
305
  }
306
- if (row.prague_district !== null) {
306
+ if (row.prague_district_name !== null) {
307
307
  point.pragueDistrict = row.prague_district_name;
308
308
  }
309
309
  point.address = createSingleLineAddress(point);
package/dist/index.d.ts CHANGED
@@ -1,4 +1,20 @@
1
- export { downloadAndImportAllLatestAddressPoints, importAllLatestAddressPoints, deleteDb } from "./open-data-sync/address-points";
2
- export { downloadAndImportAllSchools, deleteSchoolsXmlFile } from "./open-data-sync/schools";
3
- export { downloadAndImportAllStreets } from "./open-data-sync/streets";
4
- export { parseOrdinanceToAddressPoints } from "./street-markdown/smd";
1
+ import { downloadAndImportAddressPoints, deleteDb } from "./open-data-sync/address-points";
2
+ import { downloadAndImportRegions } from "./open-data-sync/regions";
3
+ import { downloadAndImportSchools } from "./open-data-sync/schools";
4
+ import { downloadAndImportStreets } from "./open-data-sync/streets";
5
+ import { parseOrdinanceToAddressPoints } from "./street-markdown/smd";
6
+ import { OpenDataSyncOptions } from "./utils/helpers";
7
+ export * from "./street-markdown/types";
8
+ /**
9
+ * Download and import all open data to SQLite DB. The DB file will be located
10
+ * in the `dataDir` folder.
11
+ * @param options Options for the sync
12
+ * @param syncStreets Streets sync takes around 1 hour, so it might be skipped.
13
+ * ```typescript
14
+ * import { downloadAndImportEverything } from "text-to-map";
15
+ *
16
+ * await downloadAndImportEverything({ tmpDir: "./tmp", dataDir: "./data" });
17
+ * ```
18
+ */
19
+ export declare function downloadAndImportEverything(options?: OpenDataSyncOptions, syncStreets?: boolean): Promise<void>;
20
+ export { downloadAndImportAddressPoints, deleteDb, downloadAndImportSchools, downloadAndImportStreets, downloadAndImportRegions, parseOrdinanceToAddressPoints, };
package/dist/index.js CHANGED
@@ -1,4 +1,37 @@
1
- export { downloadAndImportAllLatestAddressPoints, importAllLatestAddressPoints, deleteDb } from "./open-data-sync/address-points";
2
- export { downloadAndImportAllSchools, deleteSchoolsXmlFile } from "./open-data-sync/schools";
3
- export { downloadAndImportAllStreets } from "./open-data-sync/streets";
4
- export { parseOrdinanceToAddressPoints } from "./street-markdown/smd";
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { downloadAndImportAddressPoints, deleteDb, } from "./open-data-sync/address-points";
11
+ import { downloadAndImportRegions } from "./open-data-sync/regions";
12
+ import { downloadAndImportSchools } from "./open-data-sync/schools";
13
+ import { downloadAndImportStreets } from "./open-data-sync/streets";
14
+ import { parseOrdinanceToAddressPoints } from "./street-markdown/smd";
15
+ export * from "./street-markdown/types";
16
+ /**
17
+ * Download and import all open data to SQLite DB. The DB file will be located
18
+ * in the `dataDir` folder.
19
+ * @param options Options for the sync
20
+ * @param syncStreets Streets sync takes around 1 hour, so it might be skipped.
21
+ * ```typescript
22
+ * import { downloadAndImportEverything } from "text-to-map";
23
+ *
24
+ * await downloadAndImportEverything({ tmpDir: "./tmp", dataDir: "./data" });
25
+ * ```
26
+ */
27
+ export function downloadAndImportEverything(options = {}, syncStreets = true) {
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ yield downloadAndImportAddressPoints(options);
30
+ yield downloadAndImportSchools(options);
31
+ yield downloadAndImportRegions(options);
32
+ if (syncStreets) {
33
+ yield downloadAndImportStreets(options);
34
+ }
35
+ });
36
+ }
37
+ export { downloadAndImportAddressPoints, deleteDb, downloadAndImportSchools, downloadAndImportStreets, downloadAndImportRegions, parseOrdinanceToAddressPoints, };
@@ -1,4 +1,3 @@
1
1
  import { OpenDataSyncOptions } from "../utils/helpers";
2
- export declare const downloadAndImportAllLatestAddressPoints: (options?: OpenDataSyncOptions) => Promise<void>;
3
- export declare const importAllLatestAddressPoints: (options?: OpenDataSyncOptions) => Promise<void>;
2
+ export declare const downloadAndImportAddressPoints: (options?: OpenDataSyncOptions) => Promise<void>;
4
3
  export declare const deleteDb: (options?: OpenDataSyncOptions) => void;
@@ -54,17 +54,13 @@ const importDataToDb = (options) => __awaiter(void 0, void 0, void 0, function*
54
54
  console.log(`Import completed. Total imported rows: ${total}`);
55
55
  });
56
56
  const getExtractionFolder = (options) => join(options.tmpDir, options.addressPointsCsvFolderName);
57
- export const downloadAndImportAllLatestAddressPoints = (options = {}) => __awaiter(void 0, void 0, void 0, function* () {
57
+ export const downloadAndImportAddressPoints = (options = {}) => __awaiter(void 0, void 0, void 0, function* () {
58
58
  const completeOptions = prepareOptions(options);
59
59
  const datasetFeedLink = yield getLatestUrlFromAtomFeed(completeOptions.addressPointsAtomUrl);
60
60
  const zipUrl = yield getLatestUrlFromAtomFeed(datasetFeedLink);
61
61
  yield downloadAndUnzip(zipUrl, completeOptions);
62
62
  yield importDataToDb(completeOptions);
63
63
  });
64
- export const importAllLatestAddressPoints = (options = {}) => __awaiter(void 0, void 0, void 0, function* () {
65
- const completeOptions = prepareOptions(options);
66
- yield importDataToDb(completeOptions);
67
- });
68
64
  export const deleteDb = (options = {}) => {
69
65
  const completeOptions = prepareOptions(options);
70
66
  if (existsSync(completeOptions.dbFilePath)) {
@@ -1,3 +1,3 @@
1
1
  import { OpenDataSyncOptions } from "../utils/helpers";
2
- export declare const downloadAndImportAllSchools: (options: OpenDataSyncOptions) => Promise<void>;
2
+ export declare const downloadAndImportSchools: (options: OpenDataSyncOptions) => Promise<void>;
3
3
  export declare const deleteSchoolsXmlFile: (options?: OpenDataSyncOptions) => void;
@@ -303,7 +303,7 @@ const importDataToDb = (options, saveFoundersToCsv = false, saveSchoolsWithoutRu
303
303
  const getXmlFilePath = (options) => {
304
304
  return join(options.tmpDir, options.schoolsXmlFileName);
305
305
  };
306
- export const downloadAndImportAllSchools = (options) => __awaiter(void 0, void 0, void 0, function* () {
306
+ export const downloadAndImportSchools = (options) => __awaiter(void 0, void 0, void 0, function* () {
307
307
  const runOptions = prepareOptions(options);
308
308
  yield downloadXml(runOptions);
309
309
  yield importDataToDb(runOptions, false, true);
@@ -1,2 +1,2 @@
1
1
  import { OpenDataSyncOptions } from "../utils/helpers";
2
- export declare const downloadAndImportAllStreets: (options: OpenDataSyncOptions) => Promise<void>;
2
+ export declare const downloadAndImportStreets: (options: OpenDataSyncOptions) => Promise<void>;
@@ -45,7 +45,8 @@ const importDataToDb = (data) => __awaiter(void 0, void 0, void 0, function* ()
45
45
  }
46
46
  insertStreetsFromDbf(data);
47
47
  });
48
- export const downloadAndImportAllStreets = (options) => __awaiter(void 0, void 0, void 0, function* () {
48
+ export const downloadAndImportStreets = (options) => __awaiter(void 0, void 0, void 0, function* () {
49
+ console.log("Starting to download and import streets. This takes up to 1 hour.");
49
50
  const completeOptions = prepareOptions(options);
50
51
  initDb(completeOptions);
51
52
  prepareFolders(completeOptions);
@@ -178,7 +178,7 @@ export class SmdParser extends EmbeddedActionsParser {
178
178
  {
179
179
  ALT: () => {
180
180
  this.CONSUME3(DescriptiveType);
181
- type = SeriesType.Descriptive;
181
+ type = SeriesType.Description;
182
182
  },
183
183
  },
184
184
  ]);
@@ -265,7 +265,7 @@ export class SmdParser extends EmbeddedActionsParser {
265
265
  },
266
266
  {
267
267
  ALT: () => {
268
- type = SeriesType.Descriptive;
268
+ type = SeriesType.Description;
269
269
  this.CONSUME(DescriptiveType);
270
270
  },
271
271
  },
@@ -308,7 +308,7 @@ export class SmdParser extends EmbeddedActionsParser {
308
308
  },
309
309
  {
310
310
  ALT: () => {
311
- type = SeriesType.Descriptive;
311
+ type = SeriesType.Description;
312
312
  this.CONSUME(DescriptiveType);
313
313
  },
314
314
  },
@@ -321,7 +321,7 @@ export class SmdParser extends EmbeddedActionsParser {
321
321
  const descriptiveNumber = parseRichNumber(this.CONSUME(Number).image);
322
322
  this.CONSUME(Slash);
323
323
  const orientationNumber = parseRichNumber(this.CONSUME2(Number).image);
324
- return { descriptiveNumber, orientationalNumber: orientationNumber };
324
+ return { descriptionNumber: descriptiveNumber, orientationalNumber: orientationNumber };
325
325
  });
326
326
  this.performSelfAnalysis();
327
327
  }
@@ -32,7 +32,7 @@ export interface RichNumber {
32
32
  letter?: string;
33
33
  }
34
34
  export interface FullStreetNumber {
35
- descriptiveNumber: RichNumber;
35
+ descriptionNumber: RichNumber;
36
36
  orientationalNumber: RichNumber;
37
37
  }
38
38
  export declare const isFullStreetNumber: (something: RangeSpec | FullStreetNumber) => something is FullStreetNumber;
@@ -41,7 +41,7 @@ export declare enum SeriesType {
41
41
  Even = 0,
42
42
  Odd = 1,
43
43
  All = 2,
44
- Descriptive = 3
44
+ Description = 3
45
45
  }
46
46
  export interface AddressPoint extends CzechAddressPoint {
47
47
  id: number;
@@ -8,6 +8,6 @@ export var SeriesType;
8
8
  SeriesType[SeriesType["Even"] = 0] = "Even";
9
9
  SeriesType[SeriesType["Odd"] = 1] = "Odd";
10
10
  SeriesType[SeriesType["All"] = 2] = "All";
11
- SeriesType[SeriesType["Descriptive"] = 3] = "Descriptive";
11
+ SeriesType[SeriesType["Description"] = 3] = "Description";
12
12
  })(SeriesType || (SeriesType = {}));
13
13
  export const isAddressPoint = (something) => something.hasOwnProperty("id");
@@ -0,0 +1,17 @@
1
+ export interface ConversionResult {
2
+ jtsk_x: number;
3
+ jtsk_y: number;
4
+ lat: number;
5
+ lon: number;
6
+ altitude: number;
7
+ }
8
+ /**
9
+ * Convert JTSK to WGS84 - taken from @arodax/jtsk2wgs84 package that had some
10
+ * import issues.
11
+ *
12
+ * @param x
13
+ * @param y
14
+ * @param h
15
+ * @return {{jtsk_x: number, jtsk_y: number, lon: number, lat: number, altitude: number}}
16
+ */
17
+ export default function jtsk2wgs84(x: number, y: number, h?: number): ConversionResult;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Convert JTSK to WGS84 - taken from @arodax/jtsk2wgs84 package that had some
3
+ * import issues.
4
+ *
5
+ * @param x
6
+ * @param y
7
+ * @param h
8
+ * @return {{jtsk_x: number, jtsk_y: number, lon: number, lat: number, altitude: number}}
9
+ */
10
+ export default function jtsk2wgs84(x, y, h = 200) {
11
+ const originalX = x;
12
+ const originalY = y;
13
+ let a = 6377397.15508;
14
+ let e = 0.081696831215303;
15
+ let n = 0.97992470462083;
16
+ let uRo = 12310230.12797036;
17
+ let sinUQ = 0.863499969506341;
18
+ let cosUQ = 0.504348889819882;
19
+ let sinVQ = 0.420215144586493;
20
+ let cosVQ = 0.907424504992097;
21
+ let alpha = 1.000597498371542;
22
+ let k = 1.003419163966575;
23
+ let ro = Math.sqrt(x * x + y * y);
24
+ let epsilon = 2 * Math.atan(y / (ro + x));
25
+ let D = epsilon / n;
26
+ let S = 2 * Math.atan(Math.exp((1 / n) * Math.log(uRo / ro))) - Math.PI / 2;
27
+ let sinS = Math.sin(S);
28
+ let cosS = Math.cos(S);
29
+ let sinU = sinUQ * sinS - cosUQ * cosS * Math.cos(D);
30
+ let cosU = Math.sqrt(1 - sinU * sinU);
31
+ let sinDV = (Math.sin(D) * cosS) / cosU;
32
+ let cosDV = Math.sqrt(1 - sinDV * sinDV);
33
+ let sinV = sinVQ * cosDV - cosVQ * sinDV;
34
+ let cosV = cosVQ * cosDV + sinVQ * sinDV;
35
+ let lJtsk = (2 * Math.atan(sinV / (1 + cosV))) / alpha;
36
+ let t = Math.exp((2 / alpha) * Math.log((1 + sinU) / cosU / k));
37
+ let pom = (t - 1) / (t + 1);
38
+ let sinB = pom;
39
+ do {
40
+ sinB = pom;
41
+ pom = t * Math.exp(e * Math.log((1 + e * sinB) / (1 - e * sinB)));
42
+ pom = (pom - 1) / (pom + 1);
43
+ } while (Math.abs(pom - sinB) > 1e-15);
44
+ let bJtsk = Math.atan(pom / Math.sqrt(1 - pom * pom));
45
+ let f1 = 299.152812853;
46
+ let e2 = 1 - (1 - 1 / f1) * (1 - 1 / f1);
47
+ ro = a / Math.sqrt(1 - e2 * Math.sin(bJtsk) * Math.sin(bJtsk));
48
+ x = (ro + h) * Math.cos(bJtsk) * Math.cos(lJtsk);
49
+ y = (ro + h) * Math.cos(bJtsk) * Math.sin(lJtsk);
50
+ let z = ((1 - e2) * ro + h) * Math.sin(bJtsk);
51
+ let dx = 570.69;
52
+ let dy = 85.69;
53
+ let dz = 462.84;
54
+ let wz = ((-5.2611 / 3600) * Math.PI) / 180;
55
+ let wy = ((-1.58676 / 3600) * Math.PI) / 180;
56
+ let wx = ((-4.99821 / 3600) * Math.PI) / 180;
57
+ let m = 3.543e-6;
58
+ let xn = dx + (1 + m) * (x + wz * y - wy * z);
59
+ let yn = dy + (1 + m) * (-wz * x + y + wx * z);
60
+ let zn = dz + (1 + m) * (wy * x - wx * y + z);
61
+ a = 6378137.0;
62
+ f1 = 298.257223563;
63
+ let aB = f1 / (f1 - 1);
64
+ let p = Math.sqrt(xn * xn + yn * yn);
65
+ e2 = 1 - (1 - 1 / f1) * (1 - 1 / f1);
66
+ let theta = Math.atan((zn * aB) / p);
67
+ let st = Math.sin(theta);
68
+ let ct = Math.cos(theta);
69
+ t = (zn + e2 * aB * a * st * st * st) / (p - e2 * a * ct * ct * ct);
70
+ let B = Math.atan(t);
71
+ let L = 2 * Math.atan(yn / (p + xn));
72
+ h = Math.sqrt(1 + t * t) * (p - a / Math.sqrt(1 + (1 - e2) * t * t));
73
+ return {
74
+ jtsk_x: originalX,
75
+ jtsk_y: originalY,
76
+ lat: (B / Math.PI) * 180,
77
+ lon: (L / Math.PI) * 180,
78
+ altitude: Math.round(h * 100) / 100,
79
+ };
80
+ }
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "type": "module",
3
3
  "dependencies": {
4
- "@arodax/jtsk2wgs84": "^1.0.2",
5
4
  "@turf/distance": "^6.5.0",
6
5
  "adm-zip": "^0.5.9",
7
6
  "better-sqlite3": "^8.0.1",
@@ -31,7 +30,6 @@
31
30
  },
32
31
  "scripts": {
33
32
  "address-points": "ts-node --experimental-specifier-resolution=node --esm src/bin/address-points.ts",
34
- "address-points-import-only": "ts-node --experimental-specifier-resolution=node --esm src/bin/address-points-import-only.ts",
35
33
  "schools": "ts-node --experimental-specifier-resolution=node --esm src/bin/schools.ts",
36
34
  "clear-all": "ts-node --experimental-specifier-resolution=node --esm src/bin/clear-all.ts",
37
35
  "parse-ordinance": "ts-node --experimental-specifier-resolution=node --esm src/bin/parse-ordinance.ts",
@@ -39,7 +37,7 @@
39
37
  "streets": "ts-node --experimental-specifier-resolution=node --esm src/bin/streets.ts",
40
38
  "regions": "ts-node --experimental-specifier-resolution=node --esm src/bin/regions.ts",
41
39
  "dbf": "ts-node --experimental-specifier-resolution=node --esm src/bin/dbf.ts",
42
- "test": "jest",
40
+ "test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest-esm.config.mjs --no-cache",
43
41
  "ordinance-to-csv-rules": "node src/smd-to-csv/ordinance-to-csv-rules.js",
44
42
  "clean": "rimraf dist",
45
43
  "copyfiles": "copyfiles -u 1 src/address_points_init.db dist",
@@ -50,7 +48,7 @@
50
48
  },
51
49
  "name": "text-to-map",
52
50
  "description": "Text To Map usiluje o lepší, strojově zpracovatelné využití částí vyhlášek s výčtem ulic a dalších lokací. Jde o rozšiřitelnou sadu konceptů a nástrojů, které zajistí hladký převod výčtu ulic a jejich rozsahů v lidsky srozumitelném jazyce do strojově zpracovatelného, uchopitelného formátu.",
53
- "version": "1.0.3",
51
+ "version": "1.0.5",
54
52
  "main": "dist/index.js",
55
53
  "types": "dist/index.d.ts",
56
54
  "files": [
@@ -1 +0,0 @@
1
- export {};
@@ -1,14 +0,0 @@
1
- import { importAllLatestAddressPoints } from "../open-data-sync/address-points";
2
- console.time("importOnly");
3
- importAllLatestAddressPoints({})
4
- .then(() => {
5
- console.timeEnd("importOnly");
6
- })
7
- .catch((error) => {
8
- if (error.hasOwnProperty("stack")) {
9
- console.log(error, error.stack);
10
- }
11
- else {
12
- console.log(error);
13
- }
14
- });