-
Notifications
You must be signed in to change notification settings - Fork 0
/
GeoMuni.cs
198 lines (163 loc) · 5.25 KB
/
GeoMuni.cs
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
193
194
195
196
197
198
using System.Collections.Generic;
using System.IO;
namespace MunicipiosCatalunya
{
public class ItemGeo
{
public int id { get; set; }
public string nom { get; set; }
}
class GeoMuni
{
/*
* La clase facilita información de los municipios, provincias y comarcas
* en Catalunya, adquiere los datos desde el archivo binario .dat y los
* traslada a matrices de tipo ItemGeo:
*
* ItemGeo[x].id = código INE en número.
* ItemGeo[x].nom = nombre de municipio, comarca o provincia.
*
*
* Para relacionar el municipio con sus comarca y provincia
* utiliza dos matrices tipo int[,]
*
*/
/*
* Ruta al archivo binario .dat con los datos
*/
private string pathGeoMuni = Directory.GetCurrentDirectory() + @"\\MunicipiosCatalunya.dat";
/*
* Número de elementos, utilizadas en los bucles
*/
private int sonProvincias;
private int sonComarcas;
private int sonMunicipios;
/*
* Matrices que relacionan el municipio con sus comarca y provincia
*/
private int[,] idComarMuni = null;
private int[,] idProvinMuni = null;
/*
* Matrices para los pares ItemGeo
*
* ItemGeo[x].id = código INE en número.
* ItemGeo[x].nom = nombre de municipio, comarca o provincia.
*
*/
private ItemGeo[] provincias;
private ItemGeo[] comarcas;
private ItemGeo[] municipios;
/*
* En el constructor, el parametro nomReal determina el nombre de los municipios
* cargados desde el archivo binario .dat:
*
* x = new GeoMUni(); o x = new Geomuni(true);
* nombres de municipios = su nombre real= el Bruc - l'Escala
*
* x = new GeoMUni(false);
* nombres de municipios = nombre con el artículo al final,
* separado por una coma = Bruc, el - Escala, l'
*
*/
public GeoMuni(bool nomReal = true)
{
LeeArchivoGeoMuni(nomReal);
}
public ItemGeo[] Provincias()
{
return provincias;
}
public ItemGeo[] Comarcas()
{
return comarcas;
}
public ItemGeo[] Municipios()
{
return municipios;
}
/* Retorna una List<ItemGeo> con los municipios
* correspondientes a la provincia recibida
*/
public List<ItemGeo> MunicipiosEnProvincia(int idProvincia)
{
List<ItemGeo> municipiosProvin = new List<ItemGeo>();
for (int i = 0; i < sonMunicipios; i++)
{
if (idProvinMuni[0, 0] > idProvincia) break;
if (idProvinMuni[i, 0] == idProvincia) municipiosProvin.Add(municipios[idProvinMuni[i, 1]]);
}
return municipiosProvin;
}
/* Retorna una List<ItemGeo> con los municipios
* correspondientes a la comarca recibida
*/
public List<ItemGeo> MunicipiosEnComarca(int idComarca)
{
List<ItemGeo> municipiosComarca = new List<ItemGeo>();
for (int i = 0; i < sonMunicipios; i++)
{
if (idComarMuni[0, 0] > idComarca) break;
if (idComarMuni[i, 0] == idComarca) municipiosComarca.Add(municipios[idComarMuni[i, 1]]);
}
return municipiosComarca;
}
/*
* Lee el archivo binario con los datos e inicia las variables
*/
private void LeeArchivoGeoMuni(bool nomReal)
{
if (!File.Exists(pathGeoMuni)) return;
using (FileStream fs = File.OpenRead(pathGeoMuni))
{
using (BinaryReader lector = new BinaryReader(fs))
{
int offBloqueIndexado = lector.ReadInt32();
sonProvincias = lector.ReadInt32();
sonComarcas = lector.ReadInt32();
sonMunicipios = lector.ReadInt32();
// Iniciar las matrices ItemGeo para provincias y comarcas
IniciaMatrizItemGeo(lector, sonProvincias, ref provincias);
IniciaMatrizItemGeo(lector, sonComarcas, ref comarcas);
// Se posiciona en el bloque de nombres con el artículo al final del nombre
if (!nomReal) fs.Seek(offBloqueIndexado, SeekOrigin.Begin);
// Iniciar la matriz ItemGeo para los municipios
IniciaMatrizItemGeo(lector, sonMunicipios, ref municipios);
// Inicia las matrices de relación municipio con su comarca y provincia
IniciaMatrizRelaciones(lector, sonMunicipios, ref idProvinMuni);
IniciaMatrizRelaciones(lector, sonMunicipios, ref idComarMuni);
}
}
}
/*
* Crea la matriz ItemGeo[] y la inicia con los datos
*/
private void IniciaMatrizItemGeo(BinaryReader lector, int son, ref ItemGeo[] matriz)
{
// Inicia la matriz de ItemGeo
matriz = new ItemGeo[son];
int i = 0;
for (i = 0; i < son; i++) matriz[i] = new ItemGeo();
// lee y procesa los datos del archivo
string nombres = lector.ReadString();
string[] temp = nombres.Split(';');
i = 0;
for (i = 0; i < son; i++)
{
matriz[i].id = lector.ReadInt32();
matriz[i].nom = temp[i];
}
}
/*
* Crea la matriz in[,] y la inicia con los datos
*/
private void IniciaMatrizRelaciones(BinaryReader lector, int son, ref int[,] matriz)
{
matriz = new int[son, 2];
for (int i = 0; i < sonMunicipios; i++)
{
matriz[i, 0] = lector.ReadInt32();
matriz[i, 1] = lector.ReadInt32();
}
}
}
}