arcengine 要素类的复制

简介:

转自原文arcengine 要素类的复制

 

复制代码
using System;  
using System.Collections.Generic;  
using System.Text;  
using ESRI.ArcGIS.Geodatabase;  
using ESRI.ArcGIS.Geometry;  
using ESRI.ArcGIS.Carto;  
namespace MyGISClass  
{  
    /// <summary>  
    /// 该类主要包含了要素类的复制以及同要素类数据的加载  
    /// 函数主要用于SDE与Personal GDB之间数据的处理  
    /// </summary>  
    class FeatureClassDataManager  
    {  
        /// <summary>  
        /// 根据传入的源要素类OldFeatureClass,新空间范围,要素存储工作空间,新要素类名  
        /// 产生具有相同字段结构和不同空间范围的要素类  
        /// </summary>  
        /// <param name="OldFeatureClass">源要素类</param>  
        /// <param name="SaveFeatWorkspace">存储工作空间</param>  
        /// <param name="FeatClsName">新要素类名</param>  
        /// <param name="pDomainEnv">新空间范围,可为null</param>  
        /// <returns></returns>  
        public IFeatureClass CloneFeatureClassInWorkspace(IFeatureClass OldFeatureClass, IFeatureWorkspace SaveFeatWorkspace, string FeatClsName, IEnvelope pDomainEnv)  
        {  
            IFields pFields = CloneFeatureClassFields(OldFeatureClass, pDomainEnv);  
            return SaveFeatWorkspace.CreateFeatureClass(FeatClsName, pFields, null, null, esriFeatureType.esriFTSimple, OldFeatureClass.ShapeFieldName, "");  
        }  
        /// <summary>  
        /// 复制AnnotationClass,未完待续  
        /// </summary>  
        /// <param name="OldFeatureClass"></param>  
        /// <param name="SaveFeatWorkspace"></param>  
        /// <param name="FeatClsName"></param>  
        /// <param name="pDomainEnv"></param>  
        /// <returns></returns>  
        public IFeatureClass CloneAnnotationClassInWorkspace(IFeatureClass OldFeatureClass, IFeatureWorkspace SaveFeatWorkspace, string FeatClsName, IEnvelope pDomainEnv)  
        {  
            IFeatureWorkspaceAnno pFWSAnno = (IFeatureWorkspaceAnno)SaveFeatWorkspace;  
            IAnnoClass pAnnoClass = (IAnnoClass)OldFeatureClass.Extension;  
            return null;  
        }  
        /// <summary>  
        /// 将inFeatureClass要素类中所有符合pQueryFilter的要素复制到saveFeatureClass中,仅复制不做任何修改  
        /// </summary>  
        /// <param name="inFeatureClass">源要素类</param>  
        /// <param name="saveFeatureClass">存储要素类</param>  
        /// <param name="pQueryFilter">过滤参数</param>  
        /// <returns></returns>  
        public bool LoadFeatureClass(IFeatureClass inFeatureClass, IFeatureClass saveFeatureClass, IQueryFilter pQueryFilter)  
        {  
            //生成两个要素类字段的对应表  
            Dictionary<int, int> pFieldsDict = new Dictionary<int, int>();  
            this.GetFCFieldsDirectory(inFeatureClass, saveFeatureClass, ref pFieldsDict);  
            IFeatureCursor pinFeatCursor = inFeatureClass.Search(pQueryFilter, false);  
            long nCount = inFeatureClass.FeatureCount(pQueryFilter);  
            IFeature pinFeat = pinFeatCursor.NextFeature();  
            IFeatureCursor psaveFeatCursor = saveFeatureClass.Insert(true);  
            //使用IFeatureBuffer在内存中产生缓存避免多次打开,关闭数据库  
            IFeatureBuffer psaveFeatBuf = null;  
            IFeature psaveFeat = null;  
            long n = 0;  
            while (pinFeat != null)  
            {  
                try  
                {  
                    psaveFeatBuf = saveFeatureClass.CreateFeatureBuffer();  
                    psaveFeat = psaveFeatBuf as IFeature;  
                    if (inFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)  
                    {  
                        IAnnotationFeature pAF = (IAnnotationFeature)pinFeat;  
                        IAnnotationFeature pNAF = (IAnnotationFeature)psaveFeat;  
                        if (pAF.Annotation != null)  
                        {  
                            pNAF.Annotation = pAF.Annotation;  
                        }  
                    }  
                    psaveFeat.Shape = pinFeat.Shape;  
                    foreach (KeyValuePair<int, int> keyvalue in pFieldsDict)  
                    {  
                        if (pinFeat.get_Value(keyvalue.Key).ToString() == "")  
                        {  
                            if (psaveFeat.Fields.get_Field(keyvalue.Value).Type == esriFieldType.esriFieldTypeString)  
                            {  
                                psaveFeat.set_Value(keyvalue.Value, "");  
                            }  
                            else  
                            {  
                                psaveFeat.set_Value(keyvalue.Value, 0);  
                            }  
                        }  
                        else  
                        {  
                            psaveFeat.set_Value(keyvalue.Value, pinFeat.get_Value(keyvalue.Key));  
                        }  
                    }  
                    psaveFeatCursor.InsertFeature(psaveFeatBuf);  
                }  
                catch (Exception ex) { }  
                finally  
                {  
                    psaveFeat = null;  
                    n++;  
                    if (n % 2000 == 0)  
                    {  
                        psaveFeatCursor.Flush();  
                    }  
                    pinFeat = pinFeatCursor.NextFeature();  
                }  
            }  
            psaveFeatCursor.Flush();  
            return true;  
        }  
        private IFields CloneFeatureClassFields(IFeatureClass pFeatureClass, IEnvelope pDomainEnv)  
        {  
            IFields pFields = new FieldsClass();  
            IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;  
            //根据传入的要素类,将除了shape字段之外的字段复制  
            long nOldFieldsCount = pFeatureClass.Fields.FieldCount;  
            long nOldGeoIndex = pFeatureClass.Fields.FindField(pFeatureClass.ShapeFieldName);  
            for (int i = 0; i < nOldFieldsCount; i++)  
            {  
                if (i != nOldGeoIndex)  
                {  
                    pFieldsEdit.AddField(pFeatureClass.Fields.get_Field(i));  
                }  
                else  
                {  
                    IGeometryDef pGeomDef = new GeometryDefClass();  
                    IGeometryDefEdit pGeomDefEdit = (IGeometryDefEdit)pGeomDef;  
                    ISpatialReference pSR = null;  
                    if (pDomainEnv != null)  
                    {  
                        pSR = new UnknownCoordinateSystemClass();  
                        pSR.SetDomain(pDomainEnv.XMin, pDomainEnv.XMax, pDomainEnv.YMin, pDomainEnv.YMax);  
                    }  
                    else  
                    {  
                        IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;  
                        pSR = CloneSpatialReference(pGeoDataset.SpatialReference);  
                    }  
                    //设置新要素类Geometry的参数  
                    pGeomDefEdit.GeometryType_2 = pFeatureClass.ShapeType;  
                    pGeomDefEdit.GridCount_2 = 1;  
                    pGeomDefEdit.set_GridSize(0, 10);  
                    pGeomDefEdit.AvgNumPoints_2 = 2;  
                    pGeomDefEdit.SpatialReference_2 = pSR;  
                    //产生新的shape字段  
                    IField pField = new FieldClass();  
                    IFieldEdit pFieldEdit = (IFieldEdit)pField;  
                    pFieldEdit.Name_2 = "shape";  
                    pFieldEdit.AliasName_2 = "shape";  
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;  
                    pFieldEdit.GeometryDef_2 = pGeomDef;  
                    pFieldsEdit.AddField(pField);  
                }  
            }  
            return pFields;  
        }  
        private ISpatialReference CloneSpatialReference(ISpatialReference pSrcSpatialReference)  
        {  
            double xmin, xmax, ymin, ymax;  
            pSrcSpatialReference.GetDomain(out xmin, out xmax, out ymin, out ymax);  
            ISpatialReference pSR = new UnknownCoordinateSystemClass();  
            pSR.SetDomain(xmin, xmax, ymin, ymax);  
            return pSR;  
        }  
        private void GetFCFieldsDirectory(IFeatureClass pFCold,IFeatureClass pFCnew,ref Dictionary<int,int> FieldsDictionary)  
        {  
            for(int i=0;i<pFCold.Fields.FieldCount;i++)  
            {  
                string tmpstrold=pFCold.Fields.get_Field(i).Name.ToUpper();  
                switch(tmpstrold)  
                {  
                    case "OBJECTID":  
                    case "SHAPE":  
                    case "SHAPE_LENGTH":  
                    case "SHAPE_AREA":  
                    case "FID":  
                        {  
                            //以上字段由系统自动生成  
                            break;  
                        }  
                    default:  
                        {  
                            for(int j=0;j<pFCnew.Fields.FieldCount;j++)  
                            {  
                                string tmpstrnew=pFCnew.Fields.get_Field(j).Name.ToUpper();  
                                if(tmpstrold==tmpstrnew)  
                                {  
                                    FieldsDictionary.Add(i,j);  
                                    break;  
                                }  
                            }  
                            break;  
                        }  
                }  
            }  
        }  
    }  
}  
复制代码

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。

    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6262786.html ,如需转载请自行联系原作者




相关文章
|
安全 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 重启 reboot命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 重启 reboot命令 使用指南
798 0
|
6月前
|
JSON 供应链 API
商品条码查询 API 实战指南:掌握商品“唯一身份标识”
商品条码查询API简介:基于1974年诞生的条码技术,该API通过输入13/14位条码,快速获取商品基本信息(名称、品牌、规格等)和成分信息(营养成分、配料表等)。其核心功能包括商品条码查询接口与成分查询接口,广泛应用于零售、电商、物流及健康饮食等领域。支持HTTP POST请求,提供便捷的代码调用示例。作为数字化转型的重要工具,它不仅方便消费者查询商品详情,还助力商家优化库存管理与销售流程,提升运营效率。
1335 3
|
9月前
|
城市大脑 安全 计算机视觉
课时13:城市数据大脑介绍
阿里云与杭州市合作打造的城市数据大脑,通过智能调控红绿灯、实时视频分析交通事件,提升了道路通行效率。如今,城市大脑不仅能主动发现并处理交通事故,还能为救护车规划最优路线,从被动接警转变为积极应对,使城市交通更加顺畅和安全。交警们希望通过这一系统,让杭州变得更加美好,实现更愉快的出行体验。
407 0
|
9月前
|
Dubbo 应用服务中间件 Apache
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
152 0
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
533 7
|
数据挖掘 API 网络安全
如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例
Google Compute Engine(GCE)是 Google Cloud Platform(GCP)的一部分,它为用户提供了高度可扩展的虚拟机实例,用于运行各种工作负载,从简单的网站托管到复杂的数据分析。本文将引导您完成使用 Google Compute Engine 的入门过程,以便您可以轻松开始使用这一强大的云计算平台。
1625 0
|
数据库连接 C# 数据库
|
存储 NoSQL Linux
ArcGIS:如何创建地理数据库、创建要素类数据集、导入要素类、表?
ArcGIS:如何创建地理数据库、创建要素类数据集、导入要素类、表?
11081 2
|
NoSQL 定位技术 C#
基于C#的ArcEngine二次开发43:GP工具--数据管理工具--Joins
基于C#的ArcEngine二次开发43:GP工具--数据管理工具--Joins
基于C#的ArcEngine二次开发43:GP工具--数据管理工具--Joins
|
开发者
阿里云开发者社区知识产权保护暨版权授权与侵权投诉指引
阿里云开发者社区知识产权保护暨版权授权与侵权投诉指引
1131058 5