reducem

Уменьшайте плотность точек в векторных данных

Синтаксис

[latout,lonout] = reducem(latin,lonin)
[latout,lonout] = reducem(latin,lonin,tol)
[latout,lonout,cerr] = reducem(...)
[latout,lonout,cerr,tol] = reducem(...)

Описание

[latout,lonout] = reducem(latin,lonin) уменьшает число точек в векторных данных о карте. В этом случае допуск вычисляется автоматически.

[latout,lonout] = reducem(latin,lonin,tol) использует обеспеченный допуск. Модули допуска являются степенями дуги на поверхности сферы.

[latout,lonout,cerr] = reducem(...) кроме того, возвращает меру ошибки, введенной упрощением. Выход cerr различие в длине дуги исходных и уменьшаемых данных, нормированных на исходную длину.

[latout,lonout,cerr,tol] = reducem(...) также возвращает допуск, используемый в сокращении, которое полезно, когда допуск вычисляется автоматически.

Примеры

свернуть все

Сравните исходные и уменьшаемые границы округа Колумбия из файла форм usastatehi.shp.

Извлеките границы Района Колумбии.

dc = shaperead('usastatehi.shp',...
    'UseGeoCoords', true,...
    'Selector',{@(name) ...
     strcmpi(name,'district of columbia'), 'Name'});
lat = extractfield(dc, 'Lat')';
lon = extractfield(dc, 'Lon')';

Уменьшайте число точек в границе.

[latreduced, lonreduced] = reducem(lat, lon);

Отобразите исходные и уменьшаемые границы.

lonlim = dc.BoundingBox(:,1)' + [-0.02 0.02];
latlim = dc.BoundingBox(:,2)' + [-0.02 0.02];

subplot(1,2,1)
usamap(latlim, lonlim); axis off
geoshow(lat, lon,...
    'DisplayType', 'polygon', 'FaceColor', 'blue')

subplot(1,2,2)
usamap(latlim, lonlim); axis off
geoshow(latreduced, lonreduced,...
    'DisplayType', 'polygon', 'FaceColor', 'yellow')

A comparison of the original and reduced borders. The original border shows more detail than the reduced border.

Упрощение многоугольника и данных о линии может ускорить определенные вычисления, не оказывая значимого влияния на данные. Один способ приблизиться к упрощению состоит в том, чтобы использовать reducem со значением допуска по умолчанию и просматривают вывод. Если результаты не удовлетворяют ваши требования, повторите операцию, увеличившись или уменьшив значение допуска, чтобы достигнуть результата, которого вы желаете. reducem функция возвращает используемое значение допуска.

Извлеките береговые линии Массачусетса и государственные границы от usastatehi.shp файл форм.

ma = shaperead('usastatehi.shp','UseGeoCoords',true, ...
    'Selector', {@(name)strcmpi(name,'Massachusetts'),'Name'});
masslat = ma.Lat;
masslon = ma.Lon;

Результатом является пара векторов, которые обрисовывают в общих чертах состояние с 957 вершинами.

numel(masslat)
ans = 957

Упростите данные о линии Используя допуск по умолчанию

Упростите схему при помощи reducem функция со значением допуска по умолчанию.

[masslat1, masslon1, cerr, tol] = reducem(masslat', masslon');

Смотрите результаты. Количество вершин было сокращено к 252. Векторы уменьшались приблизительно до четверти своих исходных длин.

numel(masslat1)
ans = 252
numel(masslat1)/numel(masslat)
ans = 0.2633

Исследуйте ошибку и значения допуска, возвращенные reducem. cerr значение указывает на тот reducem уменьшал общую длину схемы приблизительно на 3,3 процента. Допуск, что reducem используемый, чтобы достигнуть этого сокращения были 0,006 градуса, или приблизительно 660 метров.

[cerr tol]
ans = 1×2

    0.0331    0.0060

Постройте уменьшаемую схему красного цвета по исходной схеме в синем, использующем geoshow. В этом разрешении трудно видеть любое различие между исходной схемой и уменьшаемой схемой.

figure 
axesm('MapProjection', 'eqdcyl', 'MapLatLim', [41.1 43.0],... 
'MapLonLim', [-73.6, -69.8], 'Frame', 'off', 'Grid', 'off'); 
geoshow(masslat, masslon, 'DisplayType', 'line', 'color', 'blue') 
geoshow(masslat1, masslon1, 'DisplayType', 'line', 'color', 'red')

Figure contains an axes object. The axes object contains 2 objects of type line.

Чтобы получить лучший взгляд на два основ, используйте xlim и ylim увеличить масштаб фрагмента карты. Заметьте, как уменьшаемая схема соответствует общим контурам исходной карты, но теряет много детали.

axesm('MapProjection', 'eqdcyl', 'MapLatLim', [41.1 43.0],... 
'MapLonLim', [-73.6, -69.8], 'Frame', 'off', 'Grid', 'off'); 
xlim([0.0104 0.0198])
ylim([0.7202 0.7264])
geoshow(masslat, masslon, 'DisplayType', 'line', 'color', 'blue') 
geoshow(masslat1, masslon1, 'DisplayType', 'line', 'color', 'red')

Figure contains an axes object. The axes object contains 4 objects of type line.

Упростите данные о линии Используя заданный допуск

Выполните операцию снова, на этот раз удвоив значение допуска.

[masslat2,masslon2,cerr2,tol2] = reducem(masslat', masslon', 0.012);
numel(masslat2)
ans = 157
numel(masslat2)/numel(masslat)
ans = 0.1641

Исследуйте ошибку и значения допуска, возвращенные reducem. На этот раз, cerr значение указывает на тот reducem уменьшал общую длину схемы приблизительно на 5,2 процентов. Допуск, что reducem используемый, чтобы достигнуть этого сокращения были 0,012 градуса.

[cerr2 tol2]
ans = 1×2

    0.0517    0.0120

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

geoshow(masslat2, masslon2, 'DisplayType', 'line', 'color', [0 .6 0])

Figure contains an axes object. The axes object contains 5 objects of type line.

Советы

Векторные данные уменьшаются с помощью алгоритма упрощения линии Дугласа-Пеукера. Этот метод рекурсивно подразделяет многоугольник, пока запуск точек не может быть заменен сегментом прямой линии без точки в том запуске, отклоняющемся от прямой линии больше, чем допуск. Расстояния раньше выбирали, какие запуски точек устранить вычисляются в Пластине проекция Carrée.

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

Представлено до R2006a
Для просмотра документации необходимо авторизоваться на сайте