写在前面
虽说是技术手册,但是没有源码的研究就算是一个教程吧。由于本人能力有限,文章中有很多不
当之处,请各位原谅。
本教材基于 ww.Net 1.4 版本,目前 ww 已经发展到 ww java 版本,功能更加丰富,包含很多编辑
功能和三维模型叠加功能,推荐使用。
李景富
联系:gdsqz2@163.com
中国地质大学(武汉)地球空间信息研究所
1
worldwind 技术手册
目录:
1. WorldWind 软件架构 ――――――――――――――――02
1.1 WW 功能介绍
1.2 WW 与 XML
1.3 Client 与 Server
1.3.1 WW 使用链接
1.3.2 本地缓存路径
1.3.3 本地功能配置
http 请求与 asp
1.3.4
1.3.5 WMS、WFS
2. WorldWind 金字塔体系
3. Geospatial image processing
2.2 瓦片请求调度策略
2.1 瓦片金字塔详解及其对应公式
―――――――――――――――――-03
――――――――――――――――――03
2.1.1 NASA World Wind Tile Structure ――――――――――――――――― 03
2.1.2 NASA World Wind Map Tile System ―――――――――――――――― 04
――――――――――――――――― 05
2.2.1 当前显示请求及其显示(客户端) ――――――――――――――――――05
2.2.2 目标瓦片快速搜索算法
――――――――――――――――――08
2.2.3 瓦片数据的请求预测(服务器) ――――――――――――――――――08
――――――――――――――――――10
――――――――――――――――――10
――――――――――――――――――14
3.1 步骤:(准备知识:LOTD:0 层瓦片大小;TileSize: ) ―――――――――――14
3.2 NLT Landsat 处理技术范例 ―――――――――――――15
2.3 可视化的地球空间数学模型
2.3.1 地球三维 LOD 模型
3.3 dstile howto
4. Creat a new world
―――――――――――――15
―――――――――――――17
4.1World Wind 本地文件说明
4.1.1. Worlds
4.1.2. 在安装目录下
4.2 创建新的世界模型
5. Making layer
5.1 添加新图层(更详细可参考)
5.2 Point
5.3 Lines
5.4 Polygon
5.5 Model Feature
5.6 Effects and Multi-Texturing
5.7 Shapefile
5.8 KML/KMZ
6. ddons 与 plugins
6.1 addons 与 plugins 区别
6.2 插件总汇及其功能
7. script 脚本
8. 编译调试
9. 读书籍和论文
10. 1.4.1 版本发展
―――― ――――――――――18
―――――――――――――――20
―――――――――――――――20
―――――――――――――――23
―――――――――――――――25
―――――――――――――――27
―――――――――――――――32
―――――――――――――――32
―――――――――――――――――33
―――――――――――――――――――33
―――――――――――――――――――――34
―――――――――――――――35
2
一、 WW 软件结构
1.1 功能介绍
World Wind(简称 WW,中文有人直翻译为世界风),是 NASA 发布的一个开放源代码(Open Source)的
地理科普软件(由 NASA Research 开发,由 NASA Learning Technologies 來發展),它是一个可视化地球仪,
将 NASA、USGS 以及其它 WMS 服务商提供的图像通过一个三维的地球模型展现,近期还包含了月球、
金星、火星、天文星系等的展现。
用户可在所观察的行星上随意地旋转、放大、缩小, 同时可以看到地名和行政区划.软件还包含了一个
软件包,能够浏览地图及其它由因特网上的 OpenGIS Web Mapping Service 提供的图像。
目前软件所使用的数据:
低分辩率的 Blue marble 数据现在包含的初始安装内,当用户放大到特定区域时,附加的高分辩率数据
将会自动从 NASA 服务器上被下载。
A 静态数据层:
en:Blue marble 图像
en:Landsat 图像
en:USGS 图像
en:SRTM 地形数据
B 动画数据层:
en:Animated Earth
en:MODIS
en:GLOBE
1.2 WW 与 XML
WorldWind 是一个优秀的客户端框架引擎,XML 实现数据描述和软件设置,通过 WW 的 WorldModel、
图层、插件、http 和 WMS 请求、三维渲染等实现交互式浏览。也就是说 XML 是数据。WorldWind 则是数
据执行的引擎,WW 可扩展性和开发性非常强大。
1.3 Clinet 与 Server
1.3.1 WW 使用链接(附表 1)
1.3.2 本地缓存路径(附表 1)
1.3.3 本地功能配置(附表 1)
1.3.4 http 请求与 asp
Blue marble、:Landsat、SRTM 使用直接的 http 请求。
Why not use WMS?
NASA Learning Technologies and the NWW user community has tried in the pastto use WMS to serve World
Wind tiles. The immense demand of the NWW user base hascrippled any WMS server we’ve tried to date. Instead
of using an overly complex format(for serving predefined chunks that is) we opted to go with pre-rendered,
pre-defined tilesthat are just stored in the file system, and can be served to the client with no furtherprocessing
server side. This reduces the strain on the server incredibly. If you believe youcan setup a WMS server that would
be able to withstand the NWW user base, feel free,we’d be happy to see that. In the mean time we are working on
creating a WMS serverthat can read the World Wind tile structure (for compatibility with other programs).
1.3. WMS、WFS
WMS——web Map server 网络地图服务 WFS——web Fundation server 网络要素服务
USGS 和所有动画数据层使用符合 OGC 协议的WMS和WFS实现数据网络共享。
3
二、 WorldWind 金子塔体系
2.1 瓦片金字塔详解及其对应公式
2.1.1 NASA World Wind Tile Structure
采取笛卡尔坐标,原点(X = 0, Y = 0.)在投影坐标左下方,即南极点(-90 -180 in latitude and longitude),
如图:
图 1 图 2
如图2,World Wind使用―Level Zero Tile Size‖来决定每一个瓦片宽和高的大小(所有的瓦片都是正方形。
标准的level zero tile size 还没有制定,但是它必须满足能被180整除。The level zero tile size (以后称作 lzts)
是层与层间转换的最简单的距离。在 NLTLandsat 7 中,lzts被默认设置为2.25度。可用以下公式计算第N
层的tile size:size=lzts/2^N次方。也就是说下一层将上一层一分为四。:
图3 显示坐标轴在X、Y方向值的增量:
4
2.1.2 NASA World Wind Map Tile System
坐标与图片编号对应公式:
(1)利用下面公式,求某点坐标 X,Y(纬,经),在某层 N 的文件号,图片号
[(X+90)/值*2 的 N 次方=文件夹号A(取整数如 256.65 即为 256)
[(Y+180)/值*2 的 N 次方=图片后缀B(取整数)
(2)利用求得的图片编号 A_B 反求这张图片的左下角坐标
A*值/2 的 N 次方-90=纬度
B*值/2 的 N 次方-180=经度
这样求得图片起始分割点坐标,然后以
值/2 的 N 次的间隔分割图片,把整幅图分成 256*256 or 512*512
BMNG(500m)
LandSat/
Geocover(30m/15m)
36 ×36
。
2.25×2.25
。
OnEarth
(15m)
。
2.0×2.0
USGS
(1m)
0.8×0.8
。
SRTM
(90m/3m0(US))
。
20×20
5
2.2 瓦片请求调度策略
2.2.1 当前显示请求及其显示(客户端)
(1)瓦片金字塔模型构建
金字塔是一种多分辨率层次模型。在地形场景绘制时,在保证显示精度的前提下为提高显示速度,不
同区域通常需要不同分辨率的数字高程模型数据和纹理影像数据。数字高程模型金字塔和影像金字塔则可
以直接提供这些数据而无需进行实时重采样。尽管金字塔模型增加了数据的存储空间,但能够减少完成地
形绘制所需的总机时。分块的瓦片金塔模型还能够进一步减少数据访问
量,提高系统的输入输出执行效率,从而提升系统的整体性能。当地形
显示窗口大小固定时,采用瓦片金字塔模型可以使数据访问量基本保持
不变。瓦片金字塔模型的这一特性对海量地形实时可视化是非常重要的。
在构建地形金字塔时,首先把原始地形数据作为金字塔的底层,即
第0 层,并对其进行分块,形成第0 层瓦片矩阵。在第0 层的基础上,
按每22个像素合成为一个像素的方法生成第1 层,并对其进行分块,
形成第1 层瓦片矩阵。如此下去,构成整个瓦片金字塔。
以影像为例,设第l 层的像素矩阵大小为irl×icl,分辨率为resl,瓦片大小为is×is,则瓦片矩阵的大小
trl × tcl 为:
其中“”为向下取整符,下同。
按每2×2 个像素合成为1 个像素后生成的第l+1 层的像素矩阵大小irl+1×icl+1 为:
trl = irl/is
tcl = icl/is
其分辨率resl+1 为:
irl+1 = irl/2
icl+1 = icl/2
resl+1 = resl ×2
不失一般性,我们规定像素合成从像素矩阵的左下角开始,从左至右从下到上依次进行。同时规定瓦
片分块也从左下角开始,从左至右从下到上依次进行。在上述规定的约束下,影像与其瓦片金字塔模型是
互逆的。同时,影像的瓦片金字塔模型也便于转换成具有更明确拓扑关系的四叉树结构。
(2)线性四叉树瓦片索引(WW中应用QST,即quadrat size tree)
四叉树是一种每个非叶子节点最多只有四个分支的树型结构,也是一种层次数据结构,其特性是能够
实现空间递归分解。图2 是瓦片金字塔模型的四叉树结构示意图,其中矩形符号代表叶子节点,圆形符号
代表非叶子节点。
本文采用四叉树来构建瓦片索引和管理瓦片数据。
在瓦片金字塔基础上构建线性四叉树瓦片索引分三步:
即逻辑分块、节点编码和物理分块。
①逻辑分块
与构建瓦片金字塔对应,规定块划分从地形数据左下角
开始,从左至右,从下到上依次进行。同时规定四叉树的层编码与金字塔的层编码保持一致,即四叉树的
底层对应金字塔的底层。
设(ix,iy)为像素坐标,is 为瓦片大小,io 为相邻瓦片重叠度,以像素为单位;(tx,ty)为瓦片坐标,以块
为单位;l为层号。
若瓦片坐标(tx,ty)已知,则瓦片左下角的像素坐标(ixlb,iylb)为:
ixlb = tx × is
iylb = ty × is
瓦片右上角的像素坐标(ixrt,iyrt)为:
ixrt = (tx + 1) × is + io – 1
6
如果像素坐标(ix,iy)已知,则像素所属瓦片的坐标为:
iyrt = (ty + 1) × is + io – 1
tx = ix/is
ty = iy/is
由像素矩阵行数和列数以及瓦片大小,可以计算出瓦片矩阵的行数和列数,然后按从左至右,从下到上的
顺序依次生成逻辑瓦片,逻辑瓦片由((ixlb,iylb), (ixrt,iyrt), (tx,ty), l)唯一标识。
②节点编码
假定用一维数组来存储瓦片索引,瓦片排序从底层开始,按从左至右,从下到上的顺序依次进行,瓦片在
数组中的偏移量即为节点编码。为了提取瓦片(tx,ty,l),必须计算出其偏移量。我们采用一个一维数组来存
储每层瓦片的起始偏移量,设为osl。若第l 层瓦片矩阵的列数为tcl,则瓦片(tx,ty,l)的偏移量offset 为:
③ 物理分块
offset = ty × tcl + tx + osl
在逻辑分块的基础上对地形数据进行物理分块,生成地形数据子块。对上边界和右边界瓦片中的多余部分
用无效像素值填充。物理分块完毕,按瓦片编号顺序存储。
(3) 瓦片拓扑关系
瓦片拓扑关系包括同一层内邻接关系和上下层之间的双亲与孩子关系两个方面[2]。邻接关系分别为东
(E)、西(W)、南(S)、北(N)四个邻接瓦片,如图3(a)所示;与下层四个孩子的关系分别为西南(SW)、东南(SE)、
西北(NW)、东北(NE)四个孩子瓦片,如图3(b)所示;与上层双亲的关系是一个双亲瓦片,如图3(c)所示。若
已知瓦片坐标为(tx,ty,l),则该瓦片相关的拓扑关系可表示为:
1) 东、西、南、北四个邻接瓦片的坐标分别为:(tx+1,ty,l)、(tx-1,ty,l)、(tx,ty-1,l)、(tx,ty+1,l);
2) 西南、东南、西北、东北四个孩子瓦片的坐标分别为(2tx,2ty,l-1) 、(2tx+1,2ty,l-1) 、(2tx,2ty+1,l-1) 、
(2tx+1,2ty+1,l-1);
3) 双亲瓦片的坐标为(tx/2,ty/2,l+1)。
(a) 邻接瓦片 (b) 孩子瓦片 (c) 双亲瓦片
(4)地形场景数据的动态管理
①可见区域及最佳地形分辨率计算
根据视点的坐标和视线的方向,就可以计算出视
景体与地形平均水平面相交的平面区域范围,即地形
可见区域范围。
图4 为地形可见区域示意图,图中XOY 为地形平均水
平面,E 为视点,视线EM 与地形平均水平面的交点
为M,视点在XOY 上的投影为M0。视景体E_ABCD 与
平面XOY的四个交点分别为A、B、C和D,则地形可
见区域范围即为四边形ABCD。有关点A、B、C
和D的坐标的详细计算方法,可参考文献[3]。
地形可见区域的表示若用于地形显示的屏幕窗口
宽和高分别为Xw 和Yw(以像素为单位),视景体的水平视场角和垂直视场角分别为FovX 和FovY。设当可
7
见区域ABCD恰好充满显示窗口时,窗口水平方向和垂直方向平均每个像素所对应的地面距离分别为Dx
和Dy,则有:
Dx = EM × tan(FovX / 2) × 2.0 / Xw
Dy = EM × tan(FovY / 2) × 2.0 / Yw
即当地形分辨率X 方向低于Dx 或Y 方向低于Dy时,地形显示的精度将会降低;反之,将会产生不必要的
数据冗余,影响绘制效率。也就是说,此时的Dx和Dy即为理论上地形绘制所需的最佳分辨率。由于通常地
形X 方向和Y 方向的采样间距相同,因此我们在实际应用中取Dx 和Dy 中的小值作为最佳地形分辨率,
用作后续瓦片搜索的重要依据。需要指出的是,通常该最佳分辨率被用作窗口中心瓦片所对应的分辨率,
而窗口其它位置所对应的瓦片分辨率则根据瓦片中心到视点的距离作适当的降低调整,因为这不仅符合人
眼的视觉规律,而且还可以减少用于地形绘制的三角形数量。
②World Wind当前视角高度值与图层调度间关系探讨
How does altitude relate to a level in a layer being displayed?
在 WW 中,从 N-1st 转换到 Nth level 的高度值是: ( Level0TileSize * 390km / 2^N )× X(因子)
例如对于 NLT LS7 图层,它的 L0TS=2.25deg。它的 0 level 从 390*2.25 = 877km 开始可见,level 1 在小于
439km 可见等;(但这只是从 WW 的行为分析得到而不是从源代码)
对于较小的高程(小于 2000km),X 因子近似为 1。然而,高于 2000km 因子就减少(可能是 arctan(x)/x,
或者其他)
但是,为什么刚好390km?为什么非线性\非常量的因子?肯能只有WW开发者才知!
A Small Analyse:
(假定屏幕默认尺寸为 wWidth=992px 和 wHeight=653px, 南北方向的视角范围为 FOV=45deg)
打开 OnEarth layer(L0TS=2.0deg)并飞行到高度 Alt=195km, 这时 level2 的瓦片开始显示。
那么图片区域的南北范围尺寸((N-S)dimension- nsDim)是多少?
nsDim = Alt * 2*tan(FOV/2),所以在这里 nsDim = 195km * 2*tan(22.5deg) = 161.5km.
将它转换为度数(1deg=111km),得到 nsDim = 1.454deg。每个 level2 的瓦片覆盖 0.5× 0.5 degree 的区
域,因此“照相机”(可视屏幕范围)相应有 1.454/0.5 = 2.91 个瓦片(南北方向上),或者 2.91*512 = 1489 个
像素。
数值 1489/653=2.28 可以称之为线性重采样因子(LOF- Linear Oversampling factor);平方后,得到区
域重采样因子(AOF-real oversampling factor)。在我们这例子为 5.20。
这意味着什么?5.2 个瓦片图片的像素在屏幕上显示为 1 个像素。
在没有进入下一图层时,这些参数能减少到什么程度?在例子中,下一层的开端为 Alt=97.5km,即
195km 的一半。当我们达这里时,the level2 tiles 减少到只有 L.O.F.=1.14 或者 A.O.F.=1.30。
Now let's generalize it:
When are these LOF and AOF becoming big (giving evidence about vasting)? When the user has
- reduced the WW window's height,
- increased the FOV (aka zoomed out),
- tilted significantly,
- gone near the Pole,
-.what else have I forgot?
在这些情况下,AOF 可能变得非常巨大,例如值为几十,是否意味着 100-or-so megabyte of tiles are needed
for rendering of about-1 Mpix picture.
还有很多问题例如 (e.g. the When do you know when to 'stop'? (ie. how do you know you are at 1:1) question)
8