zoukankan      html  css  js  c++  java
  • 在ArcEngine中创建内存图层 hl3292注释

     原文链接:http://gishuangjun.blog.sohu.com/139347305.html

    核心提示arcEngine9.2中新增了一个新的特征,允许创建内存工作空间。
    arcEngine9.2中新增了一个新的特征,允许创建内存工作空间。当你需要一个这样的图层时,这个图层的属性数据或者几何数据需要频繁的更新,而又不希望因此而带来效率上的问题,你就可以考虑使用内存图层。
            内存图层的创建分为五步:
          1、设置属性字段
          2、设置空间参考和几何字段
          3、创建内存工作空间
          4、在内存工作空间中创建特征类
          5、创建特征图层,并将上一步创建的特征类设置为这个特征的图层的特征类

    请看以下完整的示例代码

            /// <summary>
            /// 在内存中创建图层
            /// </summary>
            /// <param name="DataSetName">数据集名称</param>
            /// <param name="AliaseName">别名</param>
            /// <param name="SpatialRef">空间参考</param>
            /// <param name="GeometryType">几何类型</param>
            /// <param name="PropertyFields">属性字段集合</param>
            /// <returns>IfeatureLayer</returns>
            public static IFeatureLayer CreateFeatureLayerInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields)
            {
                IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
                ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);
                ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName;
                ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open();

                IField oField = new FieldClass();
                IFields oFields = new FieldsClass();
                IFieldsEdit oFieldsEdit = null;
                IFieldEdit oFieldEdit = null;
                IFeatureClass oFeatureClass = null;
                IFeatureLayer oFeatureLayer = null;

                try
                {
                    oFieldsEdit = oFields as IFieldsEdit;
                    oFieldEdit = oField as IFieldEdit;

                    for (int i = 0; i < PropertyFields.FieldCount; i++)
                    {
                        oFieldsEdit.AddField(PropertyFields.get_Field(i));
                    }

                    IGeometryDef geometryDef = new GeometryDefClass();

    IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
                    geometryDefEdit.AvgNumPoints_2 = 5;
                    geometryDefEdit.GeometryType_2 = GeometryType;
                    geometryDefEdit.GridCount_2 = 1;
                    geometryDefEdit.HasM_2 = false;
                    geometryDefEdit.HasZ_2 = false;
                    geometryDefEdit.SpatialReference_2 = SpatialRef;

                    oFieldEdit.Name_2 = "SHAPE";
                    oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    oFieldEdit.GeometryDef_2 = geometryDef;
                    oFieldEdit.IsNullable_2 = true;
                    oFieldEdit.Required_2 = true;
                    oFieldsEdit.AddField(oField);

                    oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");

    (oFeatureClass as IDataset).BrowseName = DataSetName;

                    oFeatureLayer = new FeatureLayerClass();
                    oFeatureLayer.Name = AliaseName;
                    oFeatureLayer.FeatureClass = oFeatureClass;
                }
                catch
                {
                }
                finally
                {
                    try
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oField);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(name);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceFactory);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceName);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(inmemWor);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
                    }
                    catch { }

                    GC.Collect();
                }
                return oFeatureLayer;
            }

     

    下面就是根据采集的坐标点创建点内存图层:

                IFeatureLayer pFeatureLayer = new FeatureLayerClass();
                IFieldsEdit curFileds = new FieldsClass();
                IFieldEdit curField = new FieldClass();
                curField = new FieldClass();
                curField.Name_2 = "名称";
                curField.Type_2 = esriFieldType.esriFieldTypeString;
                curFileds.AddField(curField);

                curField = new FieldClass();
                curField.Name_2 = "经度";
                curField.Type_2 = esriFieldType.esriFieldTypeDouble;
                curFileds.AddField(curField);

                curField = new FieldClass();
                curField.Name_2 = "纬度";
                curField.Type_2 = esriFieldType.esriFieldTypeDouble;
                curFileds.AddField(curField);

                pFeatureLayer = CreateFeatureLayerInmemeory("Position", "采集点", new     UnknownCoordinateSystemClass(), esriGeometryType.esriGeometryPoint, curFileds as IFields);
                p_axMap.AddLayer(pFeatureLayer as ILayer);
                IFeatureCursor FeatureCursor;
                IFeature pFeature;
                IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                pFeature = pFeatureClass.CreateFeature();
                IQueryFilter pQueryFilter = new QueryFilterClass();
                FeatureCursor = pFeatureClass.Search(pQueryFilter, true);
                pQueryFilter.WhereClause = null;
                pFeature = FeatureCursor.NextFeature();
                pFeature.set_Value(0, str1);
                pFeature.set_Value(1, x);
                pFeature.set_Value(2, y);
                IEnvelope pEnvelope = new EnvelopeClass();

                //如果双击的对象是一个点,这样子才能够缩放到该点
                pEnvelope.PutCoords(0, 0, 0.3, 0.3);//确定envelope大小

                IPoint xpoint = new PointClass();
                xpoint.PutCoords(x, y);

                pFeature.Shape = xpoint;
                pFeature.Store();

                //设置颜色
                IRgbColor pcolor = new RgbColorClass();

                pcolor.Red = 255;

                pcolor.Green = 0;

                pcolor.Blue = 0;

                //设置图形
                ISimpleMarkerSymbol psm = new SimpleMarkerSymbolClass();
                psm.Style = esriSimpleMarkerStyle.esriSMSCircle;
                psm.Size = 10;
                psm.Color = pcolor;         

                (pFeatureLayer as IFeatureSelection).SelectionSymbol = (ISymbol)psm;
                (pFeatureLayer as IFeatureSelection).SetSelectionSymbol = true;

                (pFeatureLayer as IFeatureSelection).SelectionSet.Add(pFeature.OID);

                pEnvelope.CenterAt(xpoint);//地图缩放到该点      
                p_axMap.Extent = pEnvelope;
                p_axMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, null);
                p_axMap.ActiveView.ScreenDisplay.UpdateWindow();


     

     



  • 相关阅读:
    SAP PI 如何实现消息定义查询
    EWM与ERP交互程序
    ITS Mobile Template interpretation failed. Template does not exist
    SAP Material Flow System (MFS) 物料流系统简介
    SAP EWM Table list
    EWM RF 屏幕增强
    SAP EWM TCODE list
    SAP扩展仓库管理(SAPEWM)在线研讨会笔记
    ERP与EWM集成配置ERP端组织架构(二)
    EWM RF(Radio Frequency)简介
  • 原文地址:https://www.cnblogs.com/hl3292/p/1834618.html
Copyright © 2011-2022 走看看