Выберите Shapefile Data to Read

shaperead функция предоставляет вам мощный метод, названный селектором, чтобы выбрать только поля данных и элементы, которые вы хотите импортировать из файлов форм.

Селектор является массивом ячеек с двумя или больше элементами. Первым элементом является указатель на функцию предиката (функция с одним выходным аргументом типа logical). Каждым остающимся элементом является вектор символов, указывающий на имя атрибута.

Для данной функции, shaperead предоставляет значения атрибутов, перечисленных к функции предиката, чтобы помочь определить, включать ли функцию в ее выход. Функция исключена, если предикат возвращает false. Обратное не обязательно верно: функция, для которой предикат возвращает true может быть исключен по другим причинам, когда селектор используется в сочетании с опциями номера записи или ограничительной рамкой.

Следующие примеры располагаются в порядке увеличивающейся изощренности. Несмотря на то, что они используют MATLAB® указатели на функцию, анонимные функции и вложенные функции, вы не должны быть знакомы с этими функциями, чтобы использовать селекторы для shaperead.

Пример 1: функция предиката в отдельном файле

  1. Задайте функцию предиката в отдельном файле. (До Релиза 14 это было единственной доступной опцией.) Создают файл с именем roadfilter.m, со следующим содержимым:

     function result = roadfilter(roadclass,roadlength)
     mininumClass = 4;
     minimumLength = 200;
     result = (roadclass  >= mininumClass) && ...
              (roadlength >= minimumLength);
     end
  2. Можно затем вызвать shaperead как это:

    roadselector = {@roadfilter, 'CLASS', 'LENGTH'}
    
    roadselector = 
        @roadfilter    'CLASS'    'LENGTH'
    
    s = shaperead('concord_roads.shp', 'Selector', roadselector)
    
    s = 
    115x1 struct array with fields:
        Geometry
        BoundingBox
        X
        Y
        STREETNAME
        RT_NUMBER
        CLASS
        ADMIN_TYPE
        LENGTH

    или, немного более компактным способом, как это:

    s = shaperead('concord_roads.shp',...
                  '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 мог быть задан в локальной функции этого, а не в собственном файле.

Пример 2: предикат как указатель на функцию

Как простое изменение на предыдущем примере, вы могли присвоить указатель на функцию, roadfilterfcn, и используйте его в селекторе:

roadfilterfcn = @roadfilter
s = shaperead('concord_roads.shp',...
              'Selector', {roadfilterfcn, 'CLASS', 'LENGTH'})
roadfilterfcn = 
@roadfilter
s = 
115x1 struct array with fields:
    Geometry
    BoundingBox
    X
    Y
    STREETNAME
    RT_NUMBER
    CLASS
    ADMIN_TYPE
    LENGTH

Пример 3: предикат как анонимная функция

Имея необходимость задать предикат функции в собственных файлах, или как раз когда локальные функции, может иногда быть неловким. Анонимные функции позволяют функции предиката быть заданной право, где это необходимо. Например:

roadfilterfcn = ...
    @(roadclass, roadlength) (roadclass >= 4) && ...
    (roadlength >= 200)

roadfilterfcn = 
    @(roadclass, roadlength) (roadclass >= 4) ...
               && (roadlength >= 200)

s = shaperead('concord_roads.shp','Selector', ...
              {roadfilterfcn, 'CLASS', 'LENGTH'})

s = 
115x1 struct array with fields:
    Geometry
    BoundingBox
    X
    Y
    STREETNAME
    RT_NUMBER
    CLASS
    ADMIN_TYPE
    LENGTH

Пример 4: предикат (анонимная функция), заданная в массиве ячеек

Нет на самом деле никакой потребности ввести переменную указателя на функцию при определении предиката как анонимной функции. Вместо этого можно поместить целое выражение в самом селекторном массиве ячеек, приведя к несколько более компактному коду. Этот шаблон используется во многих примерах в документации Mapping Toolbox и функциональной справке.

s = shaperead('concord_roads.shp', '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

Пример 5: параметризация селектора; предикат как вложенная функция

В предыдущих шаблонах предикат включает два трудно закодированных параметра (названный 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.shp', 'Selector', roadselector)

s = 
115x1 struct array with fields:
    Geometry
    BoundingBox
    X
    Y
    STREETNAME
    RT_NUMBER
    CLASS
    ADMIN_TYPE
    LENGTH