ArcSDE地理数据库,虽然经常在用,但仅限于了解功能层面的东西,其内部实现机制对我来说是个黑盒子。因为想了解register with geodatabase操作在数据库层面到底发生了什么,我分析了一下注册操作时会涉及到的几个表。这其中有一张表叫layers,在官方的帮助文档里,对layers是这样描述的:

该表的大多数字段含义,根据帮助文档里的描述,都很好理解。但有一个字段eflags,帮助文档里并没有描述清楚,如下图:

这说得非常模糊,只说了存储哪些图层属性,但这些图层属性是如何通过NUMBER体现出来的?帮助文档里没有更详细的说明。如果想搞清楚,我需要找其它途径。

ArcSDE地理数据库除了有一个方案(一系列的表),还有一些存储过程和包体,那这些存储过程中会不会有相关的信息呢?我以eflags作为关键字进行查询,查询结果如下:

根据查询结果可知,在GDB_UTIL、LAYER_UTIL、SPX_UTIL等包体中都有对eflags字段的或引用、或查询、或赋值。如上图所示,我们至少知道了,将NUMBER转成2进制后,从右往左数第2位表示要素类型为POINT,第3位表示LINESTRING。

但是,遗憾的是,它并未将图2中所列的所有图层属性都解译出来,而只是解译了部分属性。我们可以知道了部分比特位所代表的含义,但尚不能知道所有比特位的含义。

我们还需要查询更多的资料。我偶然间查到了名为《ORACLE SPATIAL空间数据在ARCSDE中的图层注册(李家,曹威)》的一篇论文,上面提到了eflags的含义在sdetype.h中有定义。下载ArcSde SDK For C并查看sdetype.h,发现如下内容:

该头文件仅介绍了SHAPE TYPE和STORAGE TYPE所对应的比物位,但对于图2中提到的其它图层属性,仍然没有介绍。

ArcSDE地理数据库中的表一般来说,都有管理工具。因为不可能要求所有人通过SQL接口来查询或修改相关配置。那么,Layers表的管理工具有什么呢?我首先想到的就是sdelayer。Sdelayer是ArcSDE提供的,用于对图层进行查询、注册、增加geometry字段等操作的管理工具,它可以查询哪些属性呢?它又可以修改哪些属性呢?通过比较修改属性前后的eflags字段值,是不是就可以推算出不同比特位所代表的具体含义呢?

使用sdelayer命令,需要有SDE服务,所以第一步先创建SDE service 。

下面,"存储单精度坐标还是双精度坐标"和"存储注记"属性为例,演示使用sdelayer 推算其所代表的比特位的方法

     一 、推算"存储单精度坐标还是双精度坐标"所代表的比特位

  1. 创建两个结构完全一样的表TEST2和TEST3
  2. 使用sdelayer -o add 操作,分别以-P BASIC和-P HIGH作为参数,新增geometry字段。如下图所示:

  3. 比较TEST2与TEST3的eflags(二进制)

      可知,从右往左数,第8位代表图层属性"存储单精度坐标还是双精度坐标"。

        二 、推算"存储注记"所代表的比特位

  1. 创建两个结构完全一样的表TEST4和TEST5

  2. 使用sdelayer -o add 操作,分别以-e p和-e pA(-e的详细说明见文章末尾)作为参数,新增geometry字段。如下图所示

  3. 比较TEST2与TEST3的eflags(二进制)

      可知,从右往左数,第22位代表图层属性"存储注记"。

总结:

根据上述多种资料及多种分析方法,sde.layers.eflags字段值,转成二进制之后,从右往左数,分别代表的含义如下给所示:

顺序位

该位所代表的含义

1

允许存储空类型(几何类型),即shape字段不赋值

2

POINT

3

LINESTRING

4

SIMPLELINESTRING

5

POLYGON

8

坐标是单精度还是双精度(SDO_GEOMETRY无法设置单精度)

16

地理图形类型(MICROSOFT GEOGRAPHY)

17

3D

18

LAYER AUTO LOCKING

19

MULTI

20

存储度量值

21

使用只加载 I/O 模式还是正常 I/O 模式

22

存储注记数据

23

存储 CAD 数据

24

拓扑类型

25

DBMS 数据类型为SDEBinary

26

DBMS 数据类型为WKB

27

DBMS 数据类型为ST_Geometry

28

DBMS 数据类型为SDO_Geometry

29

DBMS 数据类型为SDELOB

31

不具有空间索引

由上表可知,仍然有一些图层属性,尚不知道其所对应的比特位,例如"是另一个图层的视图"。然而,大多数的属性,其所占用的比特位,目前是弄清楚了。

附加说明:

Sdelayer 命令的-e参数,其详细含义如下:

-e

Entity types allowed (npslaAc3+M).

n

Nil

p

Point features

s

Line (spaghetti) features

l

Simple line (line string) features

a

Area features

A

Annotation

c

CAD data

3

Three-dimensional features can be added to the entity type mask only with the `-o add' operation

+

Multipart features

例如:

a+(面)

p+(点)

l+(线)

M

Measures on coordinates. The [-m] option is required to store measure values on each coordinate. Measures can be added to the entity type mask only with the "-o add" operation.

sde.layers表的eflags字段解析的更多相关文章

  1. Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件

    首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...

  2. mybatis动态调用表名和字段名

    以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...

  3. c++获取sqlite3数据库表中所有字段的方法

    常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...

  4. Form表单 JSON Content-type解析

    Form表单 JSON Content-type解析 1 表单Form概述 在Form表单中,参数一般有: action 表单提交的url method 提交方式:post get name 表单的属 ...

  5. [转]MyBatis动态传入表名、字段名参数的解决办法

    一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...

  6. 【死磕jeesite源码】mybatis动态调用表名和字段名

    本文转载自夏雪冬日 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字 ...

  7. oracle 创建表、删除表、添加字段、删除字段、表备注、字段备注、修改表属性

    1.创建表 create table 表名( classid number() primary key, 表字段 数据类型 是否允许为空(not null:不为空/null:允许空) 默认值(defa ...

  8. mysql向表中某字段后追加一段字符串:

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

  9. SQL Server 2008 R2——根据数据查找表名和字段名 根据脏数据定位表和字段

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

随机推荐

  1. C# 文件操作总结

    一.需求分析 1.将信息记录到本地记事本中. 2.将记录的信息读取出来. 3.计算出某个文件夹下所有后缀名为txt的数量和dll的数量. 4.从网络上下载文件. 二.二话不说上代码 using Sys ...

  2. Lambda表达式---Day27

    函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是“拿什么东西做什么事情”.相对而言,面向对象过 分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语 ...

  3. nginx配置多个TLS证书,以及TLS SNI简介

    背景 原来申请的正式域名备案通过,TLS证书也申请了.之前使用的临时域名和证书作为测试环境使用.于是要在单个ECS主机上配置nginx多个证书和多个域名. 实践 nginx部署多个TLS证书很简单,在 ...

  4. Java 之 Properties 集合

    一.Properties 概述 Properties 是Hashtable的子类,不允许key和value是null,并且它的key和value的类型都是String. 二.常用方法 1.构造方法 P ...

  5. android studio学习----如何创建一个库项目

    首先,打开Android studio的软件工具,进入到界面中点击菜单的“file”选项. 2 在弹出的下拉的菜单中,可以看到的是为"New Module“的选项点击进入.   3 进入到c ...

  6. Windows Server安装FileZilla服务端

    1.下载 地址: https://filezilla-project.org/download.php?type=server 点击下载 2. 安装较为简单, 不详细介绍,下面说配置 2.1 添加用户 ...

  7. 团队第五次——Alpha2的发布

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...

  8. 性能测试基础---ant集成1

    ·Jmeter的命令行与ant等的集成.·为什么需要使用Jmeter的命令行模式(Non-GUI).·为了更好的利用负载机的资源.GUI模式会消耗更多的系统资源.·为了更好的掌握jmeter和其它工具 ...

  9. python测试开发django-69.templates模板过滤器filter

    前言 templates 模板里面过滤器 filter 的作用是对变量的出来,比如小写转大写,替换一些特殊字符,对列表取值,排序等操作. 内置的过滤器有很多,本篇拿几个常用的过滤器做案例讲解下相关的功 ...

  10. Eclipse调用Tomcat出错

    错误提示:The server cannot be started because one or more of the ports are invalid. Open the server edit ...