Географические структуры данных

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

Географическая структура данных является MATLAB® массив структур, который имеет по одному элементу на каждую географическую функцию. Каждая функция представлена координатами и атрибутами. Географическая структура данных, которая содержит географические координаты (широта и долгота), называется geostruct, а та, которая содержит координаты карты (проективные x и y), называется mapstruct. Структуры географических данных содержат только векторные функции и не могут использоваться для хранения растровых данных (регулярные или геолокированные сетки данных или изображения).

Shapefiles

Структуры географических данных чаще всего возникают, когда векторные геоданные импортируются из файла shapefile. Исследовательский институт экологических систем разработал формат shapefile для векторных геоданных. Shapefiles кодируют координаты для точек, мультиточек, линий или многоугольников наряду с негеометрическими атрибутами.

Файл shapefile сохраняет атрибуты и координаты в отдельных файлах; он состоит из основного файла, файла индекса и файла xBASE. Все три файла имеют одинаковое базовое имя и отличаются расширениями .shp, .shx, и .dbf, соответственно. (Например, учитывая базовое имя 'concord_roads' имена файлов shapefile будут 'concord_roads.shp', 'concord_roads.shx', и 'concord_roads.dbf').

Содержание географических структур данных

The shaperead функция считывает векторные функции и атрибуты из файла shapefile и возвращает массив географической структуры данных. The shaperead функция определяет имена полей атрибутов во время выполнения из таблицы shapefile xBASE или из необязательных пользовательских параметров. Если имя атрибута shapefile не может непосредственно использоваться в качестве имени поля, shaperead присваивает полю надлежащим образом измененное имя, обычно заменяя пространства на символ нижнего подчеркивания.

Поля в структуре географических данных

Имя поляТип данныхОписаниеКомментарии

Geometry

вектор символов

Один из следующих типов фигур: 'Point', 'MultiPoint', 'Line', или 'Polygon'.

Для 'PolyLine', значение Geometry поле просто 'Line'.

BoundingBox

Численный массив 2 на 2

Задает минимальное и максимальное значения координат функции в каждой размерности в следующей форме:

[min(X)min(Y)max(X)max(Y)]

Опущен для типа фигуры 'Point'.

X, Y, Lon, или Lat

1-by-N массив класса double

Вектор координат.

 

Attr

вектор символов или скалярное число

Имя, тип и значение атрибута.

Необязательно. Обычно существует несколько атрибутов.

The shaperead функция не поддерживает никаких 3-D или «измеренных» типов формы: 'PointZ', 'PointM', 'MultipointZ', 'MultipointM', 'PolyLineZ', 'PolyLineM', 'PolygonZ', 'PolylineM', или 'Multipatch'. Также, хотя 'Null Shape' функции могут присутствовать в 'Point', 'Multipoint', 'PolyLine', или 'Polygon' shapefile, они игнорируются.

PolyLine и Polygon Формы

В географических структурах данных с Line или Polygon геометрии, отдельные функции могут иметь несколько частей - отсоединенные сегменты линий и многоугольные звонки. Части могут включать внутренние звонки против часовой стрелки, которые очерчивают «отверстия». Для рисунка этого смотрите Создание и отображение многоугольников. Каждая отсоединенная часть отделяется от следующей NaN в X и Y (или Lat и Lon) векторы. Вы можете использовать isShapeMultipart функция для определения, имеет ли объект разделенные NaN части.

Каждый многопозиционный или NaN-разделенный многопозиционная линия или многоугольник сущности составляет одну функцию и, таким образом, имеет один вектор символов или скаляр двойного значения на поле атрибута. Невозможно присвоить различные атрибуты различным частям такой функции; любой вектор символов или числовой атрибут, импортированный (или впоследствии добавленный в) геоstruct или mapstruct, применяется ко всем частям функции в комбинации.

Mapstructs и Geostructs

По умолчанию, shaperead возвращает mapstruct, содержащий X и Y поля. Это уместно, если координаты набора данных уже проецируются (в системе координат карты). В противном случае, если координаты набора данных не проецируются (в географической системе координат), используйте пару значение параметров 'UseGeoCoords',true сделать shaperead возвращает геоstruct, имеющее Lon и Lat поля.

Типы координат. Если вы не знаете, использует ли shapefile географические координаты или координаты карты, вот некоторые вещи, которые вы можете попробовать:

  • Если файл shapefile включает файл проекции (.prj), использование shapeinfo для получения информации о системе координат-привязок. Если на CoordinateReferenceSystem полем возвращаемой структуры является projcrs объект, у вас есть координаты карты. Если поле является geocrs объект, у вас есть географические координаты.

  • Если файл shapefile не содержит файл проекции, используйте shapeinfo для получения BoundingBox. Глядя на области значений координат, вы можете сказать, какие координаты у вас есть.

  • Спросите поставщика данных.

The geoshow функция отображает географические функции, хранящиеся в геоструктах, и mapshow функция отображает географические функции, хранящиеся в mapstructs. Если вы пытаетесь отобразить mapstruct с geoshowфункция выдает предупреждение и вызывает mapshow. Если вы пытаетесь отобразить геоstruct с mapshowфункция проецирует координаты с помощью проекции Plate Carree и выдает предупреждение.

Изучение структуры географических данных

Вот пример нефильтрованного mapstruct, возвращенного shaperead:

S = shaperead('concord_roads.shp')

Это выход выглядит следующим образом:

S = 
609x1 struct array with fields:
    Geometry
    BoundingBox
    X
    Y
    STREETNAME
    RT_NUMBER
    CLASS
    ADMIN_TYPE
    LENGTH

Файл shapefile содержит 609 функции. В дополнение к Geometry, BoundingBox, и координатные поля (X и Y), существует пять полей атрибутов: STREETNAME, RT_NUMBER, CLASS, ADMIN_TYPE, и LENGTH.

Посмотрите на 10-й элемент:

S(10)

Это выход выглядит следующим образом:

ans = 
       Geometry: 'Line'
    BoundingBox: [2x2 double]
              X: [1x9 double]
              Y: [1x9 double]
     STREETNAME: 'WRIGHT FARM'
      RT_NUMBER: ''
          CLASS: 5
     ADMIN_TYPE: 0
         LENGTH: 79.0347

Этот mapstruct содержит 'Line' функции. Десятая линия имеет девять вершин. Значения первых двух атрибутов являются векторами символов. Вторым случается пустой символьный вектор. Последние три атрибута являются числовыми. По элементам S, X и Y может иметь различные длины, но STREETNAME и RT_NUMBER всегда должны содержать векторы символов, и CLASS, ADMIN_TYPE и LENGTH должен всегда содержать скалярные двойки.

В этом примере shaperead возвращает нефильтрованный mapstruct. Если вы хотите отфильтровать некоторые атрибуты, смотрите Выберите данные Shapefile для чтения для получения дополнительной информации.

Создание географических структур данных

Функции, такие как shaperead или gshhs возвращает геострукты при импорте векторных геоданных. Тем не менее, вы можете захотеть создать геострукты или mapstructs самостоятельно в некоторых обстоятельствах. Для примера можно импортировать геоданные векторы которые не хранятся в файле shapefile (для примера, из MAT-файла, из Microsoft® Excel® электронная таблица или путем чтения в текстовом файле с разделителем). Можно также вычислить векторные геоданные и атрибуты путем вызова различных функций MATLAB или Mapping Toolbox. В обоих случаях координаты и другие данные обычно являются векторами или матрицами в рабочей области. Упаковка переменных в геоstruct или mapstruct может облегчить отображение и экспорт, поскольку структуры географических данных обеспечивают несколько преимуществ по сравнению с массивами координат:

  • Все связанные переменные геоданных упакованы в один контейнер, массив структур.

  • Структура самодокументируется через имена полей.

  • Можно изменить символику карты для точек, линий и многоугольников в соответствии с их значениями атрибутов путем создания symbolspec для отображения геоstruct или mapstruct.

  • Между элементами структуры и географическими функциями существует соответствие «один к одному», которое распространяется на дочерние элементы hggroup объекты, созданные mapshow и geoshow.

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

Построение геоструб точек и линий

Следующий пример сначала создает геоstruct точки, содержащий три города на разных континентах, и строит его с geoshow. Затем он создает геоstruct линии, содержащий данные для навигационных путей большого круга, соединяющих эти города. Наконец, он строит графики этих линий с помощью символа spec.

  1. Начнем с небольшого набора точечных данных, приблизительных широт и долгот для трех городов на трех континентах:

    latparis =  48.87084; lonparis =   2.41306;   % Paris coords
    latsant  = -33.36907; lonsant  = -70.82851;   % Santiago
    latnyc   =  40.69746; lonnyc   = -73.93008;   % New York City

  2. Создайте точечный геоstruct; он должен иметь следующие обязательные поля:

    • Geometry (в данном случае 'Point')

    • Lat (для точек это скалярный дубль)

    • Lon (для точек это скалярный дубль)

    % The first field by convention is Geometry (dimensionality).
    % As Geometry is the same for all elements, assign it with deal:
    [Cities(1:3).Geometry] = deal('Point');
    
    % Add the latitudes and longitudes to the geostruct:
    Cities(1).Lat = latparis; Cities(1).Lon = lonparis;
    Cities(2).Lat = latsant;  Cities(2).Lon = lonsant;
    Cities(3).Lat = latnyc;   Cities(3).Lon = lonnyc;
    
    % Add city names as City fields. You can name optional fields 
    % anything you like other than Geometry, Lat, Lon, X, or Y.
    Cities(1).Name = 'Paris';
    Cities(2).Name = 'Santiago';
    Cities(3).Name = 'New York';
    % Inspect your completed geostruct and its first member
    Cities    
    
    Cities = 
    1x3 struct array with fields:
        Geometry
        Lat
        Lon
        Name
    
    Cities(1)
    
    ans = 
        Geometry: 'Point'
             Lat: 48.8708
             Lon: 2.4131
            Name: 'Paris'

  3. Отображение геоstruct на проекции Меркатора наземных масс Земли, хранящихся в landareas.shp shapefile, установка пределов карты для исключения полярных областей:

    axesm('mercator','grid','on','MapLatLimit',[-75 75]); tightmap; 
    % Map the geostruct with the continent outlines
    geoshow('landareas.shp')
    
    % Map the City locations with filled circular markers
    geoshow(Cities,'Marker','o',...
        'MarkerFaceColor','c','MarkerEdgeColor','k');
    
    % Display the city names using data in the geostruct field Name.
    % Note that you must treat the Name field as a cell array.
    textm([Cities(:).Lat],[Cities(:).Lon],...
        {Cities(:).Name},'FontWeight','bold');

  4. Затем создайте геоstruct линия, чтобы упаковать большие круговые навигационные пути между тремя городами:

    % Call the new geostruct Tracks and give it a line geometry:
    [Tracks(1:3).Geometry] = deal('Line');
    
    % Create a text field identifying kind of track each entry is.
    % Here they all will be great circles, identified as 'gc'
    % (character vector used by certain functions to signify great circle arcs)
    trackType = 'gc';
    [Tracks.Type] = deal(trackType);
    
    % Give each track an identifying name
    Tracks(1).Name = 'Paris-Santiago';
    [Tracks(1).Lat Tracks(1).Lon] = ...
            track2(trackType,latparis,lonparis,latsant,lonsant);
    
    Tracks(2).Name = 'Santiago-New York';
    [Tracks(2).Lat Tracks(2).Lon] = ...
            track2(trackType,latsant,lonsant,latnyc,lonnyc);
    
    Tracks(3).Name = 'New York-Paris';
    [Tracks(3).Lat Tracks(3).Lon] = ...
            track2(trackType,latnyc,lonnyc,latparis,lonparis);

  5. Вычислите длины больших дорожек круга:

    % The distance function computes distance and azimuth between
    % given points, in degrees. Store both in the geostruct.
    for j = 1:numel(Tracks)
        [dist az] = ...
            distance(trackType,Tracks(j).Lat(1),...
                               Tracks(j).Lon(1),...
                               Tracks(j).Lat(end),...
                               Tracks(j).Lon(end));
        [Tracks(j).Length] = dist;
        [Tracks(j).Azimuth] = az;
    end
    % Inspect the first member of the completed geostruct
    Tracks(1)
    
    ans = 
        Geometry: 'Line'
            Type: 'gc'
            Name: 'Paris-Santiago'
             Lat: [100x1 double]
             Lon: [100x1 double]
          Length: 104.8274
         Azimuth: 235.8143

  6. Отобразите три пути в геоstruct линии:

    % On cylindrical projections like Mercator, great circle tracks
    % are curved except those that follow the Equator or a meridian.
    
    % Graphically differentiate the tracks by creating a symbolspec;
    % key line color to track length, using the 'summer' colormap.
    % Symbolspecs make it easy to vary color and linetype by
    % attribute values. You can also specify default symbologies.
    
    colorRange = makesymbolspec('Line',...
                {'Length',[min([Tracks.Length]) ...
                  max([Tracks.Length])],...
                 'Color',winter(3)});
    geoshow(Tracks,'SymbolSpec',colorRange);
    

    Вы можете сохранить только что созданные геоструны как shapefiles, вызвав shapewrite с именем файла по вашему выбору, например:

    shapewrite(Cities,'citylocs');
    shapewrite(Tracks,'citytracks');

Построение многоугольников геоструй

Создание геоstruct или mapstruct для многоугольников аналогично построению для данных точки или линии. Однако, если ваши многоугольники содержат несколько разделенных на NaN частей, напоминаем, что они могут иметь только одно значение на атрибут, не одно значение на деталь. Каждый атрибут, который вы помещаете в элемент структуры для такого многоугольника, относится ко всем его частям. Это означает, что если вы задаете группу островов, например, с одним разделенным на NaN списком для каждой координаты, все атрибуты для этого элемента описывают острова как группу, а не как конкретные острова. Если необходимо связать атрибуты с конкретным островом, необходимо предоставить отдельный структурный элемент для этого острова.

Имейте в виду, что упорядоченное расположение многоугольников имеет значение. Когда вы отображаете данные многоугольника, направление, в котором проходят полигоны, имеет значение для того, как они визуализируются такими функциями, как geoshow, mapshow, и mapview. Правильное направление особенно важно, если многоугольники содержат отверстия. Конвенция Mapping Toolbox кодирует координаты внешних звонков (например, контуры континента и острова) в порядке часовой стрелки; Упорядоченное расположение против часовой стрелки используется для внутренних звонков (например, озер и внутренних морей). В пределах координатного массива каждый звонок отделяется от предшествующего ему NaN.

При построении графика mapshow или geoshowзаполняют звонки по часовой стрелке. Не заполнены звонки против часовой стрелки; любая базовая символика показывает такие отверстия. Чтобы гарантировать, что внешние и внутренние звонки правильно закодированы в соответствии с вышеописанным соглашением, можно вызвать следующие функции:

  • ispolycw - True, если вершины полигонального контура упорядочены по часовой стрелке

  • poly2cw - Преобразование полигонального контура в упорядоченное расположение по часовой стрелке

  • poly2ccw - Преобразование полигонального контура в упорядоченное расположение против часовой стрелки

  • poly2fv - Преобразовать полигональную область в форму грани-вершины для использования с patch в порядок правильно визуализировать многоугольники, содержащие отверстия

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

Пример работы с многоугольниками см. в разделе Преобразование данных береговой линии (GSHHG) в формат Shapefile.

Отображение структур Mapping Toolbox версии 1

До версии 2, когда были введены геострукты и mapstructs, при импорте геоданных из некоторых внешних форматов использовалась другая структура данных для инкапсуляции функций отображения карт. Эти display structures вмещали как растровые, так и векторные данные карты и другие виды объектов, но не имели общности текущих геоструктов и mapstructs для представления векторных функций и постепенно выводятся из тулбокса. Однако можно преобразовать отображаемые структуры, которые содержат векторные геоданные, в форму geostruct, используя updategeostruct. Для получения дополнительной информации о структурах отображения версии 1 и их использовании смотрите Версию 1 Отображения Structures в страницу с описанием для displaym. Дополнительная информация находится на страницах с описанием для updategeostruct, extractm, и mlayers.

См. также

|

Похожие темы