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;  
                        }  
                }  
            }  
        }  
    }  
}  

 

基于Vue3使用阿里云OSS上传图片,你需要先确保已经注册了阿里云账号,并且创建了OSS服务,获取了相应的AccessKey ID和AccessKey Secret以及设置好了存储空间(Bucket)。 以下是使用Vue3结合阿里云OSS进行图片上传的基本步骤: 1. 安装 OSS SDK for JavaScript: 通过npm或yarn安装SDK,可以在项目中的终端运行以下命令: ``` npm install oss-sdk --save 或者 yarn add oss-sdk ``` 2. 创建OSS客户端实例: 在Vue3项目中,你可以在相应的组件中创建一个OSS客户端实例,通常是在methods或者setup函数中,使用你的AccessKey信息: ```javascript import OSS from &#39;oss-sdk&#39;; import { ref } from &#39;vue&#39;; const bucket = &#39;your-bucket-name&#39;; // 替换为你的Bucket名称 const accessKeyId = &#39;your-access-key-id&#39;; // 替换为你的AccessKey ID const accessKeySecret = &#39;your-access-key-secret&#39;; // 替换为你的AccessKey Secret const client = new OSS({ region: &#39;oss-region&#39;, // 替换为你的OSS区域 accessKeyId: accessKeyId, accessKeySecret: accessKeySecret, bucket: bucket }); ``` 3. 上传图片: 你可以创建一个方法来处理文件的上传。首先,获取要上传的文件,然后使用OSS实例的`put`方法上传图片。 ```javascript const uploadImage = async (file) => { const res = await client.put(&#39;path/to/upload&#39;, file); // &#39;path/to/upload&#39;是目标路径和文件名 console.log(&#39;upload success:&#39;, res); }; ``` 4. 使用组件上传图片: 你可以在Vue模板中添加一个文件输入元素,并在用户选择文件后调用`uploadImage`方法上传图片: ```html <input type="file" @change="handleFileUpload" /> ``` 在相应的方法中,你可以处理文件选择事件并获取文件对象: ```javascript const handleFileUpload = async (event) => { const files = event.target.files; if (files.length > 0) { const file = files[0]; await uploadImage(file); } }; ``` 确保在使用这些代码前,你已经正确配置了安全凭证和OSS服务,并且你的网络请求符合阿里云的安全要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值