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二次开发基础 -- 矢量图层的显示样式
随机推荐
- 从零自学Hadoop(05):Ambari
阅读目录 序 引入背景 Ambari介绍 在线安装 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sour ...
- 终于开始用github了
一直以来,github的大名就如雷贯耳.虽然我半年多前就从了解到了这个神奇的网站,而且趁着当时的一时兴趣注册了账户,但是对于那时候的我来说这个网站还是太复杂了点,毕竟半年前的我还没有开始写代码啊,所以 ...
- char_dev.c 添加中文注释
char_dev.c里的中文注释,仅代表个人理解,仅供参考.如有错误之处,请指出,谢谢! /* * linux/fs/char_dev.c * * Copyright (C) 1991, 1992 L ...
- form表单取消按钮自动提交
默认写在form表单里的按钮可以自动提交表单,现在要实现的效果是点击button按钮调用js函数,再有ajax提交 <button type="button" class=& ...
- Linux shell 通配符 / glob 模式
概念 glob 模式(globbing)也被称之为 shell 通配符,名字的起源来自于 Unix V6 中的 /etc/glob (详见 man 文档).glob 是一种特殊的模式匹配,最常见的是通 ...
- awk-笔记
语法形式: awk [options] 'script' var=value file1 [file...] awk [options] -f scriptfile var=value file [f ...
- windows系统命令总结
windows系统命令总结 IIS管理器:inetmgr SQL server数据库管理器:ssms windows服务:services.msc
- Struts2核心技术简介
Struts2核心技术简介 使用Struts2框架,只要注重以下三大元素:配置文件.映射文件和Action: 全局属性文件struts.properties:保存系统运行的一些参数变量,整个系统只有一 ...
- OpenStack 行业正进入拓展期:行业云将成为新一轮工业革命的基础设施和引擎
一直在关注华为2016 Connect 大会,本来没票,后来找朋友搞到了一张,参加了大会第一天下午的会议,时间虽短,但非常有收获.本来出发前还带了纸和笔,但是到了现场才发现只带了笔记本,笔却丢下了,所 ...
- Redis学习总结
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,其实当前最热门的NoSQL数据库之一,NoSQL还包括了Mem ...