首页 > 代码库 > 统计"面"要素中"点"要素的个数.

统计"面"要素中"点"要素的个数.

步骤

  1,创建字段 IFields

 1 /// <summary> 2         /// 创建:"面"-"点数"的字段. 3         /// </summary> 4         /// <returns></returns> 5         public static ESRI.ArcGIS.Geodatabase.IFields CreateFields() { 6             ESRI.ArcGIS.Geodatabase.IField fieldId = new ESRI.ArcGIS.Geodatabase.FieldClass(); 7             //todo(IFieldEdit2). 8             //面ID. 9             ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldIdEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldId;10             fieldIdEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;11             fieldIdEdit.Name_2 = "面ID";12 13             //点数.14             ESRI.ArcGIS.Geodatabase.IField fieldCount = new ESRI.ArcGIS.Geodatabase.FieldClass();15             ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldCountEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldCount;16             fieldCountEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;17             fieldCountEdit.Name_2 = "个数";18 19             ESRI.ArcGIS.Geodatabase.IObjectClassDescription objClsDes = new ESRI.ArcGIS.Geodatabase.ObjectClassDescriptionClass();20             ESRI.ArcGIS.Geodatabase.IFields fields = objClsDes.RequiredFields;21             ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields;22             fieldsEdit.AddField(fieldId);23             fieldsEdit.AddField(fieldCount);24             return fields;25         }

  2,根据Fields穿件 ITable

 1 /// <summary> 2         /// Creates a table with some default fields. 3         /// </summary> 4         /// <param name="workspace">An IWorkspace2 interface</param> 5         /// <param name="tableName">表名称,如: "owners"</param> 6         /// <param name="fields">An IFields interface or Nothing.</param> 7         /// <returns></returns> 8         public static ESRI.ArcGIS.Geodatabase.ITable CreateTable(ESRI.ArcGIS.Geodatabase.IWorkspace2 workspace, System.String tableName, ESRI.ArcGIS.Geodatabase.IFields fields) { 9             // create the behavior clasid for the featureclass10             ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass();11             // valid feature workspace not passed in as an argument to the method12             if (workspace == null) return null;13 14             ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspace;15 16             // table with that name already exists return that table 17             if (workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTTable, tableName))18                 return featureWorkspace.OpenTable(tableName);19 20             uid.Value = http://www.mamicode.com/"esriGeoDatabase.Object";21 22             ESRI.ArcGIS.Geodatabase.IObjectClassDescription objClsDes = new ESRI.ArcGIS.Geodatabase.ObjectClassDescriptionClass();23 24             // if a fields collection is not passed in then supply our own25             if (fields == null) {26                 // create the fields using the required fields method27                 fields = objClsDes.RequiredFields;28                 ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields; // Explicit Cast29 30                 ESRI.ArcGIS.Geodatabase.IField field = new ESRI.ArcGIS.Geodatabase.FieldClass();31 32                 // create a user defined text field33                 ESRI.ArcGIS.Geodatabase.IFieldEdit fieldEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit)field;34 35                 // setup field properties36                 fieldEdit.Name_2 = "SampleField";37                 fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString;38                 fieldEdit.IsNullable_2 = true;39                 fieldEdit.AliasName_2 = "Sample Field Column";40                 fieldEdit.DefaultValue_2 = "test";41                 fieldEdit.Editable_2 = true;42                 fieldEdit.Length_2 = 100;43 44                 // add field to field collection45                 fieldsEdit.AddField(field);46                 fields = (ESRI.ArcGIS.Geodatabase.IFields)fieldsEdit;47             }48 49             // Use IFieldChecker to create a validated fields collection.50             ESRI.ArcGIS.Geodatabase.IFieldChecker fieldChecker = new ESRI.ArcGIS.Geodatabase.FieldCheckerClass();51             ESRI.ArcGIS.Geodatabase.IEnumFieldError enumFieldError = null;52             ESRI.ArcGIS.Geodatabase.IFields validatedFields = null;53             fieldChecker.ValidateWorkspace = (ESRI.ArcGIS.Geodatabase.IWorkspace)workspace;54             fieldChecker.Validate(fields, out enumFieldError, out validatedFields);55 56             // The enumFieldError enumerator can be inspected at this point to determine 57             // which fields were modified during validation.58 59             // create and return the table60             return featureWorkspace.CreateTable(tableName, validatedFields, uid, null, "");61         }

  3,根据创建ITable的结构,统计"面"要素中"点"要素的个数

 1 /// <summary> 2         /// 查询"面"要素中的"点个数". 3         /// </summary> 4         /// <param name="polygonFeatureClass">"面"要素类.</param> 5         /// <param name="pointFeatureClass">"点"要素类.</param> 6         /// <param name="t">ITable表.</param> 7         /// <returns></returns> 8         public static ESRI.ArcGIS.Geodatabase.ITable PointInPolygonCount(ESRI.ArcGIS.Geodatabase.IFeatureClass polygonFeatureClass, ESRI.ArcGIS.Geodatabase.IFeatureClass pointFeatureClass, ESRI.ArcGIS.Geodatabase.ITable t) { 9             if (!(polygonFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon))10                 throw new InvalidCastException("Statistics_Assist::PointInPolygonCount:polygonFeatureClass");11             if (!(pointFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint))12                 throw new InvalidCastException("Statistics_Assist::PointInPolygonCount:pointFeatureClass");13 14             ESRI.ArcGIS.Geodatabase.ISpatialFilter polySpatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();15             polySpatialFilter.WhereClause = "name like ‘%辽宁%‘"; //指定名称的"面"要素.16 17             ESRI.ArcGIS.Geodatabase.IFeatureCursor fCurPoly = polygonFeatureClass.Search(polySpatialFilter, false);18             ESRI.ArcGIS.Geodatabase.IFeature fPoly = null;19             while ((fPoly = fCurPoly.NextFeature()) != null) {20                 ESRI.ArcGIS.Geometry.IGeometry polyGeo = fPoly.Shape;21                 ESRI.ArcGIS.Geodatabase.ISpatialFilter pntSpatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();22                 pntSpatialFilter.Geometry = polyGeo;23                 //包含在"面"要素中的"点".24                 pntSpatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelContains;25                 ESRI.ArcGIS.Geodatabase.IFeatureCursor fCurPnt = pointFeatureClass.Search(pntSpatialFilter, false);26                 ESRI.ArcGIS.Geodatabase.IFeature fPnt = null;27                 int count = 0;  ////"点"要素的个数.28                 while ((fPnt = fCurPnt.NextFeature()) != null)29                     ++count;30 31                 if (count != 0) {32                     ESRI.ArcGIS.Geodatabase.IRow r = t.CreateRow();33                     r.set_Value(1, fPoly.get_Value(0)); //注意的是,0下标是不可更改的(OID).34                     r.set_Value(2, count);35                     r.Store();36                 }37             }38 39             return t;40         }

  4,在住函数中调用

 1 try { 2                 //面. 3                 ESRI.ArcGIS.Carto.IFeatureLayer PolyFLyr = (ESRI.ArcGIS.Carto.IFeatureLayer)Engine.App_Code.Layer_Assist.GetLayerByName(mapCtrl_main.Map, "省市"); 4  5                 //点. 6                 ESRI.ArcGIS.Carto.IFeatureLayer PntFLyr = (ESRI.ArcGIS.Carto.IFeatureLayer)Engine.App_Code.Layer_Assist.GetLayerByName(mapCtrl_main.Map, "地市级以上居民地"); 7  8                 //表. 9                 string tPath = @"G:\doc\gis\1.400\data\feature";10 11                 //1,根据"表路径"和"表名"创建.12                 //ESRI.ArcGIS.Geodatabase.ITable tOri = Engine.App_Code.AttributeTable_Assist.CreateTable(tPath, "tOri");13                 //2,根据"表路径"和"表名",以及"字段"创建.14                 ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 wsf = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();15                 ESRI.ArcGIS.Geodatabase.IWorkspace2 ws = (ESRI.ArcGIS.Geodatabase.IWorkspace2)wsf.OpenFromFile(tPath, 0);16                 ESRI.ArcGIS.Geodatabase.IFields fields = Engine.App_Code.AttributeTable_Assist.CreateFields();17                 ESRI.ArcGIS.Geodatabase.ITable t = Engine.App_Code.AttributeTable_Assist.CreateTable(ws, "fields_table_LiaoNing", fields);18                 //查询面中的点.19                 ESRI.ArcGIS.Geodatabase.ITable tRes = Engine.App_Code.Statistics_Assist.PointInPolygonCount(PolyFLyr.FeatureClass, PntFLyr.FeatureClass, t);20             }


可以通过"表路径"和"表名"创建ITable

 1 /// <summary> 2         /// 创建表. 3         /// </summary> 4         /// <param name="tablePath">即将创建表的路径,如:"G:\doc\gis\1.400\data\feature"</param> 5         /// <param name="tableName">表名,如:"owner"</param> 6         /// <returns></returns> 7         public static ESRI.ArcGIS.Geodatabase.ITable CreateTable(string tablePath, string tableName) { 8             //需要注意的是必须为"IWorkspaceFactory2",不能为"IWorkspaceFactory". 9             ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 wsf = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();10             ESRI.ArcGIS.Geodatabase.IFeatureWorkspace fws = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)wsf.OpenFromFile(tablePath, 0);11 12             ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass();13 14             ESRI.ArcGIS.Geodatabase.IField fieldId = new ESRI.ArcGIS.Geodatabase.FieldClass();15             //todo(IFieldEdit2).16             //面ID.17             ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldIdEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldId;18             fieldIdEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;19             fieldIdEdit.Name_2 = "面ID";20 21             //点数.22             ESRI.ArcGIS.Geodatabase.IField fieldCount = new ESRI.ArcGIS.Geodatabase.FieldClass();23             ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldCountEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldCount;24             fieldCountEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;25             fieldCountEdit.Name_2 = "个数";26 27             ESRI.ArcGIS.Geodatabase.IObjectClassDescription objClsDes = new ESRI.ArcGIS.Geodatabase.ObjectClassDescriptionClass();28             ESRI.ArcGIS.Geodatabase.IFields fields = objClsDes.RequiredFields;29             ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields;30             fieldsEdit.AddField(fieldId);31             fieldsEdit.AddField(fieldCount);32 33             return fws.CreateTable(tableName, fields, uid, null, "");34         }

 

统计"面"要素中"点"要素的个数.