12 | Документация

Автообновляемость тайлов

Картографический сервис, помимо векторной графики, может выдавать области карты в виде растрового изображения.
Такое изображение делится на блоки/квадраты, называемые тайлами.
После генерации тайлы хранятся в тайловом кэше и при последующих запросах тайлы не формируются заново, а берутся из кэша. Таким образом, если объекты карты были изменены, то на ранее сгенерированных тайлах эти изменения не будут отражены.
Во избежание таких ситуаций картографический сервис в CoGIS Server можно настроить обновление тех тайлов, в которые попадают измененные объекты. Помимо соответствующей настройки сервиса в CoGIS Server (см. Параметры перегенерации кэша при изменении в геоданных в Руководстве по публикации ГИС-сервисов в CoGIS Server ), в базе данных необходимо создать служебную таблицу, в которую будут записываться экстенты для перегенерации тайлов.
Имя таблицы по умолчанию: elitegis_changed_extent_log.
Таблицу можно создать с помощью инструмента геообработки Создание служебных таблиц или средствами QGIS (в Менеджере БД ).
Структура таблицы (имена и типы полей) следующая, см. Рисунок 208 .
Рисунок 208 - Структура таблицы для хранения экстентов для перегенерации тайлов
Таблицу можно создать непосредственно в базе данных. Пример скрипта создания таблицы в PostgreSQL ниже:
CREATE TABLE <my_schema>.elitegis_changed_extent_log
(
id serial,
target_table_name text,
xmincoord double precision,
xmaxcoord double precision,
ymincoord double precision,
ymaxcoord double precision,
spatial_reference_id integer,
edited_date timestamp with time zone,
CONSTRAINT elitegis_changed_extent_log_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE <my_schema>.elitegis_changed_extent_log
OWNER to postgres;
Также для заполнения данной таблицы в БД необходимо создать триггер на изменение в соответствующем классе объектов. Если классов объектов несколько, то триггер создается на каждый такой класс.
Скрипт создания триггера:
CREATE FUNCTION <my_schema>.set_data_to_extentchangelog() RETURNS trigger AS $$
BEGIN
IF (OLD.geom IS NOT NULL AND ST_IsEmpty(OLD.geom) = false) THEN
BEGIN
INSERT INTO <my_schema>.elitegis_changed_extent_log (edited_date, target_table_name, xmincoord, xmaxcoord, ymincoord, ymaxcoord, spatial_reference_id)
VALUES (CURRENT_TIMESTAMP,
concat(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME),
ST_XMin(OLD.geom),
ST_XMax(OLD.geom),
ST_YMin(OLD.geom),
ST_YMax(OLD.geom),
ST_SRID(OLD.geom));
END;
END IF;
IF (NEW.geom IS NOT NULL AND ST_IsEmpty(NEW.geom) = false) THEN
BEGIN
INSERT INTO <my_schema>.elitegis_changed_extent_log (edited_date, target_table_name, xmincoord, xmaxcoord, ymincoord, ymaxcoord, spatial_reference_id)
VALUES (CURRENT_TIMESTAMP,
concat(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME),
ST_XMin(NEW.geom),
ST_XMax(NEW.geom),
ST_YMin(NEW.geom),
ST_YMax(NEW.geom),
ST_SRID(NEW.geom));
END;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER set_data_to_extent_change_log
AFTER INSERT OR UPDATE OR DELETE
ON '<my_schema>.<my_featureclass>
FOR EACH ROW
EXECUTE PROCEDURE <my_schema>.elitegis_changed_extent_log();