Geocoder是一个非常简单的控件,但也是非常常用且实用的控件,顾名思义,Geocoder就是地理编码的意思,而平常我们经常会查询一些地物,也就是常用的POI搜索,就是Geocoder的功劳。

首先,该控件支持经纬度定位,比如如下,是北京京洲世家小区的经纬度,输入后可以定位至该点,如上图所示。但是在天朝,有一种坐标叫做火星坐标。换句话说,如果你是在高德,百度等国内数据中获取的POI经纬度,该经纬度是经过偏移的,而我们的三维球通常都是用Bing,天地图等没有偏移的影像,这样就会导致地物的不匹配,还要,我们只需要纠偏POI就可以。范例里面有惊喜,自己看geocoder范例吧。

另外,Cesium采用的是Bing的地理编码和POI检索,需要Key,而且国内的数据,毕竟是中文检索,Bing在这点上有些水土不服的,所以,下面我们试着用SuperMap的POI服务来替代(当然,你也可以用其他的,比如高德,百度等,但需要申请Key,我申请了也不知道为何说我的plat不支持,想到范例的简单性,发现只有SuperMap的最简单易用,也算一个无奈之举吧。)

一个很不幸的事实是,Cesium没想到用户想要更换Geocoder的服务,所以并没有提供对应的接口来方便我们的扩展,不过,毕竟是JavaScript吗,只要深挖掘,什么都能替换之。

如上图,我们需要改写的就是searchCommand函数,尽管geocoder只提供了get接口。这里有两个逻辑,第一个就是geocode,就是POI的查询,另一个是正在查询的状态下,则会中断正在进行的查询操作。我们直接把GeocoderViewModel中的cancelGeocode函数拿来重用即可。而geocode则是需要重写的重点函数。

直接输入经纬度定位是很不错的功能,所以要保留,这段代码就留着。下面,就要开始替换Bing的POI检索了。先看看超图的POI检索服务

输入京洲世家,为什么总要输入这个?总比输一个故宫博物院好吧。点击查询,我们就可以获取其对应的url和json结果。

知道了url的规范后,通过Cesium构造一个Promise来发送请求:

返回的结果如下:

有了返回值,我们就需要解析里面的内容,并讲这些POI信息构造成Entity,保存到Viewer中。同样,这里的经纬度是偏移后的,我们需要做一个纠偏处理。

这里还有一个小技巧,我们每次查询时,都需要清除上一次查询的对象,所以我们需要在Geocoder中保存一份当前查询POI的Entity对象,方便下次查询后的删除,而删除是通过id的,所以需要付给一个唯一的ID值,我觉得通过Clock获取当前时间是一个不错的方式。

另外,为了能够让Entity在点击时获取其描述信息,我们也需要指定Entity的description,在geocoder.html范例中,采用了最简单的ConstantProperty,如果对这一块不清楚的,可以参考InfoBox控件篇,里面对Property有一个较为详细的介绍。具体代码如下:

至此,我们对Geocoder有了一个较为详细的认识,同时也扩展Geocoder控件,能够指定其他的POI服务来满足自己的需要,并实现了对查询后的POI构造并管理Entity的功能,更好的展现查询后的结果。另外,由于火星坐标的原因,会有匹配不准确的情况,这里通过纠偏也解决了这一实际应用的问题。奉上一个范例的效果图,Geocoder的介绍就到这里。

Cesium应用篇:3控件(4)Geocoder的更多相关文章

  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. win7安装oracle 时容易出的问题

    Windows7下安装Oracle11G.10G,都会提示如下信息 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为: ...

  2. Page

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  3. Linux搜索文件夹下所有文件中字符串

    1.grep "status_bar_height" * -nR /* 搜索文件中有很多不存在的文件出现 */ 2.grep -nsr "status_bar_heigh ...

  4. GIT的认识

    说实话,在听到小伙伴们都说赶紧做作业的时候很茫然,连一点头绪都没有,根本不知道从何入手,但不能因为不会就不去做,于是还是拿起手机,找到小伙伴商量着做着,虽然等的过程很焦急,但还是注册成功了.而开始写对 ...

  5. CSS 使用母版页的内容页如何调用css和javascript

    方案一: 把所有的css样式和javascript函数放到母版页的<head></head>中,我觉得这样做的弊端就是导致母版页的<head></head&g ...

  6. SQL Server 2016 CTP2.3 的关键特性

    SQL Server 2016 CTP2.3 的关键特性 数据库方面的增强 Row Level Security已经支持In-memory OLTP 表.用户现在可以对内存优化表实施row-level ...

  7. GitLab版本管理

          GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览 ...

  8. TaintDroid剖析之IPC级污点传播

    TaintDroid剖析之IPC级污点传播 作者:简行.走位@阿里聚安全 前言 在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟 ...

  9. ASP.NET安全

    ASP.NET 安全 概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 ...

  10. Java NIO6:选择器2---代码篇

    选择器服务器端代码 上一篇文章毫无条理地讲了很多和选择器相关的知识点,下面进入实战,看一下如何写和使用选择器实现服务端Socket数据接收的程序,这也是NIO中最核心.最精华的部分. 看一下代码: p ...