В контексте геоданных векторные данные означают точки, строки и полигоны, которые представляют географические объекты. Векторные картографические данные используются, чтобы представлять функции точки, такие как города и ориентиры; линейные функции, такие как реки и магистрали; и ареальные функции, такие как массы воды и избирательные округа.
В рабочей области MATLAB® векторные данные выражаются как пары переменных, которые представляют географические или координаты на плоскости для набора интересных мест. Например, одна точка, местоположение Эйфелевой башни может быть сопоставлено как вектор.
Отобразите карту Франции.
h = worldmap('France'); landareas = shaperead('landareas.shp','UseGeoCoords', true); geoshow (landareas, 'FaceColor', [1 1 .5]);
Сохраните местоположение Эйфелевой башни в векторной форме.
TowerLat = 48.85; TowerLon = 2.28;
Поместите красную точку в карту, чтобы указать на башню и маркировать его.
geoshow(TowerLat, TowerLon, 'Marker','.','MarkerEdgeColor','red') textm(TowerLat,TowerLon + 0.5, 'Eiffel Tower');
Этот простой пример демонстрирует, как использовать функциональный linem
, чтобы отобразить векторные данные для трех коротких строк, переходящих от одной общей конечной точки.
axesm sinusoid; framem; linem([15; 0; -45; -25],[-100; 0; 70; 110],'r-') linem([15; -30; -60; -65],[-100; -20; 100; 150],'b-') linem([15; 20; 40; 20],[-100; -20; 40; 50], 'g-')
Реки являются примерами строк. Введите следующий код, чтобы добавить реки в карту Франции:
h = worldmap('France'); landareas = shaperead('landareas.shp','UseGeoCoords', true); geoshow (landareas, 'FaceColor', [1 1 .5]); rivers = shaperead('worldrivers', 'UseGeoCoords', true); geoshow(rivers, 'Color', 'blue')
Узнайте больше о массиве структур rivers
:
rivers
rivers = 128x1 struct array with fields: Geometry BoundingBox Lon Lat Name
rivers
содержит 128 мировых рек. Введите следующее в командной строке, чтобы просмотреть структуру для восьмой реки:
rivers(8)
ans = Geometry: 'Line' BoundingBox: [2x2 double] Lon: [129.6929 128.9659 128.7473 NaN] Lat: [63.3965 63.4980 63.5220 NaN] Name: 'Lena'
Реки хранятся как формы типа 'Line'
. Данные для восьмой реки, Лены, хранятся в векторах Lon
и Lat
. Обратите внимание на то, что каждый вектор заканчивается NaN.
Много общих объектов карты, таких как государственные границы, острова, и континенты, являются полигонами. Некоторые объекты полигона в реальном мире могут иметь много частей: например, острова, которые составляют Гавайи. При кодировании как векторные переменные форм таких составных сущностей необходимо разделить последовательные сущности. Чтобы указать, что такой разрыв существует, тулбокс использует соглашение размещения NaNs в идентичных положениях в обеих векторных переменных. Разделитель NaN служит "перьевой" командой, командой, чтобы прекратить чертить один полигон и начинать чертить другого. Пример ниже демонстрирует, как разделители NaN делят данные для простых полигонов.
Скопируйте и вставьте следующие векторные переменные в командной строке:
x = [40 55 33 10 0 5 10 40 NaN 10 25 30 25 10... 10 NaN 90 80 65 80 90 NaN]; y = [50 20 0 0 15 25 55 50 NaN 20 10 10 20 30... 20 NaN 10 0 20 25 10 NaN];
Эти векторные переменные появляются как строки в следующей таблице, наряду со строкой, перечисляющей индексы.
Заметьте, что NaNs появляются в тех же местоположениях и в x
и в векторах y
. Столбцы 9, 16 и 22 из таблицы имеют NaNs. Они отмечают деление между отдельными полигонами. Кроме того, заметьте, что данные о X и Y для вершин 1 и 8 являются тем же самым. Это - точка, где сегменты объединяются, чтобы закрыть полигон.
Используйте функцию mapshow
, чтобы отобразить полигон.
mapshow(x,y,'DisplayType','polygon')
В этом примере векторные переменные содержат данные, которые отображаются как компактный, многослойный полигон с дырой. Сравните данные от таблицы до рисунка. Обратите внимание на то, что вершины на рисунке были маркированы, чтобы соответствовать индексам. (Ваш вывод не будет содержать эти метки.)
Отдельные контуры в X и Y приняты, чтобы быть внешними контурами, если их вершины располагаются в по часовой стрелке порядке; в противном случае они приняты, чтобы быть внутренними контурами. Вы видите, что "дыра" имеет вершины, которые появляются в против часовой стрелки порядке.
Теперь рассмотрите пример полигонов на карте Соединенных Штатов. Введите следующий код, чтобы отобразить карту США (исключая Аляску и Гавайи):
figure; ax = usamap('conus'); set(ax, 'Visible', 'off') states = shaperead('usastatelo', 'UseGeoCoords', true); names = {states.Name}; indexConus = 1:numel(states); stateColor = [0.5 1 0.5]; geoshow(ax, states(indexConus), 'FaceColor', stateColor) setm(ax, 'Frame', 'off', 'Grid', 'off',... 'ParallelLabel', 'off', 'MeridianLabel', 'off')
Исследуйте структуру на одно из состояний:
states(4)
ans = Geometry: 'Polygon' BoundingBox: [2x2 double] Lon: [1x183 double] Lat: [1x183 double] Name: 'Arkansas' LabelLat: 34.8350 LabelLon: -91.8861
Вы видите, что Арканзас имеет тип формы 'Polygon'
. Просмотрите последнюю запись в векторе Lat
:
states(4).Lat(end)
ans = NaN
NaN служит разделителем между полигонами.
Сравните первые и предпоследние записи:
states(4).Lat(1) states(4).Lat(182)
ans = 33.0200 ans = 33.0200
Первые и предпоследние записи являются тем же самым, чтобы закрыть полигон.