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

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

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

Сообщение Denis Rykov » 28 июл 2013, 14:41

Написал простенькую заметку, может для кого-нибудь окажется полезной.

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

P.S. статья опубликована.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 8910
Зарегистрирован: 06 окт 2003, 20:20
Статьи: 231
Проекты: 12/6
Репутация: 644
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

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

Сообщение Максим Дубинин » 28 июл 2013, 15:26

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

Изображение
пристегивайтесь, турбулентность прямо по курсу

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

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

Сообщение Denis Rykov » 28 июл 2013, 15:34

В Chromium у меня все ok, проверил в FF - есть такое, но только в момент когда выполняются переходы от одного масштабного уровня к другому. Похоже, что речь идет об этом.
Spatial is now, more than ever, just another column- The Geometry Column.

EternalW
Новоприбывший
Сообщения: 6
Зарегистрирован: 09 июн 2013, 11:33
Репутация: 0

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

Сообщение EternalW » 03 окт 2013, 12:02

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

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

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

luzhskij
Интересующийся
Сообщения: 17
Зарегистрирован: 16 окт 2013, 16:32
Репутация: 0

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

Сообщение luzhskij » 18 ноя 2013, 14:34

если сделать замену

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

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

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

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

luzhskij
Интересующийся
Сообщения: 17
Зарегистрирован: 16 окт 2013, 16:32
Репутация: 0

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

Сообщение luzhskij » 18 ноя 2013, 18:08

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

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

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

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

Сообщение Denis Rykov » 18 ноя 2013, 19:35

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

# -*- 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. Вопросы?
Spatial is now, more than ever, just another column- The Geometry Column.

luzhskij
Интересующийся
Сообщения: 17
Зарегистрирован: 16 окт 2013, 16:32
Репутация: 0

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

Сообщение luzhskij » 19 ноя 2013, 12:46

Благодарю, вопрос привязки решен.
Только сами .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.

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

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

Сообщение Denis Rykov » 20 ноя 2013, 09:01

Конечно, 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
и затем уже полученное изображение передавать скрипту.
Spatial is now, more than ever, just another column- The Geometry Column.

luzhskij
Интересующийся
Сообщения: 17
Зарегистрирован: 16 окт 2013, 16:32
Репутация: 0

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

Сообщение luzhskij » 20 ноя 2013, 11:47

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

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

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

Сообщение Denis Rykov » 20 ноя 2013, 12:36

А можете куда-нибудь выложить файл на котором падает, я бы посмотрел?
Spatial is now, more than ever, just another column- The Geometry Column.

luzhskij
Интересующийся
Сообщения: 17
Зарегистрирован: 16 окт 2013, 16:32
Репутация: 0

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

Сообщение luzhskij » 20 ноя 2013, 12:57

а нет, не могу=( данные для служебного пользования.


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

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

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

Сообщение Denis Rykov » 21 ноя 2013, 05:29

Что вы понимаете под разрешением тайла? Разрешение тайла на каждом масштабном уровне вычисляется по формуле, подробнее тут и 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
Spatial is now, more than ever, just another column- The Geometry Column.

luzhskij
Интересующийся
Сообщения: 17
Зарегистрирован: 16 окт 2013, 16:32
Репутация: 0

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

Сообщение luzhskij » 21 ноя 2013, 10:33

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


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

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

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

Сообщение Denis Rykov » 21 ноя 2013, 11:13

Похоже, что в gdal2tiles нет возможности задать размер тайла, сейчас посмотрю, что с этим можно сделать.
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Материалы сайта»