Openlayers - слой WMS: как получить измерение времени из определенного слоя - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь загрузить WMS-слой.Используя текущее время ISO-8601, которое показывает слой, но я также хочу иметь возможность устанавливать разные даты и времени.

Чтобы использовать дату / время, которые находятся в определенном диапазоне, мне нужно получитьИзмерение времени через, например, GetCapabilities для этого конкретного слоя и размещения полученных значений в массиве.И с этого момента я могу использовать updateParams для установки / обновления даты / времени.

Как я могу это сделать?

Например:

var WMS_DWD = new ol.layer.Image({
    name: 'Radar D',
    title: "Radar D",
    source: new ol.source.ImageWMS({
        ratio: 1,
        url: 'https://maps.dwd.de/geoserver/ows?service=wms&version=1.3.0&request=GetCapabilities',
        params: {
            'FORMAT': "image/png",
            'VERSION': '1.1.1',
            'LAYERS': 'dwd:RX-Produkt',
             time   : '2019-02-03T15:35:00.000Z',
            "exceptions": 'application/vnd.ogc.se_inimage'
        }
    })
});

Когда я просматриваюURL в браузере, полученный XML имеет тег "" ..... в данном случае для слоя "dwd: RX-Produkt".

В этом теге есть несколько доступных значений даты / времени.Эти «Дата / Время» мне нужно поместить в массив.

Надеюсь, вы мне поможете!

РЕДАКТИРОВАТЬ: ниже обновленного кода (от thx до oicgasser)

WMSlyr = new ol.layer.Tile({
        name: 'myLYR',
        title: "myLYR",
        preload: Infinity,
        source: new ol.source.TileWMS({
            url: 'https://ogcie.iblsoft.com/observations',
            params: {
               'FORMAT': "image/png",
               'VERSION': '1.3.0'
            }
        }),
        urlCapabilities: 'https://ogcie.iblsoft.com/observations?REQUEST=GetCapabilities&SERVICE=WMS&VERSION=1.3.0'
    });

LYR = 'metar';

url = 'https://ogcie.iblsoft.com/observations?REQUEST=GetCapabilities&SERVICE=WMS&VERSION=1.3.0';

window['timeArray'] = [];

var parser = new ol.format.WMSCapabilities();

Time = '2019-02-15T17:00:00.000Z';

fetch(url).then(function (response) {
       return response.text();
    }).then(function (text) {
    var capabilities = parser.read(text);
    var currentProj = map.getView().getProjection().getCode();
    var crs;

    // the parser can only read the list of projections from the WMS 1.3.0 responses.
    // For previous version the current projection wil be used as the default one.
    // If the WMS (< 1.3.0) does not support the default projection the layer will not load.
    if (capabilities.version === '1.3.0'){
        crs = capabilities.Capability.Layer.CRS; // supported EPSG-numbers
    }
    else {
        crs = [currentProj];
    }

    console.log('Projection WMS: ' + crs);

    var layers = capabilities.Capability.Layer.Layer;

    var AllLayerNames = [];

    if (layers.length > 0 && crs.indexOf(currentProj) > -1){
        for (var i = 0; i < layers.length; i += 1){
            if ( _.isArray(layers[i]['Dimension']) && layers[i]['Dimension'].length > 0 ){
                console.log(layers[i].Name);

                AllLayerNames.push(layers[i].Name);

                console.log(layers[i]['Dimension'][0]['values']);
            }
        }
    }


    var LYRnr =  (_.invert(AllLayerNames))[LYR];

    window['timeArray'] = layers[LYRnr]['Dimension'][0]['values'].split(',');

    var formats = capabilities.Capability.Request.GetMap.Format;
    var allformats = [];
    for (var i = 0; i < formats.length; i += 1){
        allformats.push(formats[i]);
    }
    console.log(allformats); // array with all the supported output-formats

    if (window['timeArray'].indexOf(Time.substr(0,16))) { // use part of string because some WMS dimensions use milliseconds and some do not
        WMSlyr.getSource().updateParams({'LAYERS': LYR, 'TIME': Time});
    }
});

Остается вопрос:

  • Некоторые WMScapabilities-XML (например, 'https://maps.dwd.de/geoserver/wms?version=1.3.0&request=GetCapabilities') показывают слои глубже, чем «нормальный». Код показывает ошибку, поскольку размер слоя LYRне найден ........ Как я могу искать эти слои, если у меня есть название этого слоя или даже лучше ..... как я могу обобщить приведенный выше код для достижения этого?

1 Ответ

0 голосов
/ 05 февраля 2019

В Openlayers есть синтаксический анализатор WMS GetCapabilities.

Вот пример кода о том, как этого добиться с помощью ol 4.6.5:

var parser = new ol.format.WMSCapabilities();
fetch("https://maps.dwd.de/geoserver/ows?service=wms&version=1.3.0&request=GetCapabilities")
  .then(function(response) {
    return response.text();
  })
  .then(function(text) {
    var result = parser.read(text);
    var layers = result.Capability.Layer.Layer;
    console.log(layers);
  })
});

Затем вам нужно найтислой, который вас интересует в массиве и анализируйте поле Dimension.Убедитесь, что вы рекурсивно просматриваете все дочерние слои, поскольку они большей частью являются вложенными.

Вот кодовая ручка с вашими WMS GetCapabilities: https://codepen.io/loicgasser/pen/BMdLYX

...