Как правило, сервер 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 содержит широкий выбор слоев, содержащих данные о вертикальном изменении. Последуйте этому примеру, чтобы объединить данные о вертикальном изменении с растровой картой, содержащей национальные контуры.
Найдите слои с сервера НАСА WorldWind.
layers = wmsfind('data.worldwind*elev', 'SearchField', 'serverurl'); layers = wmsupdate(layers);
Выберите 'EarthAsterElevations30m'
слой, содержащий данные SRTM30, объединен с глобальными данными ASTER.
aster = layers.refine('EarthAsterElevations30m', ... 'SearchField', 'layername');
Задайте область, окружающую Афганистан.
latlim = [25 40]; lonlim = [55 80];
Получите данные в 1-минутном интервале выборки.
cellSize = dms2degrees([0,1,0]); [ZA, RA] = wmsread(aster, 'Latlim', latlim, 'Lonlim', lonlim, ... 'CellSize', cellSize, 'ImageFormat', 'image/bil');
Отобразите данные о вертикальном изменении как текстурную карту.
figure worldmap('Afghanistan') geoshow(ZA, RA, 'DisplayType', 'texturemap') demcmap(double(ZA)) title({'Afghanistan and Surrounding Region', aster.LayerTitle});
Встройте национальные контуры с сервера 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});
Радарная миссия топографии шаттла (SRTM) является проектом во главе с американской Национальной Геопространственной Спецслужбой (NGA) и НАСА. SRTM создал цифровую, топографическую базу данных с высоким разрешением Земли. SRTM30 Плюс набор данных комбинирует GTOPO30, SRTM-выведенное вертикальное изменение земли и данные о батиметрии Sandwell Калифорнийского университета в Сан-Диего.
Последуйте этому примеру, чтобы считать и отобразить слой SRTM30 Plus для Залива Мэна в 30 интервалах выборки арксекунды с помощью данных из сервера WorldWind.
Найдите и обновите 'srtm30'
слой в Базе данных WMS. 'srtm30'
имя слоя от НАСА WorldWind является именем для SRTM30 Плюс набор данных.
wldwind = wmsfind('data.worldwind*elev', 'SearchField', 'serverurl'); wldwind = wmsupdate(wldwind); srtmplus = wldwind.refine('srtm30', 'SearchField', 'layername');
Установите желаемые географические пределы.
latlim = [40 46]; lonlim = [-71 -65];
Установите интервал выборки на 30 арксекунд.
samplesPerInterval = dms2degrees([0 0 30]);
Установите ImageFormat
к image/bil
.
imageFormat = 'image/bil';
Запросите карту с сервера НАСА.
[Z1, R1] = wmsread(srtmplus, 'Latlim', latlim, ... 'Lonlim', lonlim, 'ImageFormat', imageFormat, ... 'CellSize', samplesPerInterval);
Создайте окно фигуры и настройте карту оси с географическими пределами, которые совпадают с желаемыми пределами. Объект растровой привязки 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')
Сравните слой NASA WorldWind SRTM30 Plus с SRTM30 с Батиметрией (900 м), объединенных с SRTM3 V4.1 (90 м) и АСГСОМ НЕДОМ (30 м) (mergedSrtm
) слой.
mergedSrtm = wldwind.refine('mergedSrtm');
Запросите карту с сервера НАСА WorldWind.
[Z2, R2] = wmsread(mergedSrtm, 'Latlim', latlim, 'Lonlim', lonlim, ... 'CellSize', samplesPerInterval, 'ImageFormat', 'image/bil');
Отобразите данные.
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})
Сравнение результатов.
disp(newline + "SRTM30 Plus - " + srtmplus.LayerName ... + newline + "Minimum value: " + min(Z1(:))... + newline + "Maximum value: " + max(Z1(:))) disp(newline + "SRTM30 Plus Merged - " + mergedSrtm.LayerName ... + newline + "Minimum value: " + min(Z2(:))... + newline + "Maximum value: " + max(Z2(:)))
Выход появляется следующим:
SRTM30 Plus - srtm30 Minimum value: -4543 Maximum value: 1463 Merged SRTM30 Plus - mergedSrtm Minimum value: -4543 Maximum value: 1463
В этом примере показано, как драпировать формирование изображений WMS на данные о вертикальном изменении из Национального набора данных вертикального изменения (NED) USGS.
Получите слои интереса.
ortho = wmsfind('/USGSImageryTopo/','SearchField','serverurl'); layers = wmsfind('data.worldwind', 'SearchField', 'serverurl'); us_ned = layers.refine('usgs ned 30');
Присвойте географическую степень и размер изображения.
latlim = [36 36.23]; lonlim = [-113.36 -113.13]; imageHeight = 575; imageWidth = 575;
Считайте ortho
слой.
A = wmsread(ortho, 'Latlim', latlim, 'Lonlim', lonlim, ... 'ImageHeight', imageHeight, 'ImageWidth', imageWidth);
Считайте us_ned
USGS слой.
[Z, R] = wmsread(us_ned, 'ImageFormat', 'image/bil', ... 'Latlim', latlim, 'Lonlim', lonlim, ... 'ImageHeight', imageHeight, 'ImageWidth', imageWidth);
Драпируйте орторектифицированное изображение на данные о вертикальном изменении.
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
Присвойте параметры камеры.
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);