如何为地图叠加层准确制作地图

Lou*_*ley 3 overlay map coordinates mkmapview

我有覆盖整个南非的图片。它们为Tiff格式,并已将坐标嵌入其中。我正在尝试拍摄这些图像(大约20张图像),并将它们用作我的iPhone应用程序中的地图叠加层。我的问题在于将地图正确地切成图块。

我计划将MapTiler应用程序用于将这些大量图像切成小块,但它向我询问了一些细节。我必须选择:

  • 系统的自定义定义(WKT,项目4,...)
  • WGS84-经纬度(大地)
  • 通用横轴墨卡托-UTM(预计)
  • 从EPSG / ESRI数据库中指定ID号
  • 按名称搜索坐标系

关于每个人的所作所为,我一无所知。

我的tiff文件也有一个.tfw文件(相同的名称,不同的扩展名)-我不知道这是什么。(我没有创建图像,但是相信它们可能是准确的,因为它来自政府的地理部门)

我只是在所有默认设置下都通过MapTiler运行了该地图,以查看它与普通Google Maps的地图之间的对齐情况并非完美。如此说来,我相信在通过MapTiler发送图像进行裁剪和处理之前,我必须在Google Earth上手动重新对齐这些图像。

我的问题

  • MapTiler是否自动接机.tfw?-因为它们可能具有正确的坐标。
  • 我如何轻松地(例如,通过在图像上然后在真实地图上的拾取点)重新对齐/放置这些图像?

希望有人对此有一些提示!

如有任何疑问,请发表评论/询问!

谢谢你的时间。

[编辑]

.tfw使用记事本打开了文件,这就是其中的全部内容:

      0.0004024840
     -0.0000001596
     -0.0000002286
     -0.0003809100
     17.0984027750
    -32.6997115702
Run Code Online (Sandbox Code Playgroud)

Cra*_*aig 5

如果MapTiler没有执行您需要的操作,则应考虑使用GUI背后的实用程序。GDAL(http://www.gdal.org/gdal_utilities.html)几乎可以完成为iOS做好地理标记的准备工作,这正是我正在使用的功能。从这里开始的说明假定您已经安装了GDAL。

首先,您需要确保坐标确实嵌入在tif中。

gdalinfo your.tif
Run Code Online (Sandbox Code Playgroud)

通读该输出,如果未提及该输出使用的是哪个投影和坐标,则现在需要将该世界文件保存为tif。

根据源文件的大小,您可能需要在平铺之前合并它们。这将导致边缘稍微好一些,其中单个图块包含来自两个相邻地理位置的数据。如果20个Geotif组成一个完美的矩形并且适合最大tif尺寸,请使用以下方法:

gdalwarp -co COMPRESS=LZW originals/*.tif  output.tif -srcnodata 0 -dstnodata 0 -multi
Run Code Online (Sandbox Code Playgroud)

最后的位将使任何未使用的像素透明,并在有多个像素的情况下使用多个处理器。如果以上命令抱怨透明度或Alpha通道,则需要使用以下命令将tif转换为rgba:

gdal_translate -co COMPRESS=LZW old.tif new.tif -expand rgba
Run Code Online (Sandbox Code Playgroud)

现在开始实际平铺:

gdal2tiles.py --zoom 6-16 your.tif outputfolder
Run Code Online (Sandbox Code Playgroud)

这将使your.tif的图块处于指定的缩放级别,并将其保存在outputfolder中。它还将创建.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 
Run Code Online (Sandbox Code Playgroud)

但是您还没有完成。就像我之前提到的,一些图块将覆盖包含两个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");
                            }

                         }
                    }
            }
    }

}
Run Code Online (Sandbox Code Playgroud)

将其另存为.pl文件,修改基本目录和传入目录,然后运行它以将所有图块从incomingDir复制到baseDir。我在这里使用了ImageMagick的“转换”功能,因此,如果您没有安装该库,则需要替换该行。我怀疑您可以在Apple的图像库中使用某些内容,但我将IM用于其他内容,因此我没有进一步研究。

合并所有磁贴集,您已经完成了自己打算要做的事情,但是我建议您再走一步。我猜GDAL产生的PNG具有平均大小。但是您将拥有成千上万的设备,而iPhone的磁盘空间有限。因此,请抓住pngnq并压缩所有PNG。我没有发现我的质量有任何损失,在您检查输出之前,不要扔掉您的原始照片。

pngnq -n 256 */*/*.png
Run Code Online (Sandbox Code Playgroud)

我一直在处理包含过多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
Run Code Online (Sandbox Code Playgroud)

将其另存为.sh,然后从命令行运行它,如下所示:

./removeNq8.sh */*/*nq8.png
Run Code Online (Sandbox Code Playgroud)

再次,您可能必须将其分解为较大的缩放级别,因为您将要处理许多png。

通常我会把所有文件的大小减少30%以上吗?我可以将文件夹直接放入Apple的TileMap示例中,并且可以正常工作。请让我知道这可不可以帮你。我一直想写一个完整的教程,我想知道这是否足够清晰以及我错过的任何步骤。

PS:我假设您开始使用的地理标记周围没有地图项,如果可以,可以查看我的小文章中有关删除它们的内容:http : //craig.stanton.net.nz/2011/06/07 / merging-geotiffs /