AO+C++实现唯一值渲染

本文介绍了一个用于ArcGIS的独特值渲染插件开发过程。该插件使用随机颜色生成器为每个属性值创建独特的填充符号,实现了地图要素的可视化区分。文中详细介绍了使用VS2010进行开发时涉及的接口及其实现步骤。

    这两天在做出图的一个插件,学习的东西还是挺多的,首先是dll的编译,调试,一开始是vc,后来有是vs2010,这些基础问题就搞了好久。真正实现的东西其实也是比较简单的,都不好意思写出来。这边一个唯一值渲染的问题,其实本来是想实现四色渲染的,但是比较复杂,先简单的搞一下。

    思路还是比较简单,类似于把一系列对应字段名称的颜色一起放入渲染器中。首先要有一个声称随即颜色的IEnumColors,基于IRandomColorRamp接口实现;然后是常用的面图层渲染器ISimpleFillSymbol,通过遍历每一个feature,将(fieldname,simplefillsymbol)放入IUniqueValueRenderer渲染器中,然后图层调用就行。

    代码如下:

   

                                        ipFeaClass = ipTmpFeaCls;
					ipGeoFeaLayer = ipTmpGeoFeaLayer;

					IQueryFilterPtr ipQueryFilter(__uuidof(QueryFilter));
					IFeatureCursorPtr ipcursor;
					ipFeaClass->Search(ipQueryFilter, false, &ipcursor);
					ISimpleFillSymbolPtr ipsymbol(CLSID_SimpleFillSymbol);

					//随机颜色
					IRandomColorRampPtr iprx(CLSID_RandomColorRamp);
					iprx->put_MinSaturation(20);
					iprx->put_MaxSaturation(40);
					iprx->put_MinValue(76);
					iprx->put_MaxValue(188);
					iprx->put_StartHue(0);
					iprx->put_EndHue(360);
					iprx->put_Size(100);

					VARIANT_BOOL btrue = true;
					iprx->CreateRamp(&btrue);
					IEnumColorsPtr ipnumcolors;
					iprx->get_Colors(&ipnumcolors);
					if(ipnumcolors == NULL)
						return;
					ipnumcolors->Reset();

					IUniqueValueRendererPtr ipuniqueRnd;
					IFeatureRendererPtr ipRnd;
					if((ipuniqueRnd = ipRnd) == NULL)
					{
						hr = ipuniqueRnd.CreateInstance(CLSID_UniqueValueRenderer);
						if(FAILED(hr))
							return;
						ipRnd = ipuniqueRnd;
					}
					CString fname = _T("FNAME");
					BSTR fieldname = fname.AllocSysString();

					ipuniqueRnd->put_FieldCount(1);
					ipuniqueRnd->put_Field(0, fieldname);


					//遍历
					IFeaturePtr ipfeat;
					ipcursor->NextFeature(&ipfeat);
					IFieldsPtr ifields;
					long index;
					ipfeat->get_Fields(&ifields);
					ifields->FindField(fieldname, &index);

					ISimpleLineSymbolPtr ipline(CLSID_SimpleLineSymbol);
					ipline->put_Width(0.01);

					
					while(ipfeat != NULL)
					{
						ISimpleFillSymbolPtr ipsymbol(CLSID_SimpleFillSymbol);
						
						IColorPtr ipcolor2;
						ipnumcolors->Next(&ipcolor2);
						ipsymbol->put_Color(ipcolor2);
						ipsymbol->put_Outline(ipline);

						VARIANT valuevar;
						ipfeat->get_Value(index, &valuevar);
						CString valuestr(valuevar);
						BSTR valuebstr = valuestr.AllocSysString();
						ipuniqueRnd->AddValue(valuebstr, valuebstr, (ISymbolPtr)ipsymbol);

						ipcursor->NextFeature(&ipfeat);
					}
					ipRnd = (IFeatureRendererPtr)ipuniqueRnd;
					ipGeoFeaLayer->putref_Renderer(ipRnd);


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值