如果 MapTiler 没有满足您的需要,您应该考虑求助于 GUI 背后的实用程序。 GDAL (http://www.gdal.org/gdal_utilities.html) 几乎可以完成为 iOS 准备 geotif 所需的一切,我就是用它来做这件事。从这里开始的说明假设您已经安装了 GDAL。
首先,您需要确保坐标确实嵌入到 tif 中。
gdalinfo your.tif
通读该输出,如果它没有提到它正在使用哪个投影和坐标,那么您现在需要将该世界文件与 tif 一起保留。
根据源文件的大小,您可能需要在平铺之前合并它们。这将导致边缘稍微好一点,其中单个图块包含来自两个相邻 geotif 的数据。如果 20 个 geotif 形成一个完美的矩形并且它适合最大 tif 尺寸,请使用以下命令:
gdalwarp -co COMPRESS=LZW originals/*.tif output.tif -srcnodata 0 -dstnodata 0 -multi
最后的位是使任何未使用的像素透明并使用多个处理器(如果有的话)。如果上面的命令抱怨透明度或 Alpha 通道,您需要使用以下命令将 TIF 转换为 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 的数据的区域。如果您将它们单独平铺,并且每个图块集将包含相同的图块,其中一半包含数据,一半是透明的。如果您只是合并这些文件夹,第一个 tif 中的图块将覆盖第二个 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 文件,修改基本目录和传入目录并运行它以将所有图块从传入目录复制到基本目录中。我在这里使用了 ImageMagick 中的“convert”,因此如果您没有安装该库,则需要替换该行。我怀疑苹果的图像库中有一些东西你可以使用,但我使用 IM 来做其他事情,所以我没有进一步寻找。
合并所有图块集,您就完成了您打算做的事情,但我建议您再执行一步。我猜 GDAL 生成的 PNG 大小是平均大小。但您将拥有数千个此类设备,而且 iPhone 的磁盘空间有限。所以抓住pngnq
并压缩所有PNG。我没有注意到我的质量有任何损失,在检查输出之前我不会扔掉你的原件。
pngnq -n 256 */*/*.png
我一直在处理包含太多 png 的文件集,因此我必须分解命令来分别执行每个缩放图层,制作一个简短的脚本来确保覆盖每个文件将非常容易。现在你将拥有每个 png 的副本,如下所示:original.png
-> original-nq8.png
。这是我编写的一个 shell 脚本,用于循环遍历它们并在原始版本上复制 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
同样,您可能必须将其分解以获得更大的缩放级别,因为您将有太多的 png 需要处理。
完成所有这些后,我通常会将总文件大小减少 30% 以上,并且我可以将文件夹直接放入 Apple 的 TileMap 示例中,它就可以工作了。请让我知道这可不可以帮你。我一直想写一个完整的教程,我想知道这是否足够清晰以及我错过的任何步骤。
附:我假设您开始使用的 geotif 周围没有地图项圈,如果有,您可以查看我关于删除它们的小文章:http://craig.stanton.net.nz/2011/06/07/merging-geotiffs/ http://craig.stanton.net.nz/2011/06/07/merging-geotiffs/