基于ArcEngine的网格计算相关(1)

这篇博客介绍了如何在ArcEngine中创建内存图层,包括设置空间参考、添加属性字段,并展示了如何将内存图层导出到MDB文件。通过`Utility`类的静态方法实现图层的创建和转换功能,涉及了空间数据操作的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)创建内存图层

/// <summary>
        /// 创建内存图层,使用该图层创建网格
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            ILayer pLayer = DataManage.GetLayer(mapControl, "计算单元网格");  
            if (pLayer != null && pLayer is IFeatureLayer)
            {
                mapControl.Map.DeleteLayer(pLayer);
            }
            ISpatialReference pSpatRef = mapControl.SpatialReference;
            IFields pFields = new FieldsClass();
            IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
            IField pFeild = new FieldClass();
            IFieldEdit pFeildEdit = pFeild as IFieldEdit;
            pFeildEdit.Length_2 = 8;
            pFeildEdit.Name_2 = "OBJECTID";
            pFeildEdit.Type_2 = esriFieldType.esriFieldTypeOID;
            pFieldsEdit.AddField(pFeild);
            pFeild = new FieldClass();
            pFeildEdit = pFeild as IFieldEdit;
            pFeildEdit.Length_2 = 8;
            pFeildEdit.Name_2 = "pvalue";
            pFeildEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
            pFieldsEdit.AddField(pFeild);
            IFeatureLayer pFeatureLayer = Utility.CreateFeatureLayerInmemeory("计算单元网格", "计算单元网格", pSpatRef, esriGeometryType.esriGeometryPolygon, pFields);

           mapControl.AddLayer(pFeatureLayer, 0);

}

public class Utility
    {
        /// <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;
        }

    }

 

 

(2)导出内存图层到MDB

private void button4_Click(object sender, EventArgs e)
        {
            IQueryFilter pFilter = new QueryFilterClass();
            pFilter.WhereClause = "";
            IWorkspaceFactory pWSFactory = new AccessWorkspaceFactoryClass();
            IWorkspace pWorkspace = pWSFactory.OpenFromFile(@"F:/HGN/NewCode/LandGis/LGIS/LGIS/bin/Debug/data/下瑭镇/djdata/test.mdb", 0);
           
           
            IFeatureWorkspace pFWS = pWorkspace as IFeatureWorkspace;
            IFeatureClass pFeatureClass = pFWS.OpenFeatureClass("计算单元网格");
            if (pFeatureClass != null)
            {
                IFeatureWorkspaceManage pFWSM = (IFeatureWorkspaceManage)pFWS;
                IWorkspaceName workspaceName = new WorkspaceNameClass();
                workspaceName.PathName = pWorkspace.PathName;
                workspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory";
                IFeatureClassName featureClassName = new FeatureClassNameClass();
                IDatasetName datasetName = (IDatasetName)featureClassName;
                datasetName.Name = pFeatureClass.AliasName;
                datasetName.WorkspaceName = workspaceName;
                pFWSM.DeleteByName((datasetName));
            }

            ILayer pLayer = DataManage.GetLayer((IMapControl3)axMapControl.Object, "计算单元网格");
            IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
            pFeatureClass = pFeatureLayer.FeatureClass;
            ConvertFeatureClass(pFeatureClass, pWorkspace, "计算单元网格", pFilter);
            MessageBox.Show("OK");
           
        }
        public void ConvertFeatureClass(IFeatureClass inFeatureClass, IWorkspace outWorkspace, string LayerName, IQueryFilter pFilter)
        {
            //Get input FeatureClassName and Workspace
            try
            {
                IDataset dataset = (IDataset)inFeatureClass;
                IFeatureClassName inFeatureClassName = (IFeatureClassName)dataset.FullName;
                IWorkspace inWorkspace = dataset.Workspace;
                //Set output Workspace Name
                dataset = (IDataset)outWorkspace;
                IWorkspaceName outWorkspaceName = (IWorkspaceName)dataset.FullName;
                //Set output FeatureClassName
                IFeatureClassName outFeatureClassName = new FeatureClassNameClass();
                IDatasetName datasetName = (IDatasetName)outFeatureClassName;
                datasetName.Name = LayerName;
                datasetName.WorkspaceName = outWorkspaceName;
                //Get fields for input feature class and run them through field checker
                IFieldChecker fieldChecker = new FieldCheckerClass();
                IFields inFields = inFeatureClass.Fields;
                IFields outFields;

                IEnumFieldError enumFieldError;
                fieldChecker.InputWorkspace = inWorkspace;
                fieldChecker.ValidateWorkspace = outWorkspace;
                fieldChecker.Validate(inFields, out enumFieldError, out outFields);
                //Convert the data
                IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
                featureDataConverter.ConvertFeatureClass(inFeatureClassName, pFilter, null, outFeatureClassName, null, outFields, "", 100, 0);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(fieldChecker);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(featureDataConverter);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(outWorkspace);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(inFeatureClass);
            }

        }

 

引用参考:

http://www.cnblogs.com/gispeng/archive/2008/05/27/1208249.html

 

 

 

内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值