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">是否加载定位控件</param>
        mapOptions: {},
        //初始配置
        //中心点,可以是城市名称,也可以是{lng:‘‘,lat:‘‘}格式的坐标数据
        center: ‘北京‘,
        //是否监听标点的点击事件
        markerTap: false,
        //私有变量,定位按钮
        locate: null,
        //私有变量,定位控件
        geo: null,
        //注意,填充数据需要在showMap事件触发之后才可以
        //store数据源lng,lat这两个字段必须有
        store: null,
        //data数据源,格式为[{lng:‘‘,lat:‘‘}]
        data: null,
        //百度服务密钥,没有的话不会进行坐标转换,定位会有一定的误差参考http://developer.baidu.com/map/changeposition.htm
        ak: null,
        //lng坐标name
        lngName: ‘lng‘,
        //lat坐标name
        latName: ‘lat‘,
        //本地搜素关键词
        key: null,
        //根据地址直接解析坐标,可以是单个地址,也可以是[{address:‘地址‘}]数组,可以有其他参数
        address: null
    },
    //初始化
    initialize: function () {
        var me = this;
        me.callParent();
        //视图绘制完成后再加载百度地图,以免地图加载出错
        me.on({
            painted: ‘initMap‘,
            scope: me
        });
    },
    //初始化地图
    initMap: function () {
        var me = this,
        map = me.getMap();
        if (!map) {
            //初始化地图
            //获取地图初始化配置
            var mapOptions = me.getMapOptions(),
            //获取中心点
            center = me.getCenter(),
            //获取搜索key
            key = me.getKey(),
            //获取地址
            address = me.getAddress(),
            //获取数据源
            store=me.getStore(),
            point;
            //创建地图
            map = new BMap.Map(me.element.dom);
            //获取中心点
            if (Ext.isString(center)) {
                point = center;
            } else if (Ext.isObject(center)) {
                point = BMap.Point(center.lng, center.lat);
            }
            //设置中心点和地图显示级别
            map.centerAndZoom(point, 11);
            //添加地图缩放控件
            map.addControl(new BMap.ZoomControl());
            //判断是否加载定位控件
            if (mapOptions.locate) {
                //加载定位控件
                map.addControl(me.getLocateControl());
            }
            //设置地图对象,方便在其他地方获取到地图对象
            me.setMap(map);
            //关键词搜索
            if (key) {
                me.search(key);
            }
            //地址解析
            if (address) {
                me.setMarkerbyAddress(address);
            }
            //加载store
            if (store&&store.getCount()) {
                me.onLoad(store);
            }

            //地图加载完毕触发事件
            me.fireEvent(‘showMap‘, me);
        }
    },
    //数据源事件
    storeEventHooks: {
        load: ‘onLoad‘
    },
    //填充数据
    updateData: function (data) {
        var me = this,
        store = me.getStore();
        if (!store) {
            me.setStore(Ext.create(‘Ext.data.Store‘, {
                data: data,
                autoDestroy: true
            }));
        } else {
            store.add(data);
        }
    },
    //创建store
    applyStore: function (store) {
        var me = this,
        bindEvents = Ext.apply({},
        me.storeEventHooks, {
            scope: me
        });
        //获取store,绑定事件
        if (store) {
            store = Ext.data.StoreManager.lookup(store);
            store.onAfter(bindEvents);
        }
        return store;
    },
    //更新store
    updateStore: function (newStore, oldStore) {
        var me = this,
        map = me.getMap(),
        bindEvents = Ext.apply({},
        me.storeEventHooks, {
            scope: me
        });
        //移除绑定事件,销毁
        if (oldStore && Ext.isObject(oldStore) && oldStore.isStore) {
            oldStore.un(bindEvents);
            if (oldStore.getAutoDestroy()) {
                oldStore.destroy();
            }
        }
        if (map && newStore.getCount()) {
            me.onLoad(newStore);
        }
    },
    //数据加载成功,加载坐标点
    onLoad: function (store) {
        var me = this,
        map = me.getMap(),
        lngName = me.getLngName(),
        latName = me.getLatName(),
        marker,
        item;
        map.clearOverlays();
        store.each(function (record, index, length) {
            item = record.getData();
            me.addPoint(item[lngName], item[latName], item, me, map);
        });
    },
    //添加单个点
    addPoint: function (lng, lat, item,me, map) {
        if (!me) {
            me = this;
        }
        if (!map) {
            map = me.getMap();
        }
        if (lng && lat) {
            // 创建标注
            var  marker = new BMap.Marker(new BMap.Point(lng, lat));
            //其他数据
            marker.options = {};
            //将模型中的其他数据添加到按钮中
            for (var name in item) {
                marker.options[name] = item[name];
            }
            if (me.getMarkerTap()) {
                //添加点击监听
                marker.addEventListener("click",
                function (type, target) {
                    me.fireAction(‘tapMarker‘, [me, this], ‘onTapMarker‘);
                });
            }
            // 将标注添加到地图中
            map.addOverlay(marker);
        }
    },
    //获取定位控件
    getLocateControl: function () {
        //创建控件
        var locateControl = new BMap.Control();
        //设置方位
        locateControl.defaultAnchor = BMAP_ANCHOR_BOTTOM_LEFT;
        //设置坐标
        locateControl.defaultOffset = new BMap.Size(10, 70);
        //设置dom
        locateControl.initialize = function (map) {
            var zoom = document.createElement("div");
            zoom.className = ‘BMap_ZoomCtrl zoom_btn locateControl‘;
            var location = document.createElement("div");
            location.className = ‘location‘;
            zoom.appendChild(location);
            map.getContainer().appendChild(zoom);
            return zoom;
        }
        //监听点击事件
        this.element.on({
            tap: ‘onLocate‘,
            delegate: ‘div.locateControl‘,
            scope: this
        });
        return locateControl;
    },
    //点击定位按钮
    onLocate: function (e) {
        var el = e.getTarget(‘div.location‘, null, true);
        el.addCls(‘locationGif‘);
        this.setLocate(el);
        //触发定位事件
        this.setGeo(true);
    },
    //创建定位插件
    applyGeo: function (config) {
        return Ext.factory(config, Ext.util.Geolocation, this.getGeo());
    },
    //更新定位插件
    updateGeo: function (newGeo, oldGeo) {
        var events = {
            locationupdate: ‘onGeoUpdate‘,
            locationerror: ‘onGeoError‘,
            scope: this
        };

        if (oldGeo) {
            oldGeo.un(events);
        }

        if (newGeo) {
            newGeo.on(events);
            newGeo.updateLocation();
        }
    },
    // 定位成功,设置中心点
    onGeoUpdate: function (geo) {
        var me = this,
        ak = me.getAk();
        if (ak) {
            Ext.Ajax.request({
                url: ‘http://api.map.baidu.com/geoconv/v1/?‘,
                params: {
                    coords: geo.getLongitude() + ‘,‘ + geo.getLatitude(),
                    ak: ak
                },
                scope: me,
                success: function (data) {
                    data = Ext.decode(data.responseText).result[0];
                    if (data) {
                        me.addMyPoint(data.x, data.y);
                    }
                }
            });
        } else {
            me.addMyPoint(geo.getLongitude(), geo.getLatitude());
        }
    },
    //添加我的坐标
    addMyPoint: function (lng, lat) {
        var me = this,
        map = me.getMap(),
        icon = new BMap.Icon("resources/icons/markers.png", new BMap.Size(25, 25), {
            imageOffset: new BMap.Size(0, 0)
        }),
        point = new BMap.Point(lng, lat),
        marker = new BMap.Marker(point, {
            icon: icon
        });
        // 将标注添加到地图中
        map.addOverlay(marker);
        map.setCenter(point);
        me.unLocate();
    },
    // 定位失败
    onGeoError: function () {
        this.unLocate();
        //触发事件
        this.fireEvent(‘geoError‘, this);
    },
    //取消定位动画
    unLocate: function () {
        var locate = this.getLocate();
        if (locate) {
            locate.removeCls(‘locationGif‘);
        }
    },
    //更新搜索关键词
    updateKey: function (value) {
        var me = this,
        map = me.getMap();
        if (map && value) {
            me.search(value);
        }
    },
    /// <summary>
    /// 搜索
    /// </summary>
    /// <param name="key">关键词:String|Array<String></param>
    /// <param name="unClear">是否不清除覆盖物</param>
    search: function (key, unClear) {
        var map = this.getMap(); !unClear && map.clearOverlays();
        var local = new BMap.LocalSearch(map, {
            renderOptions: {
                map: map,
                autoViewport: true
            }
        });
        local.setSearchCompleteCallback(function (bo) {
            console.log(bo);
            if (bo._currentNumPois == 0) {
                Ext.toast(‘请输入正确的检索条件!‘);
            }
        });
        local.search(key);
    },
    /// <summary>
    /// 根据中心点与检索词发起周边检索
    /// </summary>
    /// <param name="key">关键词:String|Array<String></param>
    /// <param name="by">中心点:LocalResultPoi|String|Point</param>
    /// <param name="unClear">是否不清除覆盖物</param>
    searchNearby: function (key, by, unClear) {
        var map = this.getMap(); !unClear && map.clearOverlays();
        var local = new BMap.LocalSearch(map, {
            renderOptions: {
                map: map,
                autoViewport: true
            }
        });
        local.searchNearby(key, by);
    },
    /// <summary>
    /// 设置地图中心
    /// </summary>
    /// <param name="point"></param>
    setMapCenter: function (lng, lat) {
        var map = this.getMap();
        if (map) {
            map.setCenter(new BMap.Point(lng, lat));
        }
    },
    //更新地址
    setMarkerbyAddress: function (address) {
        var me = this;
        if (address) {
            if (Ext.isArray(address)) {
                for (var i = 0; i < address.length; i++) {
                    me.getMarkerbyAddress(address[i].address, address[i]);
                }
            } else if (Ext.isString(address)) {
                me.getMarkerbyAddress(address);
            }
        }
    },
    //根据地址解析坐标
    getMarkerbyAddress: function (address, params) {
        var me = this,
        ak = me.getAk();
        if (ak) {
            Ext.Ajax.request({
                url: ‘http://api.map.baidu.com/geocoder/v2/?‘,
                myParams: params,
                params: {
                    address: address,
                    ak: ak,
                    output: ‘json‘
                },
                scope: me,
                success: function (data) {
                    var response = Ext.decode(data.responseText),
                    location;
                    if (response.status == 0) {
                        location = response.result.location;
                        me.addPoint(location.lng, location.lat,data.request.options.myParams);
                    } else {
                        if (!params) {
                            Ext.toast(‘请输入正确的检索条件!‘);
                        }
                    }
                }
            });
        } else {
            Ext.Logger.error(‘请设置百度服务ak!‘);
        }
    }
});

基本用法:

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

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

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

Ext.define(‘app.view.Map‘, {
    alternateClassName: ‘map‘,
    extend: ‘ux.BMap‘,
    xtype: ‘map‘,
    config: {
        title: ‘地图‘,
        /// <summary>
        /// 地图配置
        /// </summary>
        /// <param name="locate">是否加载定位控件</param>
        mapOptions: {
            locate: true
        },
        data: [{ lng: ‘116.404‘, lat: ‘39.915‘, name: ‘天安门‘ }, { lng: ‘116.1‘, lat: ‘39.915‘, name: ‘地安门‘ }],
        //是否监听标点的点击事件
        markerTap: true
    },
    //点击坐标处理
    onTapMarker: function (me, marker) {
        //创建信息窗口
        var infoWindow = new BMap.InfoWindow(marker.options.name);
        marker.openInfoWindow(infoWindow);
    }
});

  效果图:

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

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

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 /// 地

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不一致