统计"面"要素中"点"要素的个数.
步骤
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 featureclass 10 ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass(); 11 // valid feature workspace not passed in as an argument to the method 12 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 = "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 own 25 if (fields == null) { 26 // create the fields using the required fields method 27 fields = objClsDes.RequiredFields; 28 ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields; // Explicit Cast 29 30 ESRI.ArcGIS.Geodatabase.IField field = new ESRI.ArcGIS.Geodatabase.FieldClass(); 31 32 // create a user defined text field 33 ESRI.ArcGIS.Geodatabase.IFieldEdit fieldEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit)field; 34 35 // setup field properties 36 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 collection 45 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 table 60 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 }