В примерах, приведенных в предыдущих главах, геоданные имели форму отдельных переменных. Программное обеспечение Toolbox™ отображения также предоставляет простое средство отображения, извлечения и манипулирования коллекциями элементов векторной карты, организованных в географических структурах данных.
Географическая структура данных является MATLAB® массив структур, который имеет по одному элементу на каждую географическую функцию. Каждая функция представлена координатами и атрибутами. Географическая структура данных, которая содержит географические координаты (широта и долгота), называется geostruct, а та, которая содержит координаты карты (проективные x и y), называется mapstruct. Структуры географических данных содержат только векторные функции и не могут использоваться для хранения растровых данных (регулярные или геолокированные сетки данных или изображения).
Структуры географических данных чаще всего возникают, когда векторные геоданные импортируются из файла 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
присваивает полю надлежащим образом измененное имя, обычно заменяя пространства на символ нижнего подчеркивания.
Поля в структуре географических данных
Имя поля | Тип данных | Описание | Комментарии |
---|---|---|---|
|
вектор символов |
Один из следующих типов фигур: | Для 'PolyLine' , значение Geometry поле просто 'Line' . |
|
Численный массив 2 на 2 |
Задает минимальное и максимальное значения координат функции в каждой размерности в следующей форме:
|
Опущен для типа фигуры |
|
1-by-N массив класса |
Вектор координат. | |
|
вектор символов или скалярное число |
Имя, тип и значение атрибута. |
Необязательно. Обычно существует несколько атрибутов. |
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, применяется ко всем частям функции в комбинации.
По умолчанию, 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.
Начнем с небольшого набора точечных данных, приблизительных широт и долгот для трех городов на трех континентах:
latparis = 48.87084; lonparis = 2.41306; % Paris coords latsant = -33.36907; lonsant = -70.82851; % Santiago latnyc = 40.69746; lonnyc = -73.93008; % New York City
Создайте точечный гео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'
Отображение гео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');
Затем создайте гео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);
Вычислите длины больших дорожек круга:
% 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
Отобразите три пути в гео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.
До версии 2, когда были введены геострукты и mapstructs, при импорте геоданных из некоторых внешних форматов использовалась другая структура данных для инкапсуляции функций отображения карт. Эти display structures вмещали как растровые, так и векторные данные карты и другие виды объектов, но не имели общности текущих геоструктов и mapstructs для представления векторных функций и постепенно выводятся из тулбокса. Однако можно преобразовать отображаемые структуры, которые содержат векторные геоданные, в форму geostruct, используя updategeostruct
. Для получения дополнительной информации о структурах отображения версии 1 и их использовании смотрите Версию 1 Отображения Structures в страницу с описанием для displaym
. Дополнительная информация находится на страницах с описанием для updategeostruct
, extractm
, и mlayers
.