GIS-LAB

Географические информационные системы и дистанционное зондирование


Форумы GIS-Lab.info

Геоинформационные системы (ГИС) и Дистанционное зондирование Земли


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

Обсуждение материалов сайта: вопросы, замечания, предложения

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

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

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

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

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

Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Author
 
Зарегистрирован: 11 апр 2008
 
Сообщения: 3266
Репутация: 478
Статьи: 33
Проекты: 9

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

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

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

Изображение
  • 0

пристегивайтесь, турбулентность прямо по курсу
Аватара пользователя
Максим Дубинин
NextGIS
 
Зарегистрирован: 06 окт 2003
Откуда: Москва (на карте)
 
Сообщения: 8865
Репутация: 627
Статьи: 231
Проекты: 12/6

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

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

В Chromium у меня все ok, проверил в FF - есть такое, но только в момент когда выполняются переходы от одного масштабного уровня к другому. Похоже, что речь идет об этом.
  • 0

Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Author
 
Зарегистрирован: 11 апр 2008
 
Сообщения: 3266
Репутация: 478
Статьи: 33
Проекты: 9

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

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

Ваш скрипт у меня не заработал, пишет о синтаксической ошибке в последней строке, в python вроде в конце должна быть конструкция вида:
Код: Выделить всё
if __name__ == "__main__":
  main(sys.argv[1])

, может в этом причина?
А GDAL генерирует файлы с неправильными индексами по высоте (y), они идут в обратном порядке.
В общем воспроизвести ваш пример не удалось, к сожалению.
  • 0

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

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

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

если сделать замену
Код: Выделить всё
 img_path = sys.argv[1]
на, к примеру,
Код: Выделить всё
img_path = 'G:\\work\\earthquakes.jpg'
то всё работает.
  • 0

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

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

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

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

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

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

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

Сообщение Denis Rykov » 18 ноя 2013, 20: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. Вопросы?
  • 2

Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Author
 
Зарегистрирован: 11 апр 2008
 
Сообщения: 3266
Репутация: 478
Статьи: 33
Проекты: 9

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

Сообщение luzhskij » 19 ноя 2013, 13: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.
  • 0

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

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

Сообщение Denis Rykov » 20 ноя 2013, 10: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
и затем уже полученное изображение передавать скрипту.
  • 1

Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Author
 
Зарегистрирован: 11 апр 2008
 
Сообщения: 3266
Репутация: 478
Статьи: 33
Проекты: 9

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

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

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

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

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

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

А можете куда-нибудь выложить файл на котором падает, я бы посмотрел?
  • 0

Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Author
 
Зарегистрирован: 11 апр 2008
 
Сообщения: 3266
Репутация: 478
Статьи: 33
Проекты: 9

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

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

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


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

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

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

Сообщение Denis Rykov » 21 ноя 2013, 06: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
  • 0

Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Author
 
Зарегистрирован: 11 апр 2008
 
Сообщения: 3266
Репутация: 478
Статьи: 33
Проекты: 9

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

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

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


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

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

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

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

Похоже, что в gdal2tiles нет возможности задать размер тайла, сейчас посмотрю, что с этим можно сделать.
  • 0

Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Author
 
Зарегистрирован: 11 апр 2008
 
Сообщения: 3266
Репутация: 478
Статьи: 33
Проекты: 9

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


(Геокруг)

© GIS-Lab и авторы, 2002-2013. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов (подробнее).