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