[转]SDE 中空间坐标的的物理存储
坐标顺序
一个SDE特征的几何属性,使用一个或者更多的坐标。坐标包括,最小包括一对x,y。一个特征
可能还有与x,y相关的z或m值.x,y,z和m值都以整数来存储。二进制流的顺序为x/y,x/y,...,x/y,
z,z,z,z...z,m,m,....m(z值和m值是可选的)。z,m值和x,y值直间都是一对一的关系。对于每一个
z,m值都有一个x,y对与之对应。
Multipart特征类型对象的表达
一个SDE特征的几何属性可能有一个或多个几何部分,每个部分使用一个坐标值分隔符。分隔符有
一个预定义的值。分隔符是第二个几何部分的开始,多个部分的几何属性坐标列表在二进制流中
以如下形式存储: x/y,x/y,...,x/y,<separator>,x/y,x/y,...,x/y,z,z,...,z,<separator>,z,
z,...,z,m,m,...,m,<separator>,m,m,...,m(z值和m值是可选的)
Point压缩
在二进制流中,每个x/y,z,和m值都压缩到一个顺序无关的字节流。
在SDE内部,所有的空间坐标都是从0到2147483647.这种格式提供了更好的准确性和完整性,
和相对于浮点数处理更优的性能表现.开发者应该知道内部整数的表示,因为有可能试图在
图层中存储一个过大的值.如果是那样的话,SDE将返回SE_COORD_OUT_OF_BOUNDS错误.开发者
不需要直接使用整数。
因为真实世界坐标既不是正也不是负值,SDE数据需要一个偏移距离(假原点)以确保
浮点数坐标转换到整数后是正的并有一个最小的比例系数
Part separators(Part 分隔符)
x 值为-1 ,y值为0,z和m值没有定义。分隔符在压缩时不需要任何逻辑
Point compression(点压缩)
压缩或解压缩存储在二进制流中的点分两个步骤:转换到相对偏移方案并压缩为字节数组。解压缩与之相反,
先从字节数组中解压缩,然后把值转为绝对坐标。每个过程都描述如下:
Relatie-offset value calculation(相对偏移值的计算)
转化坐标值为相对偏移的目的是使其在存储是占用尽可能少的字节。在一个存储相对偏移值的数组中,
第一个值是点的绝对坐标(使用32位整数)后面的值都是相对前一个的偏移值.
或者差值.因此,给定N个绝对坐标值,其绝对坐标计算如下:
relative_value[0]=absolute_value[0]
relative_value[1]=absolute_value[1]-absolute_value[0]
...
relative_value[N-2]=absolute_value[N-2]-absolute_value[N-3]
relative_value[N-1]=absolute_value[N-1]-absolute_value[N-2]
给定N个相对坐标值,其绝对坐标计算如下:
absolute_value[0] = relative_value[0]
absolute_value[1] = relative_value[0] + relative_value[1]
...
absolute_value[N-2] = relative_value[N-3] + relative_value[N-2]
absolute_value[N-1] = relative_value[N-2] + relative_value[N-1]
这种方法通常非常有效,因为一个特征的点往往都是紧密相临的
压缩整数值
相对偏移值一般比绝对坐标值要用更少的字节来表达,相对偏移值被压缩为一个字节序列。每个
字节的高位作为控制位来表示结束标志,指示是否还有后续字节。例如:如果一个整数被压缩为
三个字节,第一和第二个字节的高位被置位(指示还有一个后续的字节),第三个字节高位没有
被置位(表示这个是整数的最后一个字节)。第一个字节的第二个位是符号标志。所以一个字节
有一个控制位,一个符号位,和六个数据位。所有的后续字节都包括一个控制位和七个数据位。
因为只有很少的数据位来表达一个整数,最多五个字节才能表达一个整数值,(这是最坏的情形,
仅仅发生在整数值大于134,217,727)
压缩字节的整数存储的形式
=======================================================
字节数目 位 值
0 0 控制位(0 =最后一位,1=整数值延续到下个字节)
0 1 符号位(0 =正整数,1=负整数)
0 2~7 整数的其余六个位
1-4 0 控制位(0 =最后一位,1=整数值延续到下个字节)
1-4 2~7 整数的其余七个位
整数值根据数据位的存储情况使用六个或七个位(在被压缩的值和0x3F或0x7F分别使用二进制OR操作)来存储到
压缩的字节内。原始的值被向右移位(也就是将值划分为不同的部分)使用六个或七个位。如果新的,移位后的值
不为零,那么在压缩字节内的控制位就被置位,并重复这个步骤,直到移位后的值为0。解压缩与此相似,是此过
程的逆过程。
二进制形式
除了压缩的坐标值之外,一些额外的信息也被存储,用来提供坐标值存储的信息。
字节流的前八个字节被保留,用来存放额外信息。
当前,有两部分额外信息:压缩点字节流的大小和维度。这两个值都以压缩的整数方式来存储
坐标字节流长度定义为总的长度减去保留的八个字节(也就是压缩点字节流的大小)。这个值
存储在一开始的前五个字节。
坐标系统的维度表示z值m值是否包含在字节流中,维度是一个字节位向量存储在字节流的第六个字节里
第一个低位表示是否有z值存在。第二个低位指示是否有measure值存在。
SDE中几何属性的二进制形式的形式表示
=======================================================
字节数据 使用
0-4 坐标值流长度,压缩整数格式(字节流长度减去8个保留字节)
5 坐标维度掩码,压缩整数格式
6-7 保留,当前没使用
8+ 压缩的坐标值,压缩的相对偏移值格式
//------------这是一篇官方文档的翻译稿,自己懒得去翻译了,直接转载了别人的。