sencha touch 百度地图扩展

上个版本http://www.cnblogs.com/mlzs/p/3666466.html,新增了一些功能

扩展代码如下:

  1 Ext.define(‘ux.BMap‘, {
  2     alternateClassName: ‘bMap‘,
  3     extend: ‘Ext.Container‘,
  4     xtype: ‘bMap‘,
  5     requires: [‘Ext.util.Geolocation‘],
  6     config: {
  7         map: null,
  8         /// <summary>
  9         /// 地图初始化配置
 10         /// </summary>
 11         /// <param name="locate">是否加载定位控件</param>
 12         /// <param name="markers">标点集合[{lng:‘‘,lat:‘‘}]</param>
 13         mapOptions: {},
 14         center: ‘上海‘,
 15         //是否监听标点的点击事件
 16         markerTap: false,
 17         //私有变量,定位按钮
 18         locate: null,
 19         //定位控件
 20         geo: null,
 21         //注意,填充数据需要在showMap事件触发之后才可以
 22         //store数据源lng,lat这两个字段必须有
 23         store: null,
 24         //data数据源
 25         data: null,
 26         //百度服务密钥,没有的话不会进行坐标转换,定位会有一定的误差参考http://developer.baidu.com/map/changeposition.htm
 27         ak: null,
 28         //lng坐标name
 29         lngName: ‘Lng‘,
 30         //lat坐标name
 31         latName: ‘Lat‘,
 32         //搜素关键词
 33         key:null
 34     },
 35     initialize: function () {
 36         this.callParent();
 37         this.on({
 38             painted: ‘initMap‘,
 39             scope: this
 40         });
 41     },
 42     //数据源事件
 43     storeEventHooks: {
 44         load: ‘onLoad‘
 45     },
 46     //填充数据
 47     updateData: function (data) {
 48         var me = this,
 49         store = me.getStore();
 50         if (!store) {
 51             this.setStore(Ext.create(‘Ext.data.Store‘, {
 52                 data: data,
 53                 autoDestroy: true
 54             }));
 55         } else {
 56             store.add(data);
 57         }
 58     },
 59     //创建store
 60     applyStore: function (store) {
 61         var me = this,
 62         bindEvents = Ext.apply({},
 63         me.storeEventHooks, {
 64             scope: me
 65         });
 66         //获取store,绑定事件
 67         if (store) {
 68             store = Ext.data.StoreManager.lookup(store);
 69             store.onAfter(bindEvents);
 70         }
 71         return store;
 72     },
 73     //更新store
 74     updateStore: function (newStore, oldStore) {
 75         var me = this,
 76         bindEvents = Ext.apply({},
 77         me.storeEventHooks, {
 78             scope: me
 79         });
 80         //移除绑定事件,销毁
 81         if (oldStore && Ext.isObject(oldStore) && oldStore.isStore) {
 82             oldStore.un(bindEvents);
 83             if (oldStore.getAutoDestroy()) {
 84                 oldStore.destroy();
 85             }
 86         }
 87         if (newStore.getCount()) {
 88             me.on({
 89                 showMap: function () {
 90                     me.onLoad(newStore);
 91                 }
 92             });
 93         }
 94     },
 95     //数据加载成功,加载坐标点
 96     onLoad: function (store) {
 97         var me = this,
 98         map = me.getMap(),
 99         lngName = me.getLngName(),
100         latName = me.getLatName(),
101         marker,
102         item,
103         lng,
104         lat;
105         map.clearOverlays();
106
107         store.each(function (record, index, length) {
108             item = record.getData();
109             lng = item[lngName];
110             lat = item[latName];
111             if (lng && lat) {
112                 // 创建标注
113                 marker = new BMap.Marker(new BMap.Point(lng, lat));
114                 marker.options = {};
115                 for (var name in item) {
116                     if (name != lngName && name != latName) {
117                         marker.options[name] = item[name];
118                     }
119                 }
120                 if (me.getMarkerTap()) {
121                     //添加点击监听
122                     marker.addEventListener("click",
123                     function (type, target) {
124                         me.fireAction(‘tapMarker‘, [me, this], ‘onTapMarker‘);
125                     });
126                 }
127                 // 将标注添加到地图中
128                 map.addOverlay(marker);
129             }
130         });
131     },
132     //初始化地图
133     initMap: function () {
134         var me = this,
135         map = me.getMap();
136         if (!map) {
137             //初始化地图
138             var mapOptions = me.getMapOptions(),
139             map = new BMap.Map(me.getId()),
140             center = me.getCenter(),
141             key = me.getKey(),
142             point;
143             if (Ext.isString(center)) {
144                 point = center;
145             } else if (Ext.isObject(center)) {
146                 point = BMap.Point(center.lng, center.lat);
147             }
148
149             //设置中心点和地图显示级别
150             map.centerAndZoom(point, 11);
151             ////添加地图缩放控件
152             map.addControl(new BMap.ZoomControl());
153             ////判断是否加载定位控件
154             if (mapOptions.locate) {
155                 map.addControl(me.getLocateControl());
156             }
157             me.setMap(map);
158             if (mapOptions.markers) {
159                 me.setData(mapOptions.markers);
160             }
161             if (key) {
162                 me.search(key);
163             }
164             //触发事件
165             me.fireEvent(‘showMap‘, me);
166         }
167     },
168     getLocateControl: function () {
169         //创建控件
170         var locateControl = new BMap.Control();
171         //设置方位
172         locateControl.defaultAnchor = BMAP_ANCHOR_BOTTOM_LEFT;
173         //设置坐标
174         locateControl.defaultOffset = new BMap.Size(10, 70);
175         //设置dom
176         locateControl.initialize = function (map) {
177             var zoom = document.createElement("div");
178             zoom.className = ‘BMap_ZoomCtrl zoom_btn locateControl‘;
179             var location = document.createElement("div");
180             location.className = ‘location‘;
181             zoom.appendChild(location);
182             map.getContainer().appendChild(zoom);
183             return zoom;
184         }
185         //监听点击事件
186         this.element.on({
187             tap: ‘onLocate‘,
188             delegate: ‘div.locateControl‘,
189             scope: this
190         });
191         return locateControl;
192     },
193     onLocate: function (e) {
194         var el = e.getTarget(‘div.location‘, null, true);
195         el.addCls(‘locationGif‘);
196         this.setLocate(el);
197         //触发定位事件
198         this.setGeo(true);
199     },
200     //创建定位插件
201     applyGeo: function (config) {
202         return Ext.factory(config, Ext.util.Geolocation, this.getGeo());
203     },
204     updateGeo: function (newGeo, oldGeo) {
205         var events = {
206             locationupdate: ‘onGeoUpdate‘,
207             locationerror: ‘onGeoError‘,
208             scope: this
209         };
210
211         if (oldGeo) {
212             oldGeo.un(events);
213         }
214
215         if (newGeo) {
216             newGeo.on(events);
217             newGeo.updateLocation();
218         }
219     },
220     // 定位成功,设置中心点
221     onGeoUpdate: function (geo) {
222         var me = this,
223         ak = me.getAk();
224         if (ak) {
225             Ext.Ajax.request({
226                 url: ‘http://api.map.baidu.com/geoconv/v1/?‘,
227                 params: {
228                     coords: geo.getLongitude()+‘,‘+ geo.getLatitude(),
229                     ak: ak
230                 },
231                 scope: this,
232                 success: function (data) {
233                     data = Ext.decode(data.responseText).result[0];
234                     if (data) {
235                         me.addMyPoint(data.x, data.y);
236                     }
237                 }
238             });
239         } else {
240             me.addMyPoint(geo.getLongitude(), geo.getLatitude());
241         }
242     },
243     //添加我的坐标
244     addMyPoint: function (lng, lat) {
245         var me = this,
246             map = me.getMap(),
247            icon = new BMap.Icon("resources/icons/markers.png", new BMap.Size(25, 25), {
248                imageOffset: new BMap.Size(0, 0)
249            }),
250            point = new BMap.Point(lng, lat),
251            marker = new BMap.Marker(point, {
252                icon: icon
253            });
254         // 将标注添加到地图中
255         map.addOverlay(marker);
256         map.setCenter(point);
257         me.unLocate();
258     },
259     // 定位失败
260     onGeoError: function () {
261         this.unLocate();
262         //触发事件
263         this.fireEvent(‘geoError‘, this);
264     },
265     unLocate: function () {
266         var locate = this.getLocate();
267         if (locate) {
268             locate.removeCls(‘locationGif‘);
269         }
270     },
271     /// <summary>
272     /// 搜索
273     /// </summary>
274     /// <param name="key">关键词:String|Array<String></param>
275     /// <param name="unClear">是否不清除覆盖物</param>
276     search: function (key, unClear) {
277         var map = this.getMap();
278         !unClear && map.clearOverlays();
279         var local = new BMap.LocalSearch(map, {
280             renderOptions: {
281                 map: map,
282                 autoViewport: true
283             }
284         });
285         local.setSearchCompleteCallback(
286             function (bo) {
287                 if (bo._currentNumPois==0) {
288                     Ext.toast(‘请输入正确的检索条件!‘);
289                 }
290             });
291         local.search(key);
292     },
293     /// <summary>
294     /// 根据中心点与检索词发起周边检索
295     /// </summary>
296     /// <param name="key">关键词:String|Array<String></param>
297     /// <param name="by">中心点:LocalResultPoi|String|Point</param>
298     /// <param name="unClear">是否不清除覆盖物</param>
299     searchNearby: function (key, by, unClear) {
300         var map = this.getMap(); !unClear && map.clearOverlays();
301         var local = new BMap.LocalSearch(map, {
302             renderOptions: {
303                 map: map,
304                 autoViewport: true
305             }
306         });
307         local.searchNearby(key, by);
308     },
309     /// <summary>
310     /// 设置地图中心
311     /// </summary>
312     /// <param name="point"></param>
313     setMapCenter: function (lng, lat) {
314         var map = this.getMap();
315         if (map) {
316             map.setCenter(new BMap.Point(lng, lat));
317         }
318     }
319 });

基本用法:

1.引入百度地图JavaScript 极速版

http://api.map.baidu.com/api?type=quick&ak=Y5wTAbhgC4EDVgaBnzCUYO9l&v=1.0

2.在视图中使用,用法类似官方谷歌地图控件

 1 Ext.define(‘app.view.Map‘, {
 2     alternateClassName: ‘map‘,
 3     extend: ‘ux.BMap‘,
 4     xtype: ‘map‘,
 5     config: {
 6         title: ‘地图‘,
 7       8         /// <summary>
 8         /// 地图配置
 9         /// </summary>
10         /// <param name="center">中心坐标点:{lng:‘‘,lat:‘‘}</param>
11         /// <param name="locate">是否加载定位控件</param>
12         /// <param name="markers">标点集合[{lng:‘‘,lat:‘‘}]</param>
13         mapOptions: {
14             locate: true,
15             markers: [{ lng: ‘116.404‘, lat: ‘39.915‘, options: ‘天安门‘ }, { lng: ‘116.1‘, lat: ‘39.915‘, options: ‘地安门‘ }]
16         },
17         //是否监听标点的点击事件
18         markerTap:true,
19         //私有变量,定位按钮
20         locate: null
21     }
22 });

效果图:

时间: 2024-10-15 09:34:33

sencha touch 百度地图扩展的相关文章

sencha touch百度地图扩展

扩展代码如下: Ext.define('ux.BMap', { alternateClassName: 'bMap', extend: 'Ext.Container', xtype: 'bMap', requires: ['Ext.util.Geolocation'], config: { //私有变量,地图对象 map: null, /// <summary> /// 地图初始化配置 /// </summary> /// <param name="locate&q

EChart系列:在echart3中使用百度地图扩展之后,如何获取到百度地图对象

最近做项目想要在百度地图上叠加显示echart的散点图,然后根据地图的缩放等级和区域范围要显示不同的散点图,这中间折腾了好久.功能要求包括: (1)底图使用百度地图: (2)可以在地图上叠加显示echart的散点图: (3)鼠标移动到散点图上面之后,可以浮动显示相关信息: (4)能够获取当前显示区域地图的经纬度范围: (5)能够响应地图的拖拽和缩放事件: 这里有两种选择: 1. 使用echart2的百度地图扩展,1, 3, 4, 5 都可以满足,就是2满足不了,他的一个series的所有图标样式

Sencha Touch 和 jQuery Mobile 的比较

Sencha Touch 和 jQuery Mobile 的比较 英文原文:Sencha Touch vs jQuery Mobile 标签: Sencha Touch jQuery Mobile 103人收藏此文章, 我要收藏oschina 推荐于 2年前 (共 7 段, 翻译完成于 08-02) (23评) 参与翻译(1人): yale8848 仅中文 | 中英文对照 | 仅英文 | 打印此文章 很多人问我Sencha Touch (百度百科Sencha Touch译者加) 和jQuery

用百度地图API分析打交通大数据

百度地图API, 文档不全,例子不细致. 在网上还没有太多有用的例子.比如说下面几个需求的解决方案就找不到: 1. 如何用百度地图API查询一个地点的经纬度. 2. 如何用百度地图通过一个经纬度查询商圈和地址. 3.点击百度地图时, 获得点击位置的经纬度. 4. 如果按照时间轴动态显示热力图的变化. 我昨天玩了一下午百度地图javascript API,解决了上面的几个问题,顺道用少量打车用户的抽样数据做一个数据可视化, 给大家提供一个可以参考的例子 首先数据是来自北京市某个周日的出行数据, 其

Sencha Touch和jQuery Mobile的比较

第一组-行销和平台支持 Sencha Touch和jQuery Mobile都以HTML5框架著称.jQuery Mobile谦虚的说自己只是内建于所有流行的移动设备平台,而Sencha Touch则说自己是唯一能让为开发者在iOS,Android,BlachBerry,Windows Phone等更多的OS上开发漂亮应用的框架.老实说,这种夸大其词的广告让我失望.我还没有发现它说的那样好,Sencha Touch只能孤芳自赏了. 只支持web kit内核浏览器(据说这会在未来有所变化) 大家知

sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序

    这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境下,最后通过xcode导出成ipa安装程序: 一.phonegap环境搭建: phonegap从3.0开始已经不再使用手动的方式搭建项目了,而是使用command-line命令行工具来搭建项目环境,并且插件引入的机制也在3.0做了调整,采用了模块化的方式,即需要什么功能模块就通过命令行工具来安装对应

sencha touch 侧边栏扩展(只隐藏不销毁)

基于Ext.ux.MenuButton改造而来,和它不同的是,不会每次都去销毁侧边栏,只是单纯的隐藏,属性配置方面没啥区别,每次点击按钮显示时,会触发showMenu事件/方法 代码如下: /** *只隐藏不销毁的侧边栏 * @private */ Ext.define('ux.Menu.Context', { extend: 'Ext.Button', requires: ['Ext.ux.ContextMenu'], config: { menuItems: [], menuSide: 'r

用 Sencha Touch 构建移动 web 应用程序

Sencha Touch 是一个使用 HTML5.CSS3 和 JavaScript 语言构建的移动 web 应用程序框架,在本文中,学习如何应用您当前的 web 开发技能进行移动 web 开发.下载和建立 Sencha Touch,通过一个样例应用程序探究基本原理.学习开始使用 Sencha Touch 框架所需的一切 2012 年 3 月 19 日 内容 概述 Sencha Touch 准备开始 UI components 结束语 参考资料 评论 概述 在软件开发领域中,有两个重要的趋势越来

jQuery Mobile和Sencha Touch哪个更适合你?

纯粹的总结一下移动web开发框架,移动web开发框架有jQuery Mobile .Sencha Touch等等,他们都来源于web开发,是成熟的框架,jQuery Mobile出自于jQuery家族,Sencha Touch来自于ExtJS.jQuery Mobile 和Sencha Touch都是比较成熟老牌的框架,项目中也有应用.国内也有公司,像BAT巨头也在探索和实现了适合自己的移动web框架. 1.jQuery Mobile适合你吗 差不多二十年来,处理跨浏览器的HTML和CSS不一致