【AO笔记】关于创建IFeatureClass中的参考系设置——不能为null也不能为IUnknownCoodinateSystem
创建一个要素类是很简单的,只需要获取一枚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的更多相关文章
- 学习笔记-menusript控件中条目权限设置使用
在做一个小程序的时候,偶然发现了使用menusript控件做权限设置的方法,仅此标记,以供参考. 首先创建一个实例:testuseright.sln, 在项目文件里创建两个窗体:Form1.cs和us ...
- MySQL学习笔记_3_MySQL创建数据表(中)
MySQL创建数据表(中) 三.数据字段属性 1.unsigned[无符号] 可以让空间增加一倍 比如可以让-128-127增加到0-255 注意:只能用在数值型字段 2.zerofill[前导零] ...
- 【AO笔记】有关使用AO基于shp文件创建网络数据集的一个细节
前些日子,和群友交流时提及shp文件创建单一网络数据集的创建问题. 由于项目需求,用shp文件创建网络合适,所以不得不去找一些古老的代码资料... 以前的研究中,创建网络数据集是根据IDatasetC ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- springmvc学习笔记---idea创建springmvc项目
前言: 真的是很久没搞java的web服务开发了, 最近一次搞还是读研的时候, 想来感慨万千. 英雄没落, Eclipse的盟主地位隐隐然有被IntelliJ IDEA超越的趋势. Spring从2. ...
- Spring读书笔记——bean创建(下)
有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...
- Django:学习笔记(2)——创建第一个应用
Django:学习笔记(2)——创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...
- OpenStack虚拟机创建过程中镜像格式的的变化过程
Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为OpenStack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想: 基于组件的 ...
- 运维开发笔记整理-创建django用户
运维开发笔记整理-创建django用户 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建普通用户 C:\Users\yinzhengjie\softwares\Pycharm ...
随机推荐
- entity cannot be tracked
背景:EF Core项目中使用InMemory作为数据库提供程序,编写单元测试. 报错:“The instance of entity type 'Movie' cannot be tracked b ...
- Android快速开发常用知识点系列目录
项目构建 Android项目目录结构模板以及简单说明[简单版] Android Studio配置统一管理依赖版本号引用 Android多Module下的Application引用方式 APP开篇 An ...
- Python调用ansible API系列(二)执行adhoc和playbook
执行adhoc #!/usr/bin/env python # -*- coding: utf-8 -*- import sys from collections import namedtuple ...
- NumPy 超详细教程(3):ndarray 的内部机理及高级迭代
系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 ndarray 对象的内部机理 ...
- aps .net MVC单用户登录
当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线. 原文地址:http://www.cnblogs.com/f23wangj/p/4984302.htm ...
- SmartSql Redis 分布式缓存
安装 SmartSql.Cache.Redis Install-Package SmartSql.Cache.Redis Cache 配置 <Cache Id="T_Test.Redi ...
- 通过user.MYD MySQL密码
具体的获取方法: 1)通过hex 十六进制的工具打开user.MYD文件 这里使用:0XED 2)复制MySQL密码出来,进行分析 *CEAF6E9FA3A448A25AC9D00C8D7078385 ...
- Button控件的点击事件
Java的代码 主要重点: findViewById(); OnClickListener() package com.example.admin.myapplication; import andr ...
- linux 进程概念
1,pcb:进程控制块结构体:/usr/src/linux-headers-4.15.0-29/include/linux/sched.h 进程id:系统中每个进程有唯一的id,在c语言中用pid_t ...
- 【English EMail】2019 Q2 Public Holiday Announcement
Hi all, According to 2019 public holiday announcement released by Chinese government, this is to ann ...