Если MapTiler не делает то, что вам нужно, вам следует обратиться к утилите за графическим интерфейсом. GDAL (http://www.gdal.org/gdal_utilities.html) сделает почти все, что вам нужно для подготовки ваших геотифов для iOS, именно это я и использую, чтобы сделать именно это. Инструкции с этого момента предполагают, что у вас установлен GDAL.
Прежде всего, вы должны убедиться, что координаты действительно встроены в TIF.
gdalinfo your.tif
Прочитайте этот вывод, и если в нем не указано, какую проекцию и координаты он использует, то вам нужно сохранить этот файл мира с tif.
В зависимости от размера ваших исходных файлов вы можете объединить их перед разбиением на листы. Это приведет к немного лучшим краям, где один фрагмент содержит данные из двух соседних геотифов. Если 20 геотифов образуют идеальный прямоугольник и соответствуют максимальным размерам tif, используйте следующее:
gdalwarp -co COMPRESS=LZW originals/*.tif output.tif -srcnodata 0 -dstnodata 0 -multi
Биты на конце должны сделать прозрачными любые неиспользуемые пиксели и использовать несколько процессоров, если они у вас есть. Если команда, приведенная выше, жалуется на прозрачность или альфа-каналы, вам нужно конвертировать ваши tifs в rgba, используя это:
gdal_translate -co COMPRESS=LZW old.tif new.tif -expand rgba
Теперь на самом деле черепица:
gdal2tiles.py --zoom 6-16 your.tif outputfolder
Это сделает плитки your.tif на указанных уровнях масштабирования и сохранит их в выходной папке. Он также создаст файлы .kml и прозрачные плитки по краям, на которые повернут tif, чтобы найти проекцию набора плиток. Эти три строки разберутся. 334c
- это размер прозрачного 256x256 .png на моем диске в байтах. У вас все будет иначе, поэтому найдите один такой файл и настройте его значение. Также будьте очень осторожны с путями здесь , автоматизация любого удаления может пойти не так, так что перепроверьте все. Сначала вы удалите файлы .kml, затем удалите все 100% прозрачные файлы .png, а затем удалите все каталоги, которые теперь пусты:
rm -r */*/*.kml
find ./ -type f -size 334c -exec rm -f {} \;
find ./ -depth -empty -type d -exec
Но ты еще не закончил. Как я упоминал ранее, некоторые плитки будут покрывать область, которая содержит данные двух tif. Если вы разделили их на части по отдельности, и каждый набор будет содержать одну и ту же плитку, половина с данными, половина прозрачная. Если вы просто объедините эти папки, плитка с первого раза перезапишет плитку со второго, и она все равно будет равна половине / половине. Так что вам нужно объединить отдельные плитки. К счастью для вас, я взломал скрипт Perl, чтобы сделать это. Пожалуйста, не судите меня по моим способностям Perl. Я никогда не читал об этом, я просто нашел сценарий поблизости и взломал его.
#! /usr/bin/perl
use File::Slurp;
use File::Copy;
$baseDir = "/Volumes/Elemental/geotifs/destination";
$incomingDir = "/Volumes/Elemental/geotifs/sourcetiles";
my @files = read_dir($incomingDir);
foreach my $zoomlevel(@files) {
if(-d "$incomingDir/$zoomlevel") {
#mkdir "$imgdir/$nextZoom/";
unless(-e "$baseDir/$zoomlevel")
{
mkdir "$baseDir/$zoomlevel";
}
my @subdirs = read_dir("$incomingDir/$zoomlevel");
foreach my $x(@subdirs) {
#print "subdir called $imgdir/$zoomlevel/$x\n";
if(-d "$incomingDir/$zoomlevel/$x") {
unless(-e "$baseDir/$zoomlevel/$x")
{
mkdir "$baseDir/$zoomlevel/$x";
}
my @mapfiles = read_dir("$incomingDir/$zoomlevel/$x");
foreach my $y(@mapfiles) {
if (-e "$baseDir/$zoomlevel/$x/$y")
{
print "Have to merge /$zoomlevel/$x/$y \n";
qx(convert $baseDir/$zoomlevel/$x/$y $incomingDir/$zoomlevel/$x/$y -composite $baseDir/$zoomlevel/$x/$y);
} else {
copy("$incomingDir/$zoomlevel/$x/$y","$baseDir/$zoomlevel/$x/$y");
}
}
}
}
}
}
Сохраните его как файл .pl, измените базовый и входящий каталоги и запустите его, чтобы скопировать все плитки из входящего в базовый каталог. Я использовал здесь «convert» из ImageMagick, поэтому, если у вас не установлена эта библиотека, вам нужно заменить эту строку. Я подозреваю, что в библиотеке изображений Apple есть что-то, что вы можете использовать, но я использую IM для других вещей, поэтому я не смотрел дальше.
Объедините все свои наборы плиток, и вы сделали то, что вы намеревались сделать, но есть еще один шаг, который я бы порекомендовал. Я думаю, PNG, которые производит GDAL, среднего размера. Но их будет много тысяч, а на айфонах ограничено дисковое пространство. Так что возьмите pngnq
и сожмите все PNG. Я не заметил каких-либо потерь в качестве, я не выбрасываю ваш оригинал, пока вы не проверите выход.
pngnq -n 256 */*/*.png
Я имел дело с наборами файлов, которые содержат слишком много файлов png, поэтому мне пришлось разбить команду, чтобы сделать каждый слой масштабирования по отдельности, было бы довольно легко создать короткий скрипт, чтобы обеспечить охват каждого файла. Теперь у вас будет дубликат каждого png, например: original.png
-> original-nq8.png
. Вот сценарий оболочки, который я написал, чтобы просмотреть их и скопировать версию nq8 поверх оригинала
for OriginalFile
do
Location=`dirname "$OriginalFile"`
FileName="$OriginalFile"
newName=`echo $FileName | sed 's/-nq8//g'`
if [ $newName != "$FileName" ]
then
mv "$FileName" "$newName"
fi
done
Сохраните это как .sh и запустите его из командной строки следующим образом:
./removeNq8.sh */*/*nq8.png
Опять же, вам, вероятно, придется разбить его на большие уровни масштабирования, потому что у вас будет так много pngs, с которыми вам придется иметь дело.
Завершив все, я обычно уменьшу общий размер файла более чем на 30%, и я могу перетащить папку прямо в пример TileMap от Apple, и это работает. Пожалуйста, дайте мне знать, если это поможет. Я собирался написать полное руководство, и я хотел бы знать, достаточно ли это ясно и какие шаги я пропустил.
P.S. Я предположил, что у геотифов, с которых вы начинаете, нет никаких ошейников карты, если они есть, вы можете проверить мою маленькую статью об их удалении: http://craig.stanton.net.nz/2011/06/07/merging-geotiffs/