-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathfeature-property-filter.js
More file actions
299 lines (275 loc) · 10.4 KB
/
feature-property-filter.js
File metadata and controls
299 lines (275 loc) · 10.4 KB
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
/**
* Copyright (c) Institut national de l'information géographique et forestière
*
* This program and the accompanying materials are made available under the terms of the GPL License, Version 3.0.
*/
import parseOsmOpeningHours from "./parse-osm-opening-hours";
// import wayNameDictionnary from "./way-name-dictionnary";
/**
*
* @param {feature} feature maplibre issue de tuile vecteur
* @returns chaine de caractère HTML qui décrit la feature
*/
const isIndifferencie = (prop) => {
if (prop == "Indifférenciée" || prop == "Indifférencié") return true;
else return false;
};
const getProperty = (feature, prop) => {
return Object.prototype.hasOwnProperty.call(feature.properties, prop) ? feature.properties[prop] : "";
};
const featurePropertyFilter = (feature) => {
let result = {
before: "<div class='positionHtmlBefore'>",
after: "<div class='positionHtmlAfter'>",
};
if (feature.source === "poi_osm") {
let web = getProperty(feature, "web");
let telephone = getProperty(feature, "telephone");
let horaire = getProperty(feature, "horaire");
let panoramax = getProperty(feature, "panoramax");
if (panoramax) {
result.after += `<p class="panoramaxPoiImg"><img class="unescoimg" src="https://api.panoramax.xyz/api/pictures/${panoramax}/thumb.jpg" width="200px">`;
result.after += "<span class=\"monumentsHistoriquesImageAuthor\">Image issue du projet <a href=\"https://panoramax.fr\" target=\"_blank\">Panoramax</a></span></p>";
}
if (horaire) {
try {
result.after += `<p class="positionHours positionInfo">Horaire : ${parseOsmOpeningHours(horaire)}</p>`;
} catch {
console.warn("Could not parse horaire: " + horaire);
result.after += `<p class="positionHours positionInfo">Horaire : ${horaire}</p>`;
}
}
if (web) {
result.after += `<p class="positionWeb positionInfo"><a href="${web}" target="_blank">Accéder au site web</a></p>`;
}
if (telephone) {
telephone = telephone.replace(/\s/g, "");
const telArray = telephone.split("");
if (telArray[0] === "0") {
let offset = 0;
for (let i = 2; i < 10; i += 2) {
telArray.splice(i + offset, 0, " ");
offset++;
}
} else {
telArray.splice(3, 0, " ");
let offset = 0;
for (let i = 5; i < 13; i += 2) {
telArray.splice(i + offset, 0, " ");
offset++;
}
}
result.after += `<p class="positionTelephone positionInfo"><a href="tel:${telephone}">${telArray.join("")}</a></p>`;
}
result.after += "</div>";
result.before = "";
return result;
}
// Pour la plupart des layers bdtopo
let toponyme = getProperty(feature, "toponyme");
let nature = getProperty(feature, "nature");
let nature_detaillee = getProperty(feature, "nature_detaillee");
let hauteur = getProperty(feature, "hauteur");
// pas de légende bdtopo
const noBdtopoAttr = ["surface_hydrographique", "construction_lineaire", "detail_hydrographique", "zone_d_estran", "ligne_orographique"];
if (noBdtopoAttr.includes(feature.layer["source-layer"])) {
result.after += "</div>";
result.before = "";
return result;
}
if (feature.layer["source-layer"] == "surface_hydrographique" && ["Marais salant", "Marais"].includes(nature)) {
result.after += "</div>";
result.before = "";
return result;
}
// Propriétés spécifiques reservoir
if(feature.layer["source-layer"] == "reservoir") {
let volume = getProperty(feature, "volume");
if (hauteur) {
result.before += `Hauteur : ${hauteur.toLocaleString("fr-FR")} mètres <br/>`;
}
if (volume) {
result.before = `Volume : ${volume.toLocaleString("fr-FR")} m3 <br/>`;
}
result.before += "</div>";
result.after = "";
return result;
}
// Propriétés spécifiques troncon_de_route
if(feature.layer["source-layer"] == "troncon_de_route") {
let cpx_numero = getProperty(feature, "cpx_numero");
let cpx_toponyme_route_nommee = getProperty(feature, "cpx_toponyme_route_nommee");
// let nom_1_droite = getProperty(feature, "nom_1_droite");
// let nom_1_gauche = getProperty(feature, "nom_1_gauche");
let cpx_toponyme_voie_verte = getProperty(feature, "cpx_toponyme_voie_verte");
let cpx_toponyme_itineraire_cyclable = getProperty(feature, "cpx_toponyme_itineraire_cyclable");
let nombre_de_voies = getProperty(feature, "nombre_de_voies");
let voie_prive = getProperty(feature, "voie_prive");
let acces_pieton = getProperty(feature, "acces_pieton");
if (cpx_numero) {
result.before += `Numéro : ${cpx_numero}<br/>`;
}
if (cpx_toponyme_route_nommee) {
result.before += `Nom : ${cpx_toponyme_route_nommee}<br/>`;
}
// TODO: si on veut finalement afficher le nom de la route
// } else if (nom_1_droite) {
// const firstWord = nom_1_droite.split(" ")[0];
// if (firstWord in wayNameDictionnary) {
// const nom_1_droite_array = nom_1_droite.split(" ");
// nom_1_droite_array.splice(0, 1, wayNameDictionnary[firstWord]);
// nom_1_droite = nom_1_droite_array.join(" ");
// }
// result.before += `Nom : ${nom_1_droite}<br/>`;
// } else if (nom_1_gauche) {
// const firstWord = nom_1_gauche.split(" ")[0];
// if (firstWord in wayNameDictionnary) {
// const nom_1_gauche_array = nom_1_gauche.split(" ");
// nom_1_gauche_array.splice(0, 1, wayNameDictionnary[firstWord]);
// nom_1_gauche = nom_1_gauche_array.join(" ");
// }
// result.before += `Nom : ${nom_1_gauche}<br/>`;
// }
if (cpx_toponyme_voie_verte)
result.before += `${cpx_toponyme_voie_verte}<br/>`;
if (cpx_toponyme_itineraire_cyclable)
result.before += `${cpx_toponyme_itineraire_cyclable}<br/>`;
if (nombre_de_voies) {
result.before += `Nombre de voies : ${nombre_de_voies}<br/>`;
}
if (acces_pieton) {
result.before += `Mode d'accès piéton : ${acces_pieton}<br/>`;
}
if (voie_prive) {
result.before += "Voie privée<br/>";
}
result.before += "</div>";
result.after = "";
return result;
}
// Propriétés spécifiques batiment
if(feature.layer["source-layer"] == "batiment") {
// Batiment religieux
let usage = getProperty(feature, "usage_1");
if (usage == "Religieux" && !isIndifferencie(nature)) {
result.before += `${nature}<br/>`;
}
// Autres batiments
else {
let nombre_de_logements = getProperty(feature, "nombre_de_logements");
let nombre_d_etages = getProperty(feature, "nombre_d_etages");
let date_d_apparition = getProperty(feature, "date_d_apparition");
if(nombre_de_logements && (nature == "Bâtiment résidentiel ou quelconque" || nature == "Indifférenciée")) {
result.before += `Nombre de logements : ${nombre_de_logements}<br/>`;
}
if(nombre_d_etages) {
if (nombre_d_etages == "0")
result.before += "Bâtiment de plain-pied<br/>";
else
result.before += `Nombre d'étages : ${nombre_d_etages}<br/>`;
}
if(hauteur) {
result.before += `Hauteur : ${hauteur.toLocaleString("fr-FR")} mètres<br/>`;
}
if(date_d_apparition) {
let match = date_d_apparition.match("([0-9]+)/");
if (!match) {
match = date_d_apparition.match("([0-9]+)-");
}
if (match) {
let year = match[1] ? match[1] : "";
result.before += `Année de construction : ${year}<br/>`;
}
}
}
result.before += "</div>";
result.after = "";
return result;
}
// Propriétés spécifiques ligne de chemin de fer
if(feature.layer["source-layer"] == "troncon_de_voie_ferree") {
// Batiment
let cpx_toponyme = getProperty(feature, "cpx_toponyme");
let usage = getProperty(feature, "usage");
let nombre_de_voies = getProperty(feature, "nombre_de_voies");
if(cpx_toponyme) {
result.before += `Nom : ${cpx_toponyme}<br/>`;
}
if(usage) {
result.before += `Usage : ${usage}<br/>`;
}
if(nombre_de_voies) {
result.before += `Nombre de voies : ${nombre_de_voies}<br/>`;
}
result.before += "</div>";
result.after = "";
return result;
}
// Régles spécifiques cimetière
if (feature.layer["source-layer"] == "cimetiere") {
if (nature) {
result.before += `Cimetière ${nature.toLowerCase()}<br/>`;
}
result.before += "</div>";
result.after = "";
return result;
}
// Régles spécifiques réservoir
if (feature.layer["source-layer"] == "reservoir") {
let volume = getProperty(feature, "volume");
if (nature) {
result.before += `${nature}<br/>`;
}
if (hauteur) {
result.before += `Hauteur : ${feature.properties.hauteur.toLocaleString("fr-FR")} mètres <br/>`;
}
if (volume) {
result.before += `Volume : ${feature.properties.volume.toLocaleString("fr-FR")} mètres <br/>`;
}
result.before += "</div>";
result.after = "";
return result;
}
// Régles spécifiques construction ponctuelle
if (feature.layer["source-layer"] == "construction_ponctuelle") {
let date_d_apparition = getProperty(feature, "date_d_apparition");
if (nature_detaillee) {
result.before += `Type : ${nature_detaillee}<br/>`;
}
if (hauteur) {
result.before += `Hauteur : ${feature.properties.hauteur.toLocaleString("fr-FR")} mètres <br/>`;
}
if(date_d_apparition) {
let match = date_d_apparition.match("([0-9]+)/");
let year = match[1] ? match[1] : "";
result.before += `Année de construction : ${year}<br/>`;
}
result.before += "</div>";
result.after = "";
return result;
}
// Régles spécifiques zone_de_vegetation
if (feature.layer["source-layer"] == "zone_de_vegetation") {
const vegetationNoAttr = ["Lande ligneuse", "Vigne", "Verger", "Forêt ouverte", "Mangrove"];
if (!vegetationNoAttr.includes(nature)) {
result.before += nature + "<br/>";
}
result.before += "</div>";
result.after = "";
return result;
}
// pour toutes les couches qui restent
if (toponyme) {
result.before += `<b>${toponyme}</b><br/>`;
}
if (nature && nature_detaillee) {
result.before += nature + ", " + nature_detaillee + "<br/>";
}
else if (nature && !nature_detaillee) {
result.before += nature + "<br/>";
}
result.before += "</div>";
result.after = "";
return result;
};
export default featurePropertyFilter;