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

时间:2011-06-10 16:56:36

标签: map mkmapview overlay coordinates

我有覆盖整个南非的图像。这些是Tiff格式并且嵌入了坐标。我正在尝试拍摄这些图像(约20张图像)并将其用作我的iPhone应用程序中的地图叠加层。我的问题在于将地图切割成瓷砖(准确地)。

MapTiler是我计划用于将这些大量图像切割成瓷砖的应用程序,但它让我了解了几个细节。我必须选择:

  • 系统的自定义定义(WKT,Proj.4,...)
  • WGS84 - 纬度和经度(大地测量)
  • Universal Transverse Mercator - UTM(预计)
  • 指定EPSG / ESRI数据库中的id-number
  • 按名称搜索坐标系

我不知道每个人/是做什么。

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

我只是在所有默认设置下通过MapTiler运行此地图,以查看它与普通Google地图的地图不完全对齐。有了这个说法,我相信我必须手动重新对齐这些图像。之前我通过MapTiler发送Google地球进行切割和处理。

我的问题

  • MapTiler会自动选择.tfw吗? - 因为这些可以保持正确的坐标。
  • 我如何轻松(例如通过图像上的拾取点然后在真实地图上)重新对齐/放置这些图像?

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

任何不清楚,请评论/询问!

感谢您的时间。

[编辑]

我用NotePad打开了.tfw文件,就在那里:

      0.0004024840
     -0.0000001596
     -0.0000002286
     -0.0003809100
     17.0984027750
    -32.6997115702

2 个答案:

答案 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地图上正确定位了您的图片。如果是这样,您已经解决了定位问题:您可以找到一些更自动化的解决方案来重新定位您的所有数据。