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); }
|
|
|