创建一个要素类是很简单的,只需要获取一枚IFeatureWorkspace或者一个IFeatureDataset,然后调用其CreateFeatureClass()即可。

这个CreateFeatureClass()方法定义如下:

public IFeatureClass CreateFeatureClass (
string Name,
IFields Fields,
UID CLSID,
UID EXTCLSID,
esriFeatureType FeatureType,
string ShapeFieldName,
string ConfigKeyword
);

第二个参数很关键,叫字段集合,有很多开发者报错也是这个。

有关这个参数怎么写的问题,网上代码相当多了。

我们知道在ArcGIS中创建要素类的时候,会有两个必须存在的系统字段:OBJECTID、SHAPE;

在AO/AE编程中,必须自己创建这两个字段(字段名可以自己定义,但是相关的属性必须设置好,此处为了好看将全大写的SHAPE改为Shape),至少创建Shape字段。

问题来了,我们在ArcGIS中创建要素类的时候,是可以不选空间参考的:

1. 在IFeatureWorkspace中CreateFeatureClass()不允许空坐标系

在AO/AE中,创建数据库中独立的要素类,而不是在要素数据集中的要素类则不行,必须对IGeometryDefEdit.SpatialReference进行赋值:

/// <summary>
/// 创建Shape字段的代码,以及为Shape字段添加几何定义
/// </summary> // 创建字段所需的几何定义
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = geometryDef as IGeometryDefEdit;
geometryDefEdit.GeometryType_2 = esrigeomtryType;
geometryDefEdit.HasZ_2 = true;
geometryDefEdit.SpatialReference_2 = // 必须在此设置参考,不能为null,也不能为new UnknownCoordinateSystem();

// 创建字段
IField geometryField = new FieldClass();
IFieldEdit geometryFieldEdit = (IFieldEdit)geometryField;
geometryFieldEdit.Name_2 = "Shape";
geometryFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
// 赋予几何定义
geometryFieldEdit.GeometryDef_2 = geometryDef;

否则创建要素类就会报错,VS调试模式中,报错信息提示:缺少空间参考。

这已经被我测试了N次,以下为证据:

1.1 使用ArcCatalog中导出的Unknown.prj文件创建未知坐标系

使用Unknown.prj文件创建坐标系,判断其是否为IUnknownCoordinateSystem,结果返回true。

1.2 地图的参考系可以为空,但是要素类的参考系不能为空

我写了这么一段代码:

其中,nowMap是IMap类型的变量,代表了一个数据框(地图)。

下面,打开ArcMap,不加载任何数据的情况下,查看坐标系统:

点击测试按钮反馈:

提示空指针,证明了不添加数据时,数据框的坐标系就是null,而不是IUnknownCoordinateSystem;

紧接着,添加一个点要素类进数据库,点要素没有定义坐标系,点击按钮反馈:

此时,nowMap变量的坐标系就变成了IUnknownCoordinateSystem。

2. 在IFeatureDataset中CreateFeatureClass()

若要素数据集设置的是未知坐标系:

则可以不对IGeometryDefEdit.SpatialReference进行赋值,而且创建的要素的坐标系一定是要素数据集的IUnknownCoordinateSystem,且不会报错。

相关代码(在ArcGIS默认数据库的Test数据集中创建名为TestFC要素类):

结果:

(因为在要素数据集下,所以要素类的坐标系是不能被更改的)

3. UnknownCoordinateSystem类的定义

我找到了这个类:UnknownCoordinateSystem

实现了很多接口,包括ISpatialReference和IUnknownCoordinateSystem,这为编程判断类型提供了帮助(类型转换的as和is)

【AO笔记】关于创建IFeatureClass中的参考系设置——不能为null也不能为IUnknownCoodinateSystem的更多相关文章

  1. 学习笔记-menusript控件中条目权限设置使用

    在做一个小程序的时候,偶然发现了使用menusript控件做权限设置的方法,仅此标记,以供参考. 首先创建一个实例:testuseright.sln, 在项目文件里创建两个窗体:Form1.cs和us ...

  2. MySQL学习笔记_3_MySQL创建数据表(中)

    MySQL创建数据表(中) 三.数据字段属性 1.unsigned[无符号] 可以让空间增加一倍 比如可以让-128-127增加到0-255 注意:只能用在数值型字段 2.zerofill[前导零] ...

  3. 【AO笔记】有关使用AO基于shp文件创建网络数据集的一个细节

    前些日子,和群友交流时提及shp文件创建单一网络数据集的创建问题. 由于项目需求,用shp文件创建网络合适,所以不得不去找一些古老的代码资料... 以前的研究中,创建网络数据集是根据IDatasetC ...

  4. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  5. springmvc学习笔记---idea创建springmvc项目

    前言: 真的是很久没搞java的web服务开发了, 最近一次搞还是读研的时候, 想来感慨万千. 英雄没落, Eclipse的盟主地位隐隐然有被IntelliJ IDEA超越的趋势. Spring从2. ...

  6. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  7. Django:学习笔记(2)——创建第一个应用

    Django:学习笔记(2)——创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...

  8. OpenStack虚拟机创建过程中镜像格式的的变化过程

    Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为OpenStack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想: 基于组件的 ...

  9. 运维开发笔记整理-创建django用户

    运维开发笔记整理-创建django用户 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建普通用户 C:\Users\yinzhengjie\softwares\Pycharm ...

随机推荐

  1. Redis--Memched--Cache缓存介绍使用

    目录:  一.分布式缓存—Redis与Memched的区别 1.1.      数据支持类型 1.2.      持久性 1.3.      内存利用情况 1.4.      数据一致性 1.5.   ...

  2. .NET中的状态机库Stateless

    标题:.NET中的状态机库Stateless 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10674018.html 介绍 什么是状态机和状态模式 ...

  3. Flannel工作原理

    flanneld程序启动会有一个参数叫做-etcd-prefix和-iface.前者是指定flanneld程序使用etcd的哪个节点来存储数据,-face是指定flanneld使用网络是使用宿主机哪个 ...

  4. POLARDB · 最佳实践 · POLARDB不得不知道的秘密(二)

    前言 POLARDB For MySQL(下文简称POLARDB)目前是阿里云数据库团队主推的关系型数据库.线上已经有很多企业用户在使用并且稳定运行了很久.当然,由于POLARDB是为云上环境专门打造 ...

  5. 删除Oracle用户及表空间

    --转载自 https://blog.csdn.net/sunny05296/article/details/81126548--以sysdba用户登录,查找需要删除的用户conn / as sysd ...

  6. shell 简单脚本编程

    shell脚本编程 编译器,解释器 编程语言: 机器语言,汇编语言,高级语言 静态语言:编译型语言 强类型(变量) 事先转换成可执行格式 C,C++,JAVA,C# 动态语言:解释型语言,on the ...

  7. 数字信号处理专题(3)——FFT运算初探

    一.前言 FFT运算是目前最常用的信号频谱分析算法.在本科学习数字信号处理这门课时一直在想:学这些东西有啥用?公式推来推去的,有实用价值么?到了研究生后期才知道,广义上的数字信号处理无处不在:手机等各 ...

  8. python 简史

    ---恢复内容开始--- Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机 ...

  9. 客户端和服务端(C#) 时间戳的生成和转换

    C# DateTime与时间戳的相互转换,包括JavaScript时间戳和Unix的时间戳. 1. 什么是时间戳 首先要清楚JavaScript与Unix的时间戳的区别: JavaScript时间戳: ...

  10. Java并发-建立线程

    一.建立新的线程 Runnable r = () ->{ //线程所执行的逻辑代码 }; Thread thread = new Thread(r); thread.start(); 方法介绍 ...