humu1985
路人甲
路人甲
  • 注册日期2009-05-27
  • 发帖数1
  • QQ
  • 铜币107枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1734回复:2

[求助]arcgis二次开发 动态图层释放问题

楼主#
更多 发布于:2012-04-04 22:47
 各位论坛前辈你们好~~~  小弟在用arcgis进行在vc2005环境下进行二次开发的时候,创建动态图层出现问题,特地来请教各位大牛:

小弟在创建动态图层后,再释放该图层,再创建··释放 重复几次 软件内存使用不停的增长,请问各位大神有没有遇到类似的问题以及如何解决的 ?
另外动态图层释放函数好像没有返回值,通知是否释放完毕或者成功,小弟新手,希望各位论坛大神不吝赐教
谢谢
喜欢0 评分0
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15947
  • QQ554730525
  • 铜币25339枚
  • 威望15364点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
1楼#
发布于:2012-04-05 12:54
1.       动态显示的原理<br/>2.1 概述<br/>这个专题主要涉及动态显示的原理及涉及的接口<br/>2.2 背景<br/>动态显示技术是对地图渲染引擎核心功能的加强。这是一种新的功能,包括对多个对象亚秒级的刷新支持,而且显示过程能够平滑支持移动,缩放,旋转等操作。这也使得ArcGIS平台可及范围能够进入动态显示领域,通常该领域中的平台在计算能力上有限的(受到处理器效率和内存的限制)。如下图<br/><br/> <img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/jx1228/test.bmp"/><br/>2.3 概念<br/>这个部分主要讨论一些动态显示技术的概念。<br/>ArcGIS显示子系统管理着地图的显示和刷新。异步显示刷新和密集的地图渲染操作能导致CPU的大量运算操作。CPU的负载能够延迟,甚至阻止地图显示刷新和用户对地图显示的交互。如下图<br/><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/jx1228/test2.JPG"/><br/><br/>动态显示技术把密集的图形渲染工作负担从CPU运算转移到图形设备硬件上来,最重要的是它提升了性能。动态显示技术提供了一种同步刷新机制,能够让许多的移动对象的到快速的刷新。如下图<br/><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/jx1228/test3.JPG"/> <br/>2.4 结构<br/>以下是AO中动态显示用到的主要接口<br/>IDynamicMap—该接口主要用于控制动态显示。接口被用于控制动态显示的可用或不可用。控制动态地图的全局属性。在maps和dynamic maps之间有一对一的关系。<br/>IDynamicLayer—它常和ILayer,IGeoDataset接口联系在一起。IDynamicLayer提供这样的机制,如果实现了通常的Layers,那么在动态显示可用状态下调用对象的动态绘制内容。<br/>IDynamicScreenDisplay—用于控制动态显示的可用或不可用<br/>IDynaimcGlyph—动态字符处理需要被动态显示所渲染的资源。<br/>IDynaimcGlyphFactory—它用来管理动态字符(Dynamic Glyph),可以通过使用IDynamicGlyphFactory接口来得到,新建和删除动态字符。这意味着你能够使用标准的AO符号,如字体符号,文本符号,图形符号等或者也可以使用其它的资源,例如icons和位图。此外,动态字符也能够由动态字符组来新建,动态字符组的概念就是若干按顺序排列的字符拼接出来的image。使用来自动态字符组的字符能够得到更好的绘制效果,原应是一个动态字符组绘制一个纹理对象。动态显示中包括了一个内置的默认的动态字符组,因此它来load或者unload字符。<br/>        IDynamicSymbolProperties—可以设置选中的符号的各种属性,例如颜色,比例,转向和字符。通过使用符号属性使符号在绘制到地图之前得到控制。<br/>        IDynamicDisplay—通过他来提供一种机制,在地图上绘制不同的地理几何对象。此外提供动态字符工厂的接口。在地图上绘制地理几何对象,也需要同时使用动态字符和动态符号属性。使用动态符号属性来设置符号,然后使用动态显示来画形状。<br/>        IDynamicDrawScreen—使用它可以采用屏幕坐标系在map上绘制地理几何对象。<br/>        IDynamicCompoundMarker—它可以在绘制的符号周围带有labels和属性。<br/> <br/>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15947
  • QQ554730525
  • 铜币25339枚
  • 威望15364点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
2楼#
发布于:2012-04-05 12:58
<p><strong>1.       </strong><strong>如何使用动态显示技术</strong></p>
<p>3.1概述</p>
<p>这个介绍主要说明如何有效地使用ArcGIS Framework中的动态显示技术。介绍当前的一些使用方法和需求,演示一些GIS中需要采用动态显示技术的例子,以及一些接口的使用介绍。</p>
<p>3.2 Dynamic map在动态显示技术中的使用</p>
<p>推荐使用基于DynamicMap类的IDynamicMap接口,来使Dynamic map可用或不可用。</p>
<p><br/> </p>
<p></p>
<p>下面是IDynamicMap使用代码:</p>
<p>[C#] </p>
<p>//Cast the dynamic map from the focus map.</p>
<p>IDynamicMap dynamicMap = m_hookHelper.FocusMap as IDynamicMap;</p>
<p>//Make sure to switch into dynamic mode.</p>
<p>if (!dynamicMap.DynamicMapEnabled)</p>
<p>  dynamicMap.DynamicMapEnabled = true;</p>
<p><br/>[VB.NET] </p>
<p>' Cast the dynamic map from the focus map.</p>
<p>Dim dynamicMap As IDynamicMap = CType(m_hookHelper.FocusMap, IDynamicMap)</p>
<p>' Make sure to switch into dynamic mode.</p>
<p>If (Not dynamicMap.DynamicMapEnabled) Then</p>
<p>    dynamicMap.DynamicMapEnabled = True</p>
<p>End If</p>
<p>(上述或以下有可能涉及的代码都是.net例子,但是最近我自己完成了vc6.0的Demons)</p>
<p>当设置Dynamic map为Enable,那么动态显示将使用OPenGL的render context来绘制基本的地图图层和动态图层。</p>
<p><br/> </p>
<p>3.3 Dynamic mode下的绘图</p>
<p>以下是两种Dynamic mode绘图方式:</p>
<p>(1)    实现IDynaimcLayer接口中的DrawDynamicLayer方法</p>
<p>(2)    监听动态显示的两个事件:</p>
<p>IDynamicMapEvents.BeforeDynamicDraw;</p>
<p>IDynamicMapEvents.AfterDynamicDraw;</p>
<p><br/> </p>
<p>3.3.1 绘图方式的两种选择(事实是本质的draw都是OpenGL方法)</p>
<p>(1)使用AO的API</p>
<p>(2)直接调用OpenGL的API</p>
<p>    默认情况下OpenGL的纹理(texture)可用。需要注意的是,在最初需要开始利用OpenGL的方法时,要求关闭OpenGL 2D texture flag。</p>
<p>3.4绘图方式采用使用AO的API</p>
<p>[C#] </p>
<p>//Set the marker symbol.</p>
<p>m_dynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker,</p>
<p>  m_markerGlyphs[2]);</p>
<p><br/> </p>
<p>//Draw a marker symbol.</p>
<p>DynamicDisplay.DrawMarker(m_point);</p>
<p><br/>[VB.NET] </p>
<p>'Set the marker symbol.</p>
<p>m_dynamicSymbolProps.DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker) = m_markerGlyphs(2)</p>
<p><br/> </p>
<p>'Draw a marker symbol.</p>
<p>DynamicDisplay.DrawMarker(m_point)</p>
<p>In the following code example, drawing is done using a compound marker symbol using the dynamic display API:</p>
<p><br/> </p>
<p><br/>[C#] </p>
<p>//Draw the item as a compound marker. This means that you do not have to draw the items and its</p>
<p>//accompanying labels separately, thus allowing you to write less code and better set</p>
<p>//the marker symbol.</p>
<p>m_dynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker,</p>
<p>  m_markerGlyphs[2]);</p>
<p><br/> </p>
<p>//Drawing a compound marker symbol using six strings.</p>
<p>m_dynamicCompoundMarker.DrawCompoundMarker6(m_point, "TOP", "BOTTOM", "Item " +</p>
<p>  Convert.ToString(r[0]), heading.ToString("###.##"), m_point.X.ToString(</p>
<p>  "###.#####"), m_point.Y.ToString("###.#####"));</p>
<p><br/>[VB.NET] </p>
<p>'Draw the item as a compound marker. This means that you do not have to draw the items and its</p>
<p>'accompanying labels separately, thus allowing you to write less code and better set</p>
<p>'the marker symbol.</p>
<p>m_dynamicSymbolProps.DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker) = m_markerGlyphs(2)</p>
<p><br/> </p>
<p>'Drawing a compound marker symbol using six strings.</p>
<p>m_dynamicCompoundMarker.DrawCompoundMarker6</p>
<p>(m_point,</p>
<p>"TOP",</p>
<p>"BOTTOM",</p>
<p>"Item " ; Convert.ToString(r(0)),</p>
<p>heading.ToString("###.##"),</p>
<p>m_point.X.ToString("###.#####"), m_point.Y.ToString("###.#####"))</p>
<p><br/> </p>
<p>3.5绘图方式使用OpenGL的API</p>
<p>[C#] </p>
<p>GL.glDisable(GL.GL_TEXTURE_2D);</p>
<p>GL.glPushMatrix();</p>
<p>GL.glLoadIdentity();</p>
<p><br/> </p>
<p>// Draw a simple point.</p>
<p>GL.glBegin(GL.GL_POINTS);</p>
<p>GL.glColor3f(1.0f, 1.0f, 0.0f); //Yellow</p>
<p>GL.glVertex2f((float)x, (float)y);</p>
<p>GL.glEnd();</p>
<p align="left"> </p>
<p>GL.glPopMatrix();</p>
<p>GL.glEnable(GL.GL_TEXTURE_2D);</p>
<p><br/>[VB.NET] </p>
<p>GL.glDisable(GL.GL_TEXTURE_2D)</p>
<p>GL.glPushMatrix()</p>
<p>GL.glLoadIdentity()</p>
<p><br/> </p>
<p>' Draw a simple point.</p>
<p>GL.glBegin(GL.GL_POINTS)</p>
<p>GL.glColor3f(1.0F, 1.0F, 0.0F)</p>
<p>GL.glVertex2f(CType(x, Single), CType(y, Single))</p>
<p>GL.glEnd()</p>
<p><br/> </p>
<p>GL.glPopMatrix()</p>
<p>GL.glEnable(GL.GL_TEXTURE_2D)</p>
<p><br/> </p>
<p>3.5动态图层</p>
<p>动态图层也是普通的图层。它实现了普通图层的接口,当然为此你必须最小程度上实现ILayer接口。事实上,实现了ILayer接口能够使自己加载到map上,也能使自己被放在内容列表中。需要实现一个动态图层,也需要实现IDynamicLayer接口,那就有如下的方法需要被实现:</p>
<p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="55">
<p></p></td>
<td valign="top" width="168">
<p>DrawDynamicLayer</p></td>
<td valign="top" width="345">
<p>在绘制阶段决定画什么内容</p></td></tr>
<tr>
<td valign="top" width="55">
<p></p></td>
<td valign="top" width="168">
<p>DynamicLayerDirty</p></td>
<td valign="top" width="345">
<p>表明上次画完后的动态显示是否改变</p></td></tr>
<tr>
<td valign="top" width="55">
<p></p></td>
<td valign="top" width="168">
<p>DynamicRecompileRate</p></td>
<td valign="top" width="345">
<p>重新编译率是以百分之一秒为间隔的,这使得编译阶段的动态显示中的绘制方法(DrawDynamicLayer)可以被调用。</p></td></tr></tbody></table><br/></p>
<p>由于动态显示是处于激活状态的,这就意味着它就有固定的循环过程。在每次的阶段绘制过程中,都会检查DynaimcLayer中的脏标志,来重绘所有的动态图层中的内容。</p>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部