Как правило, сервер 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);
Отобразите имя и заголовок каждого слоя.
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'
Выберите слой 'EarthAsterElevations30m'
, содержащий данные SRTM30, объединенные с глобальными данными ASTER.
aster = layers.refine('earthaster', '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})
Сравнение результатов.
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(:)));
Вывод появляется можно следующим образом:
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);
Считайте слой USGS us_ned
.
[Z, R] = wmsread(us_ned, 'ImageFormat', 'image/bil', ... 'Latlim', latlim, 'Lonlim', lonlim, ... 'ImageHeight', imageHeight, 'ImageWidth', imageWidth);
Драпируйте изображение 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
Присвойте параметры камеры.
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);