shaperead
функция предоставляет вам мощный метод, называемый селектором, чтобы выбрать только поля данных и элементы, которые вы хотите импортировать из shapefiles.
Селектор является массивом ячеек с двумя или более элементами. Первый элемент является указателем на предикатную функцию (функцию с одним выходным аргументом типа 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
), а также 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