Функция 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
Нет на самом деле никакой потребности ввести переменную указателя на функцию при определении предиката как анонимной функции. Вместо этого можно поместить целое выражение в самом селекторном массиве ячеек, приведя к несколько более компактному коду. Этот шаблон используется во многих примерах в документации Mapping Toolbox и функциональной справке.
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
), а также входные переменные roadlength
и roadclass
. Если вы используете какой-либо из этих шаблонов в программе, необходимо выбрать минимальные значения сокращения для 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