Точки, строки и полигоны

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

Отображение точки

В рабочей области MATLAB® векторные данные выражаются как пары переменных, которые представляют географические или координаты на плоскости для набора интересных мест. Например, одна точка, местоположение Эйфелевой башни может быть сопоставлено как вектор.

  1. Отобразите карту Франции.

    h = worldmap('France');
    landareas = shaperead('landareas.shp','UseGeoCoords', true);
    geoshow (landareas, 'FaceColor', [1 1 .5]);
  2. Сохраните местоположение Эйфелевой башни в векторной форме.

    TowerLat = 48.85;
    TowerLon = 2.28;
    
  3. Поместите красную точку в карту, чтобы указать на башню и маркировать его.

    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 делят данные для простых полигонов.

  1. Скопируйте и вставьте следующие векторные переменные в командной строке:

    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 являются тем же самым. Это - точка, где сегменты объединяются, чтобы закрыть полигон.

  2. Используйте функцию mapshow, чтобы отобразить полигон.

     mapshow(x,y,'DisplayType','polygon')
    

  3. В этом примере векторные переменные содержат данные, которые отображаются как компактный, многослойный полигон с дырой. Сравните данные от таблицы до рисунка. Обратите внимание на то, что вершины на рисунке были маркированы, чтобы соответствовать индексам. (Ваш вывод не будет содержать эти метки.)

    Отдельные контуры в 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

Первые и предпоследние записи являются тем же самым, чтобы закрыть полигон.