如何使用ArcGIS9.2中的动态显示(Dynamic Display)技术(三)

来源:互联网 发布:淘宝发货地址不是买家 编辑:程序博客网 时间:2024/05/21 09:32

1.       如何使用动态显示技术

3.1概述

这个介绍主要说明如何有效地使用ArcGIS Framework中的动态显示技术。介绍当前的一些使用方法和需求,演示一些GIS中需要采用动态显示技术的例子,以及一些接口的使用介绍。

3.2 Dynamic map在动态显示技术中的使用

推荐使用基于DynamicMap类的IDynamicMap接口,来使Dynamic map可用或不可用。

 

下面是IDynamicMap使用代码:

[C#]

//Cast the dynamic map from the focus map.

IDynamicMap dynamicMap = m_hookHelper.FocusMap as IDynamicMap;

//Make sure to switch into dynamic mode.

if (!dynamicMap.DynamicMapEnabled)

  dynamicMap.DynamicMapEnabled = true;


[VB.NET]

' Cast the dynamic map from the focus map.

Dim dynamicMap As IDynamicMap = CType(m_hookHelper.FocusMap, IDynamicMap)

' Make sure to switch into dynamic mode.

If (Not dynamicMap.DynamicMapEnabled) Then

    dynamicMap.DynamicMapEnabled = True

End If

(上述或以下有可能涉及的代码都是.net例子,但是最近我自己完成了vc6.0Demons)

当设置Dynamic mapEnable,那么动态显示将使用OPenGLrender context来绘制基本的地图图层和动态图层。

 

3.3 Dynamic mode下的绘图

以下是两种Dynamic mode绘图方式:

(1)    实现IDynaimcLayer接口中的DrawDynamicLayer方法

(2)    监听动态显示的两个事件:

IDynamicMapEvents.BeforeDynamicDraw;

IDynamicMapEvents.AfterDynamicDraw;

 

3.3.1 绘图方式的两种选择(事实是本质的draw都是OpenGL方法)

(1)使用AOAPI

(2)直接调用OpenGLAPI

    默认情况下OpenGL的纹理(texture)可用。需要注意的是,在最初需要开始利用OpenGL的方法时,要求关闭OpenGL 2D texture flag

3.4绘图方式采用使用AOAPI

[C#]

//Set the marker symbol.

m_dynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker,

  m_markerGlyphs[2]);

 

//Draw a marker symbol.

DynamicDisplay.DrawMarker(m_point);


[VB.NET]

'Set the marker symbol.

m_dynamicSymbolProps.DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker) = m_markerGlyphs(2)

 

'Draw a marker symbol.

DynamicDisplay.DrawMarker(m_point)

In the following code example, drawing is done using a compound marker symbol using the dynamic display API:

 


[C#]

//Draw the item as a compound marker. This means that you do not have to draw the items and its

//accompanying labels separately, thus allowing you to write less code and better set

//the marker symbol.

m_dynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker,

  m_markerGlyphs[2]);

 

//Drawing a compound marker symbol using six strings.

m_dynamicCompoundMarker.DrawCompoundMarker6(m_point, "TOP", "BOTTOM", "Item " +

  Convert.ToString(r[0]), heading.ToString("###.##"), m_point.X.ToString(

  "###.#####"), m_point.Y.ToString("###.#####"));


[VB.NET]

'Draw the item as a compound marker. This means that you do not have to draw the items and its

'accompanying labels separately, thus allowing you to write less code and better set

'the marker symbol.

m_dynamicSymbolProps.DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker) = m_markerGlyphs(2)

 

'Drawing a compound marker symbol using six strings.

m_dynamicCompoundMarker.DrawCompoundMarker6

(m_point,

"TOP",

"BOTTOM",

"Item " & Convert.ToString(r(0)),

heading.ToString("###.##"),

m_point.X.ToString("###.#####"), m_point.Y.ToString("###.#####"))

 

3.5绘图方式使用OpenGLAPI

[C#]

GL.glDisable(GL.GL_TEXTURE_2D);

GL.glPushMatrix();

GL.glLoadIdentity();

 

// Draw a simple point.

GL.glBegin(GL.GL_POINTS);

GL.glColor3f(1.0f, 1.0f, 0.0f); //Yellow

GL.glVertex2f((float)x, (float)y);

GL.glEnd();

 

GL.glPopMatrix();

GL.glEnable(GL.GL_TEXTURE_2D);


[VB.NET]

GL.glDisable(GL.GL_TEXTURE_2D)

GL.glPushMatrix()

GL.glLoadIdentity()

 

' Draw a simple point.

GL.glBegin(GL.GL_POINTS)

GL.glColor3f(1.0F, 1.0F, 0.0F)

GL.glVertex2f(CType(x, Single), CType(y, Single))

GL.glEnd()

 

GL.glPopMatrix()

GL.glEnable(GL.GL_TEXTURE_2D)

 

3.5动态图层

动态图层也是普通的图层。它实现了普通图层的接口,当然为此你必须最小程度上实现ILayer接口。事实上,实现了ILayer接口能够使自己加载到map上,也能使自己被放在内容列表中。需要实现一个动态图层,也需要实现IDynamicLayer接口,那就有如下的方法需要被实现:

DrawDynamicLayer

在绘制阶段决定画什么内容

DynamicLayerDirty

表明上次画完后的动态显示是否改变

DynamicRecompileRate

重新编译率是以百分之一秒为间隔的,这使得编译阶段的动态显示中的绘制方法(DrawDynamicLayer)可以被调用。

 

由于动态显示是处于激活状态的,这就意味着它就有固定的循环过程。在每次的阶段绘制过程中,都会检查DynaimcLayer中的脏标志,来重绘所有的动态图层中的内容。

 (...待续-jx1228)

原创粉丝点击