这两天在做出图的一个插件,学习的东西还是挺多的,首先是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);
本文介绍了一个用于ArcGIS的独特值渲染插件开发过程。该插件使用随机颜色生成器为每个属性值创建独特的填充符号,实现了地图要素的可视化区分。文中详细介绍了使用VS2010进行开发时涉及的接口及其实现步骤。
7487

被折叠的 条评论
为什么被折叠?



