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

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

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

Такое изображение делится на блоки/квадраты, называемые тайлами.

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

Во избежание таких ситуаций картографический сервис в CoGIS Server можно настроить на обновление тех тайлов, в которые попадают измененные объекты. Помимо соответствующей настройки сервиса в CoGIS Server Manager (см. в Руководстве по публикации ГИС-сервисов в CoGIS Server ), в базе данных необходимо создать специальную таблицу, в которую будут записываться экстенты для перегенерации тайлов.

Имя таблицы по умолчанию: elitegis_changed_extent_log.

Таблицу можно создать средствами QGIS (в Менеджере БД ).

Структура таблицы (имена и типы полей) следующая, см. Рисунок 186 .

Рисунок 186 – Структура таблицы для хранения экстентов для перегенерации тайлов

Скрипт создания таблицы в PostgreSQL:

CREATE TABLE <my_schema>.elitegis_changed_extent_log

(

id serial,

target_table_name text,

service_name text,

xmincoord double precision,

xmaxcoord double precision,

ymincoord double precision,

ymaxcoord double precision,

spatial_reference_id integer,

processed 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();