Инструменты пользователя

Инструменты сайта



// GeoCrop 1.0

Я подумал и решил, что функционала и стабильности достаточно для релиза версии 1.0.

Так что да будет так: https://github.com/h4tr3d/geocrop/releases/tag/v1.0

// GeoCrop и популярные привязки

Если у вас на входе привязанный GeoTIFF, то проблем нет никаких, но если у вас просто растр (.png, .jpeg, .gif) и привязка для него, то есть нюансы. Вообще, GeoCrop умеет работать с любыми данными, с которыми умеет общаться GDAL. Но в в некоторых случаях не всё получается гладко, так, например, только сегодня он научился читать файл проекции для world-привязок (пара .prj+.pgw).

На просторах интернета можно встретить различные описания привязок, самые популярные:

  • Ozi Explorer
  • World files4)
  • Global Mapper

рассмотрим более подробно.

Ozi Explorer

GDAL не умеет только шифрованные OZFX, а так привязанная карта представляет собой пару .map+растр, где растр - это, обычно, .gif, .jpg или .png, реже - .bmp. При наличии такой привязки geocrop можно вызвать без дополнительных приготовлений:

geocrop -f VRT -s 50k K-53-026-A.map K-53-026-A.vrt

Обратите внимание, что передаётся map файл, а не растр.

World files

Т.к. сама привязка состоит из двух файлов (.prj+.pgw), то не так просто сказать, что и откуда читать. Согласно документации .pgw, .pngw или .wld файл5) подтягивается автоматически, если на входе карта в PNG (про другие форматы - ниже), а вот .prj файл нужно читать самому. Для этого в последней версии GeoCrop сделана небольшая эвристика:

  • Если растр содержит пустую проекцию, то производится попытка прочитать проекцию (формат WKT или PROJ.4) из файла с таким же именем, но расширением .prj и .prf.
  • Либо файл проекции можно жестко задать при помощи новой опции -p srs_def

Т.е. при наличии привязки в виде world files GeoCrop так же можно вызвать без дополнительных приготовлений так:

geocrop -f VRT -s 50k K-53-026-A.png K-53-026-A.vrt

если файл проекции находится в K-53-026-A.prj или K-53-026-A.prf, или так:

geocrop -f VRT -s 50k -p K-53-026-A.wkt K-53-026-A.png K-53-026-A.vrt

Обратите внимание, что в обоих случаях в качестве входного источника передаётся сам растр, а не его привязка.

Если у вас растры отличные от PNG:

  • BMP - привязка ищется в .bpw, .bmpw или .wld.
  • GIF - привязка ищется в .gfw, .gifw или .wld.
  • TIFF - если это GeoTIFF со встроенной привязкой, то она и используется, если это просто растр, то привязка ищется в .tfw, .tifw/.tiffw или .wld, а так же в MapInfo .tab файле.
  • JPEG - привязка ищется в .jgw, .jpgw/.jpegw или .wld, а так же MapInfo .tab файле.

Полный и актуальный список всегда можно посмотреть тут: http://www.gdal.org/formats_list.html

Global Mapper

В данный момент GDAL не поддерживает данный формат, а значит не поддерживает и GeoCrop. Ищите способ как сконвертировать его во что-то удобочитаемое.

Вообще .gmw файлы достаточно простые для разбора, так что, возможно, появится у меня и их поддержка. Тем более, что для тех же карт GGC там сразу зашита информация об обрезке (только странно, что они сразу не сделали рамку прозрачной).

// Новый режим в GeoCrop

Теперь в GeoCrop появился новый режим: генерация полигона для обрезки рамки в формате CSV+WKT. Вывод на stdout, так что можно сохранить в любой удобный файл из скрипта, после чего использовать как аргумент для -cutline у gdalwarp в какой-то более сложной команде. Вызова gdalwarp при этом не происходит.

Активируется режим опцией -g (от [g]enerate). Указывать выходной файл при этом не нужно - он будет проигнорирован.

Так же, теперь появилась возможность указывать файл с описанием проекции: -p srs_file. Сама проекция должна быть в формате WKT или PROJ.4. Эта опция перезаписывает определение проекции в текущем файле. Полезна для преобразования файлов с привязками в виде world-файлов. Более того, если проекция в файле пустая, а опция не указана то произведётся попытка прочитать её автоматически из файла с таким же именем, но с расширением .prj или .prf (какой первый попадётся). Так что популярные карты ГГЦ с такими привязками теперь можно конвертировать так же просто, как и с привязками Ozi Explorer.

Чуть раньше реализована функциональность по передаче дополнительных параметров gdalwarp. Для этого нужно завершить опции приложения двойным минусом , опции после него будут переданы gdalwarp как есть без изменений:

geocrop -f VRT -s 200k K-53-07.map K-53-07.vrt -- -overwrite

опция -overwrite будет передана gdalwarp. Помимо этого, теперь можно переопределить и сам исполняемый файл gdalwarp - опция -w GDALWARP.

Кроме того изменился формат опций, стало возможным указывать выходной формат (опция -f FMT, как следствие, образовались такие возможности: Быстро и ненавязчиво готовим карту для открытия в QMapShack) или только обрезать рамку, не делая кроп (опция -n).

// Быстро и ненавязчиво готовим карту для открытия в QMapShack

Для примера будет рассмотрен сервис http://loadmap.net, который предоставляет карты с привязками в формате OziExplorer.

Минусом подобных карт бывает то, что у них есть рамка и отдельные листы карт перекрывают друг друга при открытии. Для того, что бы рамку резать я уже написал ранее6) про свою программку geocrop.

Теперь про самый смак: QMS умеет открывать .vrt файлы. VRT файл это XML документ, с описанием привязки и различных преобразований, понятные движку GDAL. Так вот, в ходе беглого исследования оказалось, что мой способ резки рамки применим к VRT файлам: данное преобразование просто сохраняется внутри и применяется при открытии! Если добавить сюда тот факт, что переконвертации самого растра не происходит и просто формируется дополнительный маленький XML файл, то счастье становится полным.

Рассматривать вопрос сборки программы я подробно не буду, скажу только, что нужны dev пакеты для libgdal и libproj4. Устанавливать программу не нужно - просто скопируйте в удобное место, у меня это ~/bin. Сборка и работа на Windows не проверялась.

Вот, преамбула завершилась… Основная часть будет короче :)

  1. Скачиваем растровый файл карты, допустим это 500-метровка K-53-027-A, тогда файл будет K-53-027-A.png
  2. Скачиваем файл привязки K-53-027-A.map
  3. Обрезаем рамку и формируем VRT:
    ~/bin/geocrop -s 50k -f VRT K-53-027-A.map K-53-027-A.vrt

    Обратите внимание на параметр -s - он задаёт масштаб листа в виде делителя, т.е. опущена 1:, а буква обозначает степень десятки на которое нужно домножить: 50k (кило) = 50 * 10^3 = 50000 и масштаб тогда 1:50000, т.е. пятисотметровка.

6)
ozi2map от туда более не актуальна

// Две утилиты для работы с картами: ozi2map и geocrop

На выходных готовил растровую карту для похода на Кодар, с последующей конвертацией оной в JNX.

Самые неинтересные и скучные моменты в этом деле была обрезка рамки. А кроме того, печаль, по причине того, что есть карты с привязками OZI, но нет нормального конвертера для них.

В результате, подумал и написал за выходные две программы: ozi2map и geocrop

ozi2map

Данная утилита более не актуальна. Версия GDAL (>=1.10), входящая во все популярные дистрибутивы, уже умеет сама обрабатывать такие MAP файлы.

Первая, как можно понять из названия, предназначена для конвертации карты с привязкой OZI (сама карта в JPEG или GIF или другом распространённом растровом формате, который поддерживает OZI, но не OZFX/OZFX2/OZFX3, для них преобразования можно сделать средствами самого gdal (в прошлых статьях писал про это)).

Для чтения точек привязки и параметров проекции используется функция из недр GDAL: GDALReadOziMapFile(…), что, в отличии от питоновского ozi2geotiff.py, даёт корректные параметры проекции. Далее, не стал особо заморачиваться и подсовывая нужные параметры gdal_translate/gdalwarp вызываю их через system().

Я вообще не стал лезть в разбор map файла, поэтому файла растра автоматически не определяется и его нужно указывать самому:

./ozi2map O-50-103.map O-50-103.jpg
./ozi2map O-50-103.map O-50-103.jpg O-50-103.tif

Если имя выходного файла не задано, имя будет сформировано из имени растра с заменой расширения на .tif.

Всё, пользоваться программой должно быть проще простого. Найти исходники (GPLv2) можно тут:
https://git.gitorious.org/h4tr3d-utils/ozi2map.git

Собирать просто:

make

Полученный бинарник можно запускать от куда угодно.

geocrop

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

Т.е. по сути, программе на вход нужен только масштаб листа (в виде 1M, 500k, 200k, 100k, 50k, 25k, 10k, 5k, 2k) и сам лист карты в формате, поддерживаемом GDAL с корректной привязкой.

Когда расчёты по привязке будут выполнены, вызывается gdalwarp через system(). Полигон для обрезки формируется в координатах листа (не в точках растра), для всех листов, кроме 1M, это 4х угольник (на будущее будет более качественно сделано, но и текущего результата хватит в 99.99% случаев).

Пользоваться программой не сложнее чем ozi2map:

./geocrop -s 100k O-50-103.tif O-50-103-crop.tif

Первым аргументом - стилизованное обозначение масштаба:

  • 1M - 1:1 000 000 (это масштаб используется, если мнемоника не распознана)
  • 500k - 1:500 000 («пятикилометровка»)
  • 200k - 1:200 000 («двухкилометровка»)
  • 100k - 1:100 000 («километровка»)
  • 50k - 1:50 000 («полукилометровка» или «пятисотметровка»)
  • 25k - 1:25 000 («двухсотпятидесятиметровка»)
  • 10k - 1:10 000 («стометровка», пока не реализовано)
  • 5k - 1:5000 («пятидесятиметровка», пока не реализовано)
  • 2k - 2:2000 («двадцатиметровка», пока не реализовано)

Если этот параметр пропущен, используется масштаб 100k.

Вторым аргрументом - входной файл, поддерживаемый GDAL.

Третий аргумент - выходной, кропнутый файл. По умолчанию - GeoTiff, но можно переопределить опцией «-f FORMAT», где FORMAT - любой поддерживаемый GDAL.

Если хотите обрезанные карты потом склеивать при помощи gdal_merge.py, и получить вразумительные результат, входной файл должен быть в цветовой палитре RGB, узнать это можно при помощи утилиты gdalinfo, если в выводе есть такое:

Band 1 Block=4096x1 Type=Byte, ColorInterp=Red
Band 2 Block=4096x1 Type=Byte, ColorInterp=Green
Band 3 Block=4096x1 Type=Byte, ColorInterp=Blue

значит всё хорошо, если нет (выводится палитра из 255 цветов), то палитра индексированная, нужно преобразовать в RGB при помощи утилиты pct2rgb.py из комплекта GDAL.

Собирать просто:

mkdir build
cd build
cmake ..
make

Если на стадии cmake будут какие-то проблемы, стоит поставить dev-пакеты для GDAL и PROJ.4

Исходники можно взять тут (GPLv2):
https://github.com/h4tr3d/geocrop

// Готовим растровую карту для навигатора Garmin GPSMap 62s

UPD 2013-11-16: обновил список программ, добавил информацию об автоматической обрезке рамок, добавил информацию о создании многослойного JNX. Убрал текст помеченный как удалённый. За остальными подробностями - в историю изменения страницы. Вики всё же :)

Задача: сделать растровую карту для навигатора Garmin GPSMap 62s.

Инструменты:

  • GDAL 1.8.0. С версии 1.10.0 научился конвертировать привязки OZI Explorer в виде .map + растр (.png, .gif и т.п.) в geotiff, рекоменду обновляться.
  • map2jnx 1.7.8. В последних версиях QLandkarteGT идёт в комплекте + уже с моими патчами для задания различного scale-factor для разных слоёв. Скачёк версии с 0.2.4 до 1.7 (или даже 1.6) случился как раз из-за включения в состав QLandkarteGT.
    • QLandkarteGT задепрекейчена в пользу новой программы от автора - QMapShack
    • Соответственно map2jnx теперь можно разжиться тут
  • QLandKarteGT или QMapShack - нужны для просмотра.
  • NEW: geocrop
  • NEW: ozi2map, опционально, если у вас GDAL младше 1.10.x и есть куча растров привязанных в OZI Explorer (.gif, .png, .jpg и т.д.)

Исходные карты в формате OZFX3 (Ozi Explorer) с готовой привязкой. Если нет привязанных карт, можно почитать тут как это сделать самому. Теперь можно брать любые озиковские привязки (кроме OZFX2 и новых шифрованных OZFX3), но только если у вас версия gdal больше 1.10.0, иначе можно воспользоваться утилитой ozi2map.