Openlayers: добавить сплошной цветной слой в качестве наложения

#javascript #node.js #overlay #openlayers

#javascript #node.js #наложение #openlayers

Вопрос:

Я хочу указать две точки (координаты GPS) в качестве входных данных (например, левый верхний угол и нижний правый угол) и добавить слой, в котором полностью видна только эта область. Остальное должно быть заполнено сплошным цветом и полупрозрачным. Должно выглядеть примерно так:

введите описание изображения здесь

Я новичок в Openlayers и не могу найти пример… Я нашел этот пример для добавления наложений, но здесь это не очень помогло:https://openlayers.org/en/latest/examples/overlay.html

Есть идеи, какую функцию / часть библиотеки необходимо использовать?

Ответ №1:

Вы могли бы определить многоугольник, покрывающий видовой экстент с отверстием для указанного вами экстента. Затем отобразите его в векторном контексте базовых слоев

 import "ol/ol.css";
import Map from "ol/Map";
import OSM from "ol/source/OSM";
import TileLayer from "ol/layer/Tile";
import View from "ol/View";
import { fromLonLat, transformExtent } from "ol/proj";
import { getVectorContext } from "ol/render";
import { fromExtent } from "ol/geom/Polygon";
import { Style, Fill } from "ol/style";

var extent = transformExtent([10, 53, 20, 57], "EPSG:4326", "EPSG:3857");

var osmLayer = new TileLayer({
  source: new OSM()
});

osmLayer.on("postrender", function (event) {
  var vectorContext = getVectorContext(event);
  vectorContext.setStyle(
    new Style({
      fill: new Fill({
        color: "rgba(0, 255, 255, 0.25)"
      })
    })
  );
  var polygon = fromExtent(map.getView().getProjection().getExtent());
  polygon.appendLinearRing(fromExtent(extent).getLinearRing(0));
  vectorContext.drawGeometry(polygon);
});

var map = new Map({
  layers: [osmLayer],
  target: "map",
  view: new View({
    center: fromLonLat([15, 55]),
    zoom: 5
  })
});
  

https://codesandbox.io/s/crazy-sun-qnezt?file=/main.js

или в отдельный векторный слой над базовым слоем

 var polygon = fromExtent(map.getView().getProjection().getExtent());
polygon.appendLinearRing(fromExtent(extent).getLinearRing(0));
var feature = new Feature({geometry: polygon});

var vectorLayer = new VectorLayer({
  source: new VectorSource({
    feature: [feature]
  }),
  style: new Style({
    fill: new Fill({
      color: "rgba(0, 255, 255, 0.25)"
    })
  })
});

map.addLayer(vectorLayer);
  

Комментарии:

1. Можно ли определить его как один слой без необходимости его постоянного обновления? У меня есть еще один метод «postrender», который обновляет точки, поступающие из GeoJSON на карте … поэтому вопрос в том, будет ли достаточно определить весь полигон как слой один раз и «никогда» не касаться его снова (то же самое, что и для базового слоя OSM tile)?

2. Да, это можно сделать как отдельный векторный слой, хотя он может не синхронизироваться так плавно при увеличении / уменьшении масштаба, и если ваш экстент изменился, вам придется обновить геометрию объекта polygon.

3. Здесь опечатка. Векторный слой. функция -> векторный слой. возможности