Esri geometry api java 学习 数据结构 (2) 几何数据结构 (VertexDescription)

Esri geometry api java 学习文档 (3) 几何数据结构 (VertexDescription)

本章重点描述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点属性默认值

 几个关键值:

类型名称含义
intm_attributeCount总属性个数
intm_semanticsBitArray代表语义的二进制位数
int     m_totalComponentCount总组件个数 
intm_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  MID NORMAL TEXTURE1D  TEXTURE2D TEXTURE3DID2
组价个数 232
默认值00NaN000000

 

 

 

当进行初始化操作时(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

 

  (按位遍历和语义字典的好处是:如果有一个输入值【1001】,属性数为2,组件数还是3,但是字典是{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 固有属性XY
默认值0.00

 

数据2
属性 0
语义0 (固有属性XY)0 (固有属性XY)1(Z)
默认值0.00.00.0

 

 

这种复杂的初始化方式主要是因为,几何数据不一定具有全部的属性XY、Z、M、ID,它们只是有其中的几个,所以要建立详细的字典和数组对应好数据和语义的关系!

 

 

 

 

最后截一张只有XY+M 属性的VertexDescription的样子~

上图只有XY

上图有XY+M 

对齐~

属性
语义 0 固有属性XY2 M 
默认值0.0NaN

 

数据2
属性 0
语义0 (固有属性XY)0 (固有属性XY)2(M)
默认值0.00.0NaN

 

参考:

http://esri.github.io/geometry-api-java/javadoc/com/esri/core/geometry/VertexDescription.html

http://esri.github.io/geometry-api-java/javadoc/com/esri/core/geometry/VertexDescription.Semantics.html#MAXSEMANTICS

 

posted @ 2019-02-18 21:39 第17个巡道工 阅读(...) 评论(...) 编辑 收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值