view client/src/layers/layers.js @ 1063:7ec2133c6404

client: add area measurement. simpify code * Add a third draw mode which can only be activated when no morphology is selected and we are already in LineString mode. It adds an area calculation. Because the Polygon drawMode ends on a double click, there needs to be an extra callback for this to run identify so that the area calculation is shown all times. * Add Bernhard as author to some files and also simplify copyright note. * Remove DRAWMODES in the code to simplify as this is just one indirection used once in stores/application.js. * Use mapState instead mapGetters to get the drawMode at all places to save some code lines.
author Bernhard Reiter <bernhard@intevation.de>
date Thu, 25 Oct 2018 23:16:53 +0200
parents ca628dce90dd
children 9e3ba050a7f7
line wrap: on
line source

/*
 * This is Free Software under GNU Affero General Public License v >= 3.0
 * without warranty, see README.md and license for details.
 * 
 * SPDX-License-Identifier: AGPL-3.0-or-later
 * License-Filename: LICENSES/AGPL-3.0.txt
 * 
 * Copyright (C) 2018 by via donau 
 *   – Österreichische Wasserstraßen-Gesellschaft mbH
 * Software engineering by Intevation GmbH
 * 
 * Author(s):
 * Thomas Junk <thomas.junk@intevation.de>
 */

import TileWMS from "ol/source/TileWMS.js";
import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer.js";
import OSM from "ol/source/OSM";
import { Stroke, Style, Fill, Text, Circle as CircleStyle } from "ol/style.js";
import VectorSource from "ol/source/Vector.js";
import { bbox as bboxStrategy } from "ol/loadingstrategy";
import { HTTP } from "../application/lib/http";

const layers = [
  {
    name: "Open Streetmap",
    data: new TileLayer({
      source: new OSM()
    }),
    isVisible: true
  },
  {
    name: "Inland ECDIS chart Danube",
    data: new TileLayer({
      source: new TileWMS({
        preload: 1,
        url: "https://demo.d4d-portal.info/wms",
        params: { LAYERS: "d4d", VERSION: "1.1.1", TILED: true }
      })
    }),
    isVisible: true
  },
  {
    name: "Fairway Dimensions",
    data: new VectorLayer({
      source: new VectorSource(),
      style: function(feature) {
        return [
          new Style({
            stroke: new Stroke({
              color: "rgba(0, 0, 255, 1.0)",
              width: 2
            })
          }),
          new Style({
            text: new Text({
              font: 'bold 12px "Open Sans", "sans-serif"',
              placement: "line",
              fill: new Fill({
                color: "black"
              }),
              text: "LOS: " + feature.get("level_of_service").toString()
              //, zIndex: 10
            })
          })
        ];
      }
    }),
    isVisible: true
  },
  {
    name: "Waterway Area, named",
    data: new VectorLayer({
      source: new VectorSource({
        strategy: bboxStrategy
      }),
      style: new Style({
        stroke: new Stroke({
          color: "rgba(0, 132, 0, 1)",
          width: 2
        })
      })
    }),
    isVisible: false
  },
  {
    name: "Waterway Area",
    data: new VectorLayer({
      source: new VectorSource({
        strategy: bboxStrategy
      }),
      style: new Style({
        stroke: new Stroke({
          color: "rgba(0, 102, 0, 1)",
          width: 2
        })
      })
    }),
    isVisible: true
  },
  {
    name: "Waterway Axis",
    data: new VectorLayer({
      source: new VectorSource({
        strategy: bboxStrategy
      }),
      style: new Style({
        stroke: new Stroke({
          color: "rgba(0, 0, 255, .5)",
          lineDash: [5, 5],
          width: 2
        })
      })
    }),
    isVisible: true
  },
  {
    name: "Distance marks",
    forLegendStyle: { point: true, resolution: 8 },
    data: new VectorLayer({
      source: new VectorSource({
        strategy: bboxStrategy
      })
    }),
    isVisible: false
  },
  {
    name: "Bottlenecks",
    data: new VectorLayer({
      source: new VectorSource({
        strategy: bboxStrategy
      }),
      style: new Style({
        stroke: new Stroke({
          color: "rgba(230, 230, 10, .8)",
          width: 4
        }),
        fill: new Fill({
          color: "rgba(230, 230, 10, .3)"
        })
      })
    }),
    isVisible: true
  },
  {
    name: "Bottleneck isolines",
    data: new TileLayer({
      source: new TileWMS({
        preload: 0,
        projection: "EPSG:3857",
        url: window.location.origin + "/api/internal/wms",
        params: {
          LAYERS: "sounding_results_contour_lines_geoserver",
          VERSION: "1.1.1",
          TILED: true
        },
        tileLoadFunction: function(tile, src) {
          // console.log("calling for", tile, src);
          HTTP.get(src, {
            headers: {
              "X-Gemma-Auth": localStorage.getItem("token")
            },
            responseType: "blob"
          }).then(response => {
            tile.getImage().src = URL.createObjectURL(response.data);
          });
        } // TODO  tile.setState(TileState.ERROR);
      })
    }),
    isVisible: false
  },
  {
    name: "Distance marks, Axis",
    forLegendStyle: { point: true, resolution: 8 },
    data: new VectorLayer({
      source: new VectorSource({
        strategy: bboxStrategy
      }),
      style: function(feature, resolution) {
        if (resolution < 10) {
          var s = new Style({
            image: new CircleStyle({
              radius: 5,
              fill: new Fill({ color: "rgba(255, 0, 0, 0.1)" }),
              stroke: new Stroke({ color: "blue", width: 1 })
            })
          });
          if (resolution < 6) {
            s.setText(
              new Text({
                offsetY: 12,
                font: '10px "Open Sans", "sans-serif"',
                fill: new Fill({
                  color: "black"
                }),
                text: (feature.get("hectometre") / 10).toString()
              })
            );
          }
          return s;
        } else {
          return [];
        }
      }
    }),
    isVisible: true
  }
];

export { layers };