首页 > 代码库 > 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 /// 地图初始化配置 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 onl oad: 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 //设置dom176 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: this190 });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: this209 };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: ak230 },231 scope: this,232 success: function (data) {233 data = http://www.mamicode.com/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: icon253 });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: true283 }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: true305 }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: null21 }22 });
效果图:
sencha touch 百度地图扩展
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。