OpenLayers addLayers не работает с TypeError - PullRequest
1 голос
/ 27 мая 2020

Я обновляюсь с OpenLayers 3.15.0 до 6.3.1. Когда я вызываю map.addLayer, я получаю следующую ошибку:

Uncaught TypeError: Cannot read property 'ol_uid' of undefined @
ecb://web/java/ol.js:1:23754

Вот контекст, в котором он вызывается:

function getMinZoom() {
  var width = map.clientWidth;
  return Math.ceil(Math.LOG2E * Math.log(width / 256));
}

//create wms layer
function addWMSLayer(url, attTxt, attHref, layer, format, server, res1, res2, res3, res4) {
  initializeMap();
  //tile source for load wms layers
  var newRes1 = Number(getCalcResolutionSrv(res1));
  var newRes2 = Number(getCalcResolutionSrv(res2));
  var newRes3 = Number(getCalcResolutionSrv(res3));
  var newRes4 = Number(getCalcResolutionSrv(res4));

  var newWMSSource = new ol.source.TileWMS({
    url: url,
    params: {
      'LAYERS': layer,
      'FORMAT': format,
    },
    serverType: 'mapserver',
    projection: projection
  });

  var minZoom = getMinZoom();
  var newWmsLayer = new ol.layer.Tile({
    extent: extent,
    source: newWMSSource,
    minResolution: newRes4,
    maxResolution: newRes1,
    zIndex: 0,
    minZoom: minZoom
  });
  wmsResolution.push(Number(newRes1 - 0.00100));
  wmsResolution.push(newRes2);
  wmsResolution.push(newRes3);
  wmsResolution.push(Number(newRes4 + 0.00100));
  map.addLayer(newWmsLayer);
  ECBJS.addNewWMSLayer(url, layer, newRes1, newRes2, newRes3, newRes4);
};

Функция идентична той, которая использовалась для вызовите addLayer с 3.15.0, за исключением свойств zIndex и minZoom. В версии 3.15.0 это работало.

В чем может быть проблема?

Обновление

Я создал решение MinimalExample на основе MinimalExample из CefSharp . Для его открытия вам потребуется Visual Studio или Rider. https://github.com/tbremeyer/CefSharp.MinimalExample.git

В настоящее время вызов EvaluateScriptAsyn c в функции CallWebSite в Main Windows .xaml.cs возвращается с

Message = "Uncaught TypeError: Cannot read property 'ol_uid' of
undefined @ ecb://web/java/ol.js:1:23754" 
Success = false

Я ожидал его вернуть с

Message = ""
Success = true

1 Ответ

0 голосов
/ 15 июня 2020

Объект карты не инициализирован должным образом. Вот код для создания карты:

var map = new ol.Map({
    controls: ol.control.defaults().extend([
        new ol.control.ScaleLine({
            units: 'metric'
        })
    ]).extend([mousePositionControl]),
    layers: [filterVector],
    overlays: [overlay],
    logo: false,
    target: 'map',
    view: new ol.View({
    })
});

Он использует расширение с помощью mousePositionControl. MousePositionControl определяется как:

var mousePositionControl = new ol.control.MousePosition(
    {
        coordinateFormat: ol.coordinate.createStringXY(1),
        projection: 'EPSG:2056',
        className: 'custom-mouse-position',
        target: document.getElementById('info'),
        undefinedHTML: ' '
    });

Таким образом, он использует проекцию. Проекция не была инициализирована должным образом.

var extent = [2420000, 130000, 2900000, 1350000];
var jsLayers = new Object();
if (proj4) {
    proj4.defs("EPSG:2056",   "+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs");
};

var projection = ol.proj.get('EPSG:2056');
projection.setExtent(extent);

Из OpenLayers: Карта не отображается с нестандартным кодом EPSG Я узнал, что могу использовать

ol.proj.proj4.register(proj4);

в помощь с проецированием. Теперь он гласит:

var extent = [2420000, 130000, 2900000, 1350000];
var jsLayers = new Object();
if (proj4) {
    proj4.defs("EPSG:2056",   "+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs");
};

ol.proj.proj4.register(proj4);
var projection = ol.proj.get('EPSG:2056');
projection.setExtent(extent);

После этого изменения filterVector отсутствовало, и определение наложения нужно было переместить до инициализации карты.

var filterSource = new ol.source.Vector({ wrapX: false });
var filterVector = new ol.layer.Vector({
    source: filterSource,
    style: new ol.style.Style({
        fill: new ol.style.Fill({
            color: 'rgba(255, 255, 255, 0.5)'
        }),
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
            width: 2
        }),
        image: new ol.style.Circle({
            radius: 7,
            fill: new ol.style.Fill({
                color: '#ffcc33'
            })
        })
    })
});

var container = document.getElementById('popup');
var content = document.getElementById('popup-content');
var closer = document.getElementById('popup-closer');

var overlay = new ol.Overlay(({
    element: container,
    autoPan: true,
    autoPanAnimation: {
        duration: 250
    }
}));

Я обновил минимальный пример на https://github.com/tbremeyer/CefSharp.MinimalExample, чтобы отразить эти изменения.

...