zoukankan      html  css  js  c++  java
  • AE开发使用内存图层

    AE开发中,有时需要从磁盘中读取一些文件信息如坐标点转为图层并进行分析,此过程并不需要坐标点入库之类的操作,就可以创建一个内存图层解决问题。创建内存图层需要用到InMemoryWorkspaceFactoryClass。这样无需对磁盘进行操作,效率很高,且随程序的关闭而释放,无需考虑临时文件。

    //建立内存图层------------------
    
        /*
    
         * 创建一个工具,名为CreatMemLayer
    
         * 这个工具的作用为,创建一个名为layername参数传进来的内存图层
    
         * 这个内存图层的格式定义在本类的CreateVehicleFeature函数,可以自定义修改
    
         * 作者:陈芋宇   
    
         * 20100716
    
         */
    
            /// <summary>
    
            /// 创建空的内存工作空间,并且返回工作空间 -- pfeatureworkspace
    
            /// </summary>
    
            private IFeatureWorkspace CreateEmptyLayerInmemeory(string slayername, ESRI.ArcGIS.Geometry.ISpatialReference pspatialreference, int itype)
    
            {
    
                //打开工作空间
    
                const string strShapeFieldName = "SHAPE";
    
                IWorkspaceFactory pWSF = new InMemoryWorkspaceFactoryClass();
    
                ESRI.ArcGIS.Geodatabase.IWorkspaceName pworkspacename = pWSF.Create("", "MyWorkspace", null, 0);
    
                ESRI.ArcGIS.esriSystem.IName pname = (IName)pworkspacename;
    
                IFeatureWorkspace pfeatureworkspace = (IFeatureWorkspace)(pname.Open()); //打开刚建立的内存空间
    
                try
    
                {
    
                    //为esriFieldTypeGeometry类型的字段创建几何定义,包括类型和空间参照 
    
                    IGeometryDef pGeoDef = new GeometryDefClass();     //The geometry definition for the field if IsGeometry is TRUE.
    
                    IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef;
    
                    if (itype == 0)
    
                    {
    
                        pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
    
                    }
    
                    else
    
                    {
    
                        if (itype == 1)
    
                        {
    
                            pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
    
                        }
    
                        else
    
                        {
    
                            pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
    
                        }
    
                    }
    
                    if (pspatialreference != null)
    
                    {
    
                        pspatialreference.SetDomain(-180, 180, -90, 90);
    
                        pGeoDefEdit.SpatialReference_2 = pspatialreference;
    
                    }
    
                    else
    
                    {
    
                        ISpatialReferenceFactory3 pspatialRefFac = new SpatialReferenceEnvironmentClass();
    
                        ISpatialReference pspatialRef = pspatialRefFac.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);//定义的为WGS84的空间地理坐标系
    
                        pspatialRef.SetDomain(-180, 180, -90, 90);//这里一定要加域值的设置!
    
                        pGeoDefEdit.SpatialReference_2 = pspatialRef;
    
                    }
    
                    //设置字段集
    
                    IFields pFields = new FieldsClass();
    
                    IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;
    
                    //设置字段
    
                    IField pField = new FieldClass();
    
                    IFieldEdit pFieldEdit = (IFieldEdit)pField;
    
                    //创建类型为几何类型的字段0
    
                    pFieldEdit.Name_2 = strShapeFieldName;
    
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;//esriFieldTypeGeometry;
    
                    pFieldEdit.GeometryDef_2 = pGeoDef;
    
                    pFieldsEdit.AddField(pField);
    
                    //添加其他的字段1:nodeid,2:x,3:y
    
                        pField = new FieldClass();
    
                        pFieldEdit = (IFieldEdit)pField;
    
                        pFieldEdit.Name_2 = "ID";
    
                        pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
    
                        pFieldsEdit.AddField(pField);
    
                        
    
                        if (itype == 0)
    
                        {
    
                            pField = new FieldClass();
    
                            pFieldEdit = (IFieldEdit)pField;
    
                            pFieldEdit.Name_2 = "X";
    
                            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
    
                            pFieldEdit.Precision_2 = 10;//数值长度
    
                            pFieldEdit.Scale_2 = 6;//小数点后保留位数
    
                            pFieldsEdit.AddField(pField);
    
     
    
                            pField = new FieldClass();
    
                            pFieldEdit = (IFieldEdit)pField;
    
                            pFieldEdit.Name_2 = "Y";
    
                            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
    
                            pFieldEdit.Precision_2 = 10;//数值长度
    
                            pFieldEdit.Scale_2 = 6;//小数点后保留位数
    
                            pFieldsEdit.AddField(pField);
    
     
    
                            pField = new FieldClass();
    
                            pFieldEdit = (IFieldEdit)pField;
    
                            pFieldEdit.Name_2 = "Z";
    
                            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
    
                            pFieldsEdit.AddField(pField);
    
                        }
    
                        
    
     
    
                    //创建shapefile
    
                    IFeatureClass pfclass = pfeatureworkspace.CreateFeatureClass(slayername, pFields, null, null, esriFeatureType.esriFTSimple, strShapeFieldName, "");//这一句老是出问题!最后的解决方案是:原来之前设定的坐标系统没有添加域!
    
                    IDataset pdataset = (IDataset)pfclass; // 创建geodatabase属性表
    
                    pdataset.BrowseName = slayername;
    
                }
    
                catch (System.Exception ex)
    
                {
    
                    throw (ex);
    
                }
    
                return pfeatureworkspace;
    
            }

    上面函数的使用:

    IFeatureWorkspace feawks = CreateEmptyLayerInmemeory("TMP", pspatialRef, 0);
    
                    if (feawks == null) return;
    
                    IFeatureClass feacls = feawks.OpenFeatureClass("TMP");

    内存图层保存为磁盘图层:

    这个操作意义不大,如果需要保存,一开始就可以创建一个硬盘中的图层。

    1.可以采用最笨的方法。

    FEATURECLASS中取出FEATURE 一个个写入新的FEATURECLASS

    2.调用IGeoprocessor.Execute("select_management", , ,),利用Geoprocessing中的Select命令导出。 

    3.使用IFeatureDataConverter 

  • 相关阅读:
    Tomcat && Servlet
    List,Set,Collections工具类
    多表查询
    常用的API--集合
    msmpeng.exe阻止移动硬盘弹出
    接口400错误解析
    JDBC/Mybatis连接数据库报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    tomcat启动报错:A child container failed during start
    PAT 1019 数字黑洞
    PAT 1017 A除以B
  • 原文地址:https://www.cnblogs.com/jhlong/p/5394497.html
Copyright © 2011-2022 走看看