File size: 4,691 Bytes
a1c0952
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/** 注意: [経度, 緯度] の順 */
export type LngLat = [number, number];

export type SinglePrefecture = {
  /** 全国地方公共団体コード */
  code: number;
  /** 都道府県名 */
  pref: string;

  /** 都道府県名 (カナ) */
  pref_k: string;

  /** 都道府県名 (ローマ字) */
  pref_r: string;

  /** 代表点 (県庁の位置) */
  point: LngLat;

  cities: SingleCity[];
};

/**

 * SinglePrefecture から都道府県名を取得します。

 * @param pref SinglePrefecture

 * @returns string

 */
export function prefectureName(pref: SinglePrefecture): string {
  return pref.pref;
}

type Api<T> = {
  meta: {
    /** データ更新日(UNIX時間; 秒) */
    updated: number;
  };
  data: T;
}

/**

 * 都道府県、市区町村一覧API

 * 政令都市の場合は区で区切ります

 * @file api/ja.json

 */
export type PrefectureApi = Api<SinglePrefecture[]>;

export type SingleCity = {
  /** 全国地方公共団体コード */
  code: number;
  /** 郡名 */
  county?: string;
  /** 郡名 (カナ) */
  county_k?: string;
  /** 郡名 (ローマ字) */
  county_r?: string;

  /** 市区町村名 */
  city: string;
  /** 市区町村名 (カナ) */
  city_k: string;
  /** 市区町村名 (ローマ字) */
  city_r: string;

  /** 政令市区名 */
  ward?: string;
  /** 政令市区名 (カナ) */
  ward_k?: string;
  /** 政令市区名 (ローマ字) */
  ward_r?: string;

  /** 代表点 (自治体役場の位置) */
  point: LngLat;
};

/**

 * SingleCity から市区町村名を取得します。郡名と政令市区名を含めます。

 * @param city SingleCity

 * @returns string

 */
export function cityName(city: SingleCity): string {
  return `${city.county || ''}${city.city}${city.ward || ''}`;
}

/**

 * 市区町村一覧API

 * @file api/ja/{都道府県名}.json

 */
export type CityApi = Api<SingleCity[]>;

export type SingleMachiAza = {
  /** ABR上の「町字ID」 */
  machiaza_id: string;

  /** 大字・町名 */
  oaza_cho?: string;
  /** 大字・町名 (カナ) */
  oaza_cho_k?: string;
  /** 大字・町名 (ローマ字) */
  oaza_cho_r?: string;

  /** 丁目名 */
  chome?: string;
  /** 丁目名 (数字) */
  chome_n?: number;

  /** 小字名 */
  koaza?: string;
  /** 小字名 (カナ) */
  koaza_k?: string;
  /** 小字名 (ローマ字) */
  koaza_r?: string;

  /** 住居表示住所の情報の存在。値が存在しない場合は、住居表示住所の情報は存在しません。 */
  rsdt?: true;

  /** 代表点 */
  point?: LngLat;

  /** CSV APIに付加情報が存在する場合、この町字のバイト範囲を指定します。 */
  csv_ranges?: {
    ["住居表示"]?: { start: number; length: number; };
    ["地番"]?: { start: number; length: number; };
  }
};

/**

 * SingleMachiAza から町字名を取得します。大字・丁目・小字を含めます。

 * @param machiAza SingleMachiAza

 * @returns string

 */
export function machiAzaName(machiAza: SingleMachiAza): string {
  return `${machiAza.oaza_cho || ''}${machiAza.chome || ''}${machiAza.koaza || ''}`;
}

/**

 * 町字一覧API

 * @file api/ja/{都道府県名}/{市区町村名}.json

 */
export type MachiAzaApi = Api<SingleMachiAza[]>;

export type SingleRsdt = {
  /** 街区符号 */
  blk_num?: string;
  /** 住居番号 */
  rsdt_num: string;
  /** 住居番号2 */
  rsdt_num2?: string;

  /** 代表点 */
  point?: LngLat;
};

/**

 * SingleRsdt の街区符号・住居番号・住居番号2を `-` で区切った文字列を返します。

 * @param rsdt SingleRsdt

 * @returns string

 */
export function rsdtToString(rsdt: SingleRsdt): string {
  return [rsdt.blk_num, rsdt.rsdt_num, rsdt.rsdt_num2].filter(Boolean).join('-');
}

/**

 * {市区町村名}-住居表示.json は類似なデータフォーマットを使います。

 * @file api/ja/{都道府県名}/{市区町村名}-住居表示.json

 */
export type RsdtApi = {
  machiAza: SingleMachiAza;
  rsdts: SingleRsdt[];
}[];

export type SingleChiban = {
  /** 地番1 */
  prc_num1: string;
  /** 地番2 */
  prc_num2?: string;
  /** 地番3 */
  prc_num3?: string;

  /** 代表点 */
  point?: LngLat;
};

/**

 * SingleChiban の地番1・地番2・地番3を `-` で区切った文字列を返します。

 * @param chiban SingleChiban

 * @returns string

 */
export function chibanToString(chiban: SingleChiban): string {
  return [chiban.prc_num1, chiban.prc_num2, chiban.prc_num3]
    .filter(Boolean)
    .join('-');
}