Filtrage de données
Cette section à pour but de montrer quelques exemples d'utilisation des filtres de couches:
Cela permet de masquer les données des couches impactées par le filtre ne répondant pas au critère
Les filtres sont défini avec la structure suivante:
- Groupe : un id, un nom et une description (optionnelle)
- Filtre : un id, un nom et une description (optionnelle)
- Un objet décrivant "par calque" quel règle de filtrage appliquer
- Filtre : un id, un nom et une description (optionnelle)
Exemple :
{ "ouvs": [ // Affiche pour le calque "ouv" les données ayant TYPOLOGIE = 'REG' et TYPRES = 'EU' { type: 'equal', // equal | notequal | invalues | notinvalues field: 'TYPOLOGIE', // nom du champ de la feature openlayers values: 'REG', // valeur ou liste de valeurs }, { type: 'equal', field: 'TYPRES', values: 'EU', }, ] "cans": [/** règles pour les "cans"*/] }
La démo permet de tester l'application de filtres
- Par API
- Par l'ajout d'un bouton dans la toolbar permettant d'utilise une IHM
Démo de filtrage
{
"jsLib": [
"https://karteis.sct.saas-gfi.eu/dist/mapviewer/latest/karteis-mapviewer-var.js"
]
}
<!-- Ne pas utiliser dans votre code -->
<!-- La déclaration du css n'est utile que pour l'affichage sur le site d'exemples -->
<link rel="stylesheet" href="/mapviewer/mapviewer.css">
<!-- Ne pas utiliser dans votre code -->
<!-- Dans nos exemple on utilise font-awesome pour afficher les icones de boutons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<!-- Le div qui sera utilisé pour injecter la carte -->
<div id="kmap" style="height:350px;" />
<button onclick="addFeature()" title="Ajoute un ouvrage Type réseau EU"> Add EU feature</button>
<button onclick="changeSelection('EU')" title="Change le type de réseau de l'élement sélectionné"> change selected (EU)</button>
<button onclick="changeSelection('EP')" title="Change le type de réseau de l'élement sélectionné"> change selected (EP)</button>
<button onclick="changeSelection('UN')" title="Change le type de réseau de l'élement sélectionné"> change selected (UN)</button>
<div style="display:flex;flex-direction:row;">
<table>
<tr>
<th>Application des filtres par api</th>
</tr>
<tr class="row" id="feat-1" onclick="onClickClear()" >
<td style="color:red;">Retirer le filtre courant</td>
</tr>
<tr class="row" id="feat-1" onclick="onClick('map-eu')" >
<td>type rés: Filtre eau usée</td>
</tr>
<tr class="row" id="feat-2" onclick="onClick('map-ep')" >
<td>type rés: filtre eau pluviale</td>
</tr>
<tr class="row" id="feat-2" onclick="onClick('map-un')" >
<td>type rés: filtre eau unitaire</td>
</tr>
<tr class="row" id="feat-2" onclick="onClick('grilles-bouches-ep')" >
<td>typologie ouvrage: Grille / Bouches</td>
</tr>
<tr class="row" id="feat-2" onclick="onClick('reg-eu')" >
<td>typologie ouvrage: Regards Eau usée</td>
</tr>
<tr class="row" id="feat-2" onclick="onClick('reg-ep')" >
<td>typologie ouvrage: Regards Eau pluviale</td>
</tr>
<tr class="row" id="feat-2" onclick="onClick('brt')" >
<td>Boite de branchement</td>
</tr>
</table>
</div>
// Initialisation de la carte avec ses plugins
const kmapvInstance = (new kmapv.Mapviewer({
mapdiv: document.getElementById('kmap'), // Il est aussi possible d'utiliser directement l'id du div contenant la carte
projection: 'EPSG:3857',
defaultCenter: [673336.2187669694, 6303500.5366335241],
defaultZoom: 18,
minZoom: 5,
maxZoom: 22,
}))
.use(kmapv.CommonLayer({})) // charge le plugin générique des calques
.use(kmapv.BackgroundLayer({})) // charge le plugin de prise en charge des fond de plans
.use(kmapv.DataLayer({})) // chage le plugin de prise en charge des couche de données
// Ajout du fond de plan OSM
kmapvInstance.backgroundLayer.addOSM('background', { title: 'open street map', zIndex: 0 })
// styles des données
const stylesOuvs = {
BRT: kmapv.Services.createStyle(
{
// style des points
circle: {
radius: 5,
fill: {
color: 'rgba(200, 50, 50, 0.6)',
},
stroke: {
color: 'rgba(200, 50, 50, 0.9)',
width: 1,
}
}
}),
default: kmapv.Services.createStyle(
{
// style des points
circle: {
radius: 5,
fill: {
color: 'rgba(170, 170, 170, 0.6)',
},
stroke: {
color: 'rgba(136, 136, 136, 0.9)',
width: 1,
}
}
})
}
const stylesCans= {
EU: kmapv.Services.createStyle({
// style les lignes
stroke: {
color: 'rgba(255, 0, 0, 1)',
width: 2,
},
}),
UN: kmapv.Services.createStyle({
// style les lignes
stroke: {
color: 'rgba(0, 255, 0, 1)',
width: 2,
},
}),
EP: kmapv.Services.createStyle({
// style les lignes
stroke: {
color: 'rgba(70, 130, 180, 1)',
width: 2,
},
}),
default: kmapv.Services.createStyle({
// style les lignes
stroke: {
color: '#333',
width: 2,
},
})
}
const stylesSelected = kmapv.Services.createStyle(
{
// remplissage des polygones
fill: {
color: 'rgba(0,0,255,0.1)',
},
// style les lignes
stroke: {
color: '#00F',
width: 2,
},
// style des points
circle: {
radius: 10,
fill: {
color: 'rgba(0,0,255,0.3)',
},
stroke: {
color: '#00F',
width: 2,
}
}
})
const getStyleCans = ({ feature, selected }) => {
const typRes = feature.get("TYPRES")
return selected ? stylesSelected : stylesCans[typRes] || stylesCans.default
}
const getStyleOuvs = ({ feature, selected }) => {
const typologie = feature.get("TYPOLOGIE")
return selected ? stylesSelected : stylesOuvs[typologie] || stylesOuvs.default
}
// Ajout d'un calque de données
kmapvInstance.dataLayer.addDataLayer({
title: "Canalisations",
idGroup: 'data',
zIndex: 1,
layerId: 'cans',
selectable: true,
style: getStyleCans,
})
// Ajout d'un calque de données
kmapvInstance.dataLayer.addDataLayer({
title: "Ouvrages",
idGroup: 'data',
zIndex: 1,
layerId: 'ouvs',
selectable: true,
minZoom: 17,
maxZoom: 22,
style: getStyleOuvs,
})
// ajout des données au format geojson dans le calque
// !!!! Dans CODEPEN remplacer ../../../../datas/features-base.json par https://karteis.sct.saas-gfi.eu/documentation/datas/features-base.json
fetch('../../../../datas/feature-cans.json').then(function (response) {
return response.json();
}).then((data) => {
kmapvInstance.dataLayer.addGeojsonFeatures({
type: 'FeatureCollection',
features: data.features,
}, 'cans')
})
fetch('../../../../datas/feature-ouvs.json').then(function (response) {
return response.json();
}).then((data) => {
kmapvInstance.dataLayer.addGeojsonFeatures({
type: 'FeatureCollection',
features: data.features,
}, 'ouvs')
})
// exemple ajot de groupe, puis de filtre, puis de layers
kmapvInstance.layerFilter.addGroup("groupTypeRes",{label:"Réseau",sublabel:"Type de réseau"})
kmapvInstance.layerFilter.addFilter("map-eu",{idGroup:'groupTypeRes',label:"Eau usée",sublabel:"Type de réseau eau usée"})
kmapvInstance.layerFilter.addFilter("map-ep",{idGroup:'groupTypeRes',label:"Eau pluviale",sublabel:"Type de réseau eau pluviale"})
kmapvInstance.layerFilter.addFilter("map-un",{idGroup:'groupTypeRes',label:"Réseau Unitaire",sublabel:"Type de réseau eau unitaire"})
kmapvInstance.layerFilter.addLayers("map-eu",{
"cans": [
{
"type": "inValues",
"field": "TYPRES",
"values": [
"EU"
]
}
],
"ouvs": [
{
"type": "inValues",
"field": "TYPRES",
"values": [
"EU"
]
}
]
})
kmapvInstance.layerFilter.addLayers("map-ep",{
"cans": [
{
"type": "inValues",
"field": "TYPRES",
"values": [
"EP"
]
}
],
"ouvs": [
{
"type": "inValues",
"field": "TYPRES",
"values": [
"EP"
]
}
]
})
kmapvInstance.layerFilter.addLayers("map-un",{
"cans": [
{
"type": "inValues",
"field": "TYPRES",
"values": [
"UN"
]
}
],
"ouvs": [
{
"type": "inValues",
"field": "TYPRES",
"values": [
"UN"
]
}
]
})
// exemple: ajout de groupe puis ajout de
kmapvInstance.layerFilter.addGroup("groupTypologie",{label:"Typologie",sublabel:"Typologie"})
//kmapvInstance.layerFilter.addFilter("map-un",{idGroup:'groupTypeRes',label:"Réseau Unitaire",sublabel:"Type de réseau eau unitaire"})
kmapvInstance.layerFilter.addLayers({idFilter: 'grilles-bouches-ep', idGroup:'groupTypologie',label:"Grille / Bouches",sublabel:"typologie ouvrage Grille / Bouches"},
{
"ouvs": [
{
type: 'inValues',
field: 'TYPOLOGIE',
values: ['GRI', 'AVA', 'AVG'],
},
]
})
kmapvInstance.layerFilter.addLayers({idFilter: 'ref-eu', idGroup:'groupTypologie',label:"Regards Eau usée"},
{
"ouvs": [
{
type: 'equal',
field: 'TYPOLOGIE',
values: 'REG',
},
{
type: 'equal',
field: 'TYPRES',
values: 'EU',
},
]
})
kmapvInstance.layerFilter.addLayers({idFilter: 'reg-ep', idGroup:'groupTypologie',label:"Regards Eau pluviale"},
{
"ouvs": [
{
type: 'equal',
field: 'TYPOLOGIE',
values: 'REG',
},
{
type: 'equal',
field: 'TYPRES',
values: 'EP',
},
]
})
// sans groupe
kmapvInstance.layerFilter.addLayers({idFilter: 'brt', label:"Boite de branchement"},
{
"ouvs": [
{
type: 'equal',
field: 'TYPOLOGIE',
values: 'BRT',
},
]
})
// ajout a la toolbar:
kmapvInstance.horizontalToolbar.addLayerFilterTool()
// gestion des filtres par api
function onClick(id) {
kmapvInstance.layerFilter.applyFilter(id)
}
function onClickClear() {
kmapvInstance.layerFilter.clear()
}
function addFeature() {
// ajoute une feature type
const feature = {
"type" : "Feature",
"id": "added_feature",
"geometry" : {
"type" : "Point",
"coordinates" : [ 673336, 6303460 ]
},
"properties" : {
"TYPRES" : "EU",
"TYPOLOGIE" : "REG",
"PRIVE" : "N"
}
};
kmapvInstance.dataLayer.addGeojsonFeatures({
type: 'FeatureCollection',
features: [feature],
}, 'ouvs');
}
function changeSelection (typeres) {
const currentSelection = kmapvInstance.dataLayer.getCurrentSelection()
if (currentSelection.length === 1) {
currentSelection[0].set('TYPRES',typeres)
}
}
table {
margin-top: 3px;
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
cursor: pointer;
border: 1px solid #dddddd;
text-align: left;
}
tr:nth-child(even) {
background-color: #dddddd;
}
