Получите данные с веб-сервера карты

Как правило, сервер WMS возвращает графическое представление слоя (или слоев) назад просителю, а не фактическим данным. Однако в некоторых редких случаях, можно запросить фактические данные с определенных серверов WMS, при помощи определенной опции с wmsread.

Сервер WMS представляет один или несколько слоев и хранит результаты в файле, который передается потоком просителю. Функция wmsread или метод getMap объекта WebMapServer, выполняет запрос от вашего имени, получает поток во временном файле и импортирует содержимое файла в переменную в вашей рабочей области MATLAB®. Формат файла может быть стандартным графическим форматом, таким как JPEG, PNG или GIF, или это может быть с чередованием строк с методической точностью (BIL) формат, который популярен в дистанционном зондировании. Почти все серверы WMS поддерживают использование формата JPEG, и многие поддерживают больше чем один стандартный графический формат. Только очень немного серверов WMS поддерживают формат BIL, несмотря на то, что это очень полезно.

Выбор формата может влиять на качество ваших результатов. Например, формат PNG избегает связанных с мозаикой артефактов, которые распространены с JPEG. Выбор формата также определяет, получите ли вы графическое представление, которое имеет место с любым из стандартных графических форматов или сеткой абсолютно количественных данных (возможно включая отрицательные, а также положительные значения). Наборы количественных данных обеспечиваются через формат BIL.

Примечание

Чтобы запросить фактические данные, чаще всего необходимо создать или запрос Веб-сервиса покрытия (WCS), для растровых данных, или запрос Веб-сервиса функции (WFS), для векторных данных. Mapping Toolbox™ не поддерживает запросы WFS и WCS.

С сервером, который поддерживает несколько форматов, можно управлять, какой формат используется путем определения пары "имя-значение" ImageFormat при вызове wmsread. Например, если бы сервер поддерживает формат PNG, вы выбрали бы PNG путем определения 'ImageFormat','image/png', таким образом предотвращения возможности артефактов JPEG.

С сервером, который поддерживает его, можно получить сетку абсолютно количественных данных путем определения формата BIL при вызове wmsread. Для этого используйте пару "имя-значение" 'ImageFormat','image/bil'. Несмотря на то, что файл BIL обычно содержит несколько, co-registered полосы (каналы), файлы BIL, возвращенные сервером WMS, включают только одну полосу. В этом случае вывод wmsread вводит рабочее пространство MATLAB как 2D массив.

Например, можно получить подписанные, количественные данные о повышении, а не изображение RGB, с сервера WMS НАСА WorldWind (единственный сервер в базе данных Mapping Toolbox WMS, которая, как известно, поддерживала опцию 'image/bil'). Смотрите вывод от команды:

wmsinfo('https://data.worldwind.arc.nasa.gov/elev?')

На самом деле, потому что сервер WMS НАСА WorldWind возвращает представленные слои только в формате 'image/bil', вы не должны обеспечивать пару "имя-значение" 'ImageFormat' при использовании этого сервера. Однако это - хорошая практика, чтобы задать формат изображения, в случае, если сервер когда-либо обновляется, чтобы обеспечить представленный слоями в других форматах изображения.

После получения данных с помощью опции 'ImageFormat','image/bil' отобразите его как поверхность или сопоставленную со структурой поверхность, а не как изображение, как показано в примерах ниже.

Объедините данные о повышении с растеризированными векторными данными

Сервер WMS НАСА WorldWind содержит широкий выбор слоев, содержащих данные о повышении. Последуйте этому примеру, чтобы объединить данные о повышении с растровой картой, содержащей национальные контуры.

  1. Найдите слои с сервера НАСА WorldWind.

    layers = wmsfind('data.worldwind*elev', 'SearchField', 'serverurl');
    layers = wmsupdate(layers);
    
  2. Отобразите имя и заголовок каждого слоя.

    disp(layers,'Properties',{'LayerTitle','LayerName'})
    
     11x1 WMSLayer
    
      Properties:
               Index: 1
          LayerTitle: 'SRTM30 with Bathymetry (900m) merged with global ASTER (30m)'
           LayerName: 'EarthAsterElevations30m'
    
               Index: 2
          LayerTitle: 'USGS NED 30m'
           LayerName: 'NED'
    
               Index: 3
          LayerTitle: 'ScankortElevationsDenmarkDSM'
           LayerName: 'ScankortElevationsDenmarkDSM'
                    .
                    .
                    .
               Index: 10
          LayerTitle: 'SRTM30 Plus'
           LayerName: 'srtm30'
    
               Index: 11
          LayerTitle: 'USGS NED 10m'
           LayerName: 'usgs_ned_10m'
    
  3. Выберите слой 'EarthAsterElevations30m', содержащий данные SRTM30, объединенные с глобальными данными ASTER.

    aster = layers.refine('earthaster', 'SearchField', 'layername');
    
  4. Задайте область, окружающую Афганистан.

    latlim = [25 40];
    lonlim = [55 80];
    
  5. Получите данные в 1-минутном интервале выборки.

    cellSize = dms2degrees([0,1,0]);
    [ZA, RA] = wmsread(aster, 'Latlim', latlim, 'Lonlim', lonlim, ...
       'CellSize', cellSize, 'ImageFormat', 'image/bil');
    
  6. Отобразите данные о повышении как текстурную карту.

    figure
    worldmap('Afghanistan')
    geoshow(ZA, RA, 'DisplayType', 'texturemap')
    demcmap(double(ZA))
    title({'Afghanistan and Surrounding Region', aster.LayerTitle});
    

  7. Встройте национальные контуры с сервера VMAP0 WMS в карту повышения.

    vmap0 = wmsfind('vmap0.tiles', 'SearchField', 'serverurl');
    boundaries = refine(vmap0, 'country_02');
    B = wmsread(boundaries, 'Latlim', latlim, ...
        'Lonlim', lonlim, 'CellSize', cellSize, 'ImageFormat','image/png');
    ZB = ZA;
    ZB(B(:,:,1) < 250) = min(ZA(:));
    figure
    worldmap('Afghanistan')
    demcmap(double(ZA))
    geoshow(ZB, RA, 'DisplayType', 'texturemap')
    title({'Afghanistan and Country Boundaries', aster.LayerTitle});
    

Отобразите объединенный слой повышения и батиметрии (SRTM30 плюс)

Радарная миссия топографии шаттла (SRTM) является проектом во главе с американской Национальной Геопространственной Спецслужбой (NGA) и НАСА. SRTM создал цифровую, топографическую базу данных с высоким разрешением Земли. SRTM30 Плюс набор данных комбинирует GTOPO30, SRTM-выведенное повышение земли и данные о батиметрии Sandwell Калифорнийского университета в Сан-Диего.

Последуйте этому примеру, чтобы считать и отобразить слой SRTM30 Plus для Залива Мэна в 30 интервалах выборки арксекунды с помощью данных из сервера WorldWind.

  1. Найдите и обновите слой 'srtm30' в Базе данных WMS. Имя слоя 'srtm30' от НАСА WorldWind является именем для SRTM30 Плюс набор данных.

    wldwind = wmsfind('data.worldwind*elev', 'SearchField', 'serverurl');
    wldwind = wmsupdate(wldwind);
    srtmplus = wldwind.refine('srtm30', 'SearchField', 'layername');
    
  2. Установите желаемые географические пределы.

    latlim = [40 46];
    lonlim = [-71 -65];
    
  3. Установите интервал выборки на 30 арксекунд.

    samplesPerInterval = dms2degrees([0 0 30]);
    
  4. Установите ImageFormat на image/bil.

    imageFormat = 'image/bil';
  5. Запросите карту с сервера НАСА.

    [Z1, R1] = wmsread(srtmplus, 'Latlim', latlim, ...
       'Lonlim', lonlim, 'ImageFormat', imageFormat, ...
       'CellSize', samplesPerInterval);
    
  6. Создайте окно фигуры и настройте карту оси с географическими пределами, которые совпадают с желаемыми пределами. Растровый объект R1 ссылки связывает внутренние координаты растровой карты к EPSG:4326 географическая система координат. Создайте палитру, подходящую для данных о повышении. Затем отображение и контур карта на уровне моря (0 м).

    figure
    worldmap(Z1, R1)
    geoshow(Z1, R1, 'DisplayType', 'texturemap')
    demcmap(double(Z1))
    contourm(double(Z1), R1, [0 0], 'Color', 'black')
    colorbar
    title ({'Gulf of Maine', srtmplus.LayerTitle}, 'Interpreter','none')
    

  7. Сравните слой NASA WorldWind SRTM30 Plus с SRTM30 с Батиметрией (900 м), объединенных с SRTM3 V4.1 (90 м) и АСГСОМ НЕДОМ (30 м) слой (mergedSrtm).

    mergedSrtm = wldwind.refine('mergedSrtm');
  8. Запросите карту с сервера НАСА WorldWind.

    [Z2, R2] = wmsread(mergedSrtm, 'Latlim', latlim, 'Lonlim', lonlim, ...
        'CellSize', samplesPerInterval, 'ImageFormat', 'image/bil');
    
  9. Отобразите данные.

    figure
    worldmap(Z2, R2)
    geoshow(Z2, R2, 'DisplayType', 'texturemap')
    demcmap(double(Z2))	
    contourm(double(Z2), R2, [0 0], 'Color', 'black')
    colorbar
    title ({'Gulf of Maine', mergedSrtm.LayerTitle})
    

  10. Сравнение результатов.

    fprintf(...
       '\nSRTM30 Plus - %s\nMinimum value: %d\nMaximum value: %d\n', ...
       srtmplus.LayerName, min(Z1(:)), max(Z1(:)));
    fprintf(...
       '\nSRTM30 Plus Merged - %s\nMinimum value: %d\nMaximum value: %d\n', ...
       mergedSrtm.LayerName, min(Z2(:)), max(Z2(:)));
    
  11. Вывод появляется можно следующим образом:

    SRTM30 Plus - srtm30 
    Minimum value: -4543
    Maximum value: 1463
    
    Merged SRTM30 Plus - mergedSrtm
    Minimum value: -4543 
    Maximum value: 1463
    

Драпируйте Формирование изображений WMS на Данные о Повышении

Этот пример показывает, как драпировать формирование изображений WMS на данные о повышении из Национального набора данных повышения (NED) USGS.

  1. Получите слои интереса.

    ortho = wmsfind('/USGSImageryTopo/','SearchField','serverurl'); 
    
    layers = wmsfind('data.worldwind', 'SearchField', 'serverurl');
    us_ned = layers.refine('usgs ned 30');
    
  2. Присвойте географическую степень и размер изображения.

    latlim = [36 36.23];
    lonlim = [-113.36 -113.13];
    imageHeight = 575;
    imageWidth = 575;
    
  3. Считайте слой ortho.

    A = wmsread(ortho, 'Latlim', latlim, 'Lonlim', lonlim, ...
       'ImageHeight', imageHeight, 'ImageWidth', imageWidth);
    
  4. Считайте слой USGS us_ned.

    [Z, R] = wmsread(us_ned, 'ImageFormat', 'image/bil', ...
        'Latlim', latlim, 'Lonlim', lonlim, ...
        'ImageHeight', imageHeight, 'ImageWidth', imageWidth);
    
  5. Драпируйте изображение ortho на данные о повышении.

    figure
    usamap(latlim, lonlim)
    framem off; mlabel off; plabel off; gridm off
    geoshow(double(Z), R, 'DisplayType', 'surface', 'CData', A);
    daspectm('m',1)
    title({'Grand Canyon', 'USGS NED and Ortho Image'}, ...
       'FontSize',8);
    axis vis3d
    

  6. Присвойте параметры камеры.

    cameraPosition = [96431 4.2956e+06 -72027];
    cameraTarget = [-82.211 4.2805e+06 3054.6];
    cameraViewAngle = 8.1561;
    cameraUpVector = [3.8362e+06 5.9871e+05 5.05123e+006];
  7. Установите камеру и легкие параметры.

    set(gca,'CameraPosition', cameraPosition, ...
        'CameraTarget', cameraTarget, ...
        'CameraViewAngle', cameraViewAngle, ...
        'CameraUpVector', cameraUpVector);
    lightHandle = camlight;
    camLightPosition = [7169.3 1.4081e+06 -4.1188e+006];
    set(lightHandle, 'Position', camLightPosition);
    

Смотрите также

| |

Похожие темы