基于C#的ArcEngine二次开发28: 等高线高程值与国标码一致性检查思路及代码分析

1 高程值

类型说明
首曲线基本等高线。是按基本等高距测绘的等高线,一般用细实线(0.15mm)描绘,是表示地貌状态的主要等高线
计曲线加粗等高线。为了便于判读等高线的高程,自高程起算面开始,每隔4条首曲线加粗描绘的等高线。一般用粗实线(0.3mm)并在适当位置断开注记高程。字头朝向上坡方向,计曲线是辨认等高线高程的依据。
间曲线又叫半距等高线。当首曲线不能显示某些局部地貌时,按二分之一等高距描绘的等高线。一般用细长虚线,尽在局部地区使用,可不闭合,但应对称
助曲线辅助等高线,是按四分之一等高距描绘的细短虚线,用以显示间曲线仍不能显示的某段微型地貌。

地图与比例尺:

1.2 思路分析

各类等高线与等高距的关系:

类型被5被等高距整除被等高距整除被0.5倍等高距整除被0.25倍等高距整除
首曲线
计曲线
间曲线
助曲线

判断条件设计:

首曲线:国标码为710101,不能被等高距整除,如果能被等高距整除时不能被5倍等高距整除,为错误首曲线

计曲线:国标码为710102,不能被5倍等高距整除,为错误计曲线

间曲线:国标码为710103,不能被0.5倍等高距整除,为错误等高线

助曲线:国标码为710104,能被0.25倍等高距整除,但不能被0.5倍登高距等高距整除

2 代码设计

2.1 获取图层要素的框架

        /// <summary>
        /// 检查点图层
        /// </summary>
        /// <param name="wsPath">数据库名称</param>
        /// <param name="layerName">图层名称</param>
        public void checkContour(string wsPath, string layerName, double contourInterval)
        {
            //1. 打开工作空间
            //ESRI.ArcGIS.DataSourcesGDB
            IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactory();
            IWorkspace workspace = workspaceFactory.OpenFromFile(wsPath, 0);
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
            //2. 打开要素层
            IFeatureClass pFeaterClass = featureWorkspace.OpenFeatureClass(layerName);

            //4. 查询所有要素
            string where = "";
            IQueryFilter filter = new QueryFilterClass();
            filter.WhereClause = where;
            //5.定义查询游标并循环迭代
            IFeatureCursor pFeatcursor = pFeaterClass.Search(filter, false);
            IFeature pFeature = pFeatcursor.NextFeature();

            //6. 运算结果存储
            List<IFeature> errLists = new List<IFeature>();
            while (pFeature != null)
            {
                //要对该要素进行处理的个性化代码

                pFeature = pFeatcursor.NextFeature();
            }
            ExportPtsToShapefile(wsPath, errLists, layerName, esriGeometryType.esriGeometryPoint);
        }

注:

  • 获取mdb文件需要权限为:IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactory();
  • 读取gdb文件需要的权限为:IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactory();
  • 本段代码思路为:
    • 创建工作工厂,再在工厂以打开文件的方式中得到工作空间
    • 在工作空间中,打开要素类
    • 使用查询语句,结合光标循环,得到所有要素

2.2 获取字段名称的代码框架

                IFields fields = pFeature.Fields;
                int elevIdx = fields.FindFieldByAliasName("ELEV");
                double elevValue = double.Parse(pFeature.get_Value(elevIdx).ToString());
                int gbIdx = fields.FindFieldByAliasName("GB");
                string gbValue = pFeature.get_Value(gbIdx).ToString();

说明:

  • 使用IFields接口获取要素的所有字段;pFeature.Fields
  • 根据字段别名,从所有字段中,获取指定字段的索引;FindFiledByAliasName(fieldName)
  • 根据指定字段的说因,获取该索引值对应的要素的具体取值;pFeature.get_value(fieldIndex)

2.3 输出shp文件的代码及分析

2.3.1 在工作空间中创建要素类

            IWorkspace2 workspace2 = (IWorkspace2)workspace;
            if (workspace2.get_NameExists(esriDatasetType.esriDTFeatureClass, checkLayerName + "_检查结果"))
            {
                IFeatureClass pFC = featureWorkspace.OpenFeatureClass(checkLayerName + "_检查结果");
                IDataset pDS = pFC as IDataset;
                pDS.Delete();
            }
            IFeatureClass shpFeatureClass = featureWorkspace.CreateFeatureClass(checkLayerName + "_检查结果", 
                pFields, null, null, esriFeatureType.esriFTSimple, "shape", "");

分析:

  • 接口转换,在IWorkspace2接口中,调用get_NameExists方法,判断要创建的文件是否在工作空间中已存在
  • 如果存在,则在工作空间中打开该要素类,并将其删除
  • 之后,在工作空间中再创建要素类

2.3.2 为shape文件定义新字段

定义空间参考和几何类型

            IFields pFields = new FieldsClass();
            IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;

            IField pField = new FieldClass();
            IFieldEdit pFieldEdit = (IFieldEdit)pField;
            pFieldEdit.Name_2 = "shape";
            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;

            IGeometryDef pGeoDef = new GeometryDefClass(); //The geometry definition for the field if IsGeometry is TRUE.
            IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef;          

            //设置要素的类型及投影
            pGeoDefEdit.GeometryType_2 = geoType;
            IGeoDataset geoDataset = pFeaterClass as IGeoDataset;
            pGeoDefEdit.SpatialReference_2 = geoDataset.SpatialReference;
            pGeoDefEdit.GeometryType_2 = geoType;//要素的几何类型
            pFieldEdit.GeometryDef_2 = pGeoDef;
            pFieldsEdit.AddField(pField);

自定义字段:

            //添加其他的字段
            pField = new FieldClass();
            pFieldEdit = (IFieldEdit)pField;
            pFieldEdit.Name_2 = "X";
            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
            //pFieldEdit.Precision_2 = 7;//数值精度
            //pFieldEdit.Scale_2 = 6;//小数点位数
            pFieldsEdit.AddField(pField);

自定义字段函数:

        /// <summary>
        /// 向gdb图层中添加字段
        /// </summary>
        /// <param name="gdbName">gdb文件夹名称</param>
        /// <param name="layerName">涂层名称</param>
        /// <param name="fieldName">字段名称</param>
        /// <param name="type">字段类型</param>
        public void AddFields(string gdbName, string layerName, string fieldName, esriFieldType type)
        {
            IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
            IWorkspace workspace = workspaceFactory.OpenFromFile(gdbName, 0);
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
            IFeatureClass pFeaterClass = featureWorkspace.OpenFeatureClass(layerName);
            if (pFeaterClass.FindField(fieldName) >= 0)
            {
                return;
            }
            else
            {
                IFieldsEdit pFieldsEdit = pFeaterClass.Fields as IFieldsEdit;
                //添加其他的字段
                IField pField = new FieldClass();

                IFieldEdit2 pEdit = pField as IFieldEdit2;
                pEdit.Name_2 = fieldName;
                pEdit.Type_2 = type;
                pFieldsEdit.AddField(pField);
            }
            if (((IWorkspaceFactoryLockControl)workspaceFactory).SchemaLockingEnabled)
            {
                ((IWorkspaceFactoryLockControl)workspaceFactory).DisableSchemaLocking();
            }
        }

2.3.4 要素间字段值交换

            for(IFeature fea in liFeatures)
            {
                IFeature pFeature = shapeFeatureClass.CreateFeature();

                IFields fields = fea.Fields;
                int elevIdx = fields.FindFieldByAliasName("ELEV");
                double elevValue = double.Parse(fea.get_Value(elevIdx).ToString());

                pFeature.set_value(pFeature.Fields.FindFieldByAliasName("ELEV"), elevValue);
            }                


                

关于等高线高程值与国标码一致性的完整代码见微信公众号历史文章【等高线高程值与国标码一致性检查】:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小薛引路

喜欢的读者,可以打赏鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值