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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Однако у этого подхода есть недостатки. Это:

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

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

  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

    Задайте экстент времени в выражении запроса, чтобы вычислить агрегированные результаты между 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 запроса вам необходимо применить параметры 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-запросе полужирным шрифтом, рядом появится значок Изменить метаданные. Щелкните значок, чтобы задать свойства параметра:
    • Поле или выражение 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, чтобы запланировать выполнение задачи через определенный интервал времени.

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