exponenta event banner

Получить карту

Методы извлечения карт

Для получения карты с сервера WMS используйте функцию wmsread или, в некоторых конкретных ситуациях, WebMapServer.getMap способ. Используйте getMap метод, когда:

  • Работа с non-EPSG:4326 эталонными системами

  • Создание анимации определенной географической области во времени

  • Получение нескольких уровней с сервера WMS

В большинстве случаев использование wmsread для получения карты. Использовать wmsread, укажите либо WMSLayer объект или URL-адрес запроса карты. Получить WMSLayer объект с помощью wmsfind для поиска в базе данных WMS. Получить URL-адрес запроса карты из:

  • Выходные данные wmsread

  • RequestURL свойство WMSMapRequest объект

  • Поиск в Интернете

Вектор символов URL запроса карты состоит из URL сервера WMS с дополнительными параметрами WMS. URL запроса карты может быть вставлен в браузер, чтобы сделать запрос на сервер, который затем возвращает растровую карту.

Общие сведения о кодах системы координат

При использовании wmsreadзапросите карту, использующую EPSG:4326 систему координат. EPSG означает Европейскую группу по исследованию нефти. Эта группа, организация специалистов, работающих в области разведки нефти, разработала базу данных систем координат координат. Системы координат однозначно определяют положение. Коды систем координат - это номера, используемые для определенных систем координат.

EPSG:4326 основан на опорной системе Всемирной геодезической системы (WGS84) 1984 года и системе координат широты и долготы, с углами в градусах и Гринвичом в качестве центрального меридиана. Все серверы в базе данных WMS и, предположительно, все серверы WMS в целом используют EPSG:4326 систему ссылок. Эта система является требованием спецификации OGC ® WMS. Если слой не использует EPSG:4326, программа Mapping Toolbox™ использует следующий доступный код системы координат. Панель инструментов сопоставления не поддерживает автоматические системы координат (системы, в которых пользователь выбирает центр проекции). Для получения дополнительной информации о кодах систем координат см. веб-сайт пространственных ссылок.

Получить карту с помощью wmsread

Слой NASA Blue Marble Next Generation показывает поверхность Земли за каждый месяц 2004 года с высоким разрешением (500 метров/пиксель). Чтение и отображение слоя «Синий мрамор следующего поколения».

  1. Поиск в базе данных WMS для всех уровней с помощью 'nasa' в ServerURL поле.

    nasa = wmsfind('nasa','SearchField','serverurl');
    
  2. Используйте WMSLayer.refine метод уточнения поиска для включения только тех слоев, которые содержат фразу 'bluemarbleng' в LayerName поле. Этот синтаксис создает точный поиск.

    layer = nasa.refine('bluemarbleng', 'SearchField','layername', ...
       'MatchType','exact');
    
  3. Используйте wmsread для извлечения первого слоя следующего поколения «Синий мрамор».

    [A,R] = wmsread(layer(1));
    

    wmsread функция возвращает A, географически привязанная растровая карта, и R, растровый опорный объект, который связывает A в географическую систему координат EPSG:4326. Географические пределы A охватить полную широту и долготу layer.

  4. Откройте окно рисунка, настройте оси карты и отобразите карту.

    figure
    axesm globe
    axis off
    geoshow(A,R)
    title('Blue Marble: Next Generation')

    Слой, используемый в этом примере, любезен НАСА/JPL-Caltech.

Использовать wmsread с дополнительными параметрами

wmsread функция позволяет задать множество дополнительных параметров, таких как высота, ширина и цвет фона. В этом примере показано, как просмотреть карту отметок с разрешением 0,5 градуса, изменив размер ячейки, и как отобразить океан светло-синим цветом, задав цвет фона. Полный список параметров см. в разделе wmsread.

  1. Поиск в базе данных WMS уровней, содержащих foundation.gtopo30 в LayerName поле. GTOPO30, цифровая модель возвышения, разработанная Геологической службой США (USGS), имеет расстояние между горизонтальными сетками 30 угловых секунд.

    gtopo30Layer = wmsfind('foundation.gtopo30');
    
  2. Определите цвет фона, задав красный, зеленый и синий уровни.

    oceanColor = [0 170 255];
    
  3. Используйте BackgroundColor и CellSize параметры wmsread для установки цвета фона и размера ячейки извлеченной карты.

    cellSize = 0.5;
    [A,R] = wmsread(gtopo30Layer,'BackgroundColor',oceanColor, ...
        'CellSize', cellSize);
    
  4. Откройте окно фигуры и настройте оси карты мира. Отображение карты с заголовком.

    figure
    worldmap world
    geoshow(A,R)
    title({'GTOPO30 Elevation Model',gtopo30Layer.LayerTitle})
    

Добавление легенды на карту

Сервер WMS выполняет визуализацию слоя в виде изображения. Без соответствующей легенды интерпретация цветов пикселей может быть затруднена. Некоторые серверы WMS предоставляют доступ к изображению легенды для определенного уровня по URL-адресу, который отображается на уровне Details.Style.LegendURL поле. (См. раздел WMSLayer.Details справочная страница для получения дополнительной информации.)

Хотя легенда предоставляет ценную информацию, помогающую интерпретировать цвета пикселей изображения, только около 45% серверов в базе данных WMS содержат по крайней мере один слой с доступной легендой. Менее 10% слоев в базе данных WMS содержат легенду, но почти 80% слоев в базе данных находятся на columbo.nrlssci.navy.mil сервер. Этот сервер всегда пуст LegendURL поля. Вы не можете использовать wmsfind для поиска только слоев с легендами, поскольку база данных не сохраняет этот уровень детализации. Перед доступом к серверу необходимо обновить слой с сервера LegendURL поле.

В этом примере показано, как создать карту температуры поверхности, а затем получить и отобразить связанное изображение легенды:

  1. Поиск слоев с сервера изображений SVS космического полета НАСА Годдарда. Этот сервер содержит слои с изображениями условных обозначений. Можно указать, что изображения условных обозначений доступны, поскольку слои содержат содержимое LegendURL поле.

    layers = wmsfind('svs.gsfc.nasa.gov','SearchField','serverurl');
    serverURL = layers(1).ServerURL;
    gsfc = wmsinfo(serverURL);
    
  2. Найдите слой, содержащий сигнатуры городской температуры, и отобразите аннотацию:

    urban_temperature = gsfc.Layer.refine('urban*temperature');
    disp(urban_temperature.Abstract)
    
    Big cities influence the environment around them. For example,
    urban areas are typically warmer than their surroundings.
    Cities are strikingly visible in computer models that simulate
    the Earth's land surface. This visualization shows average 
    surface temperature predicted by the Land Information System (LIS)
    for a day in June 2001. Only part of the global computation
    is shown, focusing on the highly urbanized northeast corridor
    in the United States, including the cities of Boston, New York,
    Philadelphia, Baltimore, and Washington.
    
    Additional Credit:
    NASA GSFC Land Information System (http://lis.gsfc.nasa.gov/)
  3. Чтение и отображение слоя. Карта появляется с разными цветами в разных регионах, но без легенды непонятно, что представляют собой эти цвета.

    [A,R] = wmsread(urban_temperature);
    figure
    usamap(A,R)
    geoshow(A,R)
    title('Urban Temperature Signatures')
    axis off
    

  4. Исследовать Details области urban_temperature слой. Этот слой имеет только одну структуру в Style поле. Style определяет способ визуализации слоя сервером.

    urban_temperature.Details
    ans = 
    
      struct with fields:
    
         MetadataURL: 'http://svs.gsfc.nasa.gov/vis/a000000/a003100/a003152/a003152.fgdc'
          Attributes: [1x1 struct]
         BoundingBox: [1x1 struct]
           Dimension: [1x1 struct]
        ImageFormats: {'image/png'}
         ScaleLimits: [1x1 struct]
               Style: [1x1 struct]
             Version: '1.3.0'

    Отображение Style в окне команд:

    urban_temperature.Details.Style
    ans = 
    
            Title: 'Opaque'
             Name: 'opaque'
         Abstract: [1x319 char]
        LegendURL: [1x1 struct]

    Каждый Style элемент имеет только один LegendURL. Исследовать LegendURL:

    urban_temperature.Details.Style.LegendURL
    ans = 
    
        OnlineResource: [1x65 char]
                Format: 'image/png'
                Height: 90
                 Width: 320
  5. Загрузите URL-адрес легенды:

    url = urban_temperature.Details.Style.LegendURL.OnlineResource
    

    В окне команд появится URL-адрес:

    url =
    
    http://svs.gsfc.nasa.gov/vis/a000000/a003100/a003152/temp_bar.png
    
  6. Отображение изображения легенды с помощью image и задать свойства, так что изображение отображается с разрешением «один к одному», «экран к пикселю». Эта легенда является просто изображением панели цветов, а не легендой в графике MATLAB ®.

    temperatureLegend = webread(url);
    figure('Color','white')
    axis off image
    set(gca,'units','pixels','position',...
    [0 0 size(temperatureLegend,2) size(temperatureLegend,1)]);
    pos = get(gcf,'position');
    set(gcf,'position',...
    [pos(1) pos(2) size(temperatureLegend,2) size(temperatureLegend,1)]);
    image(temperatureLegend)
    

    Теперь карта имеет больше смысла. Области к красному концу спектра теплее.

  7. Шаги 7-10 показывают, как захватить выходные данные кадра карты и добавить легенду. Добавляя легенду таким образом, можно избежать искажения текста на изображении легенды. (Текстовые деформации условных обозначений при отображении изображения с помощью geoshow.)

    Сначала установите пределы широты и долготы, чтобы они соответствовали границам карты, и прочитайте в файле формы данные города мира:

    latlim = R.LatitudeLimits;
    lonlim = R.LongitudeLimits;
    S = shaperead('worldcities','UseGeoCoords',true,...
        'BoundingBox',[lonlim(1) latlim(1);lonlim(2) latlim(2)]);
    
  8. Определите положение текущего окна фигуры. Варьировать pos(1) и pos(2) 'Position' при необходимости параметры на основе разрешения экрана.

    colValue = [1 1 1];
    dimension = size(A,1)/2;
    figure
    set(gcf,'Color',[1,1,1])
    pos = get(gcf, 'Position');
    set(gcf, 'Position', [pos(1) pos(2) dimension dimension])
    
  9. Отобразите карту и добавьте маркеры города, границы штата, метки меридиана и параллели, заголовок и стрелку «Север»:

    usamap(A,R)
    geoshow(A,R)
    geoshow(S, 'MarkerEdgeColor', colValue, 'Color', colValue)
    
    geoshow('usastatehi.shp', 'FaceColor', 'none',...
       'EdgeColor','black')
    mlabel('FontWeight','bold')
    plabel('FontWeight','bold')
    axis off
    title('Urban Temperature Signatures', 'FontWeight', 'bold')
    
    for k=1:numel(S)
       textm(S(k).Lat, S(k).Lon, S(k).Name, 'Color', colValue,...
           'FontWeight','bold')
    end
    
    lat = 36.249;
    lon = -71.173;
    northarrow('Facecolor', colValue, 'EdgeColor', colValue,...
        'Latitude', lat, 'Longitude', lon);
    

  10. Отображение карты и легенды в виде единого комбинированного изображения:

    f = getframe(gcf);
    legendImg = uint8(255*ones(size(temperatureLegend,1),size(f.cdata,2),3));
    offset = dimension/2;
    halfSize = size(temperatureLegend, 2)/2;
    legendImg(:,offset-halfSize:offset+halfSize-1,:) = temperatureLegend;
    combined = [f.cdata; legendImg];
    figure
    pos = get(gcf,'position');
    set(gcf,'position',[10 100 size(combined,2) size(combined,1)])
    set(gca,'units','normalized','position', ...
       [0 0 1 1]);
    image(combined)
    axis off image
    

  11. Другим способом отображения карты и легенды вместе является запись легенды в карту в указанном месте. Для просмотра изображения используйте image , устанавливая параметры положения таким образом, чтобы имелось разрешение «один к одному пикселю к экрану». (Текст легенды деформируется, если изображение отображается с помощью geoshow.)

    A_legend = A;
    A_legend(end-size(temperatureLegend,1):end-1,...
       end-size(temperatureLegend,2):end-1,:) = temperatureLegend;
    figure
    image(A_legend)
    axis off image
    set(gca,'Units','normalized','position',...
       [0 0 1 1]);
    set(gcf,'Position',[10 100 size(A_legend,2) size(A_legend,1)]);
    title('Urban Temperature Signatures', 'FontWeight', 'bold')
    
  12. Объедините карту и легенду в один файл, а затем опубликуйте их в Интернете. Сначала запишите изображения в файл:

    mkdir('html')
    imwrite(A_legend, 'html/wms_legend.png')
    imwrite(combined, 'html/combined.png')
    

    Откройте редактор MATLAB и вставьте следующий код:

    %%
    % <<wms_legend.png>>
    
    %%
    % <<combined.png>>

    Добавьте любой другой текст, который вы хотите включить в опубликованный документ. Затем выделите одну из ячеек и выберите в меню «Файл» > «Сохранить файл» и «Опубликовать».

Получить карту с помощью WebMapServer.getMap

WebMapServer.getMap позволяет извлекать карты в любой правильно определенной системе координат EPSG. Если требуется получить карту в системе ссылок на EPSG:4326, можно использовать wmsread. Если требуется извлечь слой, координаты которого отсутствуют в EPSG:4326 системе ссылок, необходимо использовать WMSMapRequest объект для создания URL запроса и WebMapServer.getMap метод извлечения карты. Этот пример демонстрирует, как создавать карты в координатах «Web Mercator», также известных как координаты «WGS 84/Pseudo-Mercator», с помощью WMSMapRequest и WebMapServer объекты. Система координат Web Mercator обычно используется веб-приложениями.

Национальная карта USGS предоставляет ортоизображение и топографические карты из различных регионов США. Сервер предоставляет данные как в EPSG:4326, так и в координатах Web Mercator, определенных кодами EPSG EPSG:102113, EPSG:3857. Дополнительные сведения об этих кодах см. на веб-сайте пространственных ссылок.

  1. Получение географических координат, совпадающих с изображением в файле boston.tif.

    filename = 'boston.tif';
    info = georasterinfo(filename);
    R = info.RasterReference;
    proj = R.ProjectedCRS;
    [latlim,lonlim] = projinv(proj, ...
                              R.XWorldLimits,R.YWorldLimits);
    
  2. Преобразование географических границ в Web Mercator. Для этого сначала создайте projcrs путем задания EPSG:3857 системы координат. Затем спроецируйте координаты с помощью projfwd. Для получения изображения в этой системе координат необходимо использовать WMSMapRequest и WebMapServer с тех пор wmsread запрашивает данные только в системе EPSG:4326.

    p = projcrs(3857);
    [x,y] = projfwd(p,latlim,lonlim);
    xlimits = [min(x) max(x)];
    ylimits = [min(y) max(y)];
  3. Вычислите значения высоты и ширины изображения для образца размером 5 метров.

    metersPerSample = 5;
    imageHeight = round(diff(ylimits)/metersPerSample);
    imageWidth  = round(diff(xlimits)/metersPerSample);
    
  4. Повторно вычислите новые пределы.

    yLim = [ylimits(1), ylimits(1) + imageHeight*metersPerSample];
    xLim = [xlimits(1), xlimits(1) + imageWidth*metersPerSample];
  5. Найдите национальную карту USGS в базе данных WMS и выберите цифровой слой орто-четырехугольника.

    doqLayer = wmsfind('usgsnaipplus','SearchField','serverurl');
    doqLayer = wmsupdate(refine(doqLayer,'image'));
    doqLayer = refine(doqLayer,'USGSNaip','SearchField','abstract');
    
  6. Создать WebMapServer и WMSMapRequest объекты.

    server  = WebMapServer(doqLayer.ServerURL);
    numberOfAttempts = 50;
    attempt = 0;
    request = [];
    while(isempty(request))
        try
            request = WMSMapRequest(doqLayer, server);
        catch e 
            attempt = attempt + 1;
            fprintf('%d\n', attempt)
            if attempt > numberOfAttempts
                throw(e)
            end
        end
    end
    
  7. Использовать WMSMapRequest свойства для изменения различных аспектов запроса карты, таких как границы карты, размер изображения и код системы координат. Установите границы карты для охвата той же области, что и в boston.tif файл.

    request.CoordRefSysCode = 'EPSG:3857';
    request.ImageHeight = imageHeight;
    request.ImageWidth  = imageWidth;
    request.XLim = xLim;
    request.YLim = yLim;
  8. Запросите карту орто-изображения в координатах Web Mercator.

    A_PCS = getMap(server, request.RequestURL);
    R_PCS = request.RasterReference;
  9. Получите карту для той же области, но в EPSG:4326 координатах.

    request.CoordRefSysCode = 'EPSG:4326';
    request.Latlim = latlim;
    request.Lonlim = lonlim;
    A_Geo = getMap(server, request.RequestURL);
    R_Geo = request.RasterReference;
  10. Прочитайте в Бостоне топонимы из файла формы и наложите их поверх карт. Преобразование координат элементов в Web Mercator и географические координаты. Координаты точек в файле формы находятся в метрах, а координаты плоскости штата Массачусетс, но проекция GeoTIFF определена в футах съемки.

    S = shaperead('boston_placenames');
    x = [S.X]*unitsratio('sf','meter');
    y = [S.Y]*unitsratio('sf','meter');
    names = {S.NAME};
    [lat, lon] = projinv(proj, x, y);
    [xPCS, yPCS] = projfwd(p, lat, lon);
  11. Проецирование и отображение орто-изображений, полученных в EPSG:4326 координатах, с помощью геошоу.

    figure
    axesm('mercator','MapLatLimit',latlim,'MapLonLimit',lonlim)
    geoshow(A_Geo,R_Geo)
    textm(lat, lon, names, 'Color',[0 0 0], ...
        'BackgroundColor',[0.9 0.9 0],'FontSize',6);
    axis tight
    title({'USGS Digital Ortho-Quadrangle - Boston', ...
        'Geographic Layer'})

  12. Отображение орто-изображений, полученных в координатах Web Mercator.

    figure
    mapshow(A_PCS, R_PCS);
    text(xPCS, yPCS, names, 'Color',[0 0 0], ...
        'BackgroundColor',[0.9 0.9 0],'FontSize',6,'Clipping','on');
    axis tight
    title({'USGS Digital Ortho-Quadrangle - Boston', 'Web Mercator Layer'})

  13. Отображение изображения из boston.tif для сравнения.

    figure
    mapshow(filename)
    text(x, y, names, 'Color',[0 0 0], ...
        'BackgroundColor',[0.9 0.9 0],'FontSize',6,'Clipping','on');
    axis tight
    title({filename, proj.Name})
    

См. также

| |

Связанные темы