sencha touch 百度地图扩展(2014-12-17)
上个版本http://www.cnblogs.com/mlzs/p/3666466.html,新增了一些功能,修复了一些bug
扩展代码如下:
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);
}
});
效果图:
sencha touch 百度地图扩展(2014-12-17)的更多相关文章
- sencha touch百度地图扩展
扩展代码如下: Ext.define('ux.BMap', { alternateClassName: 'bMap', extend: 'Ext.Container', xtype: 'bMap', ...
- sencha touch 百度地图扩展(2014-6-24)(废弃 仅参考)
扩展代码如下: Ext.define('ux.BMap', { alternateClassName: 'bMap', extend: 'Ext.Container', xtype: 'bMap', ...
- EChart系列:在echart3中使用百度地图扩展之后,如何获取到百度地图对象
最近做项目想要在百度地图上叠加显示echart的散点图,然后根据地图的缩放等级和区域范围要显示不同的散点图,这中间折腾了好久.功能要求包括: (1)底图使用百度地图: (2)可以在地图上叠加显示ech ...
- Extjs 百度地图扩展
var bmapps; Bsprint.EditMapInfoWindow = Ext.extend(Ext.Window, { form: null, constructor: function ( ...
- sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩
经常有新手同学抱怨说sencha touch的项目加载速度为什么这么慢,经常要10秒左右的时间甚至更多, 大家都知道,sencha touch开发的项目中引用了大量的js文件,当我们打开项目时,st的 ...
- Sencha Touch 和 jQuery Mobile 的比较
Sencha Touch 和 jQuery Mobile 的比较 英文原文:Sencha Touch vs jQuery Mobile 标签: Sencha Touch jQuery Mobile 1 ...
- (转)Sencha Touch和jQuery Mobile的比较
原文:http://extjs.org.cn/node/664 Sencha Touch和jQuery Mobile的比较 Posted 周三, 08/07/2013 - 10:07 by admin ...
- 百度地图结合echarts并添加行政区块
作者:LJaer链接:https://www.zhihu.com/question/49251513/answer/125728764来源:知乎<!DOCTYPE html> <ht ...
- MVC项目中使用百度地图
已经很久没更新博客了,因为最近一直在学习前端的知识,没那么多时间,写博客或者写文章不但没有钱,写得好还好说,如果写得不好,一些吃瓜群众,不仅要喷你,搞不好还要人身攻击就不好了.所以写博客的人,脸皮得厚 ...
随机推荐
- Unity Shader-后处理:简单均值模糊
一.简介 今天来学习一下后处理中比较常用的一种效果,屏幕模糊效果.模糊效果,在图像处理中经常用到,Photoshop中也有类似的滤镜.我们在游戏中也会经常用到.因为屏幕模糊效果是一些高级后处理效果 ...
- 连接mysql 出现:java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.
数据测试的时候出现: 网上查资料说的是mysql5.x 版本和 8.x版本的区别: 5.7版本是:default_authentication_plugin=mysql_native_password ...
- haproxy负载均衡的安装配置
haproxy是一款可靠,高性能的并且可以支持TCP/HTTP的负载均衡器,和前面说过的nginx负载均衡类似,这里haproxy对于负载均衡来说更专业,支持的配置选项更多,稳定性也很强,甚至只需要一 ...
- 【FFmpeg】ffplay播放rtsp视频流花屏问题 (转)
问题描述:ffplay播放rtsp视频流时,播放过程中随机出现花屏现象. 基本流程学习:阅读ffplay源码,熟悉其播放rtsp视频流的基本流程. 在ffplay源码阅读和分析的基础上,画出了其播放r ...
- 快速准备(复制替换)一套新测试环境,CentOS7 MySQL相关配置
拿到一个新环境,需要找相关配置,我有一个办法,相对能比较快速地复制一套环境出来. 修改机器配置: virsh 相关几条命令,已完成,后续我再整理补充... 虚拟化相关,参考:https://www.c ...
- Promise.then的第二个参数与catch的区别
1.异常捕获 getJSON("/post/1.json").then(function(post) { return getJSON(post.commentURL); }).t ...
- Eureka服务注册中心相关错误com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
启动项目报错如下 原因: 在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以会出现 com.sun.jersey.api.client.ClientHandlerExce ...
- 【R作图】蜜蜂群图beeswarm和jitter的使用
最近经常要画好看的盒形图,还要在上面加入散点,所以总结了两个方法. 第一种方法是,利用beeswarm函数: library(beeswarm) beeswarm 蜜蜂群图 http://rgm3.l ...
- .NET+MVC+ORACLE存储分页查询一后端实现
MemberController:public ActionResult UserList() { UserBll userBll = new UserBll(); string keyWords = ...
- [APM] 解读APM技术分类和实现方式
在讲了APM的历史.作用和实际案例之后,下面我们来了解一下APM技术分类和实现方式以及它未来的发展趋势.在这之前,我们首先需要了解一下典型的互联网或移动互联网应用的整个应用交付链. 图1 上面这张示意 ...