3D地球的生成(二)——带高程的3D地球的生成

原文发布时间:2010-07-03

作者:毛毛虫

1*1度单元格的平均高程的文本来生成带高程的全球3D图的过程。

这个文本的内容是... 2240E 2220E 2200E 1800E 1400E 1000E 600E 200E 0D -120D -280D -440D -600D -600D -600D ...


其中E表示高程,D-深度、L-湖(不显示),数字表示每个单元格中高程或深度的值。这个值依次从左下角(-180°, -90°)到右上角(180°, 90°)

根据这些高程数据,我们想要生成的效果如下:

把输出的3D图输入到输出Personal Geodatabase文件中,可以在ArcGISArcScene中显示(当然也可以写入到3D PDF中,但是读入、打开文件都会花费很长时间)。

步骤如下:

1、添加数据:

这时的数据格式要选择Comma Separated Value (CSV),这时,如下图:



点击Parameters按钮,弹出CSV的参数设置窗口:



操作完成后,高程值就会自动作为源数据的一个属性显示出来。

2、生成1*1的网格。

下面我们来看如何生成这个格网。我们知道,这个网格的范围是从左下角(-180°, -90°)到右上角(180°, 90°),如下图所示:



横轴是从-180180,纵轴是从-9090,而这些单元格的高程值就是文本中相应的值。为了计算每个顶点的坐标,我们添加一个计算转换器Counter(假设获取的输出属性为_count),从0开始计数,结合图分析:在每个单元格的左下角x的值,即xmin与(_count-180%360= _count%360-180对比,如果大于等于0,则保留原值,否则得到的值再减去360;在每个单元格的左下角y的值,即从上图中不难看出ymin=_count/360-90

通过上面的分析:

每个网格的

xmin= _count%360-180<=0?_count%360:_count%360-360;

ymin=_count/360-90;

xmax=xmin+1;

ymax=ymin+1

接着提取出每个单元格的高程值:

使用两次转换器SubstringExtractor分别提取出高程类型(DEL)和高程值,转换器设置如下:

提取最后一个字符


提取第一个到倒数第二个字符。

然后使用2DboxReplacer就可以创建如上面图中显示的格网。

< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 

3、计算椭球的点坐标

给每个要素添加一个_radius属性,并赋值为6378,然后使用一个Tester判断,对于高程类型值为D的减去一个正值(比如1000,这是为了达到和面是深度的显示效果)。这里要加一个Counter转换器来记录每个多边形,后面生成面时会用到。使用Chopper转换器把格网转换为点,







再次使用Counter来记录这些点,使用CoordinateExtractor转换器获取了点的经纬度坐标后,



使用CoordinateFetcher转换器把经纬度转换为弧度后,计算每个点的(x,y,z)。

每个点的坐标表达式:

x=_radius*cos(long+3.14159)*sin(3.14159/2.0-lat)

y=_radius*sin(long+3.14159)*sin(3.14159/2.0-lat)

z=_radius*cos(3.14159/2.0-lat)

然后使用3DpointReplacer转换器把点转换为三维点后,使用Sorter排序转换器排序,该转换器的设置如下:



然后PointConnector转换器连接点成面或线,对先再使用LineCloser转换器把可能产生的线闭合为面,这时候就完成了格网转换为了面。

此时生成的图形如图:


5、计算各个点需要拉伸的矢量:

_vector_x=_elevation*cos(long+3.14159)*sin(lat+3.14159/2.0)/10.0

_vector_y=_elevation*sin(long+3.14159)*sin(lat+3.14159/2.0)/10.0

_vector_z=_elevation*cos(lat-3.14159/2.0)/10.0

对于高程类型为deep的数据,我们需要先修改_elevation的值为_elevation+10000(如果前面对deep类型减去的是1000的话),这样得到的结果才能跟原数据的数据间的高程查相同。

使用转换器ExtrusionCreator挤压成为3D图形,设置如下:

图片已丢失

6、分离各要素类型:

使用AttributeFilter转换器来分离EDL类型,设置如下:

    


再在E输出端口中进一步分离南极洲:


最后输出的要素如下(ArcScene中显示)















猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80789393