Загрузите карту

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

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

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

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

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

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

  • Область выхода wmsread

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

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

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

Осмыслите коды систем координат-ссылок

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

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

Извлечение вашей карты с wmsread

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

  1. Поиск в базе данных WMS всех слоев с 'nasa' в ServerURL поле.

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

    layer = nasa.refine('bluemarbleng', 'SearchField','layername', ...
       'MatchType','exact');
    
  3. Используйте wmsread функция для извлечения первого слоя Blue Marble Next Generation.

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

    The 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 с необязательными параметрами

The 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. Поиск слоев на сервере NASA Goddard Space Flight SVS Image Server. Этот сервер содержит слои, которые имеют изображения легенды. Можно сказать, что изображения легенды доступны, потому что слои имеют содержимое в 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 поле. The 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.)

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

    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>>

    Добавьте любой другой текст, который необходимо включить в опубликованный документ. Затем выберите одну из камер и выберите из меню File > Save File and Publish.

Извлечение вашей карты с WebMapServer.getMap

The 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 и выберите слой Digital Ortho-Quadrangle.

    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. Читайте в Бостоне поместите имена из shapefile и наложите их на верхнюю часть из карт. Преобразуйте координаты функций в Web Mercator и географические координаты. Координаты точки в файле shapefile указаны в метрах и координатах плоскости штата Массачусеттс, но проекция 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})
    

См. также

| |

Похожие темы