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, ); 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开发使用内存图层的更多相关文章
- AE开发中栅格图层实现分级渲染
GP工具IDW执行后,生成的栅格图层是黑白二色,需要手动进行分级渲染,似乎不是所有栅格图层都可以进行分级渲染,注意异常处理.注意ARCMAP中是有颜色的,无需自己处理. IRasterClassify ...
- 将AE开发的专题图制作功能发布为WPS
AE开发可以定制化实现ArcGIS的地理处理功能,并实际运用于其他方面的工作,有时候我们还希望将AE开发的功能发布为网络地理信息处理服务(WPS),从而能在Web端更自由便利地调用所需要的地学处理算法 ...
- 【转】.NET+AE开发中常见几种非托管对象的释放
尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 今天在开发时遇到一个问题:" 未处理 System.AccessViolationException Message="尝试 ...
- AE开发概念辨析
樱木 原文 AE开发之概念辨析2,AE开发涉及相关概念,AE开发相关概念 1 AE中的类库 AE总共包括了21个子库,分别是SYSTEM,SYSTEMUI,GEOMETRY,DISPLAY,SERVE ...
- AE开发能否实现TOC Control里添加多个Data Frame
问题: 在ArcMap中,菜单Insert下Data Frame,可以在TOC中增加Data Frame,在MapControl或者PageLayoutControl下都可以正常显示多个Data Fr ...
- C# ArcEngine创建内存图层(转载)
C#+Arcengine---创建内存图层 分类:技术文档 2009-12-11 14:43阅读(1498)评论(0) #region 在内存中创建图层 /// <summary& ...
- IOS开发的内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- IOS开发小记-内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- Qt+QGis二次开发:矢量图层的显示样式
原文链接:QGis二次开发基础 -- 矢量图层的显示样式
随机推荐
- 查询表结构sql
THEN obj.name ELSE '' END AS 表名, col.colorder AS 序号, col.name AS 列名, ISNULL(ep.value, N'') AS 列说明, t ...
- 从零自学Hadoop(09):使用Maven构建Hadoop工程
阅读目录 序 Maven 安装 构建 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Source ...
- 【2016-10-26】【坚持学习】【Day13】【WCF】【EF + Data Services】
今天做了一个demo, EF+Data Services 先建立一个网站项目 添加一个ADO.NET 数据模型 相当于一个EF容器,用来连接MSSQL数据库 添加一个WCF Data Services ...
- less及编译工具介绍
什么是LESSCSS LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. LE ...
- Vc6.0头文件的定义
Vc6.0头文件的定义 #ifndef __HEADER__ #define __HEADER__ int fun(int i); #endif
- [原]那些年整理的Linux常用命令,简单明了
查询相关 find 按规则查找某个文件或文件夹,包括子目录 find . -name '*.sh' -- 以.sh结尾的文件 find . -name '*channel*' -- 包含channel ...
- Eclipse: 提示 Toolchain "MinGW GCC" is not detected
解决办法: 1. 把 D:\MinGW\bin, 设置到 PATH 路径. 2. 重启 eclipse
- 【C#】【Thread】Barrier任务并行
Barrier 是一个对象,它可以在并行操作中的所有任务都达到相应的关卡之前,阻止各个任务继续执行. 如果并行操作是分阶段执行的,并且每一阶段要求各任务之间进行同步,则可以使用该对象. --MSDN ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 忘记密码功能改进、手机短信、电子邮件
由于我们的系统接近有100000个用户账户,经常会有忘记密码的时候,用户多了,很小的一个功能,每天都会有很多人在用,每个功能都非常友善,会提高提系统的效率,提高用户体验. 一天最多能返回3次手机短信, ...
- Linux 进程间通讯详解六
ftok()函数 key_t ftok(const char *pathname, int proj_id); --功能:创建系统建立IPC通讯 (消息队列.信号量和共享内存) 时key值 --参数 ...