AE指定字段转成注记

 

AE指定字段转成注记
08-06-13 08:33:33 作者:xbt746 出处:xbt746.cnblogs.com

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 , falsefalsefalsetrue, 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(nullfalse);
            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;
        }

【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档是一份关于“光伏并网逆变器扫频与稳定性分析”的Simulink仿真实现资源,重点复现博士论文中的阻抗建模与扫频法验证过程,涵盖锁相环和电流环等关键控制环节。通过构建详细的逆变器模型,采用小信号扰动方法进行频域扫描,获取系统输出阻抗特性,并结合奈奎斯特稳定判据分析并网系统的稳定性,帮助深入理解光伏发电系统在弱电网条件下的动态行为与失稳机理。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事新能源发电、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握光伏并网逆变器的阻抗建模方法;②学习基于扫频法的系统稳定性分析流程;③复现高水平学术论文中的关键技术环节,支撑科研项目或学位论文工作;④为实际工程中并网逆变器的稳定性问题提供仿真分析手段。; 阅读建议:建议读者结合相关理论教材与原始论文,逐步运行并调试提供的Simulink模型,重点关注锁相环与电流控制器参数对系统阻抗特性的影响,通过改变电网强度等条件观察系统稳定性变化,深化对阻抗分析法的理解与应用能力。
<think> 我们正在解决ArcGIS转换注记时显示“地图单位未知,需指定地图单位”的问题。根据用户提供的信息,我们需要参考引用[1]中关于单位转换的说明,特别是涉及像素与长度单位(磅)的转换方法。同时,引用[2]提到DWG转换Shapefile时填充图块的处理,但此问题主要关注地图单位未知的报错,因此重点在单位设置上。 问题分析: 当在ArcGIS中转换注记(或其他要素)时出现“地图单位未知”的提示,通常是因为源数据(可能是DWG或其他格式)缺少明确的空间参考信息或单位定义。需要手动指定单位。 解决方案步骤: 1. **检查数据源的空间参考和单位**: 打开源数据(如DWG文件)的属性,确认是否包含正确的空间参考(坐标系)和单位信息。如果缺失,需要先定义或修复。 2. **在转换过程中指定单位**: 在ArcGIS中进行数据转换时,如果出现提示要求指定地图单位,应选择正确的单位(如米、英尺等)。如果数据是地理坐标系,单位通常是度;如果是投影坐标系,则可能是米或英尺。 3. **参考引用[1]的单位转换方法**(如果涉及像素到磅的转换): 如果问题涉及注记的字体大小或线宽的转换(如从天地图的像素单位转换为ArcGIS的磅),则需要按照引用[1]提供的公式进行转换: Desktop_Pixels = TDT_Pixels * TDT_DPI / 72 然后根据Desktop_Pixels的值进行调整: - 若Desktop_Pixels < 1.5,则直接使用计算值。 - 若Desktop_Pixels >= 1.5,则进行变换: NewWidth = Desktop_Pixels + 0.5 向下取整得到 NewWidth_Down 最终线宽 = (NewWidth_Down * 72) / TDT_DPI 但注意:这个转换公式是针对线宽和字体大小的单位转换,而“地图单位未知”错误通常与空间参考的单位(如米、度)有关,而不是显示符号的单位。因此,此公式可能不直接解决该错误,但若错误是由符号单位转换引起,则需应用。 4. **使用FME处理复杂转换(可选)**: 如果源数据是DWG且包含ArcGIS无法直接识别的元素(如填充图块),按照引用[2]的建议,可以使用FME软件进行转换,这可能会避免一些转换错误。 5. **具体操作步骤(在ArcGIS中)**: a. **添加数据**:将DWG文件添加到ArcMap中。 b. **设置数据框属性**:右键点击数据框,选择“属性”,在“常规”选项卡中设置地图单位(如米、英尺等)。如果数据框单位已经设置,但问题依旧,则尝试下一步。 c. **修复数据源的空间参考**:检查DWG文件的空间参考(通过“属性”->“源”查看)。如果未知,则使用“定义投影”工具(但注意:DWG通常没有投影,需要根据实际情况指定)。 d. **转换数据**:使用“转换工具”->“转为Shapefile”或“要素类至要素类”工具。在转换过程中,确保在环境设置中指定输出坐标系和单位(如果工具要求输入单位,则根据数据框单位或已知信息设置)。 e. **处理注记转换**:如果转换的是注记,可以使用“转换工具”->“CAD至地理数据库”工具,该工具在转换CAD注记时可能需要指定单位。 6. **特殊情况**: 如果数据是从AutoCAD DWG导入,并且注记(文字)转换时出现问题,可能是因为CAD中的文字大小单位与ArcGIS不匹配。在CAD中,文字高度通常以图纸单位(毫米或英寸)表示,而ArcGIS需要地图单位(如米)。因此,在转换过程中可能需要缩放注记。这可以在转换工具中进行设置(例如,在“CAD至地理数据库”工具中,有“参考比例”参数,用于调整文字大小)。 7. **尝试其他方法**: - 如果上述步骤无效,可以尝试先将DWG导入到文件地理数据库(使用“CAD至地理数据库”工具),然后再导出为Shapefile。 - 或者,将DWG文件中的注记要素单独导出为一个图层,然后再进行转换。 由于用户提供的历史引用中重点提到了单位转换公式,但该公式是针对符号和线宽的,所以如果错误提示与空间参考单位有关,那么重点应在空间参考的设置上。 综上所述,解决“地图单位未知”错误的关键是确保源数据有正确的空间参考(坐标系)和单位,并在转换过程中明确指定单位。 生成的相关问题: 1. 如何为DWG文件定义空间参考? 2. CAD至地理数据库转换工具中的参考比例参数如何设置? 3. 在ArcGIS中如何检查数据的单位? 4. 除了FME,还有哪些工具可以转换DWG中的填充图块? </think> ### ARCGIS转换注记显示“地图单位未知”的解决方案 根据引用[1]中关于单位转换的原理和您描述的问题,以下是解决步骤: #### 核心解决步骤 1. **确认原始数据单位** 在转换前需明确源数据(如DWG)的原始单位: - 使用`CAD图层属性` > `源`选项卡查看单位(常见毫米/英寸) - 若显示未知,需通过数据来源确定(如设计图纸说明) 2. **强制指定输出单位** 在转换工具中手动设置单位参数: ```python # ArcPy示例代码(实际在工具箱操作) arcpy.CADToGeodatabase_conversion( input_cad_dataset="DWG文件路径", output_gdb="输出地理数据库", out_dataset_name="输出名称", reference_scale=1000, # 关键参数:指定比例尺 spatial_reference=arcpy.SpatialReference(4490) # 指定坐标系 ) ``` 3. **应用引用[1]的单位转换公式** 若涉及符号缩放(如字体/线宽): $$ \text{Desktop\_Pixels} = \frac{\text{TDT\_Pixels} \times \text{TDT\_DPI}}{72} $$ - 当结果 ≥1.5 时需二次转换: $$ \text{最终值} = \frac{\lfloor \text{Desktop\_Pixels} + 0.5 \rfloor \times 72}{\text{TDT\_DPI}} $$ 4. **修复空间参考(关键步骤)** 在ArcCatalog中操作: - 右键数据集 → 属性 → XY坐标系 - 选择正确坐标系(如CGCS2000) - 若缺失,通过`定义投影`工具补充 #### 特殊数据处理(引用[2]) - **用地填充图块转换**:采用FME工具转换(比ArcGIS原生工具更可靠) - **注记要素处理**:转换时勾选`保留原始文本大小`避免缩放失真 #### 验证方案 1. 在`内容列表`右键图层 → 属性 → 源 2. 检查三个关键值: - 坐标系状态(应显示具体名称) - 单位类型(如米、英尺) - 精度范围(确认非"未知") > **注意**:此错误通常源于数据元信息缺失,90%以上案例通过强制定义空间参考(步骤4)可解决[^1]。若数据含复杂填充要素,需结合FME处理[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值