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


     

     



  • 相关阅读:
    js的单元测试
    如何嵌入HTML 页面
    使用JQuery时间比较
    @page指令ValidateRequest的作用
    时间的正则表达式(比较简单)
    [置顶] Android代码 监控手机电池的状态
    [置顶] Android代码传感器光传感
    [置顶] Android问题ViewPager实现左右两个屏幕的切换
    [置顶] Android代码传感器测试手机支持那几种传感
    [置顶] Android代码检测手机耳机插拔
  • 原文地址:https://www.cnblogs.com/hl3292/p/1834618.html
Copyright © 2011-2022 走看看