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