Développer un customLayer

Exemple de customlayer

L’ojectif est ici de créer une couche personnalisée de type heatmap à partir d’un fichier KML en utilisant la librairie Openlayers et en s’inspirant de cet exemple.. Avant tout, il faut préparer la structure de fichiers qui convient.

/ demo
│
├── heatmap
│      │
│      ├── config.xml
│      ├── customlayer.js
│      ├── legend.png
│      ├── data
│      │     ├── 2012_Earthquakes_Mag5.kml
|

L’exemple complet est disponible sur github.

Ecrire le customLayer

Astuce

L’ancienne méthode fonctionne toujours mais est plus verbeuse que la nouvelle. Les 3 lignes mises en surbrillance sont remplacées par une seule ligne, également mise en surbrillance, dans la nouvelle version.

Ancienne méthode

customlayer.js
 1//Layerid is the same than the layerid in config.xml
 2const layerid = "heatmap";
 3//Create customlayer object
 4mviewer.customLayers[layerid] = {};
 5//Create Openlayers heatmap layer
 6const layer = new ol.layer.Heatmap({
 7    source: new ol.source.Vector({
 8        url: 'demo/heatmap/data/2012_Earthquakes_Mag5.kml',
 9        format: new ol.format.KML({
10            extractStyles: false
11        })
12    }),
13    blur: 10,
14    radius: 10,
15    weight: function(feature) {
16        var name = feature.get('name');
17        var magnitude = parseFloat(name.substr(2));
18        return magnitude - 5;
19    }
20});
21// Set the openlayers layer to the customLayer object layer
22mviewer.customLayers[layerid].layer = layer;

Nouvelle méthode

Depuis la version 3.2 de mviewer, une classe CustomLayer a été développée afin de faciliter la saisie de nouveaux customLayers :

customlayer.js
 1const layer = new ol.layer.Heatmap({
 2    source: new ol.source.Vector({
 3        url: 'demo/heatmap/data/2012_Earthquakes_Mag5.kml',
 4        format: new ol.format.KML({
 5            extractStyles: false
 6        })
 7    }),
 8    blur: 10,
 9    radius: 10,
10    weight: function(feature) {
11        var name = feature.get('name');
12        var magnitude = parseFloat(name.substr(2));
13        return magnitude - 5;
14    }
15});
16new CustomLayer('heatmap', layer);

Ecrire le config.xml

Dans le fichier de configuration, il faut reprendre l’id du customlayer id="heatmap", préciser type="customlayer" ainsi que l’URL du fichier url="demo/heatmap/customlayer.js" :

config.xml
<layer id="heatmap"
    name="Earthquakes Heatmap"
    visible="true"
    type="customlayer"
    legendurl="demo/heatmap/legend.png"
    opacity="1"
    url="demo/heatmap/customlayer.js"
    attribution=""
    metadata=""
    metadata-csw="">
</layer>

Exemples de customLayers

En respectant les consignes détaillées plus haut, voici quelques exemples prêts à l’emploi.

customlayer ArcGis REST Feature

test_esri_college_80.js - ancienne version
 1{
 2    mviewer.customLayers.test_esri_college_80 = {};
 3
 4    var esrijsonFormat = new ol.format.EsriJSON();
 5
 6    mviewer.customLayers.test_esri_college_80.layer = new ol.layer.Vector({
 7        source: new ol.source.Vector({
 8            url: 'https://services2.arcgis.com/aYGUaoapooTe49i1/arcgis/rest/services/COLLEGES_PUBLICS_avec_Liens/FeatureServer/0/query?where=&objectIds=&time=&geometry=154415%2C6384802%2C345565%2C6494181&geometryType=esriGeometryEnvelope&inSR=3857&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=2154&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=',
 9            format: esrijsonFormat
10        }),
11        style: new ol.style.Style({
12            image: new ol.style.Circle({
13                fill: new ol.style.Fill({
14                    color: 'rgba(255, 118, 117,1.0)'
15                }),
16                stroke: new ol.style.Stroke({
17                    color: "#ffffff",
18                    width: 4
19                }),
20                radius: 9
21            })
22        })
23    });
24    mviewer.customLayers.test_esri_college_80.handle = false;
25
26}
test_esri_college_80.js - nouvelle version
 1let esrijsonFormat = new ol.format.EsriJSON();
 2
 3const layer =  new ol.layer.Vector({
 4    source: new ol.source.Vector({
 5        url: 'https://services2.arcgis.com/aYGUaoapooTe49i1/arcgis/rest/services/COLLEGES_PUBLICS_avec_Liens/FeatureServer/0/query?where=&objectIds=&time=&geometry=154415%2C6384802%2C345565%2C6494181&geometryType=esriGeometryEnvelope&inSR=3857&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=2154&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=',
 6        format: esrijsonFormat
 7    }),
 8    style: new ol.style.Style({
 9        image: new ol.style.Circle({
10            fill: new ol.style.Fill({
11                color: 'rgba(255, 118, 117,1.0)'
12            }),
13            stroke: new ol.style.Stroke({
14                color: "#ffffff",
15                width: 4
16            }),
17            radius: 9
18        })
19    })
20});
21
22new CustomLayer('test_esri_college_80', layer);