CP-090-06

COMBINACION COROPLETAS - PROPORTIONAL - Caso alternativo

by SIGC

HTML

<script src="https://sigc.desarrollo.guadaltel.es/mapea5/js/mapea.ol.min.js"></script>
<link rel="stylesheet" href="https://sigc.desarrollo.guadaltel.es/mapea5/assets/css/mapea.ol.min.css">
<script src="https://sigc.desarrollo.guadaltel.es/mapea5/js/configuration.js"></script>
<div id="map"></div>

CSS

html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow: hidden;
}

JavaScript

// Caso de pruebas
let mapajs = M.map({
  'container': 'map',
  "controls": ["layerswitcher"],
  "layer": ["OSM"]
});

let layer = new M.layer.WFS({
  name: "Municipios",
  url: "https://clientes.guadaltel.es/desarrollo/geossigc/wfs?",
  namespace: "mapea",
  name: "da_municipio_pol",
  legend: "Municipios - CATEGORĂŤAS",
  geometry: 'POLYGON',
});;

mapajs.addLayers(layer);

let options = {
  attribute: "gid",
  maxRadius: 25,
  minRadius: 8
};


const getMaxMinValues = function(features, attribute) {
  let [minValue, maxValue] = [undefined, undefined];
  let filteredFeatures = features.filter(feature =>
    !isNaN(feature.getAttribute(attribute))).map(f => parseInt(f.getAttribute(attribute)));
  let index = 1;
  if (!M.utils.isNullOrEmpty(filteredFeatures)) {
    minValue = filteredFeatures[0];
    maxValue = filteredFeatures[0];
    while (index < filteredFeatures.length - 1) {
      let posteriorValue = filteredFeatures[index + 1];
      minValue = (minValue < posteriorValue) ? minValue : posteriorValue;
      maxValue = (maxValue < posteriorValue) ? posteriorValue : maxValue;
      index++;
    }
  }
  return [minValue, maxValue];
}


const proportionalFunction = function(feature, options) {
  let value = parseFloat(feature.getAttribute(options.attribute));
  return calcProportion(value, options.minValue, options.maxValue, options.minRadius, options.maxRadius);
}

/**
 * Funcion matematica que calcula la proporcion de un valor en base a minRadius,
 * maxRadius, minValue, maxValue
 */
const calcProportion = ((value, minValue, maxValue, minRadius, maxRadius) =>
  (((value - minValue) * (maxRadius - minRadius)) / (maxValue - minValue)) + minRadius);


layer.on(M.evt.LOAD, function() {
  /**
   * Valor minimo y maximo de los features
   */
  let [minValue, maxValue] = getMaxMinValues(layer.getFeatures(), options.attribute);
  options.minValue = minValue;
  options.maxValue = maxValue;
  layer.getFeatures().forEach(f => f.setAttribute('porcentaje',...