Предлагаю вашему вниманию простой 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
Все.
			
			
									
						
										
						Простой Tile Cash mapserver своими руками
- 
				Olax
- Интересующийся
- Сообщения: 16
- Зарегистрирован: 11 мар 2009, 10:03
- Репутация: 0
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей