ArcMap中有一个功能是Label Features,就是可以将图层内指定字段值显示以Label形式显示在主窗口上,在Label Features后,用右键点击图层,发现可以出现一个原来灰色的功能名,ConvertLabelsToAnnotation。这个功能在AE中提供,可是自己找不到设定字段值的位置,无可奈何,只有另辟蹊径。
就是先创建一个注记层,然后按照图层里指定字段的值来生成注记。就是一个一个Feature点转换。可能会比AE提供的接口效率低,没有办法,自己不会用那个接口,也就只能这样勉强的用着了。这个方面最难点就是创建一个新的注记图层,有很多属性需要设置,比较麻烦,下面是代码
private void ConvertToAnnotationLayer(IMap pMap, ILayer pLayer, string fieldname, esriGeometryType type)
{
IFeatureLayer pFeatLayer = pLayer as IFeatureLayer;
int i = pFeatLayer.FeatureClass.FindField("SHAPE");
IField pShapeField = pFeatLayer.FeatureClass.Fields.get_Field(i);
IDataset pDataSet = pFeatLayer.FeatureClass as IDataset;
IWorkspace pWS = pDataSet.Workspace;
IFeatureWorkspace pFeatWS = pWS as IFeatureWorkspace;
IGeoFeatureLayer pGeoFeatLayer = pFeatLayer as IGeoFeatureLayer;
IFields pFields = pGeoFeatLayer.FeatureClass.Fields;
IAnnotationLayerFactory pAnnoLayerFact = new FDOGraphicsLayerFactoryClass();
IGraphicsLayerScale pGraphyScale = new GraphicsLayerScaleClass();
pGraphyScale.ReferenceScale = 200000;
pGraphyScale.Units = esriUnits.esriMeters;
IAnnotationLayer pAnnoLayer = null;
ISymbolCollection2 pSymColl = new SymbolCollectionClass();
IFormattedTextSymbol pTextSymbol = new TextSymbolClass();
IRgbColor pRGB = new RgbColorClass();
pRGB.Red = 0;
pRGB.Blue = 0;
pRGB.Green = 0;
pTextSymbol.Color = pRGB;
/* pTextSymbol.Font=*/
m_FontDisp.Size=8;
pTextSymbol.Font =m_FontDisp ;
pTextSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHACenter;
pTextSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline;
pTextSymbol.CharacterSpacing = 100;
pTextSymbol.CharacterWidth = 50;
pTextSymbol.WordSpacing = 100;
// IBoundsProperties pBoundProp = pTextSymbol as IBoundsProperties;
/* pBoundProp.FixedSize = false;*/
// pBoundProp.FixedAspectRatio = true;
ISymbol pSymbol = pTextSymbol as ISymbol;
ISymbolIdentifier2 pSymident2;
pSymColl.AddSymbol(pSymbol, fieldname, out pSymident2);
ISymbolCollection pSymColl1= pSymColl as ISymbolCollection;
IOverposterProperties pOverpost = new BasicOverposterPropertiesClass();
IAnnotateLayerPropertiesCollection pAnnoPropColl = new AnnotateLayerPropertiesCollectionClass();
IAnnotateLayerProperties pAnnoProp;
ILabelEngineLayerProperties2 pLabelEngine=new LabelEngineLayerPropertiesClass();
pLabelEngine.AnnotationClassID = 0;
pLabelEngine.Symbol = pTextSymbol;
pLabelEngine.SymbolID = pSymident2.ID;
pAnnoProp = pLabelEngine as IAnnotateLayerProperties;
pAnnoProp.Class = pLayer.Name + fieldname;
pAnnoProp.LabelWhichFeatures = esriLabelWhichFeatures.esriAllFeatures;
pAnnoProp.Priority = 0;
IActiveView pActView=pMap as IActiveView;
pAnnoProp.GraphicsContainer = pActView.GraphicsContainer;
pAnnoProp.FeatureLayer = pFeatLayer;
pAnnoProp.FeatureLinked = true;
pAnnoProp.AnnotationMaximumScale = 10000000000000000000;
pAnnoProp.AnnotationMinimumScale = 0.00000000001;
pAnnoPropColl.Add(pAnnoProp);
try
{
pAnnoLayer=pAnnoLayerFact.CreateAnnotationLayer(pFeatWS, pFeatLayer.FeatureClass.FeatureDataset, pLayer.Name + "_A_" + fieldname, pShapeField.GeometryDef,
null, pAnnoPropColl,pGraphyScale,pSymColl1 , false, false, false, true, pOverpost, "");
}
catch (Exception s)
{
string mes = s.Message;
}
if (pAnnoLayer == null)
return;
int num=pFields.FindField(fieldname);
ConvertToAnnotateByFeature(pLayer, num, ref pAnnoLayer);
pMap.AddLayer(pAnnoLayer as ILayer);
}
private bool ConvertToAnnotateByFeature(ILayer pLayer,int fieldnum,ref IAnnotationLayer pAnnoLayer)
{
IFeatureLayer pFeatlayer = pLayer as IFeatureLayer;
if (pFeatlayer == null)
return false;
IFeatureClass pFeatClass = pFeatlayer.FeatureClass;
IFeatureCursor pFeatCursor = pFeatClass.Search(null, false);
IFeature pFeat = pFeatCursor.NextFeature();
IFeatureLayer pAnnoFeatLayer=pAnnoLayer as IFeatureLayer;
IAnnotationClassExtension pAnnotateExten = pAnnoFeatLayer.FeatureClass.Extension as IAnnotationClassExtension;
ISymbol pSymbol = pAnnotateExten.SymbolCollection.get_Symbol(0);
IGeometry pGeo;
double angle = 0;
IRgbColor pRGB=new RgbColorClass();
pRGB.Blue=255;
pRGB.Green=255;
pRGB.Red=0;
/////判断是不是公路层的Width,特殊处理/////
string temp_layername = pLayer.Name.ToUpper();
bool bwidth=false;
if(pFeatClass.Fields.get_Field(fieldnum).Name.ToUpper()=="WIDTH")
{
if (pLayer.Name.ToUpper().Contains("LRDL"))
bwidth = true;
}
IElementCollection pElementColl = new ElementCollectionClass();
pAnnoLayer.BeginAddElements();
while(pFeat!=null)
{
pGeo = pFeat.Shape;
IPoint pLabelPoint = null;
if(pGeo is IPolyline)
{
IPolyline pline=pGeo as IPolyline;
pLabelPoint = GetLabelPoint(pline);
}
if(pGeo is IPoint)
{
pLabelPoint = pGeo as IPoint;
}
if(pGeo is IPolygon)
{
IPolygon pPolygon = pGeo as IPolygon;
IArea pArea = pPolygon as IArea;
pLabelPoint = pArea.LabelPoint;
}
object val=pFeat.get_Value(fieldnum);
string s=val.ToString();
if (s == null || s.Length == 0)
{
pFeat = pFeatCursor.NextFeature();
continue;
}
///对公路的宽度进行特殊处理
if(bwidth)
{
double width = double.Parse(s);
int rtegnum = pFeatClass.FindField("RTEG");
string rteg = pFeat.get_Value(rtegnum).ToString();
if(rteg=="高速"&&width>55.0)
{
IElement pElement = MakeTextElement(pGeo, angle, s, pRGB, pSymbol);
pElementColl.Add(pElement, pFeat.OID);
}
else if(width>40.0)
{
IElement pElement = MakeTextElement(pGeo, angle, s, pRGB, pSymbol);
pElementColl.Add(pElement, pFeat.OID);
}
}
else if (/*pLabelPoint != null&&*/s.Length>0)
{
IElement pElement = MakeTextElement(pGeo, angle, s, pRGB,pSymbol);
pElementColl.Add(pElement, pFeat.OID);
}
pFeat = pFeatCursor.NextFeature();
}
pAnnoLayer.EndAddElements();
pAnnoLayer.BeginAddElements();
if(pElementColl.Count<1)
{
pAnnoLayer.EndAddElements();
return true;
}
pAnnoLayer.DoAddElements(pElementColl, 0);
/* pAnnoLayer.SetupAttributeConversion()*/
pAnnoLayer.EndAddElements();
return true;
}
你们的评论、反馈,及对你们有所用,是我整理材料和博文写作的最大的鼓励和唯一动力。欢迎讨论和关注!
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。