Простой Tile Cash mapserver своими руками

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Olax
Интересующийся
Сообщения: 16
Зарегистрирован: 11 мар 2009, 10:03
Репутация: 0

Простой Tile Cash mapserver своими руками

Сообщение Olax »

Предлагаю вашему вниманию простой tile cash server
Что имеем - mapserver, postgres/postgis, OpenLayers и parser3 (parser.ru) в качестве серверного обработчика.
Итак сам код:
создаем таблицу в которой будет содержаться информация о наших tile и некоторая статистика
SQL:
CREATE TABLE "public"."tile" (
"id" SERIAL,
"str" TEXT,
"coun" INTEGER,
CONSTRAINT "tile_pkey" PRIMARY KEY("id")
) WITH OIDS;

CREATE INDEX "tile_idx" ON "public"."tile"
USING btree ("str", "coun");

tilecash.html:
@main[]
#соединяемся с базой и ищем такой запрос в базе
^connect[$cpg]{$wert[^table::sql{select id, coun from tile where str='$request:query'}]}
#если есть -
^if(def $wert){
#изменяем на 1 количество запросов к этому tile
$shj($wert.coun+1)
#соединяемся и и обновляем в базе счетчик
^connect[$cpg]{^void:sql{UPDATE tile SET coun='$shj' where id=$wert.id}}
#подгружаем сам tile bvz которого является уникальным идентификатором в таблице
$f[^file::load[binary;/brd/tile/${wert.id}.jpg]]
#назначаем телу ответа найденный tile
$response:body[$f]

}{
#если не найден запрос - переадресовываем его mapserver-y и полученный ответ помещаем в переменную
$fm[^file::cgi[binary;/cgi-bin/mapserv;$request:query]]
#вносим в таблицу сам запрос
^connect[$cpg]{^void:sql{insert into tile (str) values ('$request:query')}}
#получаем идентификатор последней внесенной записи
^connect[$cpg]{$last_tile[^table::sql{SELECT id FROM public.tile WHERE id = currval('tile_id_seq')}]}
#сохраняем файл который нам дал mapserver согласно запроса
^fm.save[binary;/brd/tile/${last_tile.id}.jpg]
#назначаем телу ответа с генерированный и сохраненный для будущего использования tile
$response:body[$fm]
}
# end @main[]


Инициализация WMS:
var layer = new OpenLayers.Layer.WMS( "Name",
"http://gis.cityhall.bgov/brd/tilecash.h ... ps/fon.map",
{layers: 'bud'},
{ singleTile: false, ratio: 1.5 }
);

В итоге - если нет tile - с генерируем и выдадим, если есть - просто отдадим.
Bonus: при помощи скрипта ниже можно смотреть статистику и продуктивность использования вашего tile cash server

SELECT
sum(public.tile.coun) AS s, # общее количество отданых кешированых tile
count(public.tile.coun) AS c # количество tile которые вообще отдавались повторно
FROM
public.tile
WHERE
public.tile.coun IS NOT NULL

Все.
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: Semrush [Bot] и 9 гостей