原文发布时间: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文件中,可以在ArcGIS的ArcScene中显示(当然也可以写入到3D PDF中,但是读入、打开文件都会花费很长时间)。
步骤如下:
1、添加数据:
这时的数据格式要选择Comma Separated Value (CSV),这时,如下图:
点击Parameters按钮,弹出CSV的参数设置窗口:
操作完成后,高程值就会自动作为源数据的一个属性显示出来。
2、生成1*1的网格。
下面我们来看如何生成这个格网。我们知道,这个网格的范围是从左下角(-180°, -90°)到右上角(180°, 90°),如下图所示:
横轴是从-180到180,纵轴是从-90到90,而这些单元格的高程值就是文本中相应的值。为了计算每个顶点的坐标,我们添加一个计算转换器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分别提取出高程类型(D、E或L)和高程值,转换器设置如下:
提取最后一个字符
提取第一个到倒数第二个字符。
然后使用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转换器来分离E、D和L类型,设置如下:
再在E输出端口中进一步分离南极洲:
最后输出的要素如下(ArcScene中显示):