首页 > 代码库 > 统计"面"要素中"点"要素的个数.
统计"面"要素中"点"要素的个数.
步骤
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 }
统计"面"要素中"点"要素的个数.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。