Получение данных с сервера Web Map

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

Сервер WMS визуализирует один или несколько слоев и сохраняет результаты в файле, который передается запрашивающему устройству. The wmsread и getMap функции обращаются с просьбой от Вашего имени, захватывают поток во временном файле и импортируют содержимое файла в переменную в переменную рабочей области.

Могут быть доступны различные форматы файлов, такие как JPEG, PNG, GIF и GeoTIFF. Практически все серверы WMS поддерживают использование формата JPEG, а многие поддерживают более одного стандартного графического формата.

Формат может повлиять на качество результатов. Для примера формат PNG избегает связанных с плиткой программных продуктов, которые являются общими для JPEG. Если сервер поддерживает несколько форматов, можно задать формат при помощи wmsread функции и ImageFormat аргумент имя-значение; такие как 'ImageFormat','image/png'.

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

Примечание

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

Чтобы задать форматы GeoTIFF или BIL, используйте аргументы имя-значение 'ImageFormat','image/tiff' или 'ImageFormat','image/bil', соответственно. Хотя файлы GeoTIFF и BIL могут содержать несколько совместно зарегистрированных полос (каналов), файлы GeoTIFF и BIL, возвращенные серверами WMS, включают только одну полосу и выход wmsread является массивом 2-D.

Для примера можно получить подписанные, количественные повышения данные, а не изображение RGB, от сервера NASA WorldWind WMS. См. выход из команды:

wmsinfo('https://worldwind26.arc.nasa.gov/wms/elev?')

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

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

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

  1. Получите информацию о сервере NASA WorldWind. Выберите слой, содержащий данные SRTM.

    info = wmsinfo('https://worldwind26.arc.nasa.gov/wms/elev?');
    layers = info.Layer;
    srtm = refine(layers,'SRTM','SearchField','layername');
  2. Укажите пределы широты и долготы для области, окружающего Афганистан.

    latlim = [25 40];
    lonlim = [55 80];
    
  3. Считайте данные с помощью 1-минутного интервала дискретизации. Задайте 'ImageFormat' как 'image/tiff'.

    cellSize = dms2degrees([0,1,0]);
    [ZA,RA] = wmsread(srtm,'Latlim',latlim,'Lonlim',lonlim, ...
       'CellSize',cellSize,'ImageFormat','image/tiff');
  4. Обратите внимание, что ZA - массив данных о повышении, а не изображение RGB. Найдите минимальные и максимальные повышения.

    elevationLimits = [min(min(ZA)) max(max(ZA))]
    elevationLimits = 1×2 int16 row vector
    
       -1415    7715
  5. Отобразите данные повышения как текстурную карту.

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

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

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

Отображение объединенного слоя повышения и батиметрии (SRTM30 Plus)

Radar Topography Mission (SRTM) - проект, возглавляемый Национальным геопространственным разведывательным управлением США (NGA) и НАСА. SRTM создал цифровую топографическую базу данных Земли с высоким разрешением. Набор данных SRTM30 Plus объединяет GTOPO30, SRTM-производную повышение земли и батиметрию Сэндвелла из Калифорнийского университета в Сан-Диего.

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

  1. Получите информацию о сервере NASA WorldWind. Найдите 'srtm30' слой, представляющий собой набор данных SRTM30 Plus.

    info = wmsinfo('https://worldwind26.arc.nasa.gov/wms/elev?');
    layers = info.Layer;
    srtm = refine(layers,'srtm30','SearchField','layername');
  2. Задайте пределы широты и долготы для области, окружающей залив Мэн. Установите интервал дискретизации 30 угловых секунд, а формат изображения 'image/tiff'. Запросить карту у сервера.

    latlim = [40 46];
    lonlim = [-71 -65];
    samplesPerInterval = dms2degrees([0 0 30]);
    imageFormat = 'image/tiff';
    [Z,R] = wmsread(srtm,'Latlim',latlim, ...
       'Lonlim',lonlim,'ImageFormat',imageFormat, ...
       'CellSize',samplesPerInterval);
  3. Обратите внимание, что Z - массив данных о повышении, а не изображение RGB. Нахождение минимальных и максимальных значений Z.

    elevationLimits = [min(min(Z)) max(max(Z))]
    
    elevationLimits = 1×2 int16 row vector
    
       -4540    1469
  4. Создайте карту. Область объекта растровой привязки R1 привязка собственных координат растровой карты к EPSG:4326 системе географических координат. Применить палитру, соответствующую данным о повышении. Отображение и контур карты на уровне моря.

    figure
    worldmap(Z,R)
    geoshow(Z,R,'DisplayType','texturemap')
    demcmap(double(Z))
    contourm(double(Z),R,[0 0],'Color','k')
    colorbar
    title ({'Gulf of Maine',srtm.LayerTitle}, ...
       'Interpreter','none')

Перетащите изображения WMS на данные о повышении

В этом примере показано, как перетащить изображения WMS на данные о повышении из USGS National Elevation Dataset (NED).

  1. Найдите слои, содержащие данные ортоизображения и повышения.

    ortho = wmsfind('/USGSImageryTopo/','SearchField','serverurl'); 
    ortho = wmsupdate(ortho);
    
    info = wmsinfo('https://worldwind26.arc.nasa.gov/wms/elev?');
    layers = info.Layer;
    us_ned = refine(layers,'usgs-ned');
  2. Задайте пределы широты и долготы для области вокруг Гранд-Каньона. Задайте размер изображения.

    latlim = [36 36.23];
    lonlim = [-113.36 -113.13];
    imageHeight = 575;
    imageWidth = 575;
    
  3. Считайте слои. Задайте 'ImageFormat' слоя повышения как 'image/tiff'.

    A = wmsread(ortho,'Latlim',latlim,'Lonlim',lonlim, ...
       'ImageHeight',imageHeight,'ImageWidth',imageWidth);
    
    [Z,R] = wmsread(us_ned,'ImageFormat','image/tiff', ...
        'Latlim',latlim,'Lonlim',lonlim, ...
        'ImageHeight',imageHeight,'ImageWidth',imageWidth);

    Обратите внимание, что Z - массив данных о повышении, а не изображение RGB.

  4. Перетащите ортоизображение на данные о повышении.

    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

  5. Отрегулируйте поле зрения камеры и подсветку.

    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];
    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);

См. также

| |

Похожие темы