上一节讲的是点Point在Esri的存储方式,那么现在多顶点是如何存储的呢?
既然Point使用了数组:double[] m_attributes; double数组按顺序存储所有属性数据,
那么多点就可以使用二维数组做一个Point[] MultiVertex = Point[]();不就好了嘛(`・ω・´)
但是把所有属性数据都用double存储实在是太奢侈了!另外在处理地理数据时很多都是针对单一属性的操作,没有必要把别的属性也一起遍历一遍又一遍。所以这里我们把每个数据按照属性拆开成一列列存储(简单列式存储?),每一列都叫做一个“属性流”AttributeStream,属性流分为6种AttributeStreamOfDbl、OfFloat、OfFloat、OfInt8、OfInt16、OfInt32、OfInt64,这样做既节约了存储空间,同时也保证了存储数据格式与属性格式一致。
当属性代表n个值时(比如XY),单条属性流里就会按顺序存储X1、Y1、X2、Y2、X3、Y3、X4、Y4、X5、Y5......
来个栗子:建立只有XY属性的ployline
m_vertexAttributes AttributeStreamBase[1] (id=42) 里面存储了一条AttributeStream(XY)
XY按照上述顺序存储
对比:建立有XY属性和ID属性的的ployline
添加了ID的一条属性流,这条流格式是int32
ok,属性都放在容器里准备好了,那么怎么把这些多点数据分割开成一个个单独的图形呢?
(MultiPoint下面就别看啦点直接分了就行啦!)
分割开这些属性的方法当然是记录这些图形的首点和尾点(下一个首点-1)啦,比如说第一个ployline由第1到第2个点组成,那么
就记录【0(第一个点),2(下一条的第一个点)】
下一个是3-9
就记录【2(第一个点),9(下一条的第一个点)】
最后一条线一定要把下一条的第一个点补在最后!
组合后就是【0,2,9】啦,这也是一个数组,也能被看做一条整数属性流,就把它存在路径分割path的说明里面吧!
以后我再找第一条线就是【0,2-1】!ok!
现在出现了最后一个问题!我怎么知道这一条线是封闭的呢(Polygon)?还是不封闭的呢(Polyline)?
这个数据流存储存储Polygon是不会有 最后点 = 首点 的操作的,存储时也不会特意在最后加一个首点。它只是简单的告诉你:“这是封闭的!Flag = 1!”,那么记录这些封闭的情况又出了一个属性记录数组叫它Flag吧(m_pathFlags) !
栗子:p1.closePathWithLine();(把最后一条线封闭成Polygon!)
此外MultiVertexGeometry还会存储一些其他简单的属性:
m_moveToPoint Point 正在绘制的线的首点
m_envelope 域
m_cachedArea2D 面积
m_cachedLength2D 长度
m_pointCount 点个数
等等其他属性,有兴趣的可以跑跑程序看一下~
好嘞,本节结束,下节会讲讲当进行操作时每条数据流是怎么被增删改查和其他特别操作的,敬请期待。