本章重点描述Esri是如何建立整个几何体系的,如果没有需要可以pass,想建立自己数据体系的看看这些结构和思路还是很有意思且很有意义的。
VertexDescription存在于所有几何类型中,它规定了整个数据的存储格式和存储方法(像是数据库建表文件?)
先看一看各几何类们是否真的遵循它的规定:
point的初始化:
直接 m_description = VertexDescriptionDesignerImpl.getDefaultDescriptor2D(); 调用实现类中的创建二维描述函数,实现类中直接调用了VertexDescription(1);
Polyline的初始化:
先建立父类的实现类 m_impl = new MultiPathImpl(false);在MultiPathImpl 同样使用了 m_description = VertexDescriptionDesignerImpl.getDefaultDescriptor2D(); 实现类中直接调用了VertexDescription(1);
Polygon的初始化:(同Polyline)
先 m_impl = new MultiPathImpl(true); 后 m_description = VertexDescriptionDesignerImpl.getDefaultDescriptor2D(); 实现类中直接调用了VertexDescription(1);
Envelope的初始化(同point):
m_description = VertexDescriptionDesignerImpl.getDefaultDescriptor2D();实现类中直接调用了VertexDescription(1);
【实现类里对于初始化只提供了 VertexDescription(1); 初始化二维数据 和 VertexDescription(3); 初始化三维数据】
现在我们肯定了VertexDescription说话还是非常算数的,那VertexDescription结构究竟是什么样的呢?
VertexDescription的结构:
VertexDescription中包含着几个存储单元:
类型 | 名称 | 含义 |
int[] | m_semanticsToIndexMap | 语义在哪一位 |
int[] | m_indexToSemantics | 哪一位的语义是什么 |
int[] | m_pointAttributeOffsets | 点属性 |
double[] | m_defaultPointAttributes | 点属性默认值 |
几个关键值:
类型 | 名称 | 含义 |
int | m_attributeCount | 总属性个数 |
int | m_semanticsBitArray | 代表语义的二进制位数 |
int | m_totalComponentCount | 总组件个数 |
int | m_hash | 存储 |
还包含着一些固定字典:
static final double[] _defaultValues = { 0, 0, NumberUtils.NaN(), 0, 0, 0,0, 0, 0 }; 各种语义的默认值
int[] _components = { 2, 1, 1, 1, 3, 1, 2, 3, 2, }; 各种语义的组件个数
下面对齐一下~
语义 | XY | Z | M | ID | NORMAL | TEXTURE1D | TEXTURE2D | TEXTURE3D | ID2 |
组价个数 | 2 | 1 | 1 | 1 | 3 | 1 | 2 | 3 | 2 |
默认值 | 0 | 0 | NaN | 0 | 0 | 0 | 0 | 0 | 0 |
当进行初始化操作时(VertexDescription(1); 或者是 VertexDescription(3);)
1.函数的初始化
先将1【01】和 3【11】存入 m_semanticsBitArray (代表语义的二进制位数)
m_attributeCount = 0 开始累积属性数
m_totalComponentCount = 0 开始累积组件数
m_semanticsToIndexMap 初值化语义字典为{-1,-1,-1,-1,-1,-1,-1,-1}(8个 -1)
=====OK初始化结束=====
2.组织赋值
根据位数【01】【11】跟 flag【01】循环做 “与” 运算,之后将flag移位赋值【01】->【10】->【100】->【1000】.......(按位查询的方法)
如果 “与” 运算为 是 则:
m_attributeCount++; 属性数+1
m_semanticsToIndexMap 语义字典中新增了一个定位
从组件数表里面找到该位的组件数,记录增加到总组件数m_totalComponentCount中
有了以上数据以后可以建立更细致的索引
比如根据属性数建立
m_indexToSemantics 哪一位的语义是什么
m_pointAttributeOffsets 属性在总组件的位置
最后通过查询默认值字典
向m_defaultPointAttributes 默认值表输入值
至此终于完成了整个初始化的过程
这样干说不太直观,用具体例子来说明下(看明白的就pass):
VertexDescription(3);
首先 3 = 【11】
按位遍历:
右数第一位是1,与运算成功:
属性数为0+1 语义字典中新增了一个定位 {0,-1,-1,-1,-1,-1,-1,-1} 意思是(语义为0的属性放在了属性表里的第0位)
----语义为0的属性是什么呢?
----是点的固有属性X,Y
----那X,Y占据两个格子啊?
----要去组件字典 _components = { 2, 1, 1, 1, 3, 1, 2, 3, 2, }; 第一位是2,代表第一个属性XY有2个组件
那么此时总组件数为0+2
按位遍历:
右数第二位是1,与运算成功:
属性数为1+1 语义字典中新增了一个定位 {0,1,-1,-1,-1,-1,-1,-1} 意思是(语义为1的属性放在了属性表里的第1位)
组件字典 _components = { 2, 1, 1, 1, 3, 1, 2, 3, 2, }; 第二位是1,代表第一个属性Z有1个组件
那么此时总组件数为2+1
0,-1,-1,1,-1,-1,-1,-1}意思是(语义为4的属性放在了属性表里的第1位) )
至此初始化完成,现在把其他值都完整一下
m_indexToSemantics 是 [ 0 , 1 ] 属性表里面第0个属性的语义是0(XY),第1个属性的语义是1(Z)
m_pointAttributeOffsets 是 [ 0 , 2 ] 第1个属性(XY)在数据表里面位置是0,第2个属性(Z)在数据表里面位置是2
最后通过查询默认值字典
向m_defaultPointAttributes 默认值表输入值 [0.0 , 0.0 , 0.0] 分别是 [ 固有属性XY中的X,固有属性XY中的Y , Z ]
接着对齐~
属性 | 0 | 1 |
语义 | 0 固有属性XY | Z |
默认值 | 0.0 | 0 |
数据 | 0 | 1 | 2 |
属性 | 0 | 1 | 2 |
语义 | 0 (固有属性XY) | 0 (固有属性XY) | 1(Z) |
默认值 | 0.0 | 0.0 | 0.0 |
这种复杂的初始化方式主要是因为,几何数据不一定具有全部的属性XY、Z、M、ID,它们只是有其中的几个,所以要建立详细的字典和数组对应好数据和语义的关系!
最后截一张只有XY+M 属性的VertexDescription的样子~
上图只有XY
上图有XY+M
对齐~
属性 | 0 | 1 |
语义 | 0 固有属性XY | 2 M |
默认值 | 0.0 | NaN |
数据 | 0 | 1 | 2 |
属性 | 0 | 1 | 2 |
语义 | 0 (固有属性XY) | 0 (固有属性XY) | 2(M) |
默认值 | 0.0 | 0.0 | NaN |