Страница 1 из 2

Картографическое приложения на базе изображений без привязки

Добавлено: 28 июл 2013, 14:41
Denis Rykov
Написал простенькую заметку, может для кого-нибудь окажется полезной.

------------------------------------------

P.S. статья опубликована.

Re: Картографическое приложения на базе изображений без прив

Добавлено: 28 июл 2013, 15:26
Максим Дубинин
Почему-то у меня все время белые линии на границе тайлов то появляются, то исчезают и после "прогрузки" изображения тоже:

Изображение

Re: Картографическое приложения на базе изображений без прив

Добавлено: 28 июл 2013, 15:34
Denis Rykov
В Chromium у меня все ok, проверил в FF - есть такое, но только в момент когда выполняются переходы от одного масштабного уровня к другому. Похоже, что речь идет об этом.

Re: Картографическое приложения на базе изображений без прив

Добавлено: 03 окт 2013, 12:02
EternalW
Ваш скрипт у меня не заработал, пишет о синтаксической ошибке в последней строке, в python вроде в конце должна быть конструкция вида:

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

if __name__ == "__main__":
  main(sys.argv[1])
, может в этом причина?
А GDAL генерирует файлы с неправильными индексами по высоте (y), они идут в обратном порядке.
В общем воспроизвести ваш пример не удалось, к сожалению.

Re: Картографическое приложения на базе изображений без прив

Добавлено: 18 ноя 2013, 14:34
luzhskij
если сделать замену

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

 img_path = sys.argv[1] 
на, к примеру,

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

img_path = 'G:\\work\\earthquakes.jpg'
то всё работает.

Re: Картографическое приложения на базе изображений без прив

Добавлено: 18 ноя 2013, 18:08
luzhskij
Итак. Имеется файл в формате .img, так же имеется файл привязки .igw. Необходимо получить тайлы в формате .bmp, с сохранением привязки (формат .bpw).

Буду рад советам и предложениям=)

Re: Картографическое приложения на базе изображений без прив

Добавлено: 18 ноя 2013, 19:35
Denis Rykov

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

# -*- coding: utf-8 -*-
import sys
import os
import math
from PIL import Image

# source path
img_path = sys.argv[1]

# tile size
tile_size = 256

# tile directory
tile_path = 'tiles'


def adjustBounds(src_img):

# get size of original image
src_width, src_height = src_img.size

# calculate size of target image (background)
target_width = src_width + (tile_size - src_width % tile_size)
target_height = src_height + (tile_size - src_height % tile_size)

# create transparent background
target_img = Image.new('RGBA', (target_width, target_height))

# combine original image and background
target_img.paste(src_img, (0, 0))

return target_img

img = Image.open(img_path)
w, h = img.size[0], img.size[1]

# calculate max zoom level
max_zoom = int(math.ceil(math.log((max(w, h) / tile_size), 2)))

# check world file path
if len(sys.argv) > 2:
world_file = open(sys.argv[2])
world_file_extension = sys.argv[2].split('.')[-1]
affine_parameters = tuple(map(float, world_file))

for z in range(max_zoom, -1, -1):

adjusted_image = adjustBounds(img)

numcolumns = adjusted_image.size[0] / tile_size
numrows = adjusted_image.size[1] / tile_size

for x in range(numcolumns):

# create z/x/ directory
path = os.path.join(tile_path, str(z), str(x))
if not os.path.isdir(path):
os.makedirs(path)

for y in range(numrows):
bounds = (x * tile_size, y * tile_size, (x + 1) * tile_size, (y + 1) * tile_size)
tile = adjusted_image.crop(bounds)
tile.save('%s/%s.png' % (path, y))

# create world file for each tile
if world_file:
wfile = open('%s/%s.%s' % (path, y, world_file_extension), 'wt')
A = affine_parameters[0]
C = affine_parameters[1]
D = affine_parameters[2]
B = affine_parameters[3]
E = affine_parameters[4] + x*tile_size*A
F = affine_parameters[5] + y*tile_size*B
wfile.write("\n".join(map(str, [A, C, D, B, E, F])))

w, h = img.size[0], img.size[1]
img = img.resize((w / 2, h / 2), Image.ANTIALIAS)

Пример запуска:

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

python tiling.py A20132742013304.L3m_MO_CHL_chlor_a_9km.png A20132742013304.L3m_MO_CHL_chlor_a_9km.wld
В результате возле каждого тайла будет лежать world-файл c расширением оригинального world-файла (то есть, если вы хотите *.bpw, то копируете ваш .igw в *.bpw и подсовываете его скрипту. Одно замечание - в данном скрипте создаются файлы в формате PNG (с поддержкой прозрачности), а не BMP, поэтому на входе у меня в примере файл с расширением *.wld. Вопросы?

Re: Картографическое приложения на базе изображений без прив

Добавлено: 19 ноя 2013, 12:46
luzhskij
Благодарю, вопрос привязки решен.
Только сами .img не хотят читаться:
python tiling.py 00000.img 00000.bpw
и получаю:
Traceback (most recent call last):
File "tiling.py", line 34, in <module>
img = Image.open(img_path)
File "C:\OSGeo4W\apps\Python27\lib\site-packages\PIL\Image.py", line 1980, in
open
raise IOError("cannot identify image file")
IOError: cannot identify image file
Полагаю, связано с pil.

Re: Картографическое приложения на базе изображений без прив

Добавлено: 20 ноя 2013, 09:01
Denis Rykov
Конечно, PIL не умеет читать такие растры. Для этого нужен GDAL. В вашем случае лучше всего сконвертировать *.img в RGB растр, например, командой:

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

gdal_translate -of PNG -scale A20132742013304.L3m_MO_CHL_chlor_a_9km.img A20132742013304.L3m_MO_CHL_chlor_a_9km.png
и затем уже полученное изображение передавать скрипту.

Re: Картографическое приложения на базе изображений без прив

Добавлено: 20 ноя 2013, 11:47
luzhskij
точно,спасибо!
а еще такой вопрос, какое максимальное разрешение возможно для PIL?
на разрешении 16396х16531 скрипт помирает с "memory error" :(

Re: Картографическое приложения на базе изображений без прив

Добавлено: 20 ноя 2013, 12:36
Denis Rykov
А можете куда-нибудь выложить файл на котором падает, я бы посмотрел?

Re: Картографическое приложения на базе изображений без прив

Добавлено: 20 ноя 2013, 12:57
luzhskij
а нет, не могу=( данные для служебного пользования.


еще вопрос вдогонку, по gdal2tiles. возможно ли там изменить разрешение выходного тайла?
сам искал - не углядел такой возможности.

Re: Картографическое приложения на базе изображений без прив

Добавлено: 21 ноя 2013, 05:29
Denis Rykov
Что вы понимаете под разрешением тайла? Разрешение тайла на каждом масштабном уровне вычисляется по формуле, подробнее тут и gdal2tiles тут совершенно не в тему. В этом случае, если ваш исходный растр имеет очень высокое разрешение, то такое же разрешение тайлов может быть достигнуто на очень больших масштабных уровнях (z). Если же вы хотите, например, чтобы ваши тайлы имели, например, максимальный масштабный уровень N и на этом уровне разрешение тайлов было равно разрешению исходного растра, то для этого в зависимости от N вы должны изменить разрешение вашего *.img файла, то есть вычисляете Rz(z=N) - это и есть то разрешение к которому вы должны привести ваше оригинальное изображение. Это можно сделать с помощью gdalwarp или gdal_translate:

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

gdal_translate -of HFA -outsize 50% 50% A20132742013304.L3m_MO_CHL_chlor_a_9km.img A20132742013304.L3m_MO_CHL_chlor_a_9km_resampled.img

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

gdalwarp -of HFA -tr 0.16666666 0.16666666 A20132742013304.L3m_MO_CHL_chlor_a_9km.img A20132742013304.L3m_MO_CHL_chlor_a_9km_resampled.img

Re: Картографическое приложения на базе изображений без прив

Добавлено: 21 ноя 2013, 10:33
luzhskij
Прошу прощения, не то написал. Имел ввиду совсем иное. Т.е. при выполнении gdal2tiles генерируются тайлы 256х256, формат png. И я хотел узнать, можем ли мы изменить выходной размер тайлов, ну, к примеру, на 512х512 и выходной формат. Попробовал корректировать сам gdal2tiles.py, но как-то не работает=(


Но за пояснение касательно разрешений благодарю, полезно!

Re: Картографическое приложения на базе изображений без прив

Добавлено: 21 ноя 2013, 11:13
Denis Rykov
Похоже, что в gdal2tiles нет возможности задать размер тайла, сейчас посмотрю, что с этим можно сделать.