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

            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 == )

                {

                    pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;

                }

                else

                {

                    if (itype == )

                    {

                        pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;

                    }

                    else

                    {

                        pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;

                    }

                }

                if (pspatialreference != null)

                {

                    pspatialreference.SetDomain(-, , -, );

                    pGeoDefEdit.SpatialReference_2 = pspatialreference;

                }

                else

                {

                    ISpatialReferenceFactory3 pspatialRefFac = new SpatialReferenceEnvironmentClass();

                    ISpatialReference pspatialRef = pspatialRefFac.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);//定义的为WGS84的空间地理坐标系

                    pspatialRef.SetDomain(-, , -, );//这里一定要加域值的设置!

                    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 == )

                    {

                        pField = new FieldClass();

                        pFieldEdit = (IFieldEdit)pField;

                        pFieldEdit.Name_2 = "X";

                        pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;

                        pFieldEdit.Precision_2 = ;//数值长度

                        pFieldEdit.Scale_2 = ;//小数点后保留位数

                        pFieldsEdit.AddField(pField);

                        pField = new FieldClass();

                        pFieldEdit = (IFieldEdit)pField;

                        pFieldEdit.Name_2 = "Y";

                        pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;

                        pFieldEdit.Precision_2 = ;//数值长度

                        pFieldEdit.Scale_2 = ;//小数点后保留位数

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

                if (feawks == null) return;

                IFeatureClass feacls = feawks.OpenFeatureClass("TMP");

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

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

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

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

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

3.使用IFeatureDataConverter

AE开发使用内存图层的更多相关文章

  1. AE开发中栅格图层实现分级渲染

    GP工具IDW执行后,生成的栅格图层是黑白二色,需要手动进行分级渲染,似乎不是所有栅格图层都可以进行分级渲染,注意异常处理.注意ARCMAP中是有颜色的,无需自己处理. IRasterClassify ...

  2. 将AE开发的专题图制作功能发布为WPS

    AE开发可以定制化实现ArcGIS的地理处理功能,并实际运用于其他方面的工作,有时候我们还希望将AE开发的功能发布为网络地理信息处理服务(WPS),从而能在Web端更自由便利地调用所需要的地学处理算法 ...

  3. 【转】.NET+AE开发中常见几种非托管对象的释放

    尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 今天在开发时遇到一个问题:" 未处理 System.AccessViolationException Message="尝试 ...

  4. AE开发概念辨析

    樱木 原文 AE开发之概念辨析2,AE开发涉及相关概念,AE开发相关概念 1 AE中的类库 AE总共包括了21个子库,分别是SYSTEM,SYSTEMUI,GEOMETRY,DISPLAY,SERVE ...

  5. AE开发能否实现TOC Control里添加多个Data Frame

    问题: 在ArcMap中,菜单Insert下Data Frame,可以在TOC中增加Data Frame,在MapControl或者PageLayoutControl下都可以正常显示多个Data Fr ...

  6. C# ArcEngine创建内存图层(转载)

    C#+Arcengine---创建内存图层 分类:技术文档 2009-12-11 14:43阅读(1498)评论(0) #region 在内存中创建图层        /// <summary& ...

  7. IOS开发的内存管理

    关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...

  8. IOS开发小记-内存管理

    关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...

  9. Qt+QGis二次开发:矢量图层的显示样式

    原文链接:QGis二次开发基础 -- 矢量图层的显示样式

随机推荐

  1. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理1

    首先给上项目的整体框架图:,这里我没有使用BLL,因为感觉太烦了就没有去使用. 那么接下来我们首先先去Model层中添加Model. 管理员类: using System; using System. ...

  2. mybatis配置-返回date类型丢失时间

    此博客仅作于平时开发所遇到的问题记录,不做他用,描述可能不好,自己看懂即可~~ resultMap配置返回时间类型时,发现数据库时间是精确到秒的,但是返回给javabean之后丢失时分秒的信息,只有日 ...

  3. python3 linux下安装

    1.下载 https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 2.安装 上传到linux服务器 #进入上传文件的目录 cd /app/pr ...

  4. 学习Linux的编码风格

    对于编码,每个码农或许都会有自己的一套风格,很多人可能对编码风格压根就不关心,因为最终编译器编译出来的目标代码并不会受影响.但是在开发一个大型项目时,花费时间成本最多的永远是开发者们之间的沟通与交流. ...

  5. NYOJ 743

    复杂度 描述 for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) for(k=j+1;k<=n;k++) operation; 你知道 operation 共 ...

  6. aop

    做aop做一些事情::: package cn.happy.spring04aop; public interface ISomeService { public void doSomeThing() ...

  7. EasyUI实现工地领款单项目

    环境搭建 引入jar.配置Spring MVC.web.xml.日志等 建表 自动生成MyBatis相关文件 mybatis-generator-core-1.3.2.jar <?xml ver ...

  8. Leetcode:378. Kth Smallest Element in a Sorted Matrix

    题目: Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the ...

  9. 积极主动敲代码,使用Junit学习Java程序设计

    积极主动敲代码,使用JUnit学习Java 早起看到周筠老师在知乎的回答软件专业成绩很好但是实际能力很差怎么办?,很有感触. 从读大学算起,我敲过不下100本程序设计图书的代码,我的学习经验带来我的程 ...

  10. 高性能JavaScript 编程实践

    前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...