WorldWind系列十五:如何切割影像和DEM数据及其在WW中的应用配置

from http://wenku.baidu.com/view/7855477002768e9951e7385e.html


系列十五: WorldWind 系列十五:如何切割影像和 DEM 数据及其在 WW 中的 应用配置 来源:博客园 作者:无痕客 WorldWind 学习系列十四中我从代码上分析如何加载 DEM 数据,里面涉及了算法,有学 习和借鉴意义。但对于只求应用或者说是急于求成的网友来说,实用价值不是太大!我们分析代 码是一种学习过程,不是目的,终究要落在如何应用自己的影像和 DEM 数据、如何基于自己的 数据开发满足自己项目需求的新的 WW 插件。这是一过程,需要循序渐进,今天只跟大家分享 一下如何切割自己的影像或 DEM,及如何设置相应的 XML 配置。 我的学习和实践,主要是参考 http://worldwindcentral.com/wiki/Dstile_howto,对 于英语较好的网友,建议阅读原文,反正我英语不太好,结合实践,我差不多看了五六遍原文。 我下面是翻译部分内容及自己的实践步骤和心得(将采用红色字部分)。 这是一篇教你如何一步步将你自己的具有地理参考系的影像数据添加到 WorldWind 中的 文档。该帮助文档将告诉你如何将影像数据切割成瓦片,及怎样在 WW 中利用这些瓦片数据创 建图层。至此,你可以将该图层作为一个 Add-on 插件来发布。这个图层可以完全放在你的电 脑上。如果你想将瓦片数据作为发布服务提供给他人,该文档可能对你帮助不大。 WW 的瓦片系统的组织如下图: 阅读下面的内容前,请确保你已经理解上图中 WW 瓦片的工作原理和 XML 的配置原理。 (注: 上图是 WW 的精华) 下面我将带你创建一个图层实例,里面的数据可以换做你自己的。 (注:第一次实践的话, 建议你使用同样的数据同样的步骤,将整个过程走一遍) 必备软件工具: 必备软件工具: FWTools:这是一个操作具有地理参考系影像的免费的工具包,是开源工具。dstile 切图工 具需要使用 FWTools,最新版本 V2.4.6。下载地址:http://fwtools.maptools.org/ 安装 FWTools 时,你可以选择不安装开发文件,这样可以节省一些安装空间。dstile 工具与 2.X 版 本兼容,与 1.X 版 FWTools 不兼容。 Dstile:使用版本是 2007 年 8 月 13 日,下载地址: http://whatnick.dyndns.org:8080/tisham/dstile-0.2_win32_whatnickpatches.zip 这个程序按照 Making Layers 文章的处理过程。请将压缩文件解压后拷贝到 FWTools 的安装 目录下(如:D:\Program Files\FWTools2.4.6) WorldWind(1.4 版) 前期准备: 前期准备: 除了软件,你还将需要一个具有参考系的影像数据。本文中,我将使用特拉华州北部的地 质图。(下载:http://www.dgs.udel.edu/publications/digitaldata/geologicdata.aspx 文 中使用的是第六个 TIFF 数据) 影像格式必须是 FWTools 所支持的( here)。Dstile 目前不能 处理索引影像,但是这样的影像可以先通过 FWTools 中 pct2rgb 功能转换成 RGB 影像。简便 起见,我会将影像数据放到 FWTool 文件夹下,但也可放在其他地方,使用时确保正确的影像 文件路径。 Dstile 也可以切合地形数据,只需要在命令行中添加--dem 参数。注意:地形数据必须是 16 位的。 创建瓦片金字塔: 创建瓦片金字塔: Dstile 是个命令行程序,在你的开始菜单中运行“FWTools shell”(注:安装 FWTools 会 在桌面上出现该快捷图标)。将会出现带 FWTools 路径的命令行窗口。你也可以在 FWTools 文件夹下运行“setfw.bat”命令脚本。 创建瓦片的通用命令行格式如下: dstile.exe tile --lztsd tile_size --wwcache --overviews output_directory georeferenced_image_file(s) 参数如下: tile_size - 0 图层瓦片大小,十进制数,能被 180 正常(最好为 180/(2^N))。 output_directory - 瓦片金字塔的输出路径。(如何没有盘符只要文件夹名,是在 FWTool 安装目录下) georeferenced_image_file(s) - 影像数据的完整路径(如果影像数据在 FWTool 安装目录下的文件夹下,可以使用相对路径).一系列的多重影像可以自动组合成单一 的瓦片金字塔。 A list of multiple image files can be supplied and will be automatically ( combined into a single set of tiles.) 命令说明: --tile :告诉 dstile 将要创建瓦片金字塔 --wwcache :告诉 dstile 按 World Wind 的内部格式组织和命名创建的瓦片 --overviews :告诉 dstile 去创建所有可以创建的瓦片图层,忽略该命令,将会导致只创 建最详细的瓦片图层 --png:通常用来创建.png 格式的瓦片(速度慢且没压缩),忽略该命令,将默认为 jpg 格 式瓦片 --float :被用来切割浮点型 DEM 数据,比 Int16 稍微更准确些。 --srcProj: 被用来指明缺少.tif/.tfw 文件时的投影坐标。使用 epsg 代码。例 如 epsg:32754 is UTM Zone 54S , epsg:4326 is WGS84. 学会在 FWTools Shell 中查看命令: 我示例中的地质图,我使用如下命令创建瓦片金字塔: dstile.exe tile --lztsd 1.0 --wwcache --overviews output_tiles geomap10.tif 将会在 FWTools 的安装目录下创建一个新的 output_tiles 文件夹,里面存放着瓦片金字 塔系统。输入影像文件为 geomap10.tif。注意:这个输入文件必须是影像数据自身,而不是世 界文件(示例中的 geomap10.tfw )尽管.tfw 文件是必须的且必须与影像数据在同一个文件 夹下。在这个例子中,output_tiles 文件夹下创建了六层数据(文件夹名字从 0 到 5)。 Dstile 运行中,会依次读取输入参数,并显示进度。处理该 111M 的影像数据花费了一两 分钟。据说 dstile 在 Free Earth Foundation 网站的应用中,单机从 21GB 中录制 1.8G 的瓦 片树花了 70 分钟。 这是我使用自己的试验数据生成的瓦片金字塔,为 9 层。 0 层瓦片大小 层瓦片大小(Level zero tile size): : 这个参数控制着你的影像图层在哪一缩放界别或视角高度上显示。0 层瓦片大小越大说明 你放大时越早出现,同理相反。 作为参照,the blue marble 的 lzts 为 36°,WorldWind 中默 认的 Landsat 图层的 LZTS 为 2.25°。Zoomit! 功能中的高分辨率影像使用的 LZTS 为 0.1~0.2 度。 在地质图中,我使用 1°的 LZTS。这使得该图层将会在海拔 390 千米左右出现。你也可以按照 自己的需要改变该参数。LZTS 的大小理想值为最好为 180/(2^N),N 为整数。 该例子中理想 的 LZTS 为 1.40625(180/(2^7))。如果 dstile 的切割值不满足该表达式,可能会导致图层 在 WW 中绘制是出现水平定位问题。本实例中的地图没有表现出该问题是因为相对粗略的比例 尺。 高精度的正射影像更可能会出现水平定位问题, 所以最好是遵循该表达式 180/(2^N)规则。 中添加图层: 向 WW 中添加图层 为了在 WW 中显示该图层,需要将切好的瓦片数据放到 WW 的目录下,同时要为该新图层 创建一个 XML 配置文件。 本实例中,我将瓦片数据放在\Data\Earth 目录下。同样,瓦片数据可以在/Add-ons/的任 何位置。我没有将数据放到\Cache\目录下,是因为我偶尔会删除缓存文件夹下所以数据。我会 在\Cache 下存放可以重新下载的数据。因此我将 output_files 文件夹下的所有内容放在 WW 目录的 "\Data\Earth\N. Delaware geology map\"里。 这些瓦片文件在 WW 目录下的组织方式由你来定。 如果我有很多地质地图放在 WW 离, 我可能 会创建个文件夹然后把瓦片数据放到里面。(例如:\Data\Earth\Geology maps\N. Delaware\ )只要你能让 WW 按照你的组织方式找到它们。 一旦瓦片数据放好位置,我们需要为该图层创建一个 XML 文件。该 XML 文件存放在 WW 中的 \Config\Earth\。将 XML 命名为图层名是很好的方式。我使用的 XML 内容如下: <?xml version="1.0" encoding="UTF-8"?> <LayerSet Name="Geology maps" ShowOnlyOneLayer="false" ShowAtStartup= "false" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="LayerSet.xsd"> <QuadTileSet ShowAtStartup="true"> <Name>N. Delaware</Name> <DistanceAboveSurface>0</DistanceAboveSurface> <BoundingBox> <North> <Value>40.0</Value> </North> <South> <Value>39.0</Value> </South> <West> <Value>-76.0</Value> </West> <East> <Value>-75.0</Value> </East> </BoundingBox> <TerrainMapped>true</TerrainMapped> <ImageAccessor> <LevelZeroTileSizeDegrees>1.0</LevelZeroTileSizeDegrees> <NumberLevels>6</NumberLevels> <TextureSizePixels>512</TextureSizePixels> <ImageFileExtension>jpg</ImageFileExtension> <PermanentDirectory>Data\Earth\N. Delaware geology map</P ermanentDirectory> </ImageAccessor> <TransparentColor><Red>0</Red><Green>0</Green><Blue>0</Blue>< /TransparentColor> </QuadTileSet> </LayerSet> " LevelZeroTileSizeDegrees"为你切割影像时的 LZTS 的值 "PermanentDirectory" :是你存放瓦片的文件夹路径 图层集合的名字定义为:"Geology maps",该图层的名字为 "N. Delaware". 影像外部的部分空白的,对应的瓦片是黑色的。"TransparentColor" 的值似的那些部分是透 明的。注意:这会使得影像里纯黑部分是透明的。一些预处理步骤可能会修正它。例如在影像中 默认的空值和假定真实影像中没有像素是纯白的。修正方法如下: 1.给纯黑像素添加一个偏移量(如 32) 2.将所有的白像素点为黑色 3.切割时使用上面设置的透明颜色 因为 JPEG 压缩过程中黑边不是全黑的,可以采用下面的方式: <TransparentMinValue>0</TransparentMinValue> <TransparentMaxValue>20</TransparentMaxValue> 根据经验采用最好可视效果的透明最大值,20 只是建议值。 自定义 DEM 向 WW 中添加自定义的 DEM 与添加影像的处理很类似。但是,瓦片数据和 XML 代码分别 放在 Cache 目录下和 earth.xml 中。 Dstile 命令: 命令: DEM tif 必须是 float 32 或 int 16 格式的,并且是一个色带。命令行如下: dstile tile --lztsd <level zero tile size in degrees> --wwcache [tile out in worldwind cache format] --dem [use dem tiling switch] [--srcProj epsg:4326] --overviews [build higher level overviews] <destination directory> <sourcefile(s)> 命令及参数基本与上面介绍的类似,只是需要“--dem”命令。 瓦片数据存放位置: 将瓦片数据放在 Cache 里的 SRTM 中的自定义文件夹下。例如: X:\WorldWind\Cache\Earth\SRTM\<Custom DEM>. DEM 数据切割生成金字塔: XML 格式 在 config 文件夹下的 Earth.xml, TerrainAccessor 标签下添加 Higher Resolution 在 Subset 自标签。同时名字和数据集名字要与上面自定义的文件夹名相同。格式如下: <HigherResolutionSubsets Name="Custom DEM"> <TerrainTileService> <ServerUrl>http://127.0.0.1</ServerUrl> <DataSetName>Custom DEM</DataSetName> <LevelZeroTileSizeDegrees>0.5</LevelZeroTileSizeDegrees> <NumberLevels>6</NumberLevels> <SamplesPerTile>512</SamplesPerTile> <DataFormat>Int16</DataFormat> <FileExtension>bil</FileExtension> </TerrainTileService> <LatLonBoundingBox> <North> <Value>0.0</Value> </North> <South> <Value>-1.0</Value> </South> <West> <Value>0.0</Value> </West> <East> <Value>1.0</Value> </East> </LatLonBoundingBox> </HigherResolutionSubsets> 你可以在 Terrain Manager 里关闭或打开该图层;注意:你需要缩放操作来实现切换。 实验结果截图: 我后来添加自己的数据的截图: 配置文件内容: 相应的 XML 配置文件内容: <?xml version="1.0" encoding="UTF-8"?> <LayerSet Name="Geology maps" ShowOnlyOneLayer="false" ShowAtStartup= "true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="LayerSet.xsd"> <QuadTileSet ShowAtStartup="true"> <Name>GW</Name> <DistanceAboveSurface>0</DistanceAboveSurface> <BoundingBox> <North> </North> <South> <Value>37</Value> </South> <West> <Value>102</Value> </West> <East> <Value>104</Value> //这下面的值可以通过 gdalinfo xxx.tif 里获取 <Value>38</Value> </East> </BoundingBox> <TerrainMapped>true</TerrainMapped> //是否启用地形数据 <ImageAccessor> <LevelZeroTileSizeDegrees>1.0</LevelZeroTileSizeDegrees> <NumberLevels>9</NumberLevels> <TextureSizePixels>512</TextureSizePixels> <ImageFileExtension>jpg</ImageFileExtension> <PermanentDirectory>Data\Earth\GW</PermanentDirectory> </ImageAccessor> <TransparentColor><Red>0</Red><Green>0</Green><Blue>0</Blue>< /TransparentColor> </QuadTileSet> </LayerSet> 提示: 提示 1.当你测试 LZTS 时,每次运行前最好把输出文件夹清空。因为 Dstile 创建的新的瓦片数 据可能和已经存在的数据重叠,但不会清出原有的瓦片数据。 2.将输出文件夹路径设定为 WW 目录下面是不错的选中。我使用实例中临时文件夹更容易 学习。你可以直接定义你要 WW 中存放瓦片的文件夹目录,例如 dstile.exe tile --lztsd 1.0 --wwcache --overviews "C:\Program Files\NASA\World Wind 1.4\Add-ons\Earth\geomap10" geomap10.tif 3.为了使切割的影像不超出 WGS84 的最大范围(-180,-90,180,90),你可以使用 如下方式查询: gdalinfo geomap10.tif 看 UL LL UR LR 是否超过上面的限制。"gdal_translate -projwin" 可以实现剪裁,但 需要 ulx uly lrx lry 值。 例如:gdal_translate -projwin minx maxy maxx miny input.tif output.tif 我发现, 如果整体近似取整有时候有的数据仍然会超出键入的裁剪范围。 为了解决这类问 题,我使用十进制小数稍微缩小一下范围。例如全球影像数据剪裁处理时使用: gdal_translate.exe -projwin -179.987 89.985 179.988 -89.98 input.tif output.tif 右上角信息显示高程为 0,这里面的高程数据并没有起作用的原因是什么??请参看: http://forum.worldwindcentral.com/showthread.php?t=21419 问题相同,最好还看 看它附件里的截图(对你实践有益的)。我让你看该链接,并不是我赞同他的全部内容,里面也 有不少错误, 但它确实是亲身实践的先驱! ——这是最值得肯定和学习的。 他犯的错误我也犯过, 原因很简单,我照着他说的实践过。他最致命的错误是:“C:\Program Files\FWTools1.4.2>dstile.exe tile --lztsd 1.0 --wwcache --dem --overviews dem demo-data/utm.tif ”将影像数据作为 DEM 数据进行切割和使用!FWTools 中自动的实验影 像数据 demo-data/utm.tif,不是 DEM 数据!! DEM 数据有 TIF 格式的,但不是说 TIFF 格式的影像就可以作为 DEM 数据来使用。还有 个区别:DEM 数据中的 TIFF 数据是不带地理参考的。需要 --srcProj 命令来制定地理参考系! (据我理解) 另外影像图层的 XML 配置,可以参考: http://bbs.godeyes.cn/showtopic-180310.aspx

你可能感兴趣的:(xml,cache,工具,encoding,output,tiff)