public static IFeatureClassName GetFeatureClassName(IFeatureDatasetName pFeatureDatasetName, string featureClassName) { IDatasetName pContainDSName; pContainDSName = (IDatasetName)pFeatureDatasetName; IEnumDatasetName pEnumDsName4FC = (IEnumDatasetName)pFeatureDatasetName.FeatureClassNames; IFeatureClassName pfeaClsName = (IFeatureClassName)pEnumDsName4FC.Next(); IDatasetName pFC_DSName; try { while (pfeaClsName != null) { pFC_DSName = (IDatasetName)pfeaClsName; if (pFC_DSName.Name == featureClassName) { return(pfeaClsName); } pfeaClsName = (IFeatureClassName)pEnumDsName4FC.Next(); } } catch { } return(null); }
IEnumInvalidObject ESRI.ArcGIS.Geodatabase.IFeatureDataConverter2.ConvertFeatureClass( IDatasetName idatasetName_0, IQueryFilter iqueryFilter_0, ISelectionSet iselectionSet_0, IFeatureDatasetName ifeatureDatasetName_0, IFeatureClassName ifeatureClassName_0, IGeometryDef igeometryDef_0, IFields ifields_0, string string_0, int int_0, int int_1) { return(null); }
/// 获得个人地理数据库中要素类的名称 /// </summary> /// <param name="pAccessWorkSpace">个人地理数据库工作空间</param> /// <returns pArrayFeatureClassName>个人地理数据库中要素类的名称</returns> public static IArray GetFeactureClassName_From_AccessWorkSpace(IWorkspace pAccessWorkSpace) { IArray pArrayFeatureClassName = new ArrayClass(); //遍历直接位于地理数据库下的要素类FeatureClass IEnumDatasetName enumDatasetName = ((IWorkspace)pAccessWorkSpace).get_DatasetNames(esriDatasetType.esriDTFeatureClass); IDatasetName datasetName = enumDatasetName.Next(); while (datasetName != null) { pArrayFeatureClassName.Add(datasetName.Name.ToString()); datasetName = enumDatasetName.Next();//推进器 } //遍历位于地理数据库数据集featuredataset下的要素类 enumDatasetName = ((IWorkspace)pAccessWorkSpace).get_DatasetNames(esriDatasetType.esriDTFeatureDataset); datasetName = enumDatasetName.Next(); while (datasetName != null) { IFeatureDatasetName featureDatasetName = (IFeatureDatasetName)datasetName; IEnumDatasetName enumDatasetNameFC = featureDatasetName.FeatureClassNames; IDatasetName datasetNameFC = enumDatasetNameFC.Next(); while (datasetNameFC != null) { pArrayFeatureClassName.Add(datasetNameFC.Name.ToString()); datasetNameFC = enumDatasetNameFC.Next();//推进器 } datasetName = enumDatasetName.Next(); } return(pArrayFeatureClassName); }
public IList <FeatureName> get_FeatureDataSetNames() //遍历矢量要素集 { IList <FeatureName> names = new List <FeatureName>(); if (this.m_workSpace != null) { IFeatureClass feaClass; IEnumDatasetName enumDatasetName = m_workSpace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset); IDatasetName datasetName = enumDatasetName.Next();//DataSet的名字 while (datasetName != null) { FeatureName name = new FeatureName(); name.FeatDSName = datasetName.Name.ToString(); IFeatureDatasetName featureDatasetName = (IFeatureDatasetName)datasetName; IEnumDatasetName enumDatasetNameFC = featureDatasetName.FeatureClassNames; //是FeatureClass的名字集合 IDatasetName datasetNameFC = enumDatasetNameFC.Next(); while (datasetNameFC != null) { //添加FeatureClass的名字 name.FCName.Add(datasetNameFC.Name.ToString()); feaClass = ((IFeatureWorkspace)m_workSpace).OpenFeatureClass(datasetNameFC.Name.ToString()); name.ShapType.Add(feaClass.ShapeType); name.FeatureType.Add(feaClass.FeatureType); datasetNameFC = enumDatasetNameFC.Next(); } names.Add(name); datasetName = enumDatasetName.Next(); } } return(names); }
public static bool DeleteFeatureDataset(IWorkspace ws, string name) { if (ws == null || string.IsNullOrEmpty(name)) { return(false); } try { var pFeaWorkspace = ws as IFeatureWorkspace; var pEnumDatasetName = ws.DatasetNames[esriDatasetType.esriDTAny]; pEnumDatasetName.Reset(); var pDatasetName = pEnumDatasetName.Next(); while (pDatasetName != null) { if (pDatasetName.Type == esriDatasetType.esriDTFeatureDataset) { //如果是要素集,则对要素集内的要素类进行查找 IFeatureDatasetName featureDatasetName = pDatasetName as IFeatureDatasetName; if (featureDatasetName != null) { IEnumDatasetName pEnumFcName = featureDatasetName.FeatureClassNames; IDatasetName pFcName; while ((pFcName = pEnumFcName.Next()) != null) { if (pFcName.Name.IndexOf(name, StringComparison.Ordinal) >= 0) { DeleteByName(pFeaWorkspace, pFcName); return(true); } } } } else { if (pDatasetName.Name.IndexOf(name, StringComparison.Ordinal) >= 0) { DeleteByName(pFeaWorkspace, pDatasetName); return(true); } } pDatasetName = pEnumDatasetName.Next(); } return(true); } catch (Exception ex) { return(false); } }
/// <summary> /// Gets feature class names in the given feature dataset. Right now it only works with the /// following esriGeometryType values: esriGeometryPoint, esriGeometryPolyline, /// esriGeometryPolygon, esriGeometryAny (point, line, polygon). /// </summary> /// <param name="geomType">geometry type to get</param> /// <param name="fdsName">IFeatureDatasetName corresponding to the feature dataset to get /// feature classes in</param> /// <returns>list of IDatasetName objects for the feature classes</returns> public static List <IDatasetName> GetFeatureClassNames(esriGeometryType geomType, IFeatureDatasetName fdsName) { List <IDatasetName> outDsNames = new List <IDatasetName>(); IEnumDatasetName dsNamesFc = fdsName.FeatureClassNames; IDatasetName dsNameFc = dsNamesFc.Next(); while (dsNameFc != null) { if (CheckGeometryType(geomType, ((IFeatureClassName)dsNameFc).ShapeType)) { outDsNames.Add(dsNameFc); } dsNameFc = dsNamesFc.Next(); } return(outDsNames); }
//从数据库中读取数据 //遍历选择的featureclass public void Read_EntitiesFromDatabase() { string layerName; IName pName; IFeatureClassName pFcn; IFeatureClass pFC; //默认的输入图层与输出图层名字一样 //需要修改的时候与对照表对照 for (int i = 0; i < inputDs.Count; i++) { IDatasetName datasetName = inputDs.get_Item(i); //feactureclass if (datasetName.Type == esriDatasetType.esriDTFeatureClass) { pFcn = (IFeatureClassName)datasetName; pName = (IName)pFcn; pFC = (IFeatureClass)pName.Open(); layerName = datasetName.Name; Read_Entity_0(pFC, layerName); } //dataset if (datasetName.Type == esriDatasetType.esriDTFeatureDataset) { IFeatureDatasetName featureDatasetName = (IFeatureDatasetName)datasetName; IEnumDatasetName enumDatasetNameFC = featureDatasetName.FeatureClassNames; IDatasetName datasetNameFC = enumDatasetNameFC.Next(); while (datasetNameFC != null) { IFeatureClassName featureClassName = (IFeatureClassName)datasetNameFC; pName = (IName)featureClassName; pFC = (IFeatureClass)pName.Open(); layerName = datasetNameFC.Name; Read_Entity_0(pFC, layerName); datasetNameFC = enumDatasetNameFC.Next(); } } } }
public static bool ConvertFeatureClassToFeatureDataset(IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureClass, string nameOfTargetFeatureClass, IFeatureDatasetName pName) { try { //create source workspace name IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace; IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName; //create source dataset name IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass(); IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName; sourceDatasetName.WorkspaceName = sourceWorkspaceName; sourceDatasetName.Name = nameOfSourceFeatureClass; //create target workspace name IDataset targetWorkspaceDataset = (IDataset)targetWorkspace; IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName; //create target dataset name IFeatureClassName targetFeatureClassName = new FeatureClassNameClass(); IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName; targetDatasetName.WorkspaceName = targetWorkspaceName; targetDatasetName.Name = nameOfTargetFeatureClass; //Open input Featureclass to get field definitions. ESRI.ArcGIS.esriSystem.IName sourceName = (ESRI.ArcGIS.esriSystem.IName)sourceFeatureClassName; IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open(); //Validate the field names because you are converting between different workspace types. IFieldChecker fieldChecker = new FieldCheckerClass(); IFields targetFeatureClassFields; IFields sourceFeatureClassFields = sourceFeatureClass.Fields; IEnumFieldError enumFieldError; // Most importantly set the input and validate workspaces! fieldChecker.InputWorkspace = sourceWorkspace; fieldChecker.ValidateWorkspace = targetWorkspace; fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields); // Loop through the output fields to find the geomerty field IField geometryField; for (int i = 0; i < targetFeatureClassFields.FieldCount; i++) { if (targetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry) { geometryField = targetFeatureClassFields.get_Field(i); // Get the geometry field's geometry defenition IGeometryDef geometryDef = geometryField.GeometryDef; //Give the geometry definition a spatial index grid count and grid size IGeometryDefEdit targetFCGeoDefEdit = (IGeometryDefEdit)geometryDef; targetFCGeoDefEdit.GridCount_2 = 1; targetFCGeoDefEdit.set_GridSize(0, 0); //Allow ArcGIS to determine a valid grid size for the data loaded targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference; // we want to convert all of the features IQueryFilter queryFilter = new QueryFilterClass(); queryFilter.WhereClause = ""; // Load the feature class IFeatureDataConverter fctofc = new FeatureDataConverterClass(); IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, pName, targetFeatureClassName, geometryDef, targetFeatureClassFields, "", 1000, 0); break; } } return(true); } catch (Exception ex) { return(false); } }
/// <summary> /// 保存输出JointCount>1的点位图层 /// </summary> /// <param name="apFeatureClass"></param> public void ExportFeatureClassToShp(IFeatureClass apFeatureClass) { if (apFeatureClass == null) { MessageBox.Show("请选择", "系统提示"); return; } //调用保存文件函数 SaveFileDialog sa = new SaveFileDialog(); sa.Filter = "SHP文件(.shp)|*.shp"; sa.ShowDialog(); sa.CreatePrompt = true; string ExportShapeFileName = sa.FileName; // string StrFilter = "SHP文件(.shp)|*.shp"; // string ExportShapeFileName = SaveFileDialog(StrFilter); if (ExportShapeFileName == "") { return; } string ExportFileShortName = System.IO.Path.GetFileNameWithoutExtension(ExportShapeFileName); string ExportFilePath = System.IO.Path.GetDirectoryName(ExportShapeFileName); shpPath = ExportFilePath + "\\" + ExportFileShortName + "\\" + ExportFileShortName + ".shp"; //设置导出要素类的参数 IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass(); IDataset pOutDataset = (IDataset)apFeatureClass; pOutFeatureClassName = (IFeatureClassName)pOutDataset.FullName; //创建一个输出shp文件的工作空间 IWorkspaceFactory pShpWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); IWorkspaceName pInWorkspaceName = new WorkspaceNameClass(); pInWorkspaceName = pShpWorkspaceFactory.Create(ExportFilePath, ExportFileShortName, null, 0); //创建一个要素集合 IFeatureDatasetName pInFeatureDatasetName = null; //创建一个要素类 IFeatureClassName pInFeatureClassName = new FeatureClassNameClass(); IDatasetName pInDatasetClassName; pInDatasetClassName = (IDatasetName)pInFeatureClassName; pInDatasetClassName.Name = ExportFileShortName;//作为输出参数 pInDatasetClassName.WorkspaceName = pInWorkspaceName; //通过FIELDCHECKER检查字段的合法性,为输出SHP获得字段集合 long iCounter; IFields pOutFields, pInFields; IFieldChecker pFieldChecker; IField pGeoField; IEnumFieldError pEnumFieldError = null; pInFields = apFeatureClass.Fields; pFieldChecker = new FieldChecker(); pFieldChecker.Validate(pInFields, out pEnumFieldError, out pOutFields); //通过循环查找几何字段 pGeoField = null; for (iCounter = 0; iCounter < pOutFields.FieldCount; iCounter++) { if (pOutFields.get_Field((int)iCounter).Type == esriFieldType.esriFieldTypeGeometry) { pGeoField = pOutFields.get_Field((int)iCounter); break; } } //得到几何字段的几何定义 IGeometryDef pOutGeometryDef; IGeometryDefEdit pOutGeometryDefEdit; pOutGeometryDef = pGeoField.GeometryDef; //设置几何字段的空间参考和网格 pOutGeometryDefEdit = (IGeometryDefEdit)pOutGeometryDef; pOutGeometryDefEdit.GridCount_2 = 1; pOutGeometryDefEdit.set_GridSize(0, 1500000); try { //开始导入 IFeatureDataConverter pShpToClsConverter = new FeatureDataConverterClass(); pShpToClsConverter.ConvertFeatureClass(pOutFeatureClassName, null, pInFeatureDatasetName, pInFeatureClassName, pOutGeometryDef, pOutFields, "", 1000, 0); MessageBox.Show("导出成功", "系统提示"); } catch (Exception ex) { MessageBox.Show("the following exception occurred:" + ex.ToString()); } }
public void Execute(IArray paramvalues, ITrackCancel trackcancel, IGPEnvironmentManager envMgr, IGPMessages message) { // Get Parameters IGPParameter3 inputParameter = (IGPParameter3)paramvalues.get_Element(0); IGPParameter3 polygonParameter = (IGPParameter3)paramvalues.get_Element(1); IGPParameter3 outputParameter = (IGPParameter3)paramvalues.get_Element(2); IGPParameter3 fieldParameter = (IGPParameter3)paramvalues.get_Element(3); // UnPackGPValue. This ensures you get the value from either the dataelement or GpVariable (ModelBuilder) IGPValue inputParameterValue = m_GPUtilities.UnpackGPValue(inputParameter); IGPValue polygonParameterValue = m_GPUtilities.UnpackGPValue(polygonParameter); IGPValue outputParameterValue = m_GPUtilities.UnpackGPValue(outputParameter); IGPValue fieldParameterValue = m_GPUtilities.UnpackGPValue(fieldParameter); // Decode Input Feature Layers IFeatureClass inputFeatureClass; IFeatureClass polygonFeatureClass; IQueryFilter inputFeatureClassQF; IQueryFilter polygonFeatureClassQF; m_GPUtilities.DecodeFeatureLayer(inputParameterValue, out inputFeatureClass, out inputFeatureClassQF); m_GPUtilities.DecodeFeatureLayer(polygonParameterValue, out polygonFeatureClass, out polygonFeatureClassQF); if (inputFeatureClass == null) { message.AddError(2, "Could not open input dataset."); return; } if (polygonFeatureClass == null) { message.AddError(2, "Could not open clipping polygon dataset."); return; } if (polygonFeatureClass.FeatureCount(null) > 1) { message.AddWarning("Clipping polygon feature class contains more than one feature."); } // Create the Geoprocessor Geoprocessor gp = new Geoprocessor(); // Create Output Polygon Feature Class CreateFeatureclass cfc = new CreateFeatureclass(); IName name = m_GPUtilities.CreateFeatureClassName(outputParameterValue.GetAsText()); IDatasetName dsName = name as IDatasetName; IFeatureClassName fcName = dsName as IFeatureClassName; IFeatureDatasetName fdsName = fcName.FeatureDatasetName as IFeatureDatasetName; // Check if output is in a FeatureDataset or not. Set the output path parameter for CreateFeatureClass tool. if (fdsName != null) { cfc.out_path = fdsName; } else { cfc.out_path = dsName.WorkspaceName.PathName; } // Set the output Coordinate System for CreateFeatureClass tool. // ISpatialReference3 sr = null; IGPEnvironment env = envMgr.FindEnvironment("outputCoordinateSystem"); // Same as Input if (env.Value.IsEmpty()) { IGeoDataset ds = inputFeatureClass as IGeoDataset; cfc.spatial_reference = ds.SpatialReference as ISpatialReference3; } // Use the environment setting else { IGPCoordinateSystem cs = env.Value as IGPCoordinateSystem; cfc.spatial_reference = cs.SpatialReference as ISpatialReference3; } // Remaining properties for Create Feature Class Tool cfc.out_name = dsName.Name; cfc.geometry_type = "POLYGON"; // Execute Geoprocessor gp.Execute(cfc, null); // Get Unique Field int iField = inputFeatureClass.FindField(fieldParameterValue.GetAsText()); IField uniqueField = inputFeatureClass.Fields.get_Field(iField); // Extract Clipping Polygon Geometry IFeature polygonFeature = polygonFeatureClass.GetFeature(0); IPolygon clippingPolygon = (IPolygon)polygonFeature.Shape; // Spatial Filter ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = polygonFeature.ShapeCopy; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; // Debug Message message.AddMessage("Generating TIN..."); // Create TIN ITinEdit tinEdit = new TinClass(); // Advanced TIN Functions ITinAdvanced2 tinAdv = (ITinAdvanced2)tinEdit; try { // Initialize New TIN IGeoDataset gds = inputFeatureClass as IGeoDataset; tinEdit.InitNew(gds.Extent); // Add Mass Points to TIN tinEdit.StartEditing(); tinEdit.AddFromFeatureClass(inputFeatureClass, spatialFilter, uniqueField, uniqueField, esriTinSurfaceType.esriTinMassPoint); tinEdit.Refresh(); // Get TIN Nodes ITinNodeCollection tinNodeCollection = (ITinNodeCollection)tinEdit; // Report Node Count message.AddMessage("Input Node Count: " + inputFeatureClass.FeatureCount(null).ToString()); message.AddMessage("TIN Node Count: " + tinNodeCollection.NodeCount.ToString()); // Open Output Feature Class IFeatureClass outputFeatureClass = m_GPUtilities.OpenFeatureClassFromString(outputParameterValue.GetAsText()); // Debug Message message.AddMessage("Generating Polygons..."); // Create Voronoi Polygons tinNodeCollection.ConvertToVoronoiRegions(outputFeatureClass, null, clippingPolygon, "", ""); // Release COM Objects tinEdit.StopEditing(false); System.Runtime.InteropServices.Marshal.ReleaseComObject(tinNodeCollection); System.Runtime.InteropServices.Marshal.ReleaseComObject(tinEdit); } catch (Exception ex) { message.AddError(2, ex.Message); } }
public void CreateGeometricNetwork(IWorkspace _pWorkspace, IFeatureDatasetName _pFeatureDatasetName,String _pGeometricName) { INetworkLoader2 pNetworkLoader = new NetworkLoaderClass(); // 网络的名称 pNetworkLoader.NetworkName = _pGeometricName; // 网络的类型 pNetworkLoader.NetworkType = esriNetworkType.esriNTUtilityNetwork; // Set the containing feature dataset. pNetworkLoader.FeatureDatasetName = (IDatasetName)_pFeatureDatasetName; // 检查要建立几何网络的数据,每一个要素只能参与一个网络 if (pNetworkLoader.CanUseFeatureClass("PrimaryLine") == esriNetworkLoaderFeatureClassCheck.esriNLFCCValid) { pNetworkLoader.AddFeatureClass("PrimaryLine", esriFeatureType.esriFTComplexEdge, null, false); } if (pNetworkLoader.CanUseFeatureClass("Feeder") == esriNetworkLoaderFeatureClassCheck.esriNLFCCValid) { pNetworkLoader.AddFeatureClass("Feeder", esriFeatureType.esriFTSimpleJunction, null, false); } // 我的数据中没有enable字段,所以,用了false,如果用true的话,就要进行相关的设置 INetworkLoaderProps pNetworkLoaderProps = (INetworkLoaderProps)pNetworkLoader; pNetworkLoader.PreserveEnabledValues = false; // Set the ancillary role field for the Feeder class. String defaultAncillaryRoleFieldName = pNetworkLoaderProps.DefaultAncillaryRoleField; esriNetworkLoaderFieldCheck ancillaryRoleFieldCheck = pNetworkLoader.CheckAncillaryRoleField("Feeder", defaultAncillaryRoleFieldName); switch (ancillaryRoleFieldCheck) { case esriNetworkLoaderFieldCheck.esriNLFCValid: case esriNetworkLoaderFieldCheck.esriNLFCNotFound: pNetworkLoader.PutAncillaryRole("Feeder", esriNetworkClassAncillaryRole.esriNCARSourceSink, defaultAncillaryRoleFieldName); break; default: Console.WriteLine( "The field {0} could not be used as an ancillary role field.", defaultAncillaryRoleFieldName); break; } pNetworkLoader.SnapTolerance = 0.02; // 给几何网络添加权重 pNetworkLoader.AddWeight("Weight", esriWeightType.esriWTDouble, 0); // 将权重和PrimaryLine数据中的SHAPE_Length字段关联 pNetworkLoader.AddWeightAssociation("Weight", "PrimaryLine", "SHAPE_Length"); // 构建网络 pNetworkLoader.LoadNetwork(); }
public static void Project(IFeatureClass ifeatureClass_0, ISpatialReference ispatialReference_0, IFeatureDatasetName ifeatureDatasetName_0, string string_0, double double_0) { string str2; double num3; double num4; double num5; double num6; IEnumFieldError error; IFields fields2; IWorkspace workspace = ((IDataset)ifeatureClass_0).Workspace; IFeatureDataConverter converter = new FeatureDataConverterClass(); IWorkspaceName name = new WorkspaceNameClass { ConnectionProperties = workspace.ConnectionProperties, WorkspaceFactoryProgID = workspace.WorkspaceFactory.GetClassID().Value.ToString() }; IWorkspaceName workspaceName = (ifeatureDatasetName_0 as IDatasetName).WorkspaceName; IDatasetName name3 = new FeatureClassNameClass(); string aliasName = ifeatureClass_0.AliasName; int index = aliasName.LastIndexOf("."); if (index != -1) { aliasName = aliasName.Substring(index + 1); } name3.Name = aliasName; name3.WorkspaceName = name; IWorkspace2 workspace2 = (workspaceName as IName).Open() as IWorkspace2; IDatasetName name4 = new FeatureClassNameClass { WorkspaceName = workspaceName }; (name4 as IFeatureClassName).FeatureDatasetName = ifeatureDatasetName_0 as IDatasetName; IFieldChecker checker = new FieldCheckerClass { ValidateWorkspace = workspace2 as IWorkspace }; string[] strArray = string_0.Split(new char[] { '.' }); string_0 = strArray[strArray.Length - 1] + "_Project"; checker.ValidateTableName(string_0, out str2); string str3 = str2; int num2 = 1; if ((workspaceName.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) || (workspaceName.Type == esriWorkspaceType.esriLocalDatabaseWorkspace)) { while (workspace2.get_NameExists(esriDatasetType.esriDTFeatureClass, str3)) { str3 = str2 + "_" + num2.ToString(); num2++; } } else if (workspaceName.Type == esriWorkspaceType.esriFileSystemWorkspace) { while (File.Exists(str3 + ".shp")) { str3 = str2 + "_" + num2.ToString(); num2++; } } name4.Name = str3; IFields inputField = new FieldsClass(); index = ifeatureClass_0.Fields.FindField(ifeatureClass_0.ShapeFieldName); IField field = ifeatureClass_0.Fields.get_Field(index); IGeometryDef geometryDef = field.GeometryDef; ISpatialReference spatialReference = geometryDef.SpatialReference; ispatialReference_0.GetDomain(out num3, out num4, out num5, out num6); ((IGeometryDefEdit)geometryDef).GridCount_2 = 1; ((IGeometryDefEdit)geometryDef).set_GridSize(0, double_0); ((IGeometryDefEdit)geometryDef).SpatialReference_2 = ispatialReference_0; ((IFieldEdit)field).GeometryDef_2 = geometryDef; for (int i = 0; i < ifeatureClass_0.Fields.FieldCount; i++) { if (i == index) { ((IFieldsEdit)inputField).AddField(field); } else { IField field2 = ifeatureClass_0.Fields.get_Field(i); ((IFieldsEdit)inputField).AddField(field2); } } checker.Validate(inputField, out error, out fields2); if (m_pfrm != null) { m_pfrm.FeatureProgress = converter; } try { converter.ConvertFeatureClass((IFeatureClassName)name3, null, ifeatureDatasetName_0, (IFeatureClassName)name4, geometryDef, fields2, "", 1000, 0); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
public IEnumInvalidObject ConvertFeatureClass(IFeatureClassName ifeatureClassName_0, IQueryFilter iqueryFilter_0, IFeatureDatasetName ifeatureDatasetName_0, IFeatureClassName ifeatureClassName_1, IGeometryDef igeometryDef_0, IFields ifields_0, string string_0, int int_0, int int_1) { IEnumFieldError enumFieldError; IFields field; string str; IEnumInvalidObject enumInvalidObject = null; IFieldChecker fieldCheckerClass = new FieldChecker(); IWorkspaceName workspaceName = null; workspaceName = (ifeatureDatasetName_0 == null ? (ifeatureClassName_1 as IDatasetName).WorkspaceName : (ifeatureDatasetName_0 as IDatasetName).WorkspaceName); IWorkspace workspace = (workspaceName as IName).Open() as IWorkspace; fieldCheckerClass.ValidateWorkspace = workspace; fieldCheckerClass.Validate(ifields_0, out enumFieldError, out field); string name = (ifeatureClassName_1 as IDatasetName).Name; fieldCheckerClass.ValidateTableName(name, out str); name = str; IField field1 = null; int num = 0; while (true) { if (num >= field.FieldCount) { break; } else if (field.Field[num].Type == esriFieldType.esriFieldTypeGeometry) { field1 = field.Field[num]; break; } else { num++; } } IFeatureClass featureClass = null; if (ifeatureDatasetName_0 == null) { featureClass = (workspace as IFeatureWorkspace).CreateFeatureClass(name, field, null, null, esriFeatureType.esriFTSimple, field1.Name, string_0); } else { IFeatureDataset featureDataset = (ifeatureDatasetName_0 as IName).Open() as IFeatureDataset; featureClass = featureDataset.CreateFeatureClass(name, field, null, null, esriFeatureType.esriFTSimple, field1.Name, string_0); } IFeatureClass featureClass1 = (ifeatureClassName_0 as IName).Open() as IFeatureClass; IFeatureCursor featureCursor = featureClass1.Search(iqueryFilter_0, false); IFeature feature = featureCursor.NextFeature(); int num1 = 0; IFeatureCursor featureCursor1 = featureClass.Insert(true); while (feature != null) { IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer(); if (feature.Shape != null) { try { this.method_0(featureCursor1, featureBuffer, field, feature); } catch (Exception exception) { Logger.Current.Error("", exception, ""); } } num1++; if (num1 == int_0) { num1 = 0; featureCursor1.Flush(); } feature = featureCursor.NextFeature(); if (this.ifeatureProgress_StepEventHandler_0 == null) { continue; } this.ifeatureProgress_StepEventHandler_0(); } if (num1 > 0) { featureCursor1.Flush(); } ComReleaser.ReleaseCOMObject(featureCursor); ComReleaser.ReleaseCOMObject(featureCursor1); return(enumInvalidObject); }
/// <summary> /// 导出Shp文件 /// </summary> /// <param name="path"></param> /// <param name="apFeatureClass"></param> /// <returns></returns> public static bool ExportFeatureClassToShp(string path, IFeatureClass apFeatureClass) { try { string exportFileShortName = System.IO.Path.GetFileNameWithoutExtension(path); if (exportFileShortName == "") { exportFileShortName = (apFeatureClass as IDataset).Name; if (exportFileShortName.LastIndexOf('.') >= 0) { exportFileShortName = exportFileShortName.Substring(exportFileShortName.LastIndexOf('.') + 1); } } string exportFilePath = System.IO.Path.GetDirectoryName(path); if (exportFilePath == null) { exportFilePath = path; } //设置导出要素类的参数 IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass(); IDataset pOutDataset = (IDataset)apFeatureClass; pOutFeatureClassName = (IFeatureClassName)pOutDataset.FullName; //创建一个输出shp文件的工作空间 IWorkspaceFactory pShpWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); IWorkspaceName pInWorkspaceName = new WorkspaceNameClass(); pInWorkspaceName = pShpWorkspaceFactory.Create(exportFilePath, exportFileShortName, null, 0); //创建一个要素集合 IFeatureDatasetName pInFeatureDatasetName = null; //创建一个要素类 IFeatureClassName pInFeatureClassName = new FeatureClassNameClass(); IDatasetName pInDatasetClassName; pInDatasetClassName = (IDatasetName)pInFeatureClassName; pInDatasetClassName.Name = exportFileShortName; pInDatasetClassName.WorkspaceName = pInWorkspaceName; //通过FIELDCHECKER检查字段的合法性,为输出SHP获得字段集合 IFields pInFields = apFeatureClass.Fields; pInFields = apFeatureClass.Fields; IFieldChecker pFieldChecker = new FieldChecker(); pFieldChecker.Validate(pInFields, out IEnumFieldError pEnumFieldError, out IFields pOutFields); //通过循环查找几何字段 IField pGeoField = null; for (long iCounter = 0; iCounter < pOutFields.FieldCount; iCounter++) { if (pOutFields.get_Field((int)iCounter).Type == esriFieldType.esriFieldTypeGeometry) { pGeoField = pOutFields.get_Field((int)iCounter); break; } } //得到几何字段的几何定义 IGeometryDef pOutGeometryDef; IGeometryDefEdit pOutGeometryDefEdit; pOutGeometryDef = pGeoField.GeometryDef; //设置几何字段的空间参考和网格 pOutGeometryDefEdit = (IGeometryDefEdit)pOutGeometryDef; pOutGeometryDefEdit.GridCount_2 = 1; pOutGeometryDefEdit.set_GridSize(0, 1500000); //开始导入 IFeatureDataConverter pShpToClsConverter = new FeatureDataConverterClass(); pShpToClsConverter.ConvertFeatureClass(pOutFeatureClassName, null, pInFeatureDatasetName, pInFeatureClassName, pOutGeometryDef, pOutFields, "", 1000, 0); return(true); } catch (Exception ex) { return(false); } }
public static Dictionary <int, KeyValuePair <string, IEnumInvalidObject> > TransferMapDataWithinExtents(IMap map, IFeatureWorkspace outputWorkspace, IFeatureDatasetName outputFeatureDatasetName, ESRI.ArcGIS.ADF.Web.Geometry.Envelope downloadDataExtent, ISpatialReference outputSpatialReference) { Dictionary <int, KeyValuePair <string, IEnumInvalidObject> > invalidObjects = new Dictionary <int, KeyValuePair <string, IEnumInvalidObject> >(); IWorkspaceName outWorkspaceName = GeodatabaseUtil.GetWorkspaceName((IWorkspace)outputWorkspace); List <IFeatureLayer> featureLayers = GetFeatureLayers(map); int counter = 0; foreach (IFeatureLayer featureLayer in featureLayers) { IFeatureClass inFeatureClass = featureLayer.FeatureClass; IDataset dataset = (IDataset)inFeatureClass; IFeatureWorkspace inFeatureWorkspace = (IFeatureWorkspace)dataset.Workspace; IEnvelope env = new ESRI.ArcGIS.Geometry.EnvelopeClass(); env.XMin = downloadDataExtent.XMin; env.YMin = downloadDataExtent.YMin; env.XMax = downloadDataExtent.XMax; env.YMax = downloadDataExtent.YMax; ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = env; spatialFilter.GeometryField = inFeatureClass.ShapeFieldName; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; IFeatureClassName outputFeatureClassName = GeodatabaseUtil.GetFeatureClassName(outWorkspaceName, dataset.Name); IEnumInvalidObject eInvalidObject = TransferData(inFeatureWorkspace, inFeatureClass, outputWorkspace, outputFeatureClassName, outputFeatureDatasetName, spatialFilter, outputSpatialReference); invalidObjects.Add(counter, new KeyValuePair <string, IEnumInvalidObject>(dataset.Name, eInvalidObject)); counter++; } return(invalidObjects); }
/// <summary> /// Transfers data from an input FeatureClass to an output FeatureClass with data filtered with the specified query filter. /// </summary> /// <param name="inputWorkspace">The input workspace.</param> /// <param name="inputFeatureClassName">Name of the input feature class.</param> /// <param name="outputWorkspace">The output workspace.</param> /// <param name="outputFeatureClassName">Name of the output feature class.</param> /// <param name="outputFeatureDatasetName">The output FeatureDataset</param> /// <param name="queryFilter">The query filter used to filter data to be transfered.</param> public static IEnumInvalidObject TransferData(IFeatureWorkspace inputWorkspace, IFeatureClass inputFeatureClass, IFeatureWorkspace outputWorkspace, IFeatureClassName outputFeatureClassName, IFeatureDatasetName outputFeatureDatasetName, IQueryFilter queryFilter, ISpatialReference outputSpatialReference) { if (inputWorkspace == null) { throw new ArgumentNullException("A valid input feature workspace reference [inputWorkspace] is required."); } if (inputFeatureClass == null) { throw new ArgumentNullException("A valid input featureclass [inputFeatureClass] is required."); } if (outputWorkspace == null) { throw new ArgumentNullException("A valid output feature workspace reference [outputWorkspace] is required."); } if (outputFeatureClassName == null) { throw new ArgumentNullException("A valid output featureclass name reference [outputFeatureClassName] is required."); } IDataset dataset = (IDataset)inputFeatureClass; IFeatureClassName inputFeatureClassName = (IFeatureClassName)dataset.FullName; IEnumFieldError error = null; IFields outFields = null; IFields inFields = inputFeatureClass.Fields; FieldCheckerClass fieldChecker = new FieldCheckerClass(); fieldChecker.InputWorkspace = (IWorkspace)inputWorkspace; fieldChecker.ValidateWorkspace = (IWorkspace)outputWorkspace; fieldChecker.Validate(inFields, out error, out outFields); IField shapeField = null; for (int i = 0; i < outFields.FieldCount; i++) { if (outFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry) { shapeField = outFields.get_Field(i); break; } } IGeometryDef shapeGeoDef = shapeField.GeometryDef; IGeometryDefEdit shapeGeoDefEdit = shapeGeoDef as IGeometryDefEdit; shapeGeoDefEdit.GridCount_2 = 1; shapeGeoDefEdit.set_GridSize(0, DefaultIndexGrid(ref inputFeatureClass)); shapeGeoDefEdit.SpatialReference_2 = outputSpatialReference; FeatureDataConverterClass fdc = new FeatureDataConverterClass(); return(fdc.ConvertFeatureClass(inputFeatureClassName, queryFilter, outputFeatureDatasetName, outputFeatureClassName, shapeGeoDefEdit, outFields, "", 1000, 0)); }
/// <summary> /// 复制导入要素(ConvertFeatureDataset) /// </summary> /// <param name="pDataSet"></param> /// <param name="strFeatFileDir"></param> /// <param name="strFeatFileName"></param> /// <param name="strOutName"></param> /// <param name="isWorkspace"></param> public void FeatureClassToFeatureClass(IDataset pDataSet, string strFeatFileDir, string strFeatFileName, string strOutName, bool isWorkspace) { try { IWorkspaceFactory pWSF = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass(); IFeatureWorkspace pFeatureWK = (IFeatureWorkspace)pWSF.OpenFromFile(strFeatFileDir, 0); IFeatureClass pInFeatureClass = pFeatureWK.OpenFeatureClass(strFeatFileName); if (pInFeatureClass == null || pDataSet == null) { MessageBox.Show("创建失败"); return; } IFeatureClassName pInFeatureclassName; IDataset pIndataset = (IDataset)pInFeatureClass; pInFeatureclassName = (IFeatureClassName)pIndataset.FullName; //如果名称已存在 IWorkspace2 pWS2 = null; if (isWorkspace) { pWS2 = pDataSet as IWorkspace2; } else { pWS2 = pDataSet.Workspace as IWorkspace2; } if (pWS2.get_NameExists(esriDatasetType.esriDTFeatureClass, strOutName)) { MessageBoxResult result = MessageBox.Show(null, "矢量文件名 " + strOutName + " 在数据库中已存在!" + "/r是否覆盖?", "相同文件名", MessageBoxButton.YesNo, MessageBoxImage.Information, MessageBoxResult.Yes); //覆盖原矢量要素 if (result == MessageBoxResult.Yes) { IFeatureWorkspace pFWS = (IFeatureWorkspace)pWS2; IDataset pDataset = pFWS.OpenFeatureClass(strOutName) as IDataset; pDataset.Delete(); pDataset = null; } } IFields pInFields, pOutFields; IFieldChecker pFieldChecker = new FieldCheckerClass(); IEnumFieldError pError; pInFields = pInFeatureClass.Fields; pFieldChecker.Validate(pInFields, out pError, out pOutFields); IField geoField = null; for (int i = 0; i < pOutFields.FieldCount; i++) { IField pField = pOutFields.get_Field(i); if (pField.Type == esriFieldType.esriFieldTypeOID) { IFieldEdit pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = pField.AliasName; } if (pField.Type == esriFieldType.esriFieldTypeGeometry) { geoField = pField; break; } } IGeometryDef geometryDef = geoField.GeometryDef; IFeatureDataConverter one2another = new FeatureDataConverterClass(); IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass(); IDatasetName pOutDatasetName = (IDatasetName)pOutFeatureClassName; if (isWorkspace) { pOutDatasetName.WorkspaceName = (IWorkspaceName)pDataSet.FullName; } else { pOutDatasetName.WorkspaceName = (IWorkspaceName)((IDataset)pDataSet.Workspace).FullName; } pOutDatasetName.Name = strOutName; if (isWorkspace) { one2another.ConvertFeatureClass(pInFeatureclassName, null, null, pOutFeatureClassName, geometryDef, pOutFields, "", 1000, 0); } else { IFeatureDataset pFeatDS = (IFeatureDataset)pDataSet; IFeatureDatasetName pOutFeatDSName = pFeatDS.FullName as IFeatureDatasetName; one2another.ConvertFeatureClass(pInFeatureclassName, null, pOutFeatDSName, pOutFeatureClassName, geometryDef, pOutFields, "", 1000, 0); pOutFeatDSName = null; pFeatDS = null; } } catch (Exception ex) { MessageBox.Show(ex.Message); return; } }
public static void Project(IFeatureClass ifeatureClass_0, ISpatialReference ispatialReference_0, IFeatureDatasetName ifeatureDatasetName_0, string string_0, double double_0) { IWorkspace workspace = ((IDataset)ifeatureClass_0).Workspace; IFeatureDataConverter featureDataConverter = new FeatureDataConverter(); IWorkspaceName workspaceName = new WorkspaceName() as IWorkspaceName; workspaceName.ConnectionProperties = workspace.ConnectionProperties; workspaceName.WorkspaceFactoryProgID = workspace.WorkspaceFactory.GetClassID().Value.ToString(); IWorkspaceName workspaceName2 = (ifeatureDatasetName_0 as IDatasetName).WorkspaceName; IDatasetName datasetName = new FeatureClassName() as IDatasetName; string text = ifeatureClass_0.AliasName; int num = text.LastIndexOf("."); if (num != -1) { text = text.Substring(num + 1); } datasetName.Name = text; datasetName.WorkspaceName = workspaceName; IWorkspace2 workspace2 = (workspaceName2 as IName).Open() as IWorkspace2; IDatasetName datasetName2 = new FeatureClassName() as IDatasetName; datasetName2.WorkspaceName = workspaceName2; (datasetName2 as IFeatureClassName).FeatureDatasetName = (ifeatureDatasetName_0 as IDatasetName); IFieldChecker fieldChecker = new FieldChecker(); fieldChecker.ValidateWorkspace = (workspace2 as IWorkspace); string[] array = string_0.Split(new char[] { '.' }); string_0 = array[array.Length - 1] + "_Project"; string text2; fieldChecker.ValidateTableName(string_0, out text2); string text3 = text2; int num2 = 1; if (workspaceName2.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace || workspaceName2.Type == esriWorkspaceType.esriLocalDatabaseWorkspace) { while (workspace2.get_NameExists(esriDatasetType.esriDTFeatureClass, text3)) { text3 = text2 + "_" + num2.ToString(); num2++; } } else if (workspaceName2.Type == esriWorkspaceType.esriFileSystemWorkspace) { while (System.IO.File.Exists(text3 + ".shp")) { text3 = text2 + "_" + num2.ToString(); num2++; } } datasetName2.Name = text3; IFields fields = new ESRI.ArcGIS.Geodatabase.Fields() as IFields; num = ifeatureClass_0.Fields.FindField(ifeatureClass_0.ShapeFieldName); IField field = ifeatureClass_0.Fields.get_Field(num); IGeometryDef geometryDef = field.GeometryDef; ISpatialReference arg_1D9_0 = geometryDef.SpatialReference; double num3; double num4; double num5; double num6; ispatialReference_0.GetDomain(out num3, out num4, out num5, out num6); ((IGeometryDefEdit)geometryDef).GridCount_2 = 1; ((IGeometryDefEdit)geometryDef).set_GridSize(0, double_0); ((IGeometryDefEdit)geometryDef).SpatialReference_2 = ispatialReference_0; ((IFieldEdit)field).GeometryDef_2 = geometryDef; for (int i = 0; i < ifeatureClass_0.Fields.FieldCount; i++) { if (i == num) { ((IFieldsEdit)fields).AddField(field); } else { IField field2 = ifeatureClass_0.Fields.get_Field(i); ((IFieldsEdit)fields).AddField(field2); } } IEnumFieldError enumFieldError; IFields outputFields; fieldChecker.Validate(fields, out enumFieldError, out outputFields); if (SRLibCommonFunc.m_pfrm != null) { SRLibCommonFunc.m_pfrm.FeatureProgress = featureDataConverter; } try { featureDataConverter.ConvertFeatureClass((IFeatureClassName)datasetName, null, ifeatureDatasetName_0, (IFeatureClassName)datasetName2, geometryDef, outputFields, "", 1000, 0); } catch (System.Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } }
public void ConvertFeatureDataset(IFeatureDatasetName ifeatureDatasetName_0, IFeatureDatasetName ifeatureDatasetName_1, IGeometryDef igeometryDef_0, string string_0, int int_0, int int_1) { }
public void DataImport(IWorkspace sourceWorkspace, IWorkspace targetWorkspace, IFeatureClass sourceFeatureClass, IDataset targetFeatureDataset, string storeName) { int errorRowCount = 0; int totalRowCount = 0; Dictionary <int, string> dicError = new Dictionary <int, string>(); IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace; IDataset targetWorkspaceDataset = (IDataset)targetWorkspace; string sourceLayerName = ((IDataset)sourceFeatureClass).Name; IName sourceWorkspaceDatasetName = sourceWorkspaceDataset.FullName; IName targetWorkspaceDatasetName = targetWorkspaceDataset.FullName; IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDatasetName; IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDatasetName; // Create a name object for the shapefile and cast it to the IDatasetName interface. IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass(); IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName; sourceDatasetName.Name = sourceLayerName; sourceDatasetName.WorkspaceName = sourceWorkspaceName; // Create a name object for the FGDB feature class and cast it to the IDatasetName interface. IFeatureClassName targetFeatureClassName = new FeatureClassNameClass(); IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName; targetDatasetName.Name = storeName;// importMappingScheme.StoreDatasetName;"GEODATA.DLTB7" targetDatasetName.WorkspaceName = targetWorkspaceName; // Create the objects and references necessary for field validation. IFieldChecker fieldChecker = new FieldCheckerClass(); IFields sourceFields = sourceFeatureClass.Fields; IFields targetFields = null; IEnumFieldError enumFieldError = null; // Set the required properties for the IFieldChecker interface. fieldChecker.InputWorkspace = sourceWorkspace; fieldChecker.ValidateWorkspace = targetWorkspace; // Validate the fields and check for errors. fieldChecker.Validate(sourceFields, out enumFieldError, out targetFields); // Find the shape field. String shapeFieldName = sourceFeatureClass.ShapeFieldName; int shapeFieldIndex = sourceFeatureClass.FindField(shapeFieldName); IField shapeField = sourceFields.get_Field(shapeFieldIndex); // Get the geometry definition from the shape field and clone it. IGeometryDef geometryDef = shapeField.GeometryDef; IClone geometryDefClone = (IClone)geometryDef; IClone targetGeometryDefClone = geometryDefClone.Clone(); IGeometryDef targetGeometryDef = (IGeometryDef)targetGeometryDefClone; // Cast the IGeometryDef to the IGeometryDefEdit interface. IGeometryDefEdit targetGeometryDefEdit = (IGeometryDefEdit)targetGeometryDef; // Set the IGeometryDefEdit properties. targetGeometryDefEdit.GridCount_2 = 1; targetGeometryDefEdit.set_GridSize(0, 0.75); //修改目标字段 string fieldNameString = ChangeTargetFields(targetFields); if (fieldNameString != string.Empty) { fieldNameString += string.Format(",{0}", shapeFieldName); } else { fieldNameString = shapeFieldName; } IQueryFilter queryFilter = new QueryFilterClass(); queryFilter.SubFields = fieldNameString; //设置导出的要素集 IFeatureDatasetName featureDatasetName = null; if (targetFeatureDataset != null) { featureDatasetName = (IFeatureDatasetName)targetFeatureDataset.FullName; } // Create the converter and run the conversion. IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass(); IEnumInvalidObject enumInvalidObject = featureDataConverter.ConvertFeatureClass (sourceFeatureClassName, queryFilter, featureDatasetName, targetFeatureClassName, targetGeometryDef, targetFields, "", 1000, 0); // Check for errors. IInvalidObjectInfo invalidObjectInfo = null; enumInvalidObject.Reset(); while ((invalidObjectInfo = enumInvalidObject.Next()) != null) { if (dicError.ContainsKey(invalidObjectInfo.InvalidObjectID) == false) { // Handle the errors in a way appropriate to the application. dicError.Add(invalidObjectInfo.InvalidObjectID, invalidObjectInfo.ErrorDescription); errorRowCount++; } Console.WriteLine(invalidObjectInfo.InvalidObjectID + "" + invalidObjectInfo.ErrorDescription); } }
/// <summary> /// 要素类转Shape /// </summary> /// <param name="apFeatureClass"></param> private void ExportFeatureClassToConTempShp(IFeatureClass apFeatureClass) { if (Directory.Exists(System.Windows.Forms.Application.StartupPath + "\\Convert\\DWGConvert\\ConTempShp")) { Directory.Delete(System.Windows.Forms.Application.StartupPath + "\\Convert\\DWGConvert\\ConTempShp", true); } //设置导出要素类的参数 IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass(); IDataset pOutDataset = (IDataset)apFeatureClass; pOutFeatureClassName = (IFeatureClassName)pOutDataset.FullName; //创建一个输出shp文件的工作空间 IWorkspaceFactory pShpWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); IWorkspaceName pInWorkspaceName = new WorkspaceNameClass(); pInWorkspaceName = pShpWorkspaceFactory.Create(System.Windows.Forms.Application.StartupPath + "\\Convert\\DWGConvert", "ConTempShp", null, 0); //创建一个要素集合 IFeatureDatasetName pInFeatureDatasetName = null; //创建一个要素类 IFeatureClassName pInFeatureClassName = new FeatureClassNameClass(); IDatasetName pInDatasetClassName; pInDatasetClassName = (IDatasetName)pInFeatureClassName; pInDatasetClassName.Name = "ConTempShp";//作为输出参数 pInDatasetClassName.WorkspaceName = pInWorkspaceName; //通过FIELDCHECKER检查字段的合法性,为输出SHP获得字段集合 long iCounter; IFields pOutFields, pInFields; IFieldChecker pFieldChecker; IField pGeoField; IEnumFieldError pEnumFieldError = null; pInFields = apFeatureClass.Fields; pFieldChecker = new FieldChecker(); pFieldChecker.Validate(pInFields, out pEnumFieldError, out pOutFields); //通过循环查找几何字段 pGeoField = null; for (iCounter = 0; iCounter < pOutFields.FieldCount; iCounter++) { if (pOutFields.get_Field((int)iCounter).Type == esriFieldType.esriFieldTypeGeometry) { pGeoField = pOutFields.get_Field((int)iCounter); break; } } //得到几何字段的几何定义 IGeometryDef pOutGeometryDef; IGeometryDefEdit pOutGeometryDefEdit; pOutGeometryDef = pGeoField.GeometryDef; //设置几何字段的空间参考和网格 pOutGeometryDefEdit = (IGeometryDefEdit)pOutGeometryDef; pOutGeometryDefEdit.GridCount_2 = 1; pOutGeometryDefEdit.set_GridSize(0, 1500000); //try //{ IFeatureDataConverter pShpToClsConverter = new FeatureDataConverterClass(); pShpToClsConverter.ConvertFeatureClass(pOutFeatureClassName, null, pInFeatureDatasetName, pInFeatureClassName, pOutGeometryDef, pOutFields, "", 1000, 0); // MessageBox.Show("导出成功", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); //} //catch (Exception ex) //{ //} /*****20130227杨漾(去掉trycatch,上层trycatch(MainForm)处理)*****/ }
public IEnumInvalidObject ConvertFeatureClass(IFeatureClassName ifeatureClassName_0, IQueryFilter iqueryFilter_0, IFeatureDatasetName ifeatureDatasetName_0, IFeatureClassName ifeatureClassName_1, IGeometryDef igeometryDef_0, IFields ifields_0, string string_0, int int_0, int int_1) { return(null); }
/// <summary> /// 将指定要素类复制到目标数据库中(在目标数据库中创建要素类) /// </summary> /// <param name="pSrcFC">源要素类</param> /// <param name="pQueryFilter">查询条件</param> /// <param name="pTargetWks">目标数据库</param> /// <param name="sMessage">转换消息</param> /// <param name="sTargetName">目标要素类名</param> /// <param name="sAlias">目标要素类别名</param> /// <param name="sFDatasetName">目标要素数据集</param> /// <returns></returns> public bool TranslateFeatureClass(IFeatureClass pSrcFC, IQueryFilter pQueryFilter, IWorkspace pTargetWks, string sTargetName = null, string sAlias = null, string sFDatasetName = null) { GeoDataUtils geoDataUtils = new GeoDataUtils(); IDataset pSrcDataset = pSrcFC as IDataset; IFeatureClassName pSrcName = pSrcDataset.FullName as IFeatureClassName; IFeatureDatasetName pFeatureDatasetName = null; if (pTargetWks.Type != esriWorkspaceType.esriFileSystemWorkspace) { string sFeatureDatasetName = sFDatasetName; if (string.IsNullOrEmpty(sFeatureDatasetName) && pSrcFC.FeatureDataset != null) { sFeatureDatasetName = geoDataUtils.ExtractDatasetName(pSrcFC.FeatureDataset.Name); } if (!string.IsNullOrEmpty(sFeatureDatasetName)) { if (geoDataUtils.IsNameExist(pTargetWks, sFeatureDatasetName, esriDatasetType.esriDTFeatureDataset)) { IFeatureDataset pTargetFeatureDataset = (pTargetWks as IFeatureWorkspace).OpenFeatureDataset(sFeatureDatasetName); pFeatureDatasetName = pTargetFeatureDataset.FullName as IFeatureDatasetName; Marshal.ReleaseComObject(pTargetFeatureDataset); } else { pFeatureDatasetName = new FeatureDatasetName() as IFeatureDatasetName; IDatasetName pDatasetName = pFeatureDatasetName as IDatasetName; pDatasetName.Name = sFeatureDatasetName; pDatasetName.WorkspaceName = (pTargetWks as IDataset).FullName as IWorkspaceName; } } } //目标要素类名 FeatureClassName pTargetName = new FeatureClassName(); IDatasetName pTargetDatasetName = pTargetName as IDatasetName; if (string.IsNullOrEmpty(sTargetName)) { sTargetName = geoDataUtils.ExtractDatasetName(pSrcDataset.Name); } pTargetDatasetName.Name = sTargetName; pTargetDatasetName.WorkspaceName = (pTargetWks as IDataset).FullName as IWorkspaceName; geoDataUtils.DeleteDataset(pTargetWks, pTargetDatasetName); // 验证字段 IFields pTargetFields; string sShapeFieldName; geoDataUtils.CheckFields(pSrcFC, pTargetWks, out pTargetFields, out sShapeFieldName); IEnumInvalidObject pEnumInvalidObject = null; IFeatureDataConverter pConverter = null; try { int iIndex = pTargetFields.FindField(sShapeFieldName); IGeometryDef pTargetGeometryDef = pTargetFields.get_Field(iIndex).GeometryDef; // 执行批量转换 pConverter = new FeatureDataConverter(); pEnumInvalidObject = pConverter.ConvertFeatureClass(pSrcName, pQueryFilter, pFeatureDatasetName as IFeatureDatasetName, pTargetName as IFeatureClassName, pTargetGeometryDef, pTargetFields, "", 1000, 0); // 检查转换过程中是否产生错误 if (pEnumInvalidObject != null) { IInvalidObjectInfo pInvalidInfo = null; pEnumInvalidObject.Reset(); while ((pInvalidInfo = pEnumInvalidObject.Next()) != null) { ErrorMessage += pSrcFC.AliasName + "图层要素:" + pInvalidInfo.InvalidObjectID + "执行失败!"; } } } finally //释放资源 { if (pEnumInvalidObject != null) { Marshal.ReleaseComObject(pEnumInvalidObject); } if (pConverter != null) { Marshal.ReleaseComObject(pConverter); } } //修改要素类别名 if (string.IsNullOrEmpty(sAlias)) { sAlias = pSrcFC.AliasName; } IFeatureClass pTargetFC = (pTargetWks as IFeatureWorkspace).OpenFeatureClass(sTargetName); geoDataUtils.AlterDatasetAlias(pTargetFC, sAlias); Marshal.ReleaseComObject(pTargetFC); return(true); }
/// <summary> /// 导出FeatureClass到Shapefile文件 /// </summary> /// <param name="sPath"></param> /// <param name="apFeatureClass"></param> public static bool ExportFeatureClassToShp(string sPath, IFeatureClass apFeatureClass) { try { DateTime dt = DateTime.Now; string strTime = string.Format("{0:yyyyMMddHHmmss}", dt); string fileName = System.IO.Path.GetFileNameWithoutExtension(sPath); //文件名称 string ExportFilePath = System.IO.Path.GetDirectoryName(sPath); //文件夹路径 string ExportFileName = ExportFilePath.Substring(ExportFilePath.LastIndexOf("\\") + 1); //最后选择的文件夹 //如果是c:\\这样的根目录,那么根日期建立一个导出文件夹的名称 if (string.IsNullOrEmpty(ExportFileName)) { ExportFileName = "导出Shape文件"; } else { ExportFilePath = ExportFilePath.Substring(0, ExportFilePath.LastIndexOf("\\"));//除了导出文件夹的路径 } //设置导出要素类的参数 IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass(); IDataset pOutDataset = (IDataset)apFeatureClass; pOutFeatureClassName = (IFeatureClassName)pOutDataset.FullName; //创建一个输出shp文件的工作空间 IWorkspaceFactory pShpWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); IWorkspaceName pInWorkspaceName = new WorkspaceNameClass(); pInWorkspaceName = pShpWorkspaceFactory.Create(ExportFilePath, ExportFileName, null, 0); //创建一个要素集合 IFeatureDatasetName pInFeatureDatasetName = null; //创建一个要素类 IFeatureClassName pInFeatureClassName = new FeatureClassNameClass(); IDatasetName pInDatasetClassName; pInDatasetClassName = (IDatasetName)pInFeatureClassName; pInDatasetClassName.Name = fileName + strTime;//作为输出参数 pInDatasetClassName.WorkspaceName = pInWorkspaceName; //通过FIELDCHECKER检查字段的合法性,为输出SHP获得字段集合 long iCounter; IFields pOutFields, pInFields; IField pGeoField; IEnumFieldError pEnumFieldError = null; IQueryFilter filter = null; string subset = ""; pInFields = apFeatureClass.Fields; IFieldChecker pFieldChecker = new FieldChecker(); pFieldChecker.Validate(pInFields, out pEnumFieldError, out pOutFields); //通过循环查找几何字段 pGeoField = null; for (iCounter = 0; iCounter < pOutFields.FieldCount; iCounter++) { IField field = pOutFields.get_Field((int)iCounter); if (field.Type == esriFieldType.esriFieldTypeGeometry) { pGeoField = field; } if (!IsBlob(field)) { string fieldName = field.Name; if (fieldName.Contains("_")) { fieldName = fieldName.Replace("_", "."); } subset += (fieldName + ","); } } subset = subset.Substring(0, subset.LastIndexOf(",")); filter = new QueryFilterClass(); filter.SubFields = subset; //得到几何字段的几何定义 IGeometryDef pOutGeometryDef; IGeometryDefEdit pOutGeometryDefEdit; pOutGeometryDef = pGeoField.GeometryDef; //设置几何字段的空间参考和网格 pOutGeometryDefEdit = (IGeometryDefEdit)pOutGeometryDef; pOutGeometryDefEdit.GridCount_2 = 1; pOutGeometryDefEdit.set_GridSize(0, 1500000); //开始导入 IFeatureDataConverter pShpToClsConverter = new FeatureDataConverterClass(); pShpToClsConverter.ConvertFeatureClass(pOutFeatureClassName, filter, pInFeatureDatasetName, pInFeatureClassName, pOutGeometryDef, pOutFields, "", 1000, 0); return(true); } catch { return(false); } }
public static void OperateConvertToShape(string sFileName, IFeatureClass pInFeatureClass) { try { string str = sFileName; string str2 = str.Substring(str.LastIndexOf(@"\") + 1); //文件名 string str3 = str.Substring(0, (str.Length - str2.Length) - 1); //路径 IDataset pInDataset = pInFeatureClass as IDataset; IDatasetName pInputDatasetName = (IDatasetName)pInDataset.FullName; IFeatureClassName pInputFClassName = (IFeatureClassName)pInputDatasetName; ///////////////////////////////////////////// //创建一个输出shp文件的工作空间 IWorkspaceFactory pShpWorkspaceFactory = new ShapefileWorkspaceFactoryClass() as IWorkspaceFactory; IWorkspace pWorkspace = pShpWorkspaceFactory.OpenFromFile(str3, 0); IWorkspaceName pOutWorkspaceName = new WorkspaceNameClass(); IDataset pDataset = pWorkspace as IDataset; pOutWorkspaceName = (IWorkspaceName)pDataset.FullName; //创建一个要素集合 IFeatureDatasetName pOutFeatureDatasetName = null; //创建一个要素类 IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass(); IDatasetName pOutDatasetClassName = (IDatasetName)pOutFeatureClassName; pOutDatasetClassName.Name = str2; //作为输出参数 pOutDatasetClassName.WorkspaceName = pOutWorkspaceName; //////////////////////////////////////////////////////////////// //创建输出文件属性字段 IFields pOutFields, pInFields; IFieldChecker pFieldChecker; IField pGeoField; IEnumFieldError pEnumFieldError = null; pInFields = pInFeatureClass.Fields; pFieldChecker = new FieldChecker(); pFieldChecker.Validate(pInFields, out pEnumFieldError, out pOutFields); ///设置输出文件的几何定义 String shapeFieldName = pInFeatureClass.ShapeFieldName; int shapeFieldIndex = pInFeatureClass.FindField(shapeFieldName); IField shapeField = pInFeatureClass.Fields.get_Field(shapeFieldIndex); IGeometryDef geometryDef = shapeField.GeometryDef; IClone geometryDefClone = (IClone)geometryDef; IClone outGeometryDefClone = geometryDefClone.Clone(); IGeometryDef outGeometryDef = (IGeometryDef)outGeometryDefClone; IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass(); IEnumInvalidObject enumInvalidObject = featureDataConverter.ConvertFeatureClass(pInputFClassName, null, null, pOutFeatureClassName, outGeometryDef, pOutFields, "", 1000, 0); // IFeatureDataConverter pFeatureDataConverter = new FeatureDataConverterClass(); //pFeatureDataConverter.ConvertFeatureClass(sFeatureClassName, null, null, pFeatureClassName, null, null, "", 0x3e8, 0); MessageBox.Show("等值线计算完毕!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception exception) { MessageBox.Show(exception.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
/// <summary> /// 将GDB的数据入到SDE中 xisheng 20110919 /// </summary> private void ImportGDBToSDE(string file, string outfilename, out int featurecount) { m_success = false;//初始化 try { string filepath = file.Substring(0, file.LastIndexOf("---")); string filename = file.Substring(file.LastIndexOf("-") + 1); //打开mdb文件所在的工作空间 ESRI.ArcGIS.Geodatabase.IWorkspaceFactory wf = new FileGDBWorkspaceFactory(); IFeatureWorkspace pFeatureWorkspaceGDB = wf.OpenFromFile(@filepath, 0) as IFeatureWorkspace; IWorkspace pWorkspaceGDB = pFeatureWorkspaceGDB as IWorkspace; // 创建源工作空间名称 IDataset sourceWorkspaceDataset = (IDataset)pFeatureWorkspaceGDB; IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName; //创建源数据集名称 //IFeatureClassName sourceFeatureClassName = serverContext.CreateObject("esriGeoDatabase.FeatureClassName") as IFeatureClassName; IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass(); IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName; sourceDatasetName.WorkspaceName = sourceWorkspaceName; sourceDatasetName.Name = filename; //打开存在的工作空间,作为导入的空间; IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pTargetworkspace; //创建目标工作空间名称 IDataset targetWorkspaceDataset = (IDataset)pTargetworkspace; IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName; IWorkspace2 pWorkspace2 = pTargetworkspace as IWorkspace2; IFeatureDataset tmpfeaturedataset; //创建目标数据集名称 // IFeatureClassName targetFeatureClassName = serverContext.CreateObject("esriGeoDatabase.FeatureClassName") as IFeatureClassName; //判断要素是否存在,若存在将删除源文件 if (pWorkspace2.get_NameExists(esriDatasetType.esriDTFeatureDataset, textBox.Text)) { tmpfeaturedataset = pFeatureWorkspace.OpenFeatureDataset(textBox.Text); if (text_prj.Text != "") { IGeoDatasetSchemaEdit pgeodataset = tmpfeaturedataset as IGeoDatasetSchemaEdit; if (pgeodataset.CanAlterSpatialReference) { pgeodataset.AlterSpatialReference(GetSpatialReferenceformFile(text_prj.Text)); } } } else { tmpfeaturedataset = CreateFeatureDataset(pTargetworkspace as IFeatureWorkspace, textBox.Text, text_prj.Text); } if (pWorkspace2.get_NameExists(esriDatasetType.esriDTFeatureClass, outfilename)) { IFeatureClass tmpfeatureclass; tmpfeatureclass = pFeatureWorkspace.OpenFeatureClass(outfilename); IDataset tempset = tmpfeatureclass as IDataset; tempset.Delete(); } IFeatureClassName targetFeatureClassName = new FeatureClassNameClass(); IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName; targetDatasetName.WorkspaceName = targetWorkspaceName; targetDatasetName.Name = outfilename; //目标数据集 IFeatureDatasetName outfeaturedatasetname = tmpfeaturedataset.FullName as IFeatureDatasetName; //打开输入的要素类以得到字段定义 ESRI.ArcGIS.esriSystem.IName sourceName = (ESRI.ArcGIS.esriSystem.IName)sourceFeatureClassName; IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();//打开源要素类 //验证字段名称,因为你正在不同类型的工作空间之间进行数据转换 //IFieldChecker fieldChecker = serverContext.CreateObject("esriGeoDatabase.FieldChecker") as IFieldChecker; IFieldChecker fieldChecker = new FieldCheckerClass(); IFields sourceFeatureClassFields = sourceFeatureClass.Fields; IFields targetFeatureClassFields; IEnumFieldError enumFieldError; //最重要的设置输入和验证工作空间 fieldChecker.InputWorkspace = pWorkspaceGDB; fieldChecker.ValidateWorkspace = pTargetworkspace; fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields); //遍历所有输出字段找到几何字段 IField geometryField; for (int i = 0; i < targetFeatureClassFields.FieldCount; i++) { if (targetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry) { geometryField = targetFeatureClassFields.get_Field(i); //得到几何字段的几何定义 IGeometryDef geometryDef = geometryField.GeometryDef; //赋予几何定义一个空间索引格网数目和格网大小值 IGeometryDefEdit targetFCGeoDefEdit = (IGeometryDefEdit)geometryDef; targetFCGeoDefEdit.GridCount_2 = 1; targetFCGeoDefEdit.set_GridSize(0, 0); //允许ArcGIS为数据加载确定一个有效的格网大小 targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference; //转换要素类中所有的要素 //IQueryFilter queryFilter = serverContext.CreateObject("esriGeoDatabase.QueryFilter") as IQueryFilter; ; QueryFilter queryFilter = new QueryFilterClass(); queryFilter.WhereClause = ""; //加载要素类 //IFeatureDataConverter fctofc = serverContext.CreateObject("esriGeoDatabase.FeatureDataConverter") as IFeatureDataConverter; IFeatureDataConverter fctofc = new FeatureDataConverterClass(); IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, outfeaturedatasetname, targetFeatureClassName, geometryDef, targetFeatureClassFields, "", 1000, 0); } } featurecount = sourceFeatureClass.FeatureCount(null); m_success = true; } catch (Exception ee) { m_success = false; m_strErr = ee.Message; featurecount = 0; } }
//创建要素 public void ExportFeature(IFeatureClass apFeatureClass, string ExportFilePath, string ExportFileShortName) { if (apFeatureClass == null) { MessageBox.Show("分析出错,请检查路径分析结果", "系统提示"); return; } //设置导出要素类的参数 IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass(); IDataset pOutDataset = (IDataset)apFeatureClass; pOutFeatureClassName = (IFeatureClassName)pOutDataset.FullName; //创建一个输出shp文件的工作空间 IWorkspaceFactory pShpWorkspaceFactory = new ShapefileWorkspaceFactory(); IWorkspaceName pInWorkspaceName = new WorkspaceNameClass(); pInWorkspaceName = pShpWorkspaceFactory.Create(ExportFilePath, ExportFileShortName, null, 0); //创建一个要素集合 IFeatureDatasetName pInFeatureDatasetName = null; //创建一个要素类 IFeatureClassName pInFeatureClassName = new FeatureClassNameClass(); IDatasetName pInDatasetClassName; pInDatasetClassName = (IDatasetName)pInFeatureClassName; pInDatasetClassName.Name = ExportFileShortName;//作为输出参数 pInDatasetClassName.WorkspaceName = pInWorkspaceName; //自定义字段 AddField(apFeatureClass, "Elevation", "", esriFieldType.esriFieldTypeInteger); //通过FIELDCHECKER检查字段的合法性,为输出SHP获得字段集合 long iCounter; IFields pOutFields, pInFields; IFieldChecker pFieldChecker; IField pGeoField; IEnumFieldError pEnumFieldError = null; pInFields = apFeatureClass.Fields; pFieldChecker = new FieldChecker(); pFieldChecker.Validate(pInFields, out pEnumFieldError, out pOutFields); //通过循环查找几何字段 pGeoField = null; for (iCounter = 0; iCounter < pOutFields.FieldCount; iCounter++) { if (pOutFields.get_Field((int)iCounter).Type == esriFieldType.esriFieldTypeGeometry) { pGeoField = pOutFields.get_Field((int)iCounter); break; } } //得到几何字段的几何定义 IGeometryDef pOutGeometryDef; IGeometryDefEdit pOutGeometryDefEdit; pOutGeometryDef = pGeoField.GeometryDef; //设置几何字段的空间参考和网格 pOutGeometryDefEdit = (IGeometryDefEdit)pOutGeometryDef; pOutGeometryDefEdit.GridCount_2 = 1; pOutGeometryDefEdit.set_GridSize(0, 1500000); try { //开始导入 IFeatureDataConverter pShpToClsConverter = new FeatureDataConverterClass(); pShpToClsConverter.ConvertFeatureClass(pOutFeatureClassName, null, pInFeatureDatasetName, pInFeatureClassName, pOutGeometryDef, pOutFields, "", 1000, 0); MessageBox.Show("导出成功!"); } catch { } }