假设这样一个场景,用户在Cesium球上加载了一个GeoJson文件(DataSource),里面是全美国所有州的Geometry信息(Entity),叠加到球面后,你自然会有一种冲动,点击某一个州,了解这个州的基本信息。场景如下图所示:

这个点击行为,对应的是选择控件(SelectionIndicator),而呈现信息的载体,就是信息框控件(InfoBox)。

如上是一个简单的逻辑关系,可见Viewer.SelectEntity属性起到了承上启下的作用。首先,Viewer模块负责UI的事件交互,比如鼠标点击或者双击,则会触发对应事件,判断当前的鼠标事件是否选中了Entity,如果选中,则更新Viewer.SelectEntity属性。

如上,可以看到在Cesium源码中,目前绑定了两个事件,一个是鼠标左键单击,选中该Entity,一个是鼠标左键双击,则会追踪到该位置。当然,如果你想要增加或者修改某个事件,则可以修改screenSpaceEventHandler的内容。可以参考 screenSpaceEventHandler,比如很多人希望取消双击效果,则可以调用:viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);

而无论是单击还是双击,内部都是通过pickEntity获取选中的Entity,该方法内部通过ID作为唯一标识,判断是否选中某一Entity,具体实现我们以后在详细讨论。而在单击中,会调用Viewer.SelectEntity的Set方法,此时,当状态发生变化时(选中或消失),都会触发选择控件的动画效果:

如上就是一个Entity从鼠标选中,事件的触发以及属性信息的显示的大致过程。

但Cesiu支持实时性的InfoBox状态更新,也就是说,在每一帧,我们都可以更新选择控件和信息框控件的状态,而这,就要从Viewer.prototype._onTick说起。

首先,Viewer.prototype._onTick由Clock.onTick事件触发,而时钟本身在每一帧都会触发onTick事件,因此Viewer也可以通过onTick来实现自身的更新。

机智的你一眼就看到了time参数,原来如此。这时,根据time时间,我们获取对应的description,字符串类型,本身就是一个div,然后赋给infoBoxViewModel.description进而实现InfoBox控件的实时更新。

通常,每一个Entity的description都是固定内容,不需要根据时间等变换,而如果对实时性有一定要求,或者需要自定义效果,则需要匿名函数来实现回调方法。在这看不见的地方,主要是createPropertyDescriptor,Property两者间错综复杂的关系…

如上是Entity中description的属性定义,通过createPropertyDescriptor把Entity. description封装成Property,提供了Set和Get方法,方便该属性的调用。这里createPropertyDescriptor会根据属性赋值来选择具体的Property子类来满足不同需求,稍后在介绍完Property在详细解释这一部分。

对于Property,则会调用getValueOrDefault方法,获取该Entity的description,获取每一个Entity对应的描述信息,这里,每一个Property都需要提供一个getValue的标准方法,这也是每一个Property子类必须要实现的方法:

而Property有很多子类,但在InfoBox中,主要涉及到CallbackProperty和ConstantProperty两种类型,通过命名我们不难看出,前者是一种回调方式,而后者则是一个常量。

好了,对Property有了一个基本认识后,我们在看看createPropertyDescriptor的具体实现:

高亮处代码,不难看出,在创建时优先考虑CallbackProperty的属性,如果用户没有采用这种属性,此时,value为String类型而不是Property,所以没有实现value. getValue方法,则将value(String)封装为ConstantProperty。所以,constant常量的方式非常简单,直接赋值即可:

Entity.description = “<div> description</div>”;

可我偏要用回调的方式,如何破?我们看看GeoJsonDataSource中是如何实现的。

首先,你要实现一个匿名函数,如上,实现一个describe方法,其中,因为是匿名函数,所以可以随时获取到该Entity的所有属性的Key-Value,可以根据自己的需要来创建对应的DIV,另外,该匿名函数也提供time参数,满足对实时性的需求。

如果,万事俱备,我们就可以开心的创建一个CallbackProperty了:

而CallbackProperty的getValue的实现如下,通过该方法,可以把Entity的description属性,通过CallbackProperty,以RunTime的方式传递给InfoBox,如此,通过CallbackProperty可以实现动态显示InfoBox信息的方式:

基本上,InfoBox的实现大致如此,可以看到,Cesium的InfoBox的还是很成熟的,尽可以的在无编码的情况下显示Entity的属性,同时,也能满足自定义的扩展,并能够满足实时性的要求,而且封装的很优雅,也很简单,真的不是随便就能写来的……

光说不练假把式,写了这么多,相见ifoBox.html,,基于本文涉及到的知识点,实现了自定义InfoBox内容,并可以通过chart实现动态效果。具体代码参考infobox.html范例

Cesium应用篇:3控件(3)SelectionIndicator& InfoBox的更多相关文章

  1. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

  2. iOS开发UI篇—UIScrollView控件介绍

    iOS开发UI篇—UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...

  3. iOS开发UI篇—UITableview控件简单介绍

    iOS开发UI篇—UITableview控件简单介绍 一.基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 . 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView,UIT ...

  4. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...

  5. iOS开发UI篇—UITableview控件使用小结

    iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...

  6. iOS开发UI篇—UIScrollView控件实现图片轮播

    iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播            二.实现代码 storyboard中布局 代码: #import "YYV ...

  7. 【转】 iOS开发UI篇—UIScrollView控件实现图片轮播

    原文:http://www.cnblogs.com/wendingding/p/3763527.html iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 ...

  8. WPF 精修篇 用户控件

    原文:WPF 精修篇 用户控件 增加用户控件 数据绑定还是用依赖属性 使用的事件 就委托注册一下 public delegate void ButtonClick(object b,EventArgs ...

  9. iOS开发——基本常识篇&各种控件默认高度

    各种控件默认高度   1.状态栏 状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图 用户可以隐藏状态栏,也可以将状态栏设置 ...

  10. 【转】iOS开发——基本常识篇&各种控件默认高度

    原文:http://www.cnblogs.com/iCocos/p/4595614.html 各种控件默认高度   1.状态栏 状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注 ...

随机推荐

  1. ntko office在线编辑控件问题记录

    ntko office在线预览插件 http://www.ntko.com/ 问题:火狐或谷歌下保存报[没有打开的文档]错误,ie正常 原因:火狐.谷歌.ie的各方法执行文字不同,ie嵌在页面,而火狐 ...

  2. php入门一ubuntu16.04中php环境配置及一个网页

    1.PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言. 2.PHP 文件可包含文本.HTML.JavaScr ...

  3. 通过修改i8042prt端口驱动中类驱动Kbdclass的回调函数地址,达到过滤键盘操作的例子

    同样也是寒江独钓的例子,但只给了思路,现贴出实现代码 原理是通过改变端口驱动中本该调用类驱动回调函数的地方下手 //替换分发函数 来实现过滤 #include <wdm.h> #inclu ...

  4. 阿里聚安全受邀参加SFDC安全大会,分享互联网业务面临问题和安全创新实践

    现今,技术引领的商业变革已无缝渗透入我们的日常生活,「技术改变生活」的开发者们被推向了创新浪潮的顶端.国内知名的开发者技术社区 SegmentFault 至今已有四年多了,自技术问答开始,他们已经发展 ...

  5. TDDL分库分表规则

    规则如下: 判断一个ID在哪个库里的公式是:id % 4 / 2判断一个ID在哪个表里的公式是:id % 4 % 2 其中4表示总共有多少个分表,2表示总共有多少个数据库:上面这个例子,表示总共有2个 ...

  6. 架构之路(七)MVC点滴

    我们目前正在开发中的是任务管理系统,一个前端复杂的项目,所以我们先从MVC讲起吧. WebForm 随着ASP.NET MVC的兴起,WebForm已成昨日黄花,但我其实还很想为WebForm说几句. ...

  7. Why MVC is Better?(翻译)

    (本文翻译自CodeProject上的一篇关于ASP.NET MVC的文章,原文地址:http://www.codeproject.com/Articles/821275/Webforms-vs-MV ...

  8. Linux的tree命令

    发现Linux下有个很好的命令,tree,能把目录以树的形式列出来,还支持很强大的参数. 但默认情况下是不带的,得自己去安装,先到这里下载它的代码:http://mama.indstate.edu/u ...

  9. C语言 · 未名湖边的烦恼

    问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在 ...

  10. C# Azure 存储-分布式缓存Redis在session中的配置

    1. 开始 对于分布式的缓存,平常的session的处理是一个用户对应一台分布式的机器,如果这台机器中途挂机或者不能处理这个用户session的情况发生,则此用户的session会丢失,会发生不可预知 ...