Выберите данные Shapefile для чтения

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

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

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

В качестве простого изменения в предыдущем примере можно назначить указатель на функцию, 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

Пример 3: Предсказать как анонимную функцию

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

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

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

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

Пример 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', 'Selector', roadselector)

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