步骤

  1,创建字段 IFields

 /// <summary>
/// 创建:"面"-"点数"的字段.
/// </summary>
/// <returns></returns>
public static ESRI.ArcGIS.Geodatabase.IFields CreateFields() {
ESRI.ArcGIS.Geodatabase.IField fieldId = new ESRI.ArcGIS.Geodatabase.FieldClass();
//todo(IFieldEdit2).
//面ID.
ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldIdEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldId;
fieldIdEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;
fieldIdEdit.Name_2 = "面ID"; //点数.
ESRI.ArcGIS.Geodatabase.IField fieldCount = new ESRI.ArcGIS.Geodatabase.FieldClass();
ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldCountEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldCount;
fieldCountEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;
fieldCountEdit.Name_2 = "个数"; ESRI.ArcGIS.Geodatabase.IObjectClassDescription objClsDes = new ESRI.ArcGIS.Geodatabase.ObjectClassDescriptionClass();
ESRI.ArcGIS.Geodatabase.IFields fields = objClsDes.RequiredFields;
ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields;
fieldsEdit.AddField(fieldId);
fieldsEdit.AddField(fieldCount);
return fields;
}

  2,根据Fields穿件 ITable

 /// <summary>
/// Creates a table with some default fields.
/// </summary>
/// <param name="workspace">An IWorkspace2 interface</param>
/// <param name="tableName">表名称,如: "owners"</param>
/// <param name="fields">An IFields interface or Nothing.</param>
/// <returns></returns>
public static ESRI.ArcGIS.Geodatabase.ITable CreateTable(ESRI.ArcGIS.Geodatabase.IWorkspace2 workspace, System.String tableName, ESRI.ArcGIS.Geodatabase.IFields fields) {
// create the behavior clasid for the featureclass
ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass();
// valid feature workspace not passed in as an argument to the method
if (workspace == null) return null; ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspace; // table with that name already exists return that table
if (workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTTable, tableName))
return featureWorkspace.OpenTable(tableName); uid.Value = "esriGeoDatabase.Object"; ESRI.ArcGIS.Geodatabase.IObjectClassDescription objClsDes = new ESRI.ArcGIS.Geodatabase.ObjectClassDescriptionClass(); // if a fields collection is not passed in then supply our own
if (fields == null) {
// create the fields using the required fields method
fields = objClsDes.RequiredFields;
ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields; // Explicit Cast ESRI.ArcGIS.Geodatabase.IField field = new ESRI.ArcGIS.Geodatabase.FieldClass(); // create a user defined text field
ESRI.ArcGIS.Geodatabase.IFieldEdit fieldEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit)field; // setup field properties
fieldEdit.Name_2 = "SampleField";
fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString;
fieldEdit.IsNullable_2 = true;
fieldEdit.AliasName_2 = "Sample Field Column";
fieldEdit.DefaultValue_2 = "test";
fieldEdit.Editable_2 = true;
fieldEdit.Length_2 = ; // add field to field collection
fieldsEdit.AddField(field);
fields = (ESRI.ArcGIS.Geodatabase.IFields)fieldsEdit;
} // Use IFieldChecker to create a validated fields collection.
ESRI.ArcGIS.Geodatabase.IFieldChecker fieldChecker = new ESRI.ArcGIS.Geodatabase.FieldCheckerClass();
ESRI.ArcGIS.Geodatabase.IEnumFieldError enumFieldError = null;
ESRI.ArcGIS.Geodatabase.IFields validatedFields = null;
fieldChecker.ValidateWorkspace = (ESRI.ArcGIS.Geodatabase.IWorkspace)workspace;
fieldChecker.Validate(fields, out enumFieldError, out validatedFields); // The enumFieldError enumerator can be inspected at this point to determine
// which fields were modified during validation. // create and return the table
return featureWorkspace.CreateTable(tableName, validatedFields, uid, null, "");
}

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

 /// <summary>
/// 查询"面"要素中的"点个数".
/// </summary>
/// <param name="polygonFeatureClass">"面"要素类.</param>
/// <param name="pointFeatureClass">"点"要素类.</param>
/// <param name="t">ITable表.</param>
/// <returns></returns>
public static ESRI.ArcGIS.Geodatabase.ITable PointInPolygonCount(ESRI.ArcGIS.Geodatabase.IFeatureClass polygonFeatureClass, ESRI.ArcGIS.Geodatabase.IFeatureClass pointFeatureClass, ESRI.ArcGIS.Geodatabase.ITable t) {
if (!(polygonFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon))
throw new InvalidCastException("Statistics_Assist::PointInPolygonCount:polygonFeatureClass");
if (!(pointFeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint))
throw new InvalidCastException("Statistics_Assist::PointInPolygonCount:pointFeatureClass"); ESRI.ArcGIS.Geodatabase.ISpatialFilter polySpatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();
polySpatialFilter.WhereClause = "name like '%辽宁%'"; //指定名称的"面"要素. ESRI.ArcGIS.Geodatabase.IFeatureCursor fCurPoly = polygonFeatureClass.Search(polySpatialFilter, false);
ESRI.ArcGIS.Geodatabase.IFeature fPoly = null;
while ((fPoly = fCurPoly.NextFeature()) != null) {
ESRI.ArcGIS.Geometry.IGeometry polyGeo = fPoly.Shape;
ESRI.ArcGIS.Geodatabase.ISpatialFilter pntSpatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();
pntSpatialFilter.Geometry = polyGeo;
//包含在"面"要素中的"点".
pntSpatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelContains;
ESRI.ArcGIS.Geodatabase.IFeatureCursor fCurPnt = pointFeatureClass.Search(pntSpatialFilter, false);
ESRI.ArcGIS.Geodatabase.IFeature fPnt = null;
int count = ; ////"点"要素的个数.
while ((fPnt = fCurPnt.NextFeature()) != null)
++count; if (count != ) {
ESRI.ArcGIS.Geodatabase.IRow r = t.CreateRow();
r.set_Value(, fPoly.get_Value()); //注意的是,0下标是不可更改的(OID).
r.set_Value(, count);
r.Store();
}
} return t;
}

  4,在住函数中调用

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

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

 /// <summary>
/// 创建表.
/// </summary>
/// <param name="tablePath">即将创建表的路径,如:"G:\doc\gis\1.400\data\feature"</param>
/// <param name="tableName">表名,如:"owner"</param>
/// <returns></returns>
public static ESRI.ArcGIS.Geodatabase.ITable CreateTable(string tablePath, string tableName) {
//需要注意的是必须为"IWorkspaceFactory2",不能为"IWorkspaceFactory".
ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 wsf = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IFeatureWorkspace fws = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)wsf.OpenFromFile(tablePath, ); ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass(); ESRI.ArcGIS.Geodatabase.IField fieldId = new ESRI.ArcGIS.Geodatabase.FieldClass();
//todo(IFieldEdit2).
//面ID.
ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldIdEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldId;
fieldIdEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;
fieldIdEdit.Name_2 = "面ID"; //点数.
ESRI.ArcGIS.Geodatabase.IField fieldCount = new ESRI.ArcGIS.Geodatabase.FieldClass();
ESRI.ArcGIS.Geodatabase.IFieldEdit2 fieldCountEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit2)fieldCount;
fieldCountEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger;
fieldCountEdit.Name_2 = "个数"; ESRI.ArcGIS.Geodatabase.IObjectClassDescription objClsDes = new ESRI.ArcGIS.Geodatabase.ObjectClassDescriptionClass();
ESRI.ArcGIS.Geodatabase.IFields fields = objClsDes.RequiredFields;
ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields;
fieldsEdit.AddField(fieldId);
fieldsEdit.AddField(fieldCount); return fws.CreateTable(tableName, fields, uid, null, "");
}

统计"面"要素中"点"要素的个数.的更多相关文章

  1. Excel 中如何快速统计一列中相同字符的个数(函数法)

    https://jingyan.baidu.com/article/6d704a132ea17328da51ca78.html 通过excel快速统计一列中相同字符的个数,如果很少,你可以一个一个数. ...

  2. 统计js数组中奇数元素的个数

    如何统计一个JS数组中奇数元素的个数呢? 这是群友提出的一个问题,大部分群友给出的是遍历 然后对2取模,得到最终结果. 这样的写法是最容易想得到的,那么有没有其他思路呢? 这里我提供另外一种思路,我们 ...

  3. 【Python】【demo实验18】【练习实例】【统计输入字符串中,数字的个数、英文字母的个数及其他符号的个数】

    原题: 输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. (本题暂时不支持中文字符及汉字) 我的代码: #!/usr/bin/python # encoding=utf-8 # -* ...

  4. php 统计一维数组中重复的元素个数

    <?php echo "<pre>"; $array = array(1, 1, 1, 54, 3,4, 3,4, 3, 14, 3,4, 3,7,8,9,12, ...

  5. 统计numpy数组中每个值的个数

    import numpy as np from collections import Counter data = np.array([1.1,2,3,4,4,5]) Counter(data) #简 ...

  6. Excel如何快速统计一列中相同数值出现的个数--数据透视表

    excel如何快速统计一列中相同数值出现的个数_百度经验 --这里介绍了两种解决方式,用第一种https://jingyan.baidu.com/article/9113f81b2c16822b321 ...

  7. Python 统计列表中重复元素的个数并返回其索引值

    需求:统计列表list1中元素3的个数,并返回每个元素的索引 list1 = [3, 3, 8, 9, 2, 10, 6, 2, 8, 3, 4, 5, 5, 4, 1, 5, 9, 7, 10, 2 ...

  8. 往sde中导入要素类报错000732

    sde可以成功连接,可以在Server中注册. 但是向sde中导入要素类报错000732,如图所示. 点击红色圆圈提示 ERROR 000732. 将路径修改为绝对路径即可,如下图所示.

  9. AE CreateFeatureClass 创建shp. 删除shp. 向shp中添加要素

    /// <summary> /// 创建多边形shp /// </summary> /// <param name="pPolygon">< ...

随机推荐

  1. mysql 整形的长度问题

    tinyint  有符号的范围是-128至127: 无符号的范围是0到255,2的8 次方-1: 存储大小为 1 字节. smallint  有符号的范围是-32768至32767: 无符号的范围是0 ...

  2. 【Linux】 任务调度/计划 cron

    实时查看日志: tail -f /var/log/cron 显示任务调度 bash#crontab -u username -l 编辑 bash#crontab -u username -e 内容: ...

  3. NT头 IMAGE_NT_HEADER

    typedef struct_IMAGE_NT_HEADERS{ DWORD Signature; // 固定为 0x00004550 “PE00" IMAGE_FILE_HEADER Fi ...

  4. 存储过程中update,然后用sql%判断update是否成功的存储过程

    --更新用户状态 PROCEDURE P_UPDATE_USER_STATUS ( v_SrcID IN NUMERIC, v_DstID IN NUMERIC, v_DstType IN NUMER ...

  5. 转:MFC中创建多线程

    MFC中创建多线程   MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员 ...

  6. HttpClient and FileUpload

    All communication over the Internet happens using a standard set of protocols, such as File Transfer ...

  7. XJOI网上同步测试DAY14 T3

    思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就 ...

  8. SDL音频播放

    gcc -o tutorial03 tutorial03.c -lavutil -lavformat -lavcodec -lz -lm \`sdl-config --cflags --libs` A ...

  9. FZU2176---easy problem (树链剖分)

    http://acm.fzu.edu.cn/problem.php?pid=2176 Problem 2176 easy problem Accept: 9    Submit: 32Time Lim ...

  10. Tomcat类加载器

    1JVM类加载机制   JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使 ...