Агрегация значений в связанные объекты

Как правило, объекты отображаются на карте на основе значений их атрибутов. В качестве примеров можно привести показ городов по населению или дорог, исходя из их классификации по типам. Иногда же нужно отображать объекты на основе вычисленных агрегированных значений. Примерами вычисленных значений могут быть минимальные, максимальные, средние или суммированные. Эти значения вычисляются исходя из атрибутов агрегированного набора значений.

Сценарии временных данных

Есть два основных сценария, при которых может использоваться отображение данных с использованием агрегированных значений.

Данные о станциях с временными наборами

Это данные с изменяющимися количествами, зафиксированными в местоположениях в течение времени. Объекты изучаются, собираются или прогнозируются в этих местах через регулярные или нерегулярные периоды времени. Примерами могут быть температура, осадки, уровень воды, соленость и сток, измеренные на метеостанциях или станциях мониторинга, расположенных вдоль водотоков.

Можно отобразить объекты метеостанций по общему объему осадков за июль или по наивысшей или самой низкой годовой температуре. Для такой визуализации данных моделируйте данные так, чтобы фиксированные местоположения хранились в классе пространственных объектов, а изучаемые данные - в связанной таблице, вместе с атрибутами даты-времени.

Распределение данных с метками времени

Существуют объекты, отображающие события, которые произошли в конкретный момент времени. Примерами являются местоположения торнадо, адреса клиентов, пациентов больниц и места совершения преступлений.

Вы можете показать общий ущерб от торнадо, общий объем закупок или пациентов с использованием агрегирования полигональными объектами, например, провинциями, районами и другими административно-территориальными единицами. Для визуализации данных таким способом моделируйте данные так, чтобы местоположения сохраняются в классе объектов с атрибутами даты-времени.

Подготовка данных для агрегированного отображения

Для показа объектов с агрегированными результатами выполните следующее:

  • Тип агрегирования – задает показ общего, минимума, максимума, среднего и некоторых других значений.
  • Показ объектов – определяет, какие объекты отображаются с агрегированными результатами. Они могут быть такими же или отличаться от объектов с измерениями. К примеру, можно отобразить общее количество осадков за год на каждой метеостанции либо общее количество осадков за год (измеренное на отдельных станциях, представленных точечными объектами) на основе границ округов или водоразделов.
  • Параметры запроса:
    • Время – задает экстент времени и интервал для отображения агрегированных результатов. Воспользуйтесь бегунком времени для динамического их задания. Например, для получения агрегированных за день результатов задайте в качестве экстента времени и интервала для бегунка времени один день.
    • Диапазон – вам может понадобиться агрегировать результаты только для поднабора объектов. К примеру, для агрегирования измерений солености между 0 и 50 метрами и между 50 и 75 метрами примените параметр диапазона и бегунок диапазона.
    • Фильтры запроса – чтобы увидеть закономерности распределения данных о преступлениях с использованием агрегирования преступлений определенного типа в пределах каждого полицейского округа, используйте дискретный параметр для установки фильтра запроса.
    В этом рабочем процессе параметры запроса необязательны. См. раздел Задание параметров в слое запроса, чтобы понять, как добавлять параметры диапазона и фильтры, использующие дискретные параметры.

Пример агрегированных результатов

Рассмотрим класс пространственных объектов weather_stations, содержащий местоположения метеостанций. Каждый объект метеостанции однозначно идентифицируется по значению, содержащемуся в поле station_id. Поле используется для соединения станций к связанным с ними записям наблюдений, хранящихся в таблице observed_rainfall. Эта таблица содержит записи наблюдений за дождями, собранные в разное время в одном месте. Она включает поле station_id для связи с классом объектов метеостанций, поле rainfall_cm, в котором хранятся значения суточного выпадения осадков в сантиметрах, и поле collection_date, в котором хранятся даты событий выпадения осадков.

Вычисление агрегированных результатов динамически – с использованием параметров слоя запроса

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

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

Запустите инструмент геообработки Создать слой запроса агрегации

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

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

  1. Когда карта открыта, на вкладке Анализ в группе Геообработка щелкните Инструменты Инструменты.
  2. На панели Геообработка на вкладке Наборы инструментов щелкните Инструменты управления данными > Слои и представления таблиц > Слой запроса агрегации. Щелкните инструмент, чтобы его открыть.
  3. Следуя сценарию примера, задайте следующие свойства инструмента:
    • На вкладке Параметры установите для параметра Целевой векторный класс клас пространственных объектов weather_stations.
    • Задайте observed_rainfall для параметра Таблица суммирования.
    • Задайте station_id для целевого и связанного поля соединения и введите имя выходного слоя.
    • Выберите SUM как тип агрегации поля суммирования. В окошке Имя поля выберите rainfall_cm.
    • В Определение параметров выберите Диапазоны в качестве типа параметра и задайте имя, например, timeWindow. Этот параметр делает доступным время для слоя запроса
    • Задайте для параметра Поле или Выражение поле collection_date.
    • Задайте параметр Тип данных как Дата.
    • Просмотрите и задайте другие параметры при необходимости. На основе сделанного выбора некоторые параметры будут заданы автоматически.
  4. Запустите инструмент. Слой запроса с учетом времени добавляется в карту и на панель Содержание.
  5. Откройте таблицу атрибутов слоя запросов. Дополнительное поле SUM_rainfall_cm показывает общее количество осадков с использованием всех записей.

Вы можете включить бегунок времени и перейти к любому временному экстенту. Когда вы переходите, значения вычисляются заново для текущего временного экстента карты. Вы также дополнительно можете использовать атрибуты для присваивания символов и надписывания точечных объектов метеостанций. Чтобы узнать подробнее об этом инструменте, см. Создать слой запроса агрегации.

Создать слой запроса вручную

В некоторых случаях вам может понадобится создать слой запроса вручную, если запрос использует расширенные ключевые слова или параметры. Некоторые примеры включают следующее:

  • Предустановленные дискретные параметры, например, view_scale and view_extent
  • Запросы SQL с более чем одним соединением или внешним соединением

У этого подхода есть недостатки. А именно:

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

Если данные постоянно обновляются, перемещайте их в многопользовательскую базу геоданных и соглашайтесь с дополнительной загрузкой базы данных. Убедитесь, что вы выполняете рекомендации по поддержке базы данных, например, создание индексов.

Выполните приведенные ниже действия для создания слоя запроса вручную.

  1. На вкладке Карта, в группе Слой, откройте меню Добавить данные Добавить данные и щелкните Слой запроса Добавить слой запроса.
  2. В окне Запрос создайте запрос SQL, возвращающий агрегированный результат.

    Выберите общее количество осадков для каждой станции в таблице observed_rainfall.

    
    SELECT   station_id, SUM(rainfall_cm) AS total_rainfall
    FROM     observed_rainfall
    GROUP BY station_id

    Присоедините результаты к классу объектов weather_stations. Вы получите общее количество осадков с использованием всех записей таблицы observed_rainfall.

    
    SELECT  w.*, r.total_rainfall
    FROM    weather_stations AS w 
    INNER JOIN
            (SELECT   station_id, SUM(rainfall_cm) AS total_rainfall
             FROM     observed_rainfall
             GROUP BY station_id) AS r 
    ON w.station_id = r. station_id

    Задайте экстент времени в выражении WHERE запроса, чтобы вычислить агрегированные результаты между 1 июня 2016 г. и 30 июня 2016 г.

    
    SELECT  w.*, r.total_rainfall
    FROM    weather_stations AS w 
    INNER JOIN
            (SELECT   station_id, SUM(rainfall_cm) AS total_rainfall
             FROM     observed_rainfall
             WHERE    collection_date >= '6/1/2016' AND collection_date <= '6/30/2016'
             GROUP BY station_id) AS r 
    ON w.station_id = r.station_id
  3. Щелкните Далее для выполнения остальных действий в диалоговом окне Новый слой запроса и добавления слоя запроса к текущей карте.
  4. Отобразите с помощью символов слой, чтобы показать метеостанции, исходя из общего количества осадков в каждом их местоположении за июнь 2016 г. К примеру, можно задать размер объектов в соответствии с количеством осадков для отображения градуированных или пропорциональных символов либо, напротив, применять разные цвета для каждой станции, используя цветные градуированные или неклассифицированные символы.

Чтобы изменить экстент времени, например, чтобы увидеть такую же картину, но для промежутка между 1 и 15 августа, вам нужно открыть источник слоя запроса и изменить его выражение WHERE. Предпочтительно использовать бегунок времени для внесения таких изменений. Для использования бегунка времени с целью изменения выражения WHERE запроса вам необходимо применить параметры SQL-выражения.

Выполните следующие действия, чтобы изменить указанный временной диапазон:

  1. В Таблице содержания щелкните слой правой кнопкой и выберите Свойства Свойства.
  2. Во вкладке Источник в строке Запроса таблицы нажмите Редактировать запрос Изменить метаданные. Запрос будет показан в текстовом окне Запрос.
    Подсказка:

    Чтобы текст запроса было легче прочитать, вы можете увеличить его, нажав кнопку Ctrl и прокрутив колесо мыши вперед.

  3. Замените WHERE collection_date >= '6/1/2016' AND collection_date <= '6/30/2016' параметром диапазона. Параметры диапазона объявляются с помощью префикса ::r:.

    Выражение WHERE заменяется параметром диапазона TimeVar.

    
    SELECT  w.*, r.total_rainfall
    FROM    weather_stations AS w 
    INNER JOIN
            (SELECT   station_id, SUM(rainfall_cm) AS total_rainfall
             FROM     observed_rainfall
             WHERE    ::r:TimeVar
             GROUP BY station_id) AS r 
    ON w.station_id = r.station_id
  4. Параметры выделены в SQL-запросе жирным шрифтом и около них отображается кнопка редактирования Изменить метаданные. Щелкните кнопку, чтобы задать свойства параметра:
    • Для Поле или выражение выберите collection_date.
    • В качестве Типа данных выберитеДата.
    • Отметьте Значения по умолчанию.
    • Задайте диапазон значений по умолчанию 6/1/2016 до 6/30/2016.
  5. Щелкните Готово.
  6. В диалоговом окне Изменить запрос щелкните Проверить, чтобы убедиться в отсутствии ошибок.

Слой теперь зависит от времени, потому что параметр диапазона ссылается на поле даты-времени. Зависимые от времени слои управляются бегунком времени. К примеру, воспользуйтесь бегунком времени для выбора экстента времени, и метеостанции будут показаны исходя из вычисляемого динамически для этого экстента времени общего объема осадков.

  • Для получения объема за месяц задайте месяц для параметров Текущий интервал времени и Интервал шага один месяц.
  • Для получения скользящего среднего задайте Текущий интервал времени равным одному месяцу, а Интервал шага – одному дню. В таком случае при каждом щелчке по интервалу на бегунке времени он перемещается к следующему дню и отображает результаты для одного месяца, начиная с этого дня.

Подсказка:

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

Предварительный подсчет результатов

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

Недостатками этого подхода являются:

  • Необходимость выполнения этих действий после каждого обновления данных.
  • Этот подход нельзя назвать гибким. Для показа объектов с недельными и годовыми результатами, например, вам потребуются две отдельных таблицы: одна для хранения агрегированных результатов за одну неделю, а вторая - для хранения годовых результатов.
  • Вы не сможете использовать бегунок времени при таком подходе

Есть два способа предварительного вычисления агрегированных результатов.

Использование геообработки

В следующем примере описаны действия по предварительному вычислению среднемесячного количества осадков для каждой метеостанции с помощью инструментов геообработки.

  1. Добавьте новое целочисленное поле в класс объектов с названием month, это поле будет представлять значение месяца.
  2. Воспользуйтесь инструментом Вычислить поле для обновления записей.

    Задайте для параметра Выражение значение month = getMonth(!DateTime!).

    Введите следующий текст для параметра Блок кода. В данном примере v - значение атрибута datetime.

    
    from datetime import datetime
    def getMonth(v):
        d = datetime.strptime(v, "%m/%d/%Y")
    return d.month
  3. Воспользуйтесь инструментом Суммарная статистика для создания таблицы с результатами суммирования. В этом примере сумма – это месячное количестве осадков на каждой станции. Введите следующие параметры:
    • Поле статистики: Выберите поле, для которого вы хотите выполнить суммирование. В данном примере – это поле осадков.
    • Тип статистики: Выберите SUM для вычисления суммарного количества осадков.
    • Поле комбинаций: выберите поля station_id и month.
  4. Воспользуйтесь инструментом Присоединить поле или Добавить соединение для присоединения записей таблицы суммирования к векторному слою.
  5. Отобразите слой карты с помощью определяющего запроса для показа результатов за конкретный месяц. К примеру, для показа результатов только за май используйте определяющий запрос Month = 5.

Использование функций базы данных

Если данные хранятся в многопользовательской базе данных, используйте SQL-запрос для предварительного вычисления агрегированных или суммированных результатов и сохранения их в отдельной таблице.

  1. Выполните следующий SQL-запрос в клиенте базы данных. Будет вычислено среднемесячное значение для каждой метеостанции. Для выполнения запроса предполагается наличие поля, хранящего целочисленные значения, соответствующие конкретным месяцам.
    
    SELECT   station_id, month, SUM(rainfall_cm) AS total_rainfall
    INTO     avg_monthly_rainfall
    FROM     observed_rainfall
    GROUP BY station_id, month
  2. Если базой данных является база геоданных, зарегистрируйте таблицу в базе геоданных для оптимальной производительности и присоединения таблицы к векторному слою.

    Щелкните векторный слой на панели Содержание. В наборе вкладок Векторный слой щелкните вкладку Данные. В группе Отношение щелкните Соединения Соединения, а затем - Добавить соединение Добавить соединение.

  3. Если это не база геоданных, нужно выбрать одну из следующих стратегий:
    • Создайте представление в базе данных, присоединяющее к таблице с геометрией вновь созданную таблицу суммирования.
    • Создайте слой запроса и задайте соединение для источника слоя запроса.
  4. Отобразите слой карты с помощью определяющего запроса для показа результатов за конкретный месяц. К примеру, для показа результатов только за май используйте определяющий запрос Month = 5.
Подсказка:

Для предварительного вычисления результатов вы можете воспользоваться планировщиком задач Windows, чтобы запланировать выполнение задачи через определенный интервал времени.

Связанные разделы