@janekolszak/poland 1.0.6 → 1.0.8

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/index.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { parseCsv, parseLocalityCsv, parseLocalityTypeCsv } from "./src/csvparse"
2
+ import { parseCsv, parseLocalityCsv, parseLocalityTypeCsv, parseStreetsCsv } from "./src/csvparse"
3
3
  import { compute } from "./src/compute"
4
4
  import { generate } from "./src/generate"
5
5
 
6
6
 
7
7
  (() => {
8
- Promise.all([parseCsv(), parseLocalityCsv(), parseLocalityTypeCsv()])
9
- .then(r => compute(r[0], r[1], r[2]))
8
+ Promise.all([parseCsv(), parseLocalityCsv(), parseLocalityTypeCsv(), parseStreetsCsv()])
9
+ .then(r => compute(r[0], r[1], r[2], r[3]))
10
10
  .then(generate)
11
11
  })();
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@janekolszak/poland",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Administrative division of Poland",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
7
- "generate": "tsc && node ./dist/index.js -o ./generated -i ./TERC_Urzedowy_2023-02-12.csv -l ./SIMC_Urzedowy_2023-02-12.csv -t ./WMRODZ_2023-02-12.csv"
7
+ "generate": "tsc && node ./dist/index.js -o ./generated -i ./TERC_Urzedowy_2023-02-12.csv -l ./SIMC_Urzedowy_2023-02-12.csv -t ./WMRODZ_2023-02-12.csv -s ./ULIC_Adresowy_2023-02-19.csv"
8
8
  },
9
9
  "repository": {
10
10
  "type": "git",
package/src/args.ts CHANGED
@@ -3,6 +3,7 @@ import { parse } from 'ts-command-line-args';
3
3
  export interface Args {
4
4
  input: string;
5
5
  localities: string;
6
+ streets: string;
6
7
  types: string;
7
8
  output: string;
8
9
  help?: boolean;
@@ -12,6 +13,7 @@ export const args = parse<Args>(
12
13
  {
13
14
  input: { type: String, alias: 'i', description: 'Input TERC CSV as downloaded from https://eteryt.stat.gov.pl/eTeryt/rejestr_teryt/udostepnianie_danych/baza_teryt/uzytkownicy_indywidualni/pobieranie/pliki_pelne.aspx' },
14
15
  localities: { type: String, alias: 'l', description: 'Input SIMC CSV as downloaded from https://eteryt.stat.gov.pl/eTeryt/rejestr_teryt/udostepnianie_danych/baza_teryt/uzytkownicy_indywidualni/pobieranie/pliki_pelne.aspx' },
16
+ streets: { type: String, alias: 's', description: 'Input ULIC CSV as downloaded from https://eteryt.stat.gov.pl/eTeryt/rejestr_teryt/udostepnianie_danych/baza_teryt/uzytkownicy_indywidualni/pobieranie/pliki_pelne.aspx' },
15
17
  types: { type: String, alias: 't', description: 'Input WMRODZ CSV as downloaded from https://eteryt.stat.gov.pl/eTeryt/rejestr_teryt/udostepnianie_danych/baza_teryt/uzytkownicy_indywidualni/pobieranie/pliki_pelne.aspx' },
16
18
  output: { type: String, alias: 'o', description: 'Output file path' },
17
19
  help: { type: Boolean, optional: true, alias: 'h', description: 'Prints this usage guide' },
package/src/compute.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LocalityType, Region, Locality } from "./csvparse"
1
+ import { LocalityType, Region, Locality, Street } from "./csvparse"
2
2
  import { MultiKeyMap } from "./map"
3
3
 
4
4
  export interface NamesMap {
@@ -12,25 +12,43 @@ export interface NamesMapTwoKeys {
12
12
  export interface NamesMapThreeKeys {
13
13
  [postcode: string]: NamesMapTwoKeys
14
14
  };
15
+
15
16
  export interface NamesMapFourKeys {
16
17
  [postcode: string]: NamesMapThreeKeys
17
18
  };
18
19
 
20
+ export interface NamesMapFiveKeys {
21
+ [postcode: string]: NamesMapFourKeys
22
+ };
23
+
19
24
  export interface Computed {
20
25
  voivodeships: string[]
21
26
  counties: NamesMap
22
27
  municipalities: MultiKeyMap
23
28
  localities: MultiKeyMap
24
29
  districts: MultiKeyMap
30
+ streetsLocalities: MultiKeyMap
31
+ streetsDistricts: MultiKeyMap
25
32
  }
26
33
 
27
- export function compute(regions: Array<Region>, localities: Array<Locality>, localityTypes: Array<LocalityType>): Computed {
34
+ // RODZ_GMI
35
+ // 1 - gmina miejska,
36
+ // 2 - gmina wiejska,
37
+ // 3 - gmina miejsko-wiejska,
38
+ // 4 - miasto w gminie miejsko-wiejskiej,
39
+ // 5 - obszar wiejski w gminie miejsko-wiejskiej,
40
+ // 8 - dzielnica w m.st. Warszawa,
41
+ // 9 - delegatury miast: Kraków, Łódź, Poznań i Wrocław
42
+
43
+ export function compute(regions: Array<Region>, localities: Array<Locality>, localityTypes: Array<LocalityType>, streets: Array<Street>): Computed {
28
44
  let out: Computed = {
29
45
  voivodeships: [],
30
46
  counties: {},
31
47
  municipalities: new MultiKeyMap(),
32
48
  localities: new MultiKeyMap(),
33
- districts: new MultiKeyMap()
49
+ districts: new MultiKeyMap(),
50
+ streetsLocalities: new MultiKeyMap(),
51
+ streetsDistricts: new MultiKeyMap()
34
52
  }
35
53
 
36
54
  const locTypeIdMap: Map<string, string> = new Map(localityTypes.map(r => [r.name, r.id]))
@@ -72,7 +90,6 @@ export function compute(regions: Array<Region>, localities: Array<Locality>, loc
72
90
  municipalityIdMap.set([r.voivodeship, r.county, r.municipality], r.name)
73
91
  })
74
92
 
75
-
76
93
  // Miejscowosci
77
94
  let localityTypeIds = [
78
95
  locTypeIdMap.get("wieś"),
@@ -103,7 +120,7 @@ export function compute(regions: Array<Region>, localities: Array<Locality>, loc
103
120
  })
104
121
 
105
122
  // Dzielnice
106
- const allLocalitiesIdMap = new Map(localities.map(r => [r.localityId, r.name]))
123
+ const allLocalitiesIdMap = new Map(localities.map(r => [r.localityId, r]))
107
124
 
108
125
  let districtIds = [
109
126
  locTypeIdMap.get("dzielnica"),
@@ -120,7 +137,7 @@ export function compute(regions: Array<Region>, localities: Array<Locality>, loc
120
137
  const v = vivIdMap.get(r.voivodeship)
121
138
  const c = countyIdMap.get([r.voivodeship, r.county])
122
139
  const m = municipalityIdMap.get([r.voivodeship, r.county, r.municipality])
123
- const l = allLocalitiesIdMap.get(r.baseLocalityId)
140
+ const l = allLocalitiesIdMap.get(r.baseLocalityId)?.name
124
141
 
125
142
  if (!v || !c || !m || !l) {
126
143
  // console.error("Missing voivodeship, county, municipality or base locality for district: " + r.name + " (" + v + ", " + c + ", " + m + ", " + l + ")")
@@ -178,12 +195,105 @@ export function compute(regions: Array<Region>, localities: Array<Locality>, loc
178
195
  d = d ? d : []
179
196
  out.districts.set([v, c, m, l], [...d, name])
180
197
  })
181
- // console.log(out.districts)
182
198
 
199
+ // Ulice w miejscowosciach
200
+ let districtMunicipalityIds = ["8", "9"]
201
+ streets
202
+ .filter(r => !districtMunicipalityIds.includes(r.municipalityTypeId))
203
+ .forEach(r => {
204
+ const v = vivIdMap.get(r.voivodeship)
205
+ const c = countyIdMap.get([r.voivodeship, r.county])
206
+ const m = municipalityIdMap.get([r.voivodeship, r.county, r.municipality])
207
+ const l = allLocalitiesIdMap.get(r.localityId)
208
+
209
+ if (!v || !c || !m || !l) {
210
+ console.error("4 Missing voivodeship, county, municipality or base locality for district: " + r.name + " (" + v + ", " + c + ", " + m + ", " + l + ")")
211
+ console.error(r.voivodeship, r.county, r.municipality)
212
+ return
213
+ }
214
+
215
+ const fullName = r.name + " " + r.restName
216
+
217
+ if (districtIds.includes(l.localityTypeId)) {
218
+ const d = out.districts.get([v, c, m, l.name])
219
+ if (!d) {
220
+ console.error("Missing district: " + r.name)
221
+ return
222
+ }
223
+
224
+ let s = out.streetsDistricts.get([v, c, m, l.name, d])
225
+ s = s ? s : []
226
+ if (!s.includes(fullName)) {
227
+ out.streetsDistricts.set([v, c, m, l.name, d], [...s, fullName])
228
+ }
229
+ } else {
230
+ let s = out.streetsLocalities.get([v, c, m, l.name])
231
+ s = s ? s : []
232
+ if (!s.includes(fullName)) {
233
+ out.streetsLocalities.set([v, c, m, l.name], [...s, fullName])
234
+ }
235
+ }
236
+ })
237
+
238
+ // Ulice w dzielnicach Warszawy
239
+ streets
240
+ .filter(r => r.municipalityTypeId === "8")
241
+ .forEach(r => {
242
+ const v = vivIdMap.get(r.voivodeship)
243
+ const c = countyIdMap.get([r.voivodeship, r.county])
244
+ const m = "Warszawa"
245
+ const l = "Warszawa"
246
+ const d = allLocalitiesIdMap.get(r.localityId)?.name
247
+
248
+
249
+ if (!v || !c || !m || !l || !d) {
250
+ console.error("4 Missing voivodeship, county, municipality or base locality for district: " + r.name + " (" + v + ", " + c + ", " + m + ", " + l + ")")
251
+ console.error(r.voivodeship, r.county, r.municipality)
252
+ return
253
+ }
254
+
255
+ let s = out.streetsDistricts.get([v, c, m, l, d])
256
+ s = s ? s : []
257
+ const fullName = r.name + " " + r.restName
258
+
259
+ if (!s.includes(fullName)) {
260
+ out.streetsDistricts.set([v, c, m, l, d], [...s, fullName])
261
+ }
262
+ })
263
+
264
+ // Ulice w delegaturach miast
265
+ streets
266
+ .filter(r => r.municipalityTypeId === "9")
267
+ .forEach(r => {
268
+ const v = vivIdMap.get(r.voivodeship)
269
+ const c = countyIdMap.get([r.voivodeship, r.county])
270
+
271
+ const name = allLocalitiesIdMap.get(r.localityId)?.name
272
+ const d = name?.substring(name.indexOf('-') + 1)
273
+ const m = name?.substring(0, name?.indexOf('-'))
274
+ const l = name?.substring(0, name?.indexOf('-'))
275
+
276
+ if (!v || !c || !m || !l || !d) {
277
+ console.error("4 Missing voivodeship, county, municipality or base locality for district: " + r.name + " (" + v + ", " + c + ", " + m + ", " + l + ")")
278
+ console.error(r.voivodeship, r.county, r.municipality)
279
+ return
280
+ }
281
+
282
+ let s = out.streetsDistricts.get([v, c, m, l, d])
283
+ s = s ? s : []
284
+ const fullName = r.name + " " + r.restName
285
+ if (!s.includes(fullName)) {
286
+ out.streetsDistricts.set([v, c, m, l, d], [...s, fullName])
287
+ }
288
+ })
183
289
 
290
+ // Sort all lists
184
291
  out.municipalities.sortValues()
185
292
  out.localities.sortValues()
186
293
  out.districts.sortValues()
294
+ out.streetsLocalities.sortValues()
295
+ out.streetsDistricts.sortValues()
296
+
187
297
 
188
298
  return out
189
299
  }
package/src/csvparse.ts CHANGED
@@ -28,6 +28,20 @@ export type Locality = {
28
28
  date: string;
29
29
  };
30
30
 
31
+ // WOJ;POW;GMI;RODZ_GMI;SYM;SYM_UL;CECHA;NAZWA_1;NAZWA_2;STAN_NA
32
+ export type Street = {
33
+ voivodeship: string
34
+ county: string;
35
+ municipality: string;
36
+ municipalityTypeId: string;
37
+ localityId: string;
38
+ streenId: string;
39
+ characteristic: string;
40
+ name: string;
41
+ restName: string
42
+ date: string;
43
+ };
44
+
31
45
  export type LocalityType = {
32
46
  id: string;
33
47
  name: string;
@@ -111,4 +125,28 @@ export async function parseLocalityTypeCsv() {
111
125
  });
112
126
  await finished(parser);
113
127
  return records;
128
+ };
129
+
130
+ export async function parseStreetsCsv() {
131
+ const records: Street[] = [];
132
+ const parser = fs
133
+ .createReadStream(args.streets)
134
+ .pipe(parse({
135
+ relax_quotes: true,
136
+ delimiter: ';',
137
+ skip_empty_lines: true,
138
+ record_delimiter: '\r\n',
139
+ columns: () => {
140
+ return ["voivodeship", "county", "municipality", "municipalityTypeId", "localityId", "streenId", "characteristic", "name", "restName", "date"]
141
+ },
142
+ }))
143
+ .on('readable', function () {
144
+ let record; while ((record = parser.read()) !== null) {
145
+ // Work with each record
146
+ // record.name = toTitleCase(record.name)
147
+ records.push(record);
148
+ }
149
+ });
150
+ await finished(parser);
151
+ return records;
114
152
  };
package/src/generate.ts CHANGED
@@ -8,6 +8,8 @@ function genJson(c: Computed) {
8
8
  fs.writeFileSync(args.output + "/json/municipalities.json", JSON.stringify(c.municipalities.Get2Deep()))
9
9
  fs.writeFileSync(args.output + "/json/localities.json", JSON.stringify(c.localities.Get3Deep()))
10
10
  fs.writeFileSync(args.output + "/json/districts.json", JSON.stringify(c.districts.Get4Deep()))
11
+ fs.writeFileSync(args.output + "/json/streetsInLocalities.json", JSON.stringify(c.streetsLocalities.Get4Deep()))
12
+ fs.writeFileSync(args.output + "/json/streetsInDistricts.json", JSON.stringify(c.streetsDistricts.Get5Deep()))
11
13
 
12
14
  }
13
15
 
@@ -17,6 +19,8 @@ function genGo(c: Computed) {
17
19
  fs.copyFileSync(args.output + "/json/municipalities.json", args.output + "/go/municipalities.json")
18
20
  fs.copyFileSync(args.output + "/json/localities.json", args.output + "/go/localities.json")
19
21
  fs.copyFileSync(args.output + "/json/districts.json", args.output + "/go/districts.json")
22
+ fs.copyFileSync(args.output + "/json/streetsInLocalities.json", args.output + "/go/streetsInLocalities.json")
23
+ fs.copyFileSync(args.output + "/json/streetsInDistricts.json", args.output + "/go/streetsInDistricts.json")
20
24
  const data = `package poland
21
25
  import (
22
26
  "embed"
package/src/map.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { NamesMapThreeKeys, NamesMapFourKeys, NamesMapTwoKeys } from "./compute";
1
+ import { NamesMapThreeKeys, NamesMapFourKeys, NamesMapTwoKeys, NamesMapFiveKeys } from "./compute";
2
2
 
3
3
  export class MultiKeyMap {
4
4
  private map: Record<string, any> = {};
@@ -63,10 +63,7 @@ export class MultiKeyMap {
63
63
  if (!out[v]) {
64
64
  out[v] = {}
65
65
  }
66
- if (!out[v][c]) {
67
- out[v][c] = []
68
- }
69
- out[v][c].push(value)
66
+ out[v][c] = value
70
67
  })
71
68
  return out
72
69
  }
@@ -81,10 +78,7 @@ export class MultiKeyMap {
81
78
  if (!out[v][c]) {
82
79
  out[v][c] = {}
83
80
  }
84
- if (!out[v][c][m]) {
85
- out[v][c][m] = []
86
- }
87
- out[v][c][m].push(value)
81
+ out[v][c][m] = value
88
82
  })
89
83
  return out
90
84
  }
@@ -102,10 +96,28 @@ export class MultiKeyMap {
102
96
  if (!out[v][c][m]) {
103
97
  out[v][c][m] = {}
104
98
  }
99
+ out[v][c][m][l] = value
100
+ })
101
+ return out
102
+ }
103
+
104
+ Get5Deep(): NamesMapFiveKeys {
105
+ var out: NamesMapFiveKeys = {}
106
+ this.forEach((keys, value) => {
107
+ const [v, c, m, l, d] = keys
108
+ if (!out[v]) {
109
+ out[v] = {}
110
+ }
111
+ if (!out[v][c]) {
112
+ out[v][c] = {}
113
+ }
114
+ if (!out[v][c][m]) {
115
+ out[v][c][m] = {}
116
+ }
105
117
  if (!out[v][c][m][l]) {
106
- out[v][c][m][l] = []
118
+ out[v][c][m][l] = {}
107
119
  }
108
- out[v][c][m][l].push(value)
120
+ out[v][c][m][l][d] = value
109
121
  })
110
122
  return out
111
123
  }