我有覆盖整个南非的图像。这些是Tiff格式并且嵌入了坐标。我正在尝试拍摄这些图像(约20张图像)并将其用作我的iPhone应用程序中的地图叠加层。我的问题在于将地图切割成瓷砖(准确地)。
MapTiler是我计划用于将这些大量图像切割成瓷砖的应用程序,但它让我了解了几个细节。我必须选择:
我不知道每个人/是做什么。
我的tiff文件还有一个.tfw
文件(同名,不同的扩展名) - 我不知道这是什么。 (我没有创建图像,但认为它们可能是准确的,因为它来自政府的地理部门)
我只是在所有默认设置下通过MapTiler运行此地图,以查看它与普通Google地图的地图不完全对齐。有了这个说法,我相信我必须手动重新对齐这些图像。之前我通过MapTiler发送Google地球进行切割和处理。
我的问题:
.tfw
吗? - 因为这些可以保持正确的坐标。希望有人对此有一些提示!
任何不清楚,请评论/询问!
感谢您的时间。
[编辑]
我用NotePad打开了.tfw
文件,就在那里:
0.0004024840
-0.0000001596
-0.0000002286
-0.0003809100
17.0984027750
-32.6997115702
答案 0 :(得分:4)
如果MapTiler不能满足您的需求,您应该考虑使用GUI背后的实用程序。 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
最后的位是使任何未使用的像素透明,如果有的话,使用多个处理器。如果上面的命令抱怨透明度或alpha通道,你需要使用它将你的tif转换为rgba:
gdal_translate -co COMPRESS=LZW old.tif new.tif -expand rgba
现在要实际平铺:
gdal2tiles.py --zoom 6-16 your.tif outputfolder
这将使your.tif的图块处于指定的缩放级别并将其保存在outputfolder中。它还会创建.kml文件和围绕tif旋转的边缘的透明图块,以找到图块集的投影。这三行将对此进行排序。 334c
是我的驱动器上透明256x256 .png的大小(以字节为单位)。它会有所不同,所以找到一个这样的文件并调整值。此外对此处的路径非常小心,自动删除任何内容都可能出错,因此请仔细检查所有内容。首先删除.kml文件,然后删除任何100%透明的.pngs,然后删除任何现在为空的目录:
rm -r */*/*.kml
find ./ -type f -size 334c -exec rm -f {} \;
find ./ -depth -empty -type d -exec
但你还没完成。就像我之前提到的,一些图块将覆盖包含两个tif数据的区域。如果您将它们单独拼接起来,并且每个tileset将包含相同的tile,其中一半包含数据,一半是透明的。如果你只是合并这些文件夹,第一个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文件,修改基本和传入目录并运行它以将来自incomingDir的所有切片复制到baseDir中。 我在ImageMagick中使用过'convert',所以如果没有安装该库,则需要更换该行。我怀疑Apple的图像库中有一些东西你可以使用,但我使用IM作为其他东西,所以我没有看得更远。
合并你所有的瓷砖组,你已经完成了你要做的事情,但还有一个我推荐的步骤。 GDAL产生的PNG平均大小我猜。但是你会有成千上万的iPhone和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示例中并且可以正常工作。请让我知道这可不可以帮你。我一直想写一个完整的教程,我想知道这是否足够清楚以及我错过的任何步骤。
P.S。我假设您开始使用的地理位置周围没有地图项圈,如果他们这样做,您可以查看我关于删除它们的小文章:http://craig.stanton.net.nz/2011/06/07/merging-geotiffs/
答案 1 :(得分:1)
我不熟悉tfw文件,我也不熟悉MapTiler,但我可以做一些猜测并为坐标系添加一些背景,因为我曾在洛克希德·马丁担任过火箭科学家(真的)寿命...
首先,TL; DR,我猜想UTM是你的首选系统。
自定义定义可能需要您编写一些肮脏的东西,以使系统了解您的自定义格式。按名称指定的id-number和坐标数可能是为了提高互操作性。我所知道的系统是:
WGS84是地球的一个模型,是一个扁平(压扁)球形,于1984年标准化;它允许人们在lat,lon,alt
中指定一个针对这个理想化地球模型的位置。换句话说,如果一切顺利并处于“海平面”,它就是地球的样子。
UTM是地球上的平面模型,就像人们在地图中看到的一样。它允许人们从赤道和本初子午线中指定一个位置为northing,easting
。这些值以米为单位,是.tfw文件中的最后两个数字
有关.tfw文件中的内容的更多信息,我找到了this link。如果我正确阅读它,它似乎只是一个带有一些元数据的文本文件 - 你的.tfw文件的最后两个数字应该指明图像的左上角应该去的位置。
this description in Wikipedia是如何在墨卡托投影地图上找到位置的绝佳描述。
最后,一个小小的谷歌搜索似乎表明谷歌地图使用WGS84作为其坐标框架。您可以尝试使用在线工具such as this one将您的位置从.tfw文件转换为lat,lon,alt
,并查看是否在Google地图上正确定位了您的图片。如果是这样,您已经解决了定位问题:您可以找到一些更自动化的解决方案来重新定位您的所有数据。