C#+Arcengine---创建内存图层

分类:技术文档
2009-12-11 14:43阅读(1498)评论(0)

#region 在内存中创建图层
        /// <summary>
        /// 在内存中创建图层
        /// </summary>
        /// <param name="DataSetName">数据集名称</param>
        /// <param name="AliaseName">别名</param>
        /// <param name="SpatialRef">空间参考</param>
        /// <param name="GeometryType">几何类型</param>
        /// <param name="PropertyFields">属性字段集合</param>
        /// <returns>IfeatureLayer</returns>
        public static IFeatureLayer CreateFeatureLayerInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields)
        {
            IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
            ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);
            ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName;
            ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open();

IField oField = new FieldClass();
            IFields oFields = new FieldsClass();
            IFieldsEdit oFieldsEdit = null;
            IFieldEdit oFieldEdit = null;
            IFeatureClass oFeatureClass = null;
            IFeatureLayer oFeatureLayer = null;

try
            {
                oFieldsEdit = oFields as IFieldsEdit;
                oFieldEdit = oField as IFieldEdit;

for (int i = 0; i < PropertyFields.FieldCount; i++)
                {
                    oFieldsEdit.AddField(PropertyFields.get_Field(i));
                }

IGeometryDef geometryDef = new GeometryDefClass();
                IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
                geometryDefEdit.AvgNumPoints_2 = 5;
                geometryDefEdit.GeometryType_2 = GeometryType;
                geometryDefEdit.GridCount_2 = 1;
                geometryDefEdit.HasM_2 = false;
                geometryDefEdit.HasZ_2 = false;
                geometryDefEdit.SpatialReference_2 = SpatialRef;
                geometryDefEdit.SpatialReference_2 = new UnknownCoordinateSystemClass();//没有这一句就报错,说尝试读取或写入受保护的内存。
                geometryDefEdit.SpatialReference.SetDomain(-200, 200, -200, 200);//没有这句就抛异常来自HRESULT:0x8004120E。

oFieldEdit.Name_2 = "SHAPE";
                oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                oFieldEdit.GeometryDef_2 = geometryDef;
                oFieldEdit.IsNullable_2 = true;
                oFieldEdit.Required_2 = true;
                oFieldsEdit.AddField(oField);

oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                (oFeatureClass as IDataset).BrowseName = DataSetName;

oFeatureLayer = new FeatureLayerClass();
                oFeatureLayer.Name = AliaseName;
                oFeatureLayer.FeatureClass = oFeatureClass;
            }
            catch
            {
            }
            return oFeatureLayer;
        }

#endregion

下面就是根据采集的坐标点创建点内存图层:

IFeatureLayer pFeatureLayer = new FeatureLayerClass();
            IFieldsEdit curFileds = new FieldsClass();
            IFieldEdit curField = new FieldClass();
            curField = new FieldClass();
            curField.Name_2 = "名称";
            curField.Type_2 = esriFieldType.esriFieldTypeString;
            curFileds.AddField(curField);

curField = new FieldClass();
            curField.Name_2 = "经度";
            curField.Type_2 = esriFieldType.esriFieldTypeDouble;
            curFileds.AddField(curField);

curField = new FieldClass();
            curField.Name_2 = "纬度";
            curField.Type_2 = esriFieldType.esriFieldTypeDouble;
            curFileds.AddField(curField);

pFeatureLayer = CreateFeatureLayerInmemeory("Position", "采集点", new     UnknownCoordinateSystemClass(), esriGeometryType.esriGeometryPoint, curFileds as IFields);
            p_axMap.AddLayer(pFeatureLayer as ILayer);
            IFeatureCursor FeatureCursor;
            IFeature pFeature;
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
            pFeature = pFeatureClass.CreateFeature();
            IQueryFilter pQueryFilter = new QueryFilterClass();
            FeatureCursor = pFeatureClass.Search(pQueryFilter, true);
            pQueryFilter.WhereClause = null;
            pFeature = FeatureCursor.NextFeature();
            pFeature.set_Value(0, str1);
            pFeature.set_Value(1, x);
            pFeature.set_Value(2, y);
            IEnvelope pEnvelope = new EnvelopeClass();

//如果双击的对象是一个点,这样子才能够缩放到该点
            pEnvelope.PutCoords(0, 0, 0.3, 0.3);//确定envelope大小

IPoint xpoint = new PointClass();
            xpoint.PutCoords(x, y);

pFeature.Shape = xpoint;
            pFeature.Store();

//设置颜色
            IRgbColor pcolor = new RgbColorClass();

pcolor.Red = 255;

pcolor.Green = 0;

pcolor.Blue = 0;

//设置图形
            ISimpleMarkerSymbol psm = new SimpleMarkerSymbolClass();
            psm.Style = esriSimpleMarkerStyle.esriSMSCircle;
            psm.Size = 10;
            psm.Color = pcolor;

(pFeatureLayer as IFeatureSelection).SelectionSymbol = (ISymbol)psm;
            (pFeatureLayer as IFeatureSelection).SetSelectionSymbol = true;

(pFeatureLayer as IFeatureSelection).SelectionSet.Add(pFeature.OID);

pEnvelope.CenterAt(xpoint);//地图缩放到该点       
            p_axMap.Extent = pEnvelope;
            p_axMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, null);
            p_axMap.ActiveView.ScreenDisplay.UpdateWindow();

C# ArcEngine创建内存图层(转载)的更多相关文章

  1. AE开发使用内存图层

    AE开发中,有时需要从磁盘中读取一些文件信息如坐标点转为图层并进行分析,此过程并不需要坐标点入库之类的操作,就可以创建一个内存图层解决问题.创建内存图层需要用到InMemoryWorkspaceFac ...

  2. ArcEngine 创建线要素图层

    在创建要素图层的时候,默认的几何类型是Polygon: Dim objectClassDescription As IObjectClassDescription = New FeatureClass ...

  3. ArcEngine临时数据存储 创建内存工作空间

    参考网址,这里 工作中有时候需要使用临时数据,以前都是创建一个默认的shapefile或者gdb,今天发现esri官方帮助文档给出了一个方法,可以创建内存工作空间,代码如下: public stati ...

  4. 使用ZwMapViewOfSection创建内存映射文件总结

    标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...

  5. Java Object 对象创建的方式 [ 转载 ]

    Java Object 对象创建的方式 [ 转载 ] @author http://blog.csdn.net/mhmyqn/article/details/7943411 显式创建 有4种显式地创建 ...

  6. MAPINFO中利用GridMaker工具创建栅格图层

    在工作中需要使用栅格地图,以往都是由研发人员来创建,今天偶然发现Mapinfo中有GridMaker这样一个工具,结合网络搜索自己试了一下,居然做成功了,这里把步骤记录下来,方便以后查看. 1.首先在 ...

  7. 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...

  8. [转] arcgis Engine创建shp图层

    小生 原文 arcgis Engine创建shp图层 以创建点图层为例.首先要得到保存文件的地址. SaveFileDialog saveFileDialog = new SaveFileDialog ...

  9. ArcGIS 网络分析[8.6] 资料6 创建网络分析图层及进行路径分析

    基于上篇所介绍的内容,就说说如何利用访问到的网络数据集,在Map中添加网络数据集图层.创建网络分析图层中的路径图层,并执行路径分析示例.

随机推荐

  1. php的amqp扩展set导致内存溢出

    最近做的一个项目中需要用到rabbitmq,按照自己的之前的一篇文章http://www.cnblogs.com/mingaixin/archive/2012/10/28/2743807.html进行 ...

  2. Hadoop Browse the filesystem 无效处理

    当我们安装好并正常运行hdfs后输入http://xxxxxxxxx:50070会进入下图所示的页面. 其中Browse the filesystem 是查看文件系统的入口. 但是在发现这个链接一直无 ...

  3. cut

    cut是一个针对行的数据选取命令 SYNOPSIS cut [OPTION]... [FILE]... OPTION -b 以字节为单位进行分割,如果是多字节的话就需要注意了 -c 以字符为单位进行分 ...

  4. Android ANR分析

    1.发生anr时手机会生产traces文件 拉取trace文件:adb pull data/anr/traces.txt ./mytraces.txt 保存路径 参考

  5. UVA 11992 Fast Matrix Operations (二维线段树)

    解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...

  6. Spring AOP 注解和xml实现 --转载

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  7. Auto Clear Unity Console Log

    功能 可以在Editor模式下执行,当然也可以Runtime模式下执行,自动清除 Console的log信息 功能需求 当在制作Editor的一些功能时,常常需要手动的点击Console窗口的Clea ...

  8. Android ActionBarDrawerToggle、DrawerLayout、ActionBar 结合

    ActionBarDrawerToggle是一个开关,用于打开/关闭DrawerLayout抽屉 ActionBarDrawerToggle 提供了一个方便的方式来配合DrawerLayout和Act ...

  9. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  10. Windows server 2008系统基本优化

    前几天用上了Windows server 2008刚开始还真不习惯,毕竟是做服务器用的系统和娱乐操作系统有很大区别.先总结几点,以后慢慢更新 安装Win2008驱动: 大部分支持vista系统的驱动都 ...