阅读:2328回复:5
[求助]如何将同一点图层中不同的点显示不同的符号样式
<P>在VC中如何将点图层中不同的点根据其名称不同显示不同的符号?</P>
<P>好像mapobjects中无法实现?</P> <P>请高手帮忙!谢谢!</P> |
|
1楼#
发布于:2005-01-12 21:47
<P>根据不同的属性赋予不同的符号,就是一个独立值专题图?</P><P>可以实现啊,vb的例子在mo的帮助里就可以找到</P>
|
|
|
2楼#
发布于:2005-01-16 20:14
render!
|
|
3楼#
发布于:2005-01-23 15:34
<P>我试过了,好象点图层不行,区域图层好象可以,高手能不能附上一段源代码</P><P>谢谢!</P>
|
|
4楼#
发布于:2005-01-25 18:02
<P 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B normal">我想,下面的文档应该对你有帮助,虽然一些上下文你可能不了解,但是部分内容应该很好理解的。祝好运,有问题联系!</B></P><P 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B normal">点图层处理文档</B><B normal"><p></p></B></P><P 0cm 0cm 0pt; TEXT-INDENT: 18pt">按照下面标准来处理点图层,可以细化点图层中每一个点的显示方式,如:符号、颜色、大小、角度、与其他点比较而言是否按比例放大缩小。同时既然能对每一个点进行处理,那么将点分类就可以制作专题图。为了说明举例如下(例子只是说明应用,请举一反三,在处理很多实例时采取本方法会更快捷、高效):</P><P 0cm 0cm 0pt; TEXT-INDENT: 18pt">中国所有城市,我们把他们分为<FONT face="Times New Roman">4</FONT>类:首都、省会、重要城市、其他城市。有若干处理方法,以往的方法可以将<FONT face="Times New Roman">4</FONT>类城市分别放到<FONT face="Times New Roman">4</FONT>个图层。现在我们可以把他们都放到一个图层,只要设置他们的属性信息,就可以达到和放到<FONT face="Times New Roman">4</FONT>个图层显示时同样的显示效果,这样在有的情况下,处理会方便的多。</P><P 0cm 0cm 0pt; TEXT-INDENT: 18pt"><p><FONT face="Times New Roman"> </FONT></p></P><P 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT face="Times New Roman">1、 </FONT>首先要确保图层属性表中有如下三个字段:</P><P 0cm 0cm 0pt; TEXT-INDENT: 18pt"><FONT face="Times New Roman">Renderer</FONT>(<FONT face="Times New Roman">Text</FONT>):格式要严格如下所示!该字段分三列,第一列为<FONT face="Times New Roman">TrueType</FONT>字体<FONT face="Times New Roman">SarstFont</FONT>(<FONT face="Times New Roman">TrueType</FONT>字体,名称可变,需要在操作系统下注册字体)中点图元显示图形对应的字模索引;第二列为点图元显示的颜色对应的<FONT face="Times New Roman">Long</FONT>型大小;第三列为点图元的大小,中间用逗号格开,同时注意逗号要在英文输入法下输入。例如:<FONT face="Times New Roman">13,255,18 </FONT>该字符含义为:显示点图元形状为<FONT face="Times New Roman">SarstFont</FONT>字体中索引为<FONT face="Times New Roman"> 13 </FONT>的字模;颜色为红色;大小为<FONT face="Times New Roman"> 18</FONT>。</P><P 0cm 0cm 0pt; TEXT-INDENT: 18pt"><FONT face="Times New Roman">Rotation</FONT>(<FONT face="Times New Roman">short</FONT>):用来标识显示的点图元的旋转角度,若不需要旋转需赋<FONT face="Times New Roman">0</FONT>,若要旋转<FONT face="Times New Roman">45</FONT>度那么赋值<FONT face="Times New Roman">45</FONT>即可,以此类推。旋转方向是顺时针。</P><P 0cm 0cm 0pt; TEXT-INDENT: 18pt"><FONT face="Times New Roman">Scale</FONT>(<FONT face="Times New Roman">short</FONT>):用来标识显示的点图元的相对大小比例,值为<FONT face="Times New Roman">1</FONT>时表示原始大小,若为<FONT face="Times New Roman">2</FONT>则表示<FONT face="Times New Roman">2</FONT>倍大小(相对于原始大小而言),以此类推。</P><P 0cm 0cm 0pt"><p><FONT face="Times New Roman"> </FONT></p></P><P 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT face="Times New Roman">2、 </FONT>显示时,在适当的初始化处调用函数:<FONT face="Times New Roman">void RenderPointsLayer</FONT>(<FONT face="Times New Roman">int LayerIndex</FONT>)</P><P 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT face="Times New Roman">3、 </FONT>应用实例:</P><P 0cm 0cm 0pt 18pt"><FONT face="Times New Roman">//</FONT>前提是确认知道将要渲染的图层为点图层,并且其属性表中严格遵守上面标准。</P><P 0cm 0cm 0pt 18pt"><FONT face="Times New Roman">int i = //</FONT>要渲染的点图层在索引<FONT face="Times New Roman">//</FONT></P><P 0cm 0cm 0pt 18pt"><FONT face="Times New Roman">RenderPointsLayer(i);</FONT></P><P 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT face="Times New Roman">4、 void RenderPointsLayer</FONT>(<FONT face="Times New Roman">int LayerIndex</FONT>)的函数实现:</P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>void CMOExersiceView::RenderPointsLayer(int LayerIndex)<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>{<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoLayers layers = m_map.GetLayers();<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoMapLayer PointsLayer(layers.Item(CComVariant(LayerIndex)));<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> /////////////////////////////////////////////////////////////////////////////<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> //首先从视觉上将图层上原有点除去!下面代码目的是从视觉上隐去图层原有的点地物标志!原因是采用GroupRenderer和LabelPlacer并不像直接采用ValueMapRenderer那样直接显示经过渲染的标志。它们的处理只是将渲染图层以背景的方式再添了一个图层。<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoSymbol sym;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> if(!sym.CreateDispatch(TEXT("MapObjects2.Symbol")))<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> return;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> sym = PointsLayer.GetSymbol();<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> sym.SetSize(0);<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> //隐去图层原有点地物标志结束 <p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> /////////////////////////////////////////////////////////////////////////////<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><p> </p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoLabelPlacer LabelPlacer;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> if (!LabelPlacer.CreateDispatch(TEXT("MapObjects2.LabelPlacer")))<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> return;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoGroupRenderer GroupRenderer;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> if (!GroupRenderer.CreateDispatch(TEXT("MapObjects2.GroupRenderer")))<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> return;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoValueMapRenderer vmRender;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> if (!vmRender.CreateDispatch(TEXT("MapObjects2.ValueMapRenderer")))<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> return;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoRecordset recs=PointsLayer.GetRecords();<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> if(recs.GetEof())<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> return;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><p> </p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoFields Fields=recs.GetFields(); <p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoStrings strings;<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> VERIFY(strings.CreateDispatch(TEXT("MapObjects2.Strings")));<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> while (!recs.GetEof())<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> {<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CMoField PointVMR(Fields.Item(CComVariant("Renderer")));<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> strings.Add(PointVMR.GetValueAsString());<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> recs.MoveNext();<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> }<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><p> </p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.SetField(TEXT("Renderer"));////ValueMapRenderer的主要字段<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.SetRotationField("Rotation");//用来标识旋转角度<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.SetScalingField("Scale");//用来标识点显示的放缩比<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.SetSymbolType(0);//表示是点图层的渲染<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.SetValueCount(strings.GetCount());//表示渲染的Symbol个数<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><p> </p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> for (short i = 0; i < strings.GetCount(); i++)<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> {<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CString TempStr(strings.Item(CComVariant(i)));<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> int j = TempStr.Find(',');<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CString Character(TempStr.Left(j));<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> TempStr = TempStr.Right(TempStr.GetLength() - j - 1);<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> j = TempStr.Find(',');<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> CString Color(TempStr.Left(j));<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> TempStr = TempStr.Right(TempStr.GetLength() - j - 1);<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> int CharacterIndex = atoi(Character);//解析后字体对应的索引<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> int ColorIndex = atoi(Color);//解析后颜色对应的索引<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> int SizeIndex = atoi(TempStr);//解析后大小对应的索引<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> <p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.SetValue(i,strings.Item(CComVariant(i)));//给索引为i的Symbol赋值<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.GetSymbol(i).SetColor(ColorIndex);//设置颜色<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.GetSymbol(i).SetSize(SizeIndex);//设置大小<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.GetSymbol(i).SetStyle(4);//表示采用TrueType字体中图元显示标志<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> COleFont font = vmRender.GetSymbol(i).GetFont();//取出引用字体并设置具体字体<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> font.SetName("SarstFont");<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> vmRender.GetSymbol(i).SetCharacterIndex(CharacterIndex);//设置字体字模的索引<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> }<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><p> </p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> GroupRenderer.Add(vmRender);<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> LabelPlacer.SetBackgroundRenderer(GroupRenderer);<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left> PointsLayer.SetRenderer(LabelPlacer); <p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>}<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><p> </p></P>
|
|
|
5楼#
发布于:2005-01-25 18:03
说明,添加的三个字段的目的是为了提供相应信息。只要提供了所需信息即可。
|
|
|