/* * Copyright (c) 2015 Jean-Marc VIGLINO, * released under the CeCILL-B license (French BSD license) * (http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt). */ import ol_style_Style from 'ol/style/Style.js' import ol_style_Text from 'ol/style/Text.js'; import ol_style_Stroke from 'ol/style/Stroke.js' import ol_style_Fill from 'ol/style/Fill.js' import ol_style_Style_defaultStyle from '../style/defaultStyle.js' /** * Get a style for Geoportail WFS features * * @param {String} options.typeName * @param {any} options * @param {boolean|number} options.sens true show flow direction or a max resolution to show it, default false * @param {boolean} options.vert 'vert' road section (troncon_de_route) style, default false * @param {boolean} options.symbol show symbol on buildings (batiment), default false * @return {Array} */ var ol_style_geoportailStyle; (function(){ var cache = {}; var styleCount = 0; // Troncon de route function troncon_de_route(options) { // Get color according to road properties var getColor = function (feature) { if (options.vert && feature.get('itineraire_vert')) { if (feature.get('position_par_rapport_au_sol') < 0) return [0, 128, 0, .7]; else if (feature.get('position_par_rapport_au_sol') > 0) return [0, 100, 0, 1]; else return [0, 128, 0, 1]; } if (!feature.get('importance')) return "magenta"; if (feature.get('nature') === 'Piste cyclable') { return [27,177,27,.5] } if (feature.get('position_par_rapport_au_sol') != "0") { var col; switch(feature.get('importance')) { case "1": col = [177, 27, 177, 1]; break; case "2": col = [177, 27, 27, 1]; break; case "3": col = [217, 119, 0, 1]; break; case "4": col = [255, 225, 0, 1]; break; case "5": col = [204, 204, 204, 1]; break; default: col = [211, 211, 211, 1]; break; } if (feature.get('position_par_rapport_au_sol') < 0) col[3] = .7; return col; } else { switch(feature.get('importance')) { case "1": return [255,0,255,1]; case "2": return [255,0,0,1]; case "3": return [255, 165, 0, 1]; case "4": return [255,255,0,1]; case "5": return [255,255,255,1]; default: return [211, 211, 211, 1]; } } // return "#808080"; } // Get Width var getWidth = function (feature) { return Math.max ( feature.get('largeur_de_chaussee')||2 , 2 ); } // Zindex var getZindex = function (feature) { if (!feature.get('position_par_rapport_au_sol')) return 100; var pos = Number(feature.get('position_par_rapport_au_sol')); if (pos>0) return 10 + pos*10 - (Number(feature.get('importance')) || 10); else if (pos<0) return Math.max(4 + pos, 0); else return 10 - (Number(feature.get('importance')) || 10); // return 0; } // Get rotation on the center of the line var lrot = function (geom) { //if (sens != options.direct && sens != options.inverse) return 0; var geo = geom.getCoordinates(); var x, y, dl=0, l = geom.getLength(); for (var i=0; i=l/2) break; } return -Math.atan2(y,x); } // Sens circulation var getSens = function (feature) { if (options.sens && !/double|sans/i.test(feature.get('sens_de_circulation'))) { return new ol_style_Text({ text: (feature.get('sens_de_circulation') == 'Sens direct' ? '→' : '←'), font: 'bold 12px sans-serif', placement: 'point', textAlign: 'center', fill: new ol_style_Fill({ color: [0,0,0,.3] }), stroke: new ol_style_Stroke({ color: [0,0,0,.3], width: 1.5 }), rotateWithView: true }) } return null; } var getDash = function(feature) { switch (feature.get('nature')) { case 'Escalier': { return [1,4] } case 'Sentier': { return [8,10] } } } var styleId = 'ROUT-'+(styleCount++)+'-' return function (feature, res) { var useSens = (options.sens === true || res < options.sens); var id = styleId + feature.get('nature') + '-' + feature.get('position_par_rapport_au_sol') + '-' + (useSens ? feature.get('sens_de_circulation') : 'Sans objet') + '-' + feature.get('position_par_rapport_au_sol') + '-' + feature.get('importance') + '-' + feature.get('largeur_de_chaussee') + '-' + feature.get('itineraire_vert'); var style = cache[id]; if (!style) { style = cache[id] = [ new ol_style_Style ({ text: useSens ? getSens(feature) : null, stroke: new ol_style_Stroke({ color: getColor(feature), width: getWidth(feature), lineDash: getDash(feature) }), zIndex: getZindex(feature)-100 }) ]; } // Rotation if (style[0].getText()) style[0].getText().setRotation(lrot(feature.getGeometry())); return style; }; } /** Style for batiments */ function batiment(options) { var getBatiColor = function (feature) { switch (feature.get('nature')) { case "Industriel, agricole ou commercial": return [51, 102, 153,1]; case "Remarquable": return [0,192,0,1]; default: switch ( feature.get('usage_1') ) { case 'Résidentiel': case 'Indifférencié': return [128,128,128,1]; case 'Industriel': case 'Commercial et services': return [51, 102, 153,1]; case "Sportif": return [51,153,102,1]; case "Religieux": return [153,102,51,1]; default: return [153,51,51,1]; } } } var getSymbol = function (feature) { switch ( feature.get('usage_1') ) { case "Commercial et services": return "\uf217"; case "Sportif": return "\uf1e3"; default: return null; } } var styleId = 'BATI-'+(styleCount++)+'-' return function (feature) { if (feature.get('detruit')) return []; var id = styleId + feature.get('usage_1') + '-' + feature.get('nature') + '-' + feature.get('etat_de_l_objet'); var style = cache[id]; if (!style) { var col = getBatiColor(feature); var colfill = [col[0], col[1], col[1], .5] var projet = !/en service/i.test(feature.get('etat_de_l_objet')); if (projet) colfill[3] = .1; var symbol = (options.symbol ? getSymbol(feature): null); return [ new ol_style_Style({ text: symbol ? new ol_style_Text({ text: symbol, font: '12px FontAwesome', fill: new ol_style_Fill({ color: [0,0,0, .6] //col }) }) : null, fill: new ol_style_Fill({ color: colfill }), stroke: new ol_style_Stroke ({ color: col, width: 1.5, lineDash: projet ? [5,5] : null }) }) ] } return style } } // Parcelle / cadastre function parcelle(options) { var style = new ol_style_Style({ text: new ol_style_Text({ text: '0000', font: 'bold 12px sans-serif', fill: new ol_style_Fill({ color: [100, 0, 255, 1] }), stroke: new ol_style_Stroke ({ color: [255,255,255, .8], width: 3 }) }), stroke: new ol_style_Stroke ({ color: [255, 165, 0, 1], width: 1.5 }), fill: new ol_style_Fill({ color: [100, 0, 255, .1] }) }) return function(feature, resolution) { if (resolution < .8) style.getText().setFont('bold 12px sans-serif'); else style.getText().setFont('bold 10px sans-serif'); if (options.section) { style.getText().setText(feature.get('section') +'-'+ (feature.get('numero')||'').replace(/^0*/,'')); } else { style.getText().setText((feature.get('numero')||'').replace(/^0*/,'')); } return style; } } // Corine Land Cover Style var clcColors = { 111: { color: [230,0,77,255], title: 'Continuous urban fabric'}, 112: { color: [255,0,0,255], title: 'Discontinuous urban fabric'}, 121: { color: [204,77,242,255], title: 'Industrial or commercial units'}, 122: { color: [204,0,0,255], title: 'Road and rail networks and associated land'}, 123: { color: [230,204,204,255], title: 'Port areas'}, 124: { color: [230,204,230,255], title: 'Airports'}, 131: { color: [166,0,204,255], title: 'Mineral extraction sites'}, 132: { color: [166,77,0,255], title: 'Dump sites'}, 133: { color: [255,77,255,255], title: 'Construction sites'}, 141: { color: [255,166,255,255], title: 'Green urban areas'}, 142: { color: [255,230,255,255], title: 'Sport and leisure facilities'}, 211: { color: [255,255,168,255], title: 'Non-irrigated arable land'}, 212: { color: [255,255,0,255], title: 'Permanently irrigated land'}, 213: { color: [230,230,0,255], title: 'Rice fields'}, 221: { color: [230,128,0,255], title: 'Vineyards'}, 222: { color: [242,166,77,255], title: 'Fruit trees and berry plantations'}, 223: { color: [230,166,0,255], title: 'Olive groves'}, 231: { color: [230,230,77,255], title: 'Pastures'}, 241: { color: [255,230,166,255], title: 'Annual crops associated with permanent crops'}, 242: { color: [255,230,77,255], title: 'Complex cultivation patterns'}, 243: { color: [230,204,77,255], title: 'Land principally occupied by agriculture with significant areas of natural vegetation'}, 244: { color: [242,204,166,255], title: 'Agro-forestry areas'}, 311: { color: [128,255,0,255], title: 'Broad-leaved forest'}, 312: { color: [0,166,0,255], title: 'Coniferous forest'}, 313: { color: [77,255,0,255], title: 'Mixed forest'}, 321: { color: [204,242,77,255], title: 'Natural grasslands'}, 322: { color: [166,255,128,255], title: 'Moors and heathland'}, 323: { color: [166,230,77,255], title: 'Sclerophyllous vegetation'}, 324: { color: [166,242,0,255], title: 'Transitional woodland-shrub'}, 331: { color: [230,230,230,255], title: 'Beaches dunes sands'}, 332: { color: [204,204,204,255], title: 'Bare rocks'}, 333: { color: [204,255,204,255], title: 'Sparsely vegetated areas'}, 334: { color: [0,0,0,255], title: 'Burnt areas'}, 335: { color: [166,230,204,255], title: 'Glaciers and perpetual snow'}, 411: { color: [166,166,255,255], title: 'Inland marshes'}, 412: { color: [77,77,255,255], title: 'Peat bogs'}, 421: { color: [204,204,255,255], title: 'Salt marshes'}, 422: { color: [230,230,255,255], title: 'Salines'}, 423: { color: [166,166,230,255], title: 'Intertidal flats'}, 511: { color: [0,204,242,255], title: 'Water courses'}, 512: { color: [128,242,230,255], title: 'Water bodies'}, 521: { color: [0,255,166,255], title: 'Coastal lagoons'}, 522: { color: [166,255,230,255], title: 'Estuaries'}, 523: { color: [230,242,255,255], title: 'Sea and ocean'}, }; function corineLandCover (options) { return function(feature) { var code = feature.get('code_'+options.date); var style = cache['CLC-'+code]; if (!style) { var color = clcColors[code].color.slice(); color[3] = options.opacity || 1; style = cache['CLC-'+code] = new ol_style_Style({ fill: new ol_style_Fill({ color: color || [255,255,255,.5] }) }) } return style; } } /** Get ol style for an IGN WFS layer * @param {string} typeName * @param {Object} options */ ol_style_geoportailStyle = function(typeName, options) { options = options || {}; switch (typeName) { // Troncons de route case 'BDTOPO_V3:troncon_de_route': return troncon_de_route(options); // Bati case 'BDTOPO_V3:batiment': return batiment(options); // Parcelles case 'CADASTRALPARCELS.PARCELLAIRE_EXPRESS:parcelle': return parcelle(options); default: { // CLC if (/LANDCOVER/.test(typeName)) { options.date = typeName.replace(/[^\d]*(\d*).*/,'$1'); return (corineLandCover(options)); } else { // Default style console.warn('[ol/style/geoportailStyle] no style defined for type: ' + typeName) return ol_style_Style_defaultStyle(); } } } }; /** List of clc colors */ ol_style_geoportailStyle.clcColors = JSON.parse(JSON.stringify(clcColors)); })(); export default ol_style_geoportailStyle