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

it2024-11-17  12

  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 </ PermanentDirectory >          </ 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 >      //这下面的值可以通过gdalinfo xxx.tif里获取              < North >                  < Value > 38 </ Value >              </ North >              < South >                  < Value > 37 </ Value >              </ South >              < West >                  < Value > 102 </ Value >              </ West >              < East >                  < Value > 104 </ 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

 

dstile工具:下载

转载于:https://www.cnblogs.com/wuhenke/archive/2010/01/03/1638499.html

相关资源:数据结构—成绩单生成器
最新回复(0)