Склеивание тайлов TileCache в единое изображение

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3321
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 494
Ваше звание: Author
Контактная информация:

Склеивание тайлов TileCache в единое изображение

Сообщение Denis Rykov » 09 сен 2013, 12:08

Скрипт (работает только для TileCache-структуры, для TMS не подходит, но может быть легко адаптирован), позволяющий склеить тайлы из TileCache-совместимой структуры (используется по умолчанию в MapProxy) каталогов в единое изображение (для заданного масштабного уровня). Пример пути до тайла в такой структуре:

Код: Выделить всё

/home/rykov/sandbox/mymapproxy/cache_data/osm_cache_EPSG900913/06/000/000/038/000/000/034.png
Нужен PIL. Может есть более красивое решение?

Код: Выделить всё

import os
import Image

z_level = 0
x_level = 3
y_level = 6
tile_size = 256

base = "/home/rykov/sandbox/mymapproxy/cache_data/osm_cache_EPSG900913/"
path = "06"
tiles_paths = []

merged_path = os.path.join(base, path, 'merged.png')
if os.path.isfile(merged_path):
os.remove(merged_path)

for root, dirs, files in os.walk(os.path.join(base, path)):
for f in files:
fname = f.split('.')[0]
tiles_paths.append(os.path.join(root, fname).split('/')[-7:])

x_num_tiles = len(os.listdir(os.path.join(base, "/".join(tiles_paths[0][:x_level]))))
y_num_tiles = max([len(os.listdir(os.path.join(base, "/".join(tiles_paths[:y_level])))) for i in range(len(tiles_paths))])

width = tile_size*x_num_tiles
height = tile_size*y_num_tiles

print "Image size: %s x %s" % (str(width), str(height))

max_x_tile = max([int(d) for d in os.listdir(os.path.join(base, "/".join(tiles_paths[0][:x_level])))])
max_y_tile = max([int(tiles_paths[y_level]) for i in range(len(tiles_paths))])

print "Xmax: %s, Ymax: %s" % (str(max_x_tile), str(max_y_tile))

img = Image.new('RGBA', (width, height))

for tile in tiles_paths:
x_tile = int("".join(tile[1:x_level+1]))
y_tile = int("".join(tile[4:y_level+1]))
tile_img = Image.open("%s.%s" % (os.path.join(base, "/".join(tile)), 'png'))
img.paste(tile_img, (width - (max_x_tile-x_tile+1)*tile_size, (max_y_tile-y_tile)*tile_size))

img.save(merged_path)

print "Image saved into: %s" % merged_path
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
gimran
Гуру
Сообщения: 1860
Зарегистрирован: 07 июл 2010, 15:43
Статьи: 1
Репутация: 224
Откуда: Уфа

Re: Склеивание тайлов TileCache в единое изображение

Сообщение gimran » 09 сен 2013, 12:19

Тупейший вопрос: через что запускать скрипт? на выходе, как понимаю, геопривязки нет?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3321
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 494
Ваше звание: Author
Контактная информация:

Re: Склеивание тайлов TileCache в единое изображение

Сообщение Denis Rykov » 09 сен 2013, 12:28

Да, геопривязки нет. Запускается просто, сохраняем в файл и скармливаем питону:

Код: Выделить всё

(env)rykov@extensa:~/sandbox$ python tilecache2img.py
Image size: 2048 x 2048
Xmax: 43, Ymax: 39
Image saved into: /home/rykov/sandbox/mymapproxy/cache_data/osm_cache_EPSG900913/06/merged.png
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
gimran
Гуру
Сообщения: 1860
Зарегистрирован: 07 июл 2010, 15:43
Статьи: 1
Репутация: 224
Откуда: Уфа

Re: Склеивание тайлов TileCache в единое изображение

Сообщение gimran » 09 сен 2013, 12:39

Спасибо

Ответить

Вернуться в «Рецепты»