原文转自:http://www.cnblogs.com/wuhenke/archive/2010/01/03/1638499.html

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内容如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><?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 自标签。同时名字和数据集名字要与上面自定义的文件夹名相同。格式如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->   <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配置文件内容:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><?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

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

  1. 【Python学习系列十五】pandas库DataFrame行列操作使用方法

    参考:http://pandas.pydata.org/pandas-docs/stable/api.html#dataframe data['w'] #选择表格中的'w'列,使用类字典属性,返回的是 ...

  2. Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)

    竞争资源(共享资源):如果有多条线程需要并发访问.并修改某个对象,该对象就是"竞争资源".为了避免多个线程"自由竞争"修改共享资源所导致的不安全问题. 线程同步 ...

  3. 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

    转自:https://www.cnblogs.com/Uncle-Joker/p/13686618.html 1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向 ...

  4. Android音视频学习系列(十) — 基于FFmpeg + OpenSL ES实现音频万能播放器

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  5. Linux的基本学习(十五)——认识系统服务

    Linux的基本学习(十五)--认识系统服务 前言 继续学习Linux 什么是daemon与服务(service) 从CentOS 7.x开始,传统的init已经被抛弃,取而代之的是systemd 什 ...

  6. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

  7. 数学之美 系列十五 繁与简 自然语言处理的几位精英

    数学之美 系列十五 繁与简 自然语言处理的几位精英 我在数学之美系列中一直强调的一个好方法就是简单.但是,事实上,自然语言处理中也有一些特例,比如有些学者将一个问题研究到极致,执著追求完善甚至可以说完 ...

  8. [中级]Java命令学习系列(五)——jhat

    转载自 [中级]Java命令学习系列(五)--jhat jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令.之前的文章讲到过,使用jmap可以生成Java ...

  9. python数据挖掘学习】十五.Matplotlib调用imshow()函数绘制热图

    python数据挖掘学习]十五.Matplotlib调用imshow()函数绘制热图 #2018-03-28 14:47:19 March Wednesday the 13 week, the 087 ...

最新文章

  1. 利用npm安装/删除/发布/更新/撤销发布包
  2. Java 里的字符串处理类StringBuffer简介
  3. 2012年初的10个绝对让你惊喜的jQuery插件
  4. 后台服务系统之编写服务消费方实现
  5. 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
  6. 【源码分享】POSCMS功能如何实现短信验证码
  7. 二级 计算机 vf,计算机二级(VF)笔试-144.doc
  8. 电脑常见的VGA、DVI、PS/2、USB等接口知识笔记,值得收藏!
  9. mega2560单片机开发_[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)
  10. ant design Cascader 实现联动省市区数据
  11. 概率图模型在图像处理中的应用
  12. MaxCompute SQL引用第三方Base64JAR实现编解码
  13. 【语义分割】2021-PVT2 CVMJ
  14. Matlab中的mod()函数
  15. 永远不要和沙雕一样的人去争论,争论最后你会发现你也是一个沙雕
  16. Python 3 怎么快速搭建服务器
  17. FastStone Capture安装包正版激活码使用说明
  18. 大四实习生java的个人计划
  19. “操作必须使用一个可更新的查询”故障解决
  20. 开始积极开发支持机器学习PC正式迈入AI世代

热门文章

  1. AnyMP4 Mac Video Converter Ultimate for Mac(视频格式转换器)
  2. 学计算机设计制图需啥基础,计算机绘图:AutoCAD2018基础入门
  3. 《机械制造业智能工厂规划设计》——2.2 智能工厂设计需求分析
  4. cmake pylon6 opencv
  5. 接口调试神器:Postman 从入门到进阶教程(万字
  6. linux 仿QQ 2.0版本
  7. startos属于linux的哪个版本,国产Linux版本StartOS起点操作系统常见问题回答
  8. 2021 长城杯 pwn K1ng_in_h3Ap_I
  9. 使用百度音乐盒API接口实现音乐播放器
  10. 笔记本内存安装图解 【转载】