Картографическое приложения на базе изображений без привязки
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Картографическое приложения на базе изображений без привязки
Написал простенькую заметку, может для кого-нибудь окажется полезной.
------------------------------------------
P.S. статья опубликована.
------------------------------------------
P.S. статья опубликована.
Spatial is now, more than ever, just another column- The Geometry Column.
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Картографическое приложения на базе изображений без прив
Почему-то у меня все время белые линии на границе тайлов то появляются, то исчезают и после "прогрузки" изображения тоже:
пристегивайтесь, турбулентность прямо по курсу
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Картографическое приложения на базе изображений без прив
В Chromium у меня все ok, проверил в FF - есть такое, но только в момент когда выполняются переходы от одного масштабного уровня к другому. Похоже, что речь идет об этом.
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Новоприбывший
- Сообщения: 6
- Зарегистрирован: 09 июн 2013, 11:33
- Репутация: 0
Re: Картографическое приложения на базе изображений без прив
Ваш скрипт у меня не заработал, пишет о синтаксической ошибке в последней строке, в python вроде в конце должна быть конструкция вида:
, может в этом причина?
А GDAL генерирует файлы с неправильными индексами по высоте (y), они идут в обратном порядке.
В общем воспроизвести ваш пример не удалось, к сожалению.
Код: Выделить всё
if __name__ == "__main__":
main(sys.argv[1])
А GDAL генерирует файлы с неправильными индексами по высоте (y), они идут в обратном порядке.
В общем воспроизвести ваш пример не удалось, к сожалению.
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 16 окт 2013, 16:32
- Репутация: 0
Re: Картографическое приложения на базе изображений без прив
если сделать замену
на, к примеру,
то всё работает.
Код: Выделить всё
img_path = sys.argv[1]
Код: Выделить всё
img_path = 'G:\\work\\earthquakes.jpg'
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 16 окт 2013, 16:32
- Репутация: 0
Re: Картографическое приложения на базе изображений без прив
Итак. Имеется файл в формате .img, так же имеется файл привязки .igw. Необходимо получить тайлы в формате .bmp, с сохранением привязки (формат .bpw).
Буду рад советам и предложениям=)
Буду рад советам и предложениям=)
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Картографическое приложения на базе изображений без прив
Код: Выделить всё
# -*- 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
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 16 окт 2013, 16:32
- Репутация: 0
Re: Картографическое приложения на базе изображений без прив
Благодарю, вопрос привязки решен.
Только сами .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.
Только сами .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
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Картографическое приложения на базе изображений без прив
Конечно, 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.
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 16 окт 2013, 16:32
- Репутация: 0
Re: Картографическое приложения на базе изображений без прив
точно,спасибо!
а еще такой вопрос, какое максимальное разрешение возможно для PIL?
на разрешении 16396х16531 скрипт помирает с "memory error"
а еще такой вопрос, какое максимальное разрешение возможно для PIL?
на разрешении 16396х16531 скрипт помирает с "memory error"
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Картографическое приложения на базе изображений без прив
А можете куда-нибудь выложить файл на котором падает, я бы посмотрел?
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 16 окт 2013, 16:32
- Репутация: 0
Re: Картографическое приложения на базе изображений без прив
а нет, не могу=( данные для служебного пользования.
еще вопрос вдогонку, по gdal2tiles. возможно ли там изменить разрешение выходного тайла?
сам искал - не углядел такой возможности.
еще вопрос вдогонку, по gdal2tiles. возможно ли там изменить разрешение выходного тайла?
сам искал - не углядел такой возможности.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Картографическое приложения на базе изображений без прив
Что вы понимаете под разрешением тайла? Разрешение тайла на каждом масштабном уровне вычисляется по формуле, подробнее тут и 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.
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 16 окт 2013, 16:32
- Репутация: 0
Re: Картографическое приложения на базе изображений без прив
Прошу прощения, не то написал. Имел ввиду совсем иное. Т.е. при выполнении gdal2tiles генерируются тайлы 256х256, формат png. И я хотел узнать, можем ли мы изменить выходной размер тайлов, ну, к примеру, на 512х512 и выходной формат. Попробовал корректировать сам gdal2tiles.py, но как-то не работает=(
Но за пояснение касательно разрешений благодарю, полезно!
Но за пояснение касательно разрешений благодарю, полезно!
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Картографическое приложения на базе изображений без прив
Похоже, что в gdal2tiles нет возможности задать размер тайла, сейчас посмотрю, что с этим можно сделать.
Spatial is now, more than ever, just another column- The Geometry Column.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей