创建一个要素类是很简单的,只需要获取一枚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. 啥?客户叫在DataGridView的左上角添加CheckBox?

    效果图是这样的,如何把CheckBox放到左上角是最重要的. 添加方法 InitColumnInfo() 方法,代码如下. private void InitColumnInfo() { ; Data ...

  2. 【Android Studio安装部署系列】目录

    概述 从刚开始使用Android Studio到现在,下面所有目录下的操作,当时习惯性的把每一个整理成一个文档(其实就是简单文字描述+截图):有些地方当时是一知半解,现在会稍微明白一些.正好赶上现在有 ...

  3. 【我们一起写框架】MVVM的WPF框架(五)—完结篇

    前言 这篇文章是WPF框架系列的最后一篇,在这里我想阐述一下我对框架设计的理解. 我对框架设计的理解是这样的: 框架设计不应该局限于任何一种设计模式,我们在设计框架时,应该将设计模式揉碎,再重组:这样 ...

  4. 总结微信公众平台网页开发中遇到的ios的兼容问题

    1. ios中音频不自动播放: 原因:出于节省流量的初衷,ios系统禁止音视频自动播放. 解决方案:使用微信的JS-SDK. DEMO: 先引入微信的JS-SDK, <script src=&q ...

  5. Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮

    前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求 ...

  6. C++基础——类继承中方法重载

    一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类 ...

  7. Windows 10 ADK 版本及下载链接汇总

    Windows 评估和部署工具包 (Windows ADK) 具有自定义大规模部署的 Windows 映像以及测试系统.添加的组件和在该系统上运行的应用程序的质量和性能所需的工具. Windows A ...

  8. 随笔:WPS居然!出了!Mac版!

    震惊! WPS! 居然! 出了! Mac版! 刚刚,我打算改一个word文档,打开了我的WIN10虚拟机,然而由于这个win10是前两天重装的,上面并没有word和wps. 当我打开wps官网的时候, ...

  9. 安装Adobe时出现Adobe Application Manager丢失或损坏解决方法

    很多朋友在安装Adobe系列产品时出现Adobe Application Manager丢失或损坏,这是由于上次安装的Adobe产品没有正确卸载,导致这次安装失败.那么如何解决这一问题呢? 1.下载安 ...

  10. 消费阿里云日志服务SLS

    此文档只关心消费接入,不关心日志接入,只关心消费如何接入,可直接跳转到[sdk消费接入] SLS简介 日志服务: 日志服务(Log Service,简称 LOG)是针对日志类数据的一站式服务,在阿里巴 ...