shaperead функция предоставляет мощный метод, называемый селектором, для выбора только полей данных и элементов, которые требуется импортировать из файлов формы.
Селектор - это массив ячеек с двумя или более элементами. Первый элемент является дескриптором предикатной функции (функция с одним выходным аргументом типа logical). Каждый оставшийся элемент представляет собой символьный вектор, указывающий имя атрибута.
Для данной функции: shaperead предоставляет значения перечисленных атрибутов функции предиката для определения необходимости включения элемента в его вывод. Функция исключается, если предикат возвращается false. Обратное не обязательно верно: функция, для которой предикат возвращает true может быть исключен по другим причинам, когда селектор используется в сочетании с ограничительной рамкой или опциями номера записи.
Следующие примеры расположены в порядке возрастания сложности. Несмотря на то, что они используют дескрипторы функций MATLAB ®, анонимные функции и вложенные функции, нет необходимости знакомиться с этими функциями, чтобы освоить использование селекторов дляshaperead.
Определите функцию предиката в отдельном файле. (До выпуска 14 это был единственный доступный вариант.) Создание файла с именем roadfilter.m, со следующим содержанием:
function result = roadfilter(roadclass,roadlength)
mininumClass = 4;
minimumLength = 200;
result = (roadclass >= mininumClass) && ...
(roadlength >= minimumLength);
endЗатем можно позвонить shaperead вот так:
roadselector = {@roadfilter, 'CLASS', 'LENGTH'}
roadselector =
@roadfilter 'CLASS' 'LENGTH'
s = shaperead('concord_roads', 'Selector', roadselector)
s =
115x1 struct array with fields:
Geometry
BoundingBox
X
Y
STREETNAME
RT_NUMBER
CLASS
ADMIN_TYPE
LENGTHили, несколько более компактным образом, вот так:
s = shaperead('concord_roads',...
'Selector', {@roadfilter, 'CLASS', 'LENGTH'})
s =
115x1 struct array with fields:
Geometry
BoundingBox
X
Y
STREETNAME
RT_NUMBER
CLASS
ADMIN_TYPE
LENGTHДо версии 7 программного обеспечения Mapping Toolbox™ включение селектора в файл или локальную функцию было единственным способом работы с селектором.
Обратите внимание, что при вызове shaperead происходил в рамках функции, то roadfilter может быть определен в его локальной функции, а не в собственном файле.
В качестве простого варианта предыдущего примера можно назначить дескриптор функции, roadfilterfcnи используйте его в селекторе:
roadfilterfcn = @roadfilter
s = shaperead('concord_roads',...
'Selector', {roadfilterfcn, 'CLASS', 'LENGTH'})
roadfilterfcn =
@roadfilter
s =
115x1 struct array with fields:
Geometry
BoundingBox
X
Y
STREETNAME
RT_NUMBER
CLASS
ADMIN_TYPE
LENGTHНеобходимость определения предикатных функций в собственных файлах или даже в качестве локальных функций иногда может быть неловкой. Анонимные функции позволяют определять предикатную функцию там, где она необходима. Например:
roadfilterfcn = ...
@(roadclass, roadlength) (roadclass >= 4) && ...
(roadlength >= 200)
roadfilterfcn =
@(roadclass, roadlength) (roadclass >= 4) ...
&& (roadlength >= 200)
s = shaperead('concord_roads','Selector', ...
{roadfilterfcn, 'CLASS', 'LENGTH'})
s =
115x1 struct array with fields:
Geometry
BoundingBox
X
Y
STREETNAME
RT_NUMBER
CLASS
ADMIN_TYPE
LENGTHФактически нет необходимости вводить переменную дескриптора функции при определении предиката как анонимной функции. Вместо этого можно поместить целое выражение в сам массив ячеек селектора, что приведет к несколько более компактному коду. Этот шаблон используется во многих примерах в документации и справке по функциям панели инструментов мэппинга.
s = shaperead('concord_roads', 'Selector', ...
{@(roadclass, roadlength)...
(roadclass >= 4) && (roadlength >= 200),...
'CLASS', 'LENGTH'})
s =
115x1 struct array with fields:
Geometry
BoundingBox
X
Y
STREETNAME
RT_NUMBER
CLASS
ADMIN_TYPE
LENGTHВ предыдущих шаблонах предикат включает два жестко закодированных параметра (называемых minimumClass и minimumLength в roadfilter.m), а также roadclass и roadlength входные переменные. При использовании любого из этих шаблонов в программе необходимо определить минимальные значения отсечения для roadclass и roadlength во время написания программы. Но предположим, что вы хотели подождать и определиться с такими параметрами, как minimumClass и minimumLength во время выполнения?
К счастью, вложенные функции обеспечивают дополнительную мощность, необходимую для этого; они позволяют использовать переменные рабочей области в качестве параметров, а не требовать, чтобы параметры были жестко закодированы как константы в предикатной функции. В следующем примере переменные рабочей области minimumClass и minimumLength могли быть назначены посредством различных вычислений, результаты которых были неизвестны до времени выполнения, но их значения могут быть доступны в предикате, пока он определен как вложенная функция. В этом примере вложенная функция переносится в файл с именем constructroadselector.m, который возвращает полный селектор: дескриптор предиката (именованный nestedroadfilter) и двух имен атрибутов:
function roadselector = ...
constructroadselector(minimumClass, minimumLength)
roadselector = {@nestedroadfilter, 'CLASS', 'LENGTH'};
function result = nestedroadfilter(roadclass, roadlength)
result = (roadclass >= minimumClass) && ...
(roadlength >= minimumLength);
end
endСледующие четыре строки показывают, как использовать constructroadselector:
minimumClass = 4; % Could be run-time dependent
minimumLength = 200; % Could be run-time dependent
roadselector = constructroadselector(...
minimumClass, minimumLength);
s = shaperead('concord_roads', 'Selector', roadselector)
s =
115x1 struct array with fields:
Geometry
BoundingBox
X
Y
STREETNAME
RT_NUMBER
CLASS
ADMIN_TYPE
LENGTH