视频图像处理系列索引 || Arcgis/Engine/Server开发索引 || Web Map Gis开发索引 || jquery表格组件 JQGrid索引
WPF MVVM模式开发实现简明教程索引 || ArcGIS Runtime WPF(.net C#)开发简明教程索引

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 

posted @ 2016-04-15 10:52  jhlong  阅读(753)  评论(0编辑  收藏  举报
海龙的博客 jhlong@cnblogs 版权所有© 转载请注明链接.有用请推荐一下
代码全部经过本人测试,但不保证复制粘贴就正常运行,更不保证能解决你的问题,请结合前后代码及描述理解后修改和使用