В этом примере показано, как упростить данные многоугольника и линий с помощью reducem
функция. Упрощение данных многоугольника и линии может ускорить определенные вычисления, не оказывая заметного влияния на данные. Одним из способов подхода к упрощению является использование reducem
с значением допуска по умолчанию вначале и просмотреть выход. Если результаты не соответствуют вашим требованиям, повторите операцию, увеличив или уменьшив значение допуска, чтобы достичь желаемого результата. reducem
возвращает используемое значение допуска. Для получения дополнительной информации об упрощении векторных данных см. «Упрощение векторных данных координат».
Извлечение береговых линий и границ штата Массачусетс из usastatehi.shp
shapefile.
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
. The 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')
Чтобы лучше взглянуть на эти два контура, используйте 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')
Выполните операцию еще раз, на этот раз удвоив значение допуска.
[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])
Увеличьте допуск до 0,1 степени.
[masslat3, masslon3, cerr3, tol3] = reducem(masslat', masslon', 0.1);
Постройте этот сокращенный контур в черном цвете. Обратите внимание, что эта сокращенная карта сохраняет только самые широкие элементы исходной формы и теряет большую часть деталей.
geoshow(masslat3, masslon3, 'DisplayType', 'line', 'color', 'black')