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

2024-01-04

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

MapTiler 是我计划用来将这些大量图像切割成图块的应用程序,但它要求我提供一些细节。我必须选择:

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

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

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

我只是在所有默认设置下通过 MapTiler 运行此地图,以查看它与普通 Google 地图的地图没有近乎完美对齐。话虽如此,我相信我必须手动重新对齐这些图像,例如Google Earth之前我通过MapTiler将其发送来进行切割和处理。

我的问题:

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

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

有不懂的地方请评论/提问!

谢谢你的时间。

[EDIT]

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

      0.0004024840
     -0.0000001596
     -0.0000002286
     -0.0003809100
     17.0984027750
    -32.6997115702

如果 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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何准确地制作地图叠加层的地图 的相关文章

  • 如何使用 tweepy 仅提取主题标签中的文本?

    我想为我的情感分析项目提取主题标签 但是我得到了一个字典列表 其中包含所有主题标签及其在推文中的索引 我只想要文字 我的代码 data tweepy Cursor api search q since a i until b i items
  • Mapkit 在 IOS 13 中使用过多的 CPU

    最近 在一些用户更新到 iOS 13 x 后 我的 iOS 应用程序开始频繁崩溃 在 iOS 12 x 中没有出现该问题 我正在使用 Mapkit 渲染一些 MKPolygons 和 MKPolylines MKPolylines 被删除并
  • 将构造函数传递给 Array.map?

    我怎样才能做这样的事情 var a 1 2 3 4 a map Date constructor 此代码在 Google V8 上引发错误 SyntaxError Unexpected number 我也尝试过 a map Date con
  • 一个类似 dict 的 Python 类

    我想编写一个自定义类 其行为类似于dict 所以 我继承自dict 不过 我的问题是 我是否需要创建一个私有的dict我的成员 init 方法 我不明白这个有什么意义 因为我已经有了dict如果我只是继承自的行为dict 谁能指出为什么大多
  • 使用 for 循环填充 python 字典列表

    我试图用 for 循环填充字典列表 但最终结果显示 for 循环填充的最后一个字典覆盖了所有先前字典的值 我尝试调整以下中提出的解决方案 如何使用循环填充 Python 字典 https stackoverflow com question
  • 如何将 div (或任何元素)覆盖在表格行 (tr) 上?

    我想在恰好有多个列的表行 tr 标记 上覆盖一个 div 或任何可以使用的元素 我尝试了几种方法 似乎都不起作用 我在下面发布了我当前的代码 我确实得到了一个覆盖 但不是直接覆盖在该行上 我尝试将覆盖顶部设置为 div Bottom css
  • 按多个键分组并对字典列表的值进行汇总/平均值

    在Python中按多个键进行分组并对字典列表进行汇总 平均值的最Pythonic方法是什么 假设我有一个字典列表 如下所示 input dept 001 sku foo transId uniqueId1 qty 100 dept 001
  • 以有效的方式从 Map 中删除多个键?

    我有一个Map
  • iteritems 的优点是什么?

    我使用的是 Python 2 7 5 Mac OS X 10 9 3 具有 8GB 内存和 1 7GHz Core i5 我测试了如下的时间消耗 d i i 2 for i in xrange 10 7 3 WARNING it takes
  • 对象指针值作为字典的键

    我想使用对象的引用值作为字典的键 而不是对象值的副本 因此 我本质上想在字典中存储与另一个对象的特定实例关联的对象 并稍后检索该值 这可能吗 是不是完全违背了NSDictionary的理念 我可以看出我可能以错误的方式处理这个问题 因为字典
  • 嵌套字典中的 Django 模板

    我正在使用 Django 模板 并且遇到了嵌套字典的一个问题 Dict result dict type 0 file name abc count 0 type 1 file name xyz count 50 我的 HTML 文件中的模
  • 将嵌套字典键值转换为 pyspark 数据帧

    我有一个 Pyspark 数据框 如下所示 我想提取 dic 列中的那些嵌套字典并将它们转换为 PySpark 数据帧 像这样 请让我知道如何实现这一目标 Thanks from pyspark sql import functions a
  • 多重映射的每个元素是否都包含键和值?

    我无法想象没有人问过这个问题 但我没有运气找到它 a 的每个元素是否multimap包含它的价值and它的钥匙 这就是a的内部结构multimap看起来更像这样 map
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 如何将旋转的 NetCDF 转换回正常的纬度/经度网格?

    我有一个带有旋转坐标的 NetCDF 文件 我需要将其转换为正常的纬度 经度坐标 经度为 180到180 纬度为 90到90 library ncdf4 nc open dat nf 对于尺寸 它显示 1 5 variables exclu
  • Swift 3.0 Pin 颜色注释在 MapView 中没有改变

    我有兴趣根据案例场景更改注释的图钉颜色 在一个函数中 我发送了一个数组 用于确定引脚注释的颜色 到目前为止 我已经设置了一个名为 ColorPointAnnotation 的子类 它将确定 pinColor 然后 在 switch 语句中
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 定义 types.Dict 和 dict 之间的区别?

    我正在练习使用 Python 3 5 中的类型提示 我的一位同事使用typing Dict import typing def change bandwidths new bandwidths typing Dict user id int
  • 在Python上获取字典的前x个元素

    我是Python的新手 所以我尝试用Python获取字典的前50个元素 我有一本字典 它按值降序排列 k 0 l 0 for k in len dict d l 1 if l lt 51 print dict 举个小例子 dict d m
  • 将字典写入 csv 时遇到问题,其中键作为标题,值作为列

    我有一本字典 看起来像 mydict foo 1 2 bar 3 4 asdf 5 6 我正在尝试将其写入 CSV 文件 使其看起来像 foo bar asdf 1 3 5 2 4 6 我花了最后一个小时寻找解决方案 我发现的最接近的解决方

随机推荐

  • 对象最终化的前期成本是多少?

    Java 中可终结对象的讨论通常讨论当可终结对象 及其相关资源 无法快速进行垃圾收集时发生的常见间接成本 目前 我更感兴趣的是可终结的实际直接成本是多少 无论是在内存方面还是在对象分配时间方面 我在很多地方都看到过间接提及这种成本的存在 例
  • java,未找到类异常 com.mysql.jdbc.Driver [重复]

    这个问题在这里已经有答案了 我正在尝试在 java 程序中创建运行以下内容 但出现此错误 java lang ClassNotFoundException com mysql jdbc Driver 位于 org apache catali
  • Python 中的logging.warn 和logging.warning 有什么区别?

    样品位于http docs python org 2 howto logging html http docs python org 2 howto logging html两者都使用warn and warning logging war
  • Jupyter Notebook(仅限)内存错误,相同的代码在传统的 .py 中运行并且可以工作

    我有一个深度学习课程的作业 他们提供了一个 Jupyter 笔记本作为基本代码 问题是在运行数据导入和重塑后 jupyter 笔记本出现 内存错误 经过一些分析后 我尝试编译普通 py 文件中的相同代码 一切运行良好 问题是我需要 最好 使
  • Matlab傅里叶描述符出了什么问题?

    我正在使用冈萨雷斯frdescp函数来获取边界的傅立叶描述符 我使用这段代码 得到两组完全不同的数字 描述两个相同但尺度不同的形状 那么有什么问题吗 im imread c classes a1 png im im2bw im b bwbo
  • excel 2007 vba:如何引用HPageBreaks

    我正在尝试编写一个宏 它可以查看工作表保留的水平分页符列表 看起来 HPageBreaks 应该正是这样 我可以添加或删除分页符 但我似乎无法隔离集合本身来查看其内容 即使添加监视并查看 ActiveSheet HPageBreaks 也只
  • ES6导出覆盖功能

    如何导出这个覆盖函数 以便导入模块可以检查该函数是否已被调用 util js export function isPageload return isPageload function return false 当我用 Babel 编译它时
  • 是否可以更改 RESX 生成器以在生成的类上使用公共访问器?

    我正在编写一个 ASP NET MVC 应用程序 并尝试使用 RESX 文件来存储错误消息和其他常见字符串 问题是 RESX 生成器构建内部类 并且无法使用以下语法在 ASP NET HTML 代码中使用它们 是否可以调整设置以使 RESX
  • 通过psycopg2获取警告消息

    我想通过 psycopg2 调用 plpgsql 函数并查看警告消息 即 我有这个功能 create or replace function test warning returns void as begin raise warning
  • Ruby on Rails 连接多个表以及如何提取数据

    我正在尝试为 Ruby on Rails 中的餐厅创建一个预订系统 我有三个表 用户 表和预订 users 具有 id name email phone 和 totalPersons 列 table 具有 id 和 seats 列 rese
  • asp.net WindowsImpersonationContext 函数

    谁能解释一下下面几行的功能 WindowsIdentity wId WindowsIdentity HttpContext Current User Identity WindowsImpersonationContext wIdCon w
  • 从asp页面执行exe

    我有一个 exe 文件可以进行一些 pdf 处理 我想在 ASP 页面中调用此 exe 并且希望 asp 页面等待 exe 完成处理 有什么解决办法吗 谢谢 维韦克 Set WshShell WScript CreateObject WSc
  • 无法加载DLL“opencv_core242”:找不到指定的模块。埃姆古简历

    我正在尝试开始使用 emgu CV open CV for C 但我很难让它发挥作用 我正在按照本指南使用 emgu CV 制作简单的程序Link http www emgu com wiki index php Setting up EM
  • 如何从可能的字符串列表中替换python中的字符串

    我有一列数据 如下所示 df pd DataFrame Ex1 apple apple1 Peear peAr b nana Bananas Ex2 Applet banan apples PAIR banana apple Ex3 Pea
  • 如何访问Locu API

    我希望使用 Locu API 但找不到注册或 和获取 API 密钥的方法 我浏览了他们的网站 但不知道如何注册 有谁知道我将如何实现这一点 不幸的是 Locu 不再允许新开发者注册 阅读帖子 https www godaddy com co
  • 根据部分文本删除行

    如果我在 A 列中找到文本 FemImplant 我会尝试删除整行 该文本是由 链接的句子的一部分 我需要解析 之前的单元格内容 看看它是否与 FemImplant 匹配并删除该行 这是我到目前为止所拥有的 Dim cell As Exce
  • 静态构造函数有什么用?

    请向我解释一下静态构造函数的使用 为什么以及何时创建静态构造函数 是否可以重载静态构造函数 不 你不能超载 静态构造函数可用于初始化与类型 或任何其他每类型操作 关联的任何静态字段 特别适用于将所需的配置数据读取到只读字段等 它在第一次需要
  • 如何让 Alexa 以秒为单位倒计时

    我希望能够在我的技能中实现 Alexa 有声 倒计时 15 秒 我知道我可以
  • [Vue warn]:渲染错误:“TypeError:_vm 未定义”(在 中找到)

    我最近切换到使用打字稿的类组件 并在我的网站上收到此错误 此错误在 Firefox 上出现 但在 chrome 上出现 TypeError Cannot read property createElement of undefined fo
  • 如何准确地制作地图叠加层的地图

    我有覆盖整个南非的图像 它们采用 Tiff 格式 并嵌入了坐标 我正在尝试拍摄这些图像 大约 20 张图像 并将它们用作我的 iPhone 应用程序中的地图叠加层 我的问题在于将地图切割成图块 准确地 MapTiler 是我计划用来将这些大