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

[info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 05 мар 2015, 12:59
SergeyRyzhkov
Коллеги,
Тема не вопрос, а просто делюсь опытом.
Естественно вопрос избитый, тысячу раз обмусоленный, но по опыту знаю, что иногда надо 100 прочитать об одном и том же из разных источников, чтобы осмыслить все до конца.

Итак была задача сформировать тайловый массив в файловой системе в формате .../Z/X/Y.png (не TMS!)
Исходными данными был набор растров в формате *.sid (MrSID) с фалами привязки в формате *.tab (MapInfo).
При этом система координат отсутствует, вернее - CoordSys Nonearth Units "m" , сами координаты в МКС-64

Сразу ринулся естественно к GDAL.
Не имея достаточного опыта работы с GDAL,
в голове изначально был следующий алгоритм (не совсем неправильный):
1. Преобразовать все *.sid в GeoTIFF
2. Объединить все полученные на п1 в единый
4. Для единого растра назначить СК, а затем перепроецировать в EPSG:3857
5. Нарезать тайлы с использованием gdal2tiles

Не получилось, а именно
1. Файлы привязки *.tab не "схватывались"
2. Когда разобрался с п1, объединение шло очень долго
3. После перпроецирования получился артифакт, небольшой поворот и черная неравномерная окантовка вокруг растра
4. gdal2tiles "генерит" согласно спецификации TMS. То есть направление оси Y с юга на север

Не буду долго описывать ход экспериментов и т.д., сразу напишу как я сделал (но тоже не факт что оптимально)
Примеры кода будут под винду, bat-команды (я образно)

1. GDAL при конвертации и т.д. использует геопривязку. При этом если геопривязка есть в самом файле, то внешние файлы привязки, например *.tab игнорируются
Решение: Убираем геопривязку из файлов *.sid

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

rem Обязательно с параметром -co "PROFILE=BASELINE", 
rem Иначе геопривзяка из файла не будет удалена и дальнейшие команды не будут использовать фалы привязки
for %%f in (*.sid) do (
	gdal_translate -co "PROFILE=BASELINE" -q %%f %%~nf.tif 
)
2. GDAL, как и, например, QGIS, ArcGIS, прекрасно работаю с так называемыми виртуальными наборами растров (VRT), которые представляют из себя просто XML. То есть нет необходимости мержить (объединять) все растры в один, чтобы потом использовать для других операций.

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

rem Построение виртуального набора растров для всех полученных *.tif
rem Назначение системы координат с геопривязкой "внтури" файла
rem В данном случае уже будут использоваться файлы геопривязки
gdalbuildvrt -overwrite -q -a_srs "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=... +y_0=... +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs" -vrtnodata "255 255 255" -hidenodata -resolution highest MergedMsk.vrt *.tif
При этом устанавливаем параметры для сокрытия пустых областей

3. Дабы избежать артефакта черной каймы в результирующем растре, оказывается можно не делать перепроицирование в в EPSG:3857, а сразу отдать виртуальный набор растров скрипту gdal2tiles
То есть вот так делать не обязательно, и не надо

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

rem Перепроецирование виртуального набора растров
rem gdalwarp -of VRT -overwrite -t_srs EPSG:3857 MergedMsk.vrt Merged3857.vrt 
Сразу "генерим" растры модифицированным питон-скриптом:

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

rem Создание тайлового кэша. Используется модифицированный код, так как стандартный в схеме TMS
python C:\_Work\_Projects\nRsn\CoreLibs\gdal-1.11.2\bin\gdal\python\scripts\gdal2tilesXYZ.py -z 11-18 MergedMsk.vrt pyramid

Что я дополнительно сделал:

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

rem Далее можно прогнать OptiPNG и PNGOUT
rem Можно из проводника http://blog.sijey.ru/2011/04/04/optipng_pngout_integration/
Также можно удалить все пустые тайлы (очень очень большое количество).
Определить их легко, их размер 4 096 байт.

Как результат, всего за 1 сутки я построил тайловый кэш ортофотопланов 11-18 уровня на территорию СПб.

UPD:
Относительно долго не мог понять почему GDAL не принимает файл привязки после "очистки" файлов от привязки.
Оказалось поставщик растров сделал *.tab в таком формате

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

!table
!version 300
!charset WindowsLatin1
Definition table
File   "2222-04.sid"
Type"Raster"
(87000,88000)(0,0) Label "Point 1",
(88000,88000)(1666,0) Label "Point 2",
(87000,87000)(0,1666) Label "Point 3",
(88000,87000)(1666,1666) Label "Point 4"
CoordSys Nonearth Units "m"
Для MapInfo не критично, а вот GDAL-у не понятно. Оказалось банально (но я долго не мог понять):
В Type"Raster" нужен пробел... Type "Raster"

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 05 мар 2015, 17:50
Максим Дубинин
у меня только один вопрос, почему это не статья?

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 05 мар 2015, 18:04
SergeyRyzhkov
Максим Дубинин писал(а):у меня только один вопрос, почему это не статья?
К сожалению мама-папа в генах мне дали алгоритмический склад ума, способность строить деревья решений и т.д. ..., данное ими я постарался развить до существующего своего профессионального уровня.
Полученное мною военное образование также не предполагало мыслить публично, только делай раз-два.

Но нет у меня способности излагать мысли (знания, опыт и т.д.) на письме. И нет потребности это дело развивать...

На все изыскания я потратил около 2 часов, на написание данной темы я потратил около 40 минут, с несколькими корректировками. То есть КПД моей работы на выходе очень низкий.

Возможно стоит сделать какой-то раздел инкубатор статей и т.д., чтобы люди, которые более шире мыслят и могут грамотно и доступно изложить идею, могли выступить в роли технических писателей (редакторов) драфтов.

Если я как-то в очередной раз нарушил правила, удалите данную тему...

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 10 мар 2015, 13:46
SergeyRyzhkov
Прикладываю архив с:
- батник для построения тайлов (добавлена опция для определения прозрачности)

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

python gdal2tilesXYZ.py -a "255,255,255" -z 11-18 MergedMsk.vrt pyramid
- в батнике прописано удаление файлов менее 4096 байт. Существенно уменьшает количество пустых тайлов

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

for /R %%F in (*.png) do if /i %%~zF LEQ 4096 del /f %%F
- батник и сама программа для оптимизации размера png, у меня экономия по месту получилась 12% !
- модифицированный python-скрипт для построения тайлов в системе координат ZXY, а не TMS. Автора не помню, к сожалению

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 20 мар 2015, 14:40
Natalia Novoselova
SergeyRyzhkov писал(а):
Максим Дубинин писал(а):у меня только один вопрос, почему это не статья?
К сожалению мама-папа в генах мне дали алгоритмический склад ума, способность строить деревья решений и т.д. ..., данное ими я постарался развить до существующего своего профессионального уровня.
Полученное мною военное образование также не предполагало мыслить публично, только делай раз-два.
Но нет у меня способности излагать мысли (знания, опыт и т.д.) на письме. И нет потребности это дело развивать...
Сергей, а что вы сейчас делаете, как не мыслите публично? Не заметила в ваших текстах на форуме косноязычия. Излагаете свои мысли вы ясно.


Возможно стоит сделать какой-то раздел инкубатор статей и т.д., чтобы люди, которые более шире мыслят и могут грамотно и доступно изложить идею, могли выступить в роли технических писателей (редакторов) драфтов.
Вам не кажется, что в данном случае вы предлагаете "лишнюю сущность"? Это уже есть на ГИС-Лаб, этот инкубатор статей - есть формат Черновиков Вики-статей.
Перенесите материал темы в черновик вики - и основа статьи будет готова. Если выпускающие редакторы сочтут нужным сделать в вашем тексте правки - или наводящими вопросами вам помогут это сделать, или (так думаю) они сделают это сами.

Согласна с Максимом. Жаль, когда хороший материал - выносится на форум, а не попадает в Вики (на форуме все уходит вниз и немногие люди будут штудировать разделы на предмет поиска). А в вики все наглядно, по содержанию. Есть возможность дополнять и дорабатывать материал (не только автором, а любым желающим - ведь в этом принцип Вики)

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 20 мар 2015, 15:03
SergeyRyzhkov
Сделал, как положено.
http://wiki.gis-lab.info/w/%D0%9D%D0%B0 ... 0%BE%D0%B9

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 20 мар 2015, 16:03
Natalia Novoselova
SergeyRyzhkov писал(а):Сделал, как положено.
http://wiki.gis-lab.info/w/%D0%9D%D0%B0 ... 0%BE%D0%B9

Раньше черновики сразу были видны, заметила, что сейчас автоматом это не получается (в списке черновик не появился). Но это вопрос к админам.

P.S. А вот эти приложения тоже к статье относятся?
viewtopic.php?f=30&t=18732#p125883

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 21 мар 2015, 01:42
Александр Мурый
Natalia Novoselova писал(а): Раньше черновики сразу были видны, заметила, что сейчас автоматом это не получается (в списке черновик не появился). Но это вопрос к админам.
Автоматом черновики на свет не появляются, для это надо в начале вики-текста вставить спец. конструкцию "{{Статья|Черновик}}". Посмотрите тексты имеющихся черновиков на вики.

Re: [info] Нарезка тайлов из растров MrSID c *.tab привязкой

Добавлено: 21 мар 2015, 23:02
Максим Дубинин
Первая ссылка для автора статьи:
http://gis-lab.info/qa/authors.html#.D0 ... 0.B8.D0.BA