SuperMap iObjects .NET 制作2.5D数据详解(一)

作者:为梦齐舞

目前腾讯搜搜、百度地图等多家地图厂商都已推出2.5D地图查看模式,只要把查看级别缩放到较小的区域,就可以看到该区域楼体的形状,用户可以由此更好的辨认位置,确认自己的出行目的地,如下图所示:
SuperMap iObjects .NET 制作2.5D数据详解(一)_第1张图片

很多用户都会有这样的疑问,在SuperMap中我们能否制作出类似百度的2.5D地图呢?答案都是肯定的,下面就让我们来一步一步了解SuperMap iObjects .NET 制作2.5D数据的步骤。

一、 数据准备:我们首先准备一份小区的矢量数据。

二、 制作顶面:根据图1和图2的对比,我们不难发现2.5D数据只是将数据向Y方向偏移了一定的距离, 那让我们来直接平移一下,看一下效果。
SuperMap iObjects .NET 制作2.5D数据详解(一)_第2张图片
我们可以发现直接平移后的数据和百度地图还是有一定差距的,也就是两份数据中间的部分缺失掉了,如果我们把中间的部分补起来,是否就可以达到和百度地图一样的效果呢?

三、 制作侧面:那么现在问题来了,如何能够生成中间部分的数据呢?我们不难发现,其实这两份数据有一个共同的特点,就是每个点的坐标只有Y方向有特定数值的拉高,X坐标不变,我们可以根据这个特点,向上构造侧面,取底面的第一个和第二个点,我们把它命名为A点和B点,以A点为起点,那么第二个点就是A点Y值拉伸的点A1,第三个点为B点拉伸的点B1,第四个点为B点,按照顺时针方向构造点集,生成侧面。如下图:
SuperMap iObjects .NET 制作2.5D数据详解(一)_第3张图片
以此类推,生成其他的面片,来构造侧面,生成顶面和侧面的代码如下:
SuperMap iObjects .NET 制作2.5D数据详解(一)_第4张图片
其中ati变量为拉伸的高度,生成结果:
SuperMap iObjects .NET 制作2.5D数据详解(一)_第5张图片
做到这一步,跟百度地图的效果已经很相近了,但是如图6和图7所示,侧面出现了面与面压盖的问题,看起来还是存在视觉差异。那么如何解决这个问题呢?

四、 侧面压盖:既然小的面片出现了压盖,那么我们直接将面片合并为一个整面,是否可以解决压盖问题呢?
SuperMap iObjects .NET 制作2.5D数据详解(一)_第6张图片

五、 制作棱角:走到这一步,我们发现效果还是不太好,如果每个棱角,能够标示出来,是否效果还会好一些呢?棱角的提取还是和之前的思路一致,直接使用拉伸前的点和拉伸后的点构造棱角线。
SuperMap iObjects .NET 制作2.5D数据详解(一)_第7张图片
虽然棱角线是有了,但是出现了很多多余的棱角线,从第三步的截图中我们也可以发现,侧面其实也存在很多冗余的数据,那些数据在顶面的背后,不能被看见,这样的就是棱角线和侧面都存在数据冗余。

六、 去除冗余数据:顶面、侧面和棱角的关系,大家都能从图中看出,被顶面包含的棱角和侧面其实是我们不需要的;对于侧面,我们可以将顶面和侧面做擦除运算,对于棱角线,可以使用运算结果和棱角线做相交;这样就可以解决冗余数据的问题了,下面我们来看一下代码实现和效果。

七、合并数据:工作进行到这一步,大致就已经完成了,但是这些数据是由侧面、顶面、棱角边,三份数据组成的,这样管理数据将会非常头痛,我们是否可以设法将这三份数据合并为一个数据集来存放呢?那么问题就又来了,线数据和面数据怎么合并啊?我们这时可以将侧面转换为线,然后将结果追加到棱角线中,再拓扑生成面数据集就可以解决以上问题。(PS:这里不要使用线数据集转面数据功能,可能结果会出现数据丢失的问题)

八、 区分对象类型:接着步骤7的思路,我们是否也有要顶面和侧面也合并呢?这时会发现顶面和侧面是有一定区别的,就百度地图来看,他们设置的颜色不一样,合并后如何解决这个问题呢?我们可以建立一个名称为isSide的Boolean类型字段,来标识是底面还是侧面,就可以轻松解决这个问题了。
SuperMap iObjects .NET 制作2.5D数据详解(一)_第8张图片
SuperMap iObjects .NET 制作2.5D数据详解(一)_第9张图片

九、效果展示:通过以上的步骤,我们制作的2.5D数据就全部完成了,只需要使用字段isSide制作专题图即可。下面我们来看一下最终的效果。

你可能感兴趣的:(百度地图,supermap,2-5D数据)