var map;// 地图对象
var ac;// ac自动完成对象
var isReturnNum = false;// 初始未返回微信的经纬度信息
var parkMarkers = [];// 停车场覆盖物
var searchMarkers = [];// 搜索图标
var selectMarker = "";// 选中的覆盖物
var selectPoint = "";// 选中的覆盖物点
var selectMarkerColor = 0;// 选中的停车点剩余临界值类型(停车点标记颜色 0-蓝色(默认) 1-黄色 2-红色 )
var selectParkingType="";// 选中的停车点类型(停车点类型:0-路边停车点,1-路边简易停车点,2-场内停车点)
var selectFlag = false;// 是否选择过覆盖物,true表示选中
// 初始化获取当前用户的位置,如获取默认坐标不成功则赋值(绍兴城市广场坐标)
var latitudeNum = 30.009466;//30.214684;// 纬度
var longitudeNum = 120.58606;//120.218346;// 经度
var oldMyLocationMaker;// 旧的我的位置覆盖物
var newMypoint;//微信刷新定位:我的位置
wx.config({
//debug : true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId : $("#appId").val(), // 必填,公众号的唯一标识
timestamp : $("#timestamp").val(), // 必填,生成签名的时间戳
nonceStr : $("#nonceStr").val(), // 必填,生成签名的随机串
signature : $("#signature").val(), // 必填,签名,见附录1
jsApiList : ['getLocation' ]// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function() {
getLocation();
});
//获取当前地址
function getLocation(){
wx.getLocation({
type : 'wgs84',//GPS设备获取的角度坐标,wgs84坐标;
//type : 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标(国测局坐标),可传入'gcj02'
success : function(res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
if(typeof (latitude) != "undefined" && latitude != null&&typeof (longitude) != "undefined" && longitude != null){
isReturnNum=true;
var gpsPoint = new BMap.Point(longitude,latitude);//GPS定位的地图坐标点
gpsConvertBaidu(gpsPoint);//(微信定位的坐标)转为百度坐标
}
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
},
cancel: function (res) {
alert('用户拒绝授权获取地理位置!');
isReturnNum = false;
}
});
}
/**
* 坐标转换完之后的回调函数处理
*/
translateCallback = function (data){
if(data.status === 0) {
//去除旧的定位点覆盖物,设置新的定位点覆盖物并查周边停车场信息
newMypoint=data.points[0];
changeMapAddr(data.points[0]);
}
}
/**
* 微信公众号GPS坐标转换百度坐标
* 具体参考:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
*/
function gpsConvertBaidu(gpsPoint){
var convertor = new BMap.Convertor();
var pointArr = [];
pointArr.push(gpsPoint);
convertor.translate(pointArr,1,5, translateCallback);//GPS设备获取的角度坐标,wgs84坐标,定位转码;
// convertor.translate(pointArr,3,5, translateCallback);//google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标,国测局坐标,定位转码;
}
//页面加载初始化地图
initMap();
/**
* 初始化创建和初始化地图函数
* 初始化查询我的位置附近停车场
*/
function initMap() {
createMap_1();// 创建地图
createAutoMap();// 创建自动完成的map对象
setMapEvent_1();// 设置地图事件
addMapControl_1();// 初始化向地图添加控件
var mypoint = new BMap.Point(longitudeNum,latitudeNum); // 我的位置坐标
addMapOverlay_1(mypoint);// 初始化向地图添加覆盖物
// 初始化查询我的位置附近停车场
seachNearbyPark(longitudeNum, latitudeNum);
}
/**
* 创建地图
*/
function createMap_1() {
map = new BMap.Map("allmap"); // 创建Map实例
map.centerAndZoom(new BMap.Point(longitudeNum, latitudeNum), 18);// 初始化地图,设置中心点坐标和地图级别。
}
/**
* 设置地图事件
*/
function setMapEvent_1() {
addClickHandler_1(map);// 地图页面单击事件
addClickHandler_searchOnListOnBlur(ac);//搜索框鼠标放在下拉列表上的事件
addClickHandler_searchOnListOnClick(ac);//鼠标点击下拉列表后的事件
}
/**
* 向地图添加控件
*/
function addMapControl_1() {
// 添加比例尺控件
map.addControl(new BMap.ScaleControl());
/*
* var scaleControl = new
* BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT});
* scaleControl.setUnit(BMAP_UNIT_IMPERIAL); map.addControl(scaleControl);
*/
// 添加地图缩放控件
var navControl = new BMap.NavigationControl({
anchor : BMAP_ANCHOR_BOTTOM_RIGHT,
type : BMAP_NAVIGATION_CONTROL_SMALL
});
map.addControl(navControl);
/*
* var overviewControl = new
* BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:true});
* map.addControl(overviewControl);
*/
}
/**
* 向地图添加覆盖物
*/
function addMapOverlay_1(point) {
var myIcon = new BMap.Icon('/static/images/maps/[email protected]',
new BMap.Size(39, 39), {
anchor : new BMap.Size(39, 20)
}, {
imageOffset : new BMap.Size(0 - 10, 0 - 10)
});
oldMyLocationMaker = new BMap.Marker(point, {
icon : myIcon
});
var infoWindow = new BMap.InfoWindow("我的位置");
//覆盖物单击事件
addClickHandler_myLocationOnClick(oldMyLocationMaker, infoWindow);
map.addOverlay(oldMyLocationMaker);// 将标注添加到地图中
}
/**
* 初始化添加地图事件(添加覆盖物)
* @param target
* @param window
*/
function addClickHandler_myLocationOnClick(target,window){
target.addEventListener("click",function(e){
$("#searchInput").blur();
target.openInfoWindow(window);
e.domEvent.stopPropagation();
});
}
/**
* 初始化添加地图事件(添加地图页面单击事件)
* @param target 地图对象map
*/
function addClickHandler_1(target){
target.addEventListener("click",function(e){
if (!e.overlay) {
$("#searchInput").blur();
$(".tangram-suggestion-main").css("display", "none");
// 点选过覆盖物之后,样式才会改变
showFlag(selectFlag);
}
});
}
/**
* 页面点击我的定位图标,回到我的位置(注意:后续的自动纠正用户位置)
* @param longitudeNum 全局变量经度
* @param latitudeNum 全局变量维度
*/
function mylocation() {
var mypoint;
//重新刷新定位信息
getLocation();
if(isReturnNum){
mypoint = newMypoint; // 微信定位我的位置坐标
}else{
mypoint = new BMap.Point(longitudeNum, latitudeNum); // 默认位置坐标
}
map.centerAndZoom(mypoint, 18);
}
/**
* 微信获取位置后回调自动定位,并查询周边停车场信息
* @param lo
* @param la
*/
function changeMapAddr(mypoint) {
map.centerAndZoom(mypoint, 18);
map.removeOverlay(oldMyLocationMaker); //清除初始化定位标注
addMapOverlay_1(mypoint);// 向地图添加新的我的位置覆盖物
seachNearbyPark(mypoint.lng, mypoint.lat);// 查询我的位置附近停车场
}
/**
* 点击覆盖物页面显示图标位置调整
* @param sFlag
*/
function showFlag(sFlag) {
// true,有覆盖物,高度调上来,详情宽度调整
if (sFlag) {
$(".parkingNavigate").css("height", "116px");
$(".anchorBR").css("bottom", "135px");
$(".mylocation").css("bottom", "135px");
} else {
$(".parkingNavigate").css("display", "none");// 隐藏详情信息
$(".anchorBR").css("bottom", "35px");
$(".mylocation").css("bottom", "35px");
}
}
/**
* 获取文档对象
* @param id
* @returns
*/
function G(id) {
return document.getElementById(id);
}
/**
*建立一个自动完成的map对象
*ac 全局变量
*/
function createAutoMap(){
ac = new BMap.Autocomplete({
"input" : "searchInput",
"location" : map
});
}
/**
* 搜索框鼠标放在下拉列表上的事件
* @param target ac全局对象
*/
function addClickHandler_searchOnListOnBlur(target){
target.addEventListener("onhighlight",function(e){
var str = "";
var _value = e.fromitem.value;
var value = "";
if (e.fromitem.index > -1) {
value = _value.province + _value.city + _value.district + _value.street + _value.business;
}
str = "FromItem
index = " + e.fromitem.index + "
value = "+ value;
value = "";
if (e.toitem.index > -1) {
_value = e.toitem.value;
value = _value.province + _value.city + _value.district + _value.street + _value.business;
}
str += "
ToItem
index = " + e.toitem.index + "
value = "+ value;
G("searchResultPanel").innerHTML = str;
});
}
/**
* 鼠标点击下拉列表后的事件
* @param target ac全局对象
*/
function addClickHandler_searchOnListOnClick(target){
target.addEventListener("onconfirm",function(e){
var _value = e.item.value;
var myValue = _value.province + _value.city + _value.district + _value.street+ _value.business;
G("searchResultPanel").innerHTML = "onconfirm
index = " + e.item.index+ "
myValue = " + myValue;
// 设置搜索的位置
setPlace(myValue);
});
}
/**
* 设置搜索的覆盖物属性
* @param myValue
*/
function setPlace(myValue) {
function myFun() {
for ( var i = 0; i < searchMarkers.length; i++) {
map.removeOverlay(searchMarkers[i]);
}
// 搜索后,清空覆盖物,改变页面图标的位置
searchMarkers = [];
selectFlag = false;
showFlag(selectFlag);
$("#searchInput").blur();// 去除输入焦点
var pp = local.getResults().getPoi(0).point; // 获取第一个智能搜索的结果
map.centerAndZoom(pp, 18);
var marker = new BMap.Marker(
pp,
{
icon : new BMap.Icon(
"http://api.map.baidu.com/lbsapi/createmap/images/icon.png",
new BMap.Size(20, 25), {
imageOffset : new BMap.Size(3, 3)
})
});
searchMarkers.push(marker); // 添加标注
map.addOverlay(marker);
// 搜索后,云检索附近的停车点
seachNearbyPark(pp.lng, pp.lat);
}
var local = new BMap.LocalSearch(map, { // 智能搜索
onSearchComplete : myFun
});
local.search(myValue);
}
/**
* 搜索附近停车点
*
* @param longitude
* @param latitude
* @returns
*/
function seachNearbyPark(longitude, latitude) {
// 停车点周边云检索
$.ajax({
type : 'POST',
dataType : 'json',
data : {
"longitude" : longitude,
"latitude" : latitude
},
url : "/mobile/mapSearchNearByPark",
success : function(data) {
//调用停车点周边云检索回调无论是否有数据,必须清理之前的停车点标记
for ( var i = 0; i < parkMarkers.length; i++) {
map.removeOverlay(parkMarkers[i]);
}
parkMarkers = [];//清空数组停车点原数据
//回调返回的周边停车点信息列表
var parkArr = data.dataList;
if (parkArr != null && $.isArray(parkArr) && parkArr.length > 0) {
for ( var i = 0, len = parkArr.length; i < len; i++) {
var park = parkArr[i];
parkMarkers.push(addParkMarker(park));
}
}
},
error : function() {
alert("停车点周边云检索异常!");
}
});
}
/**
* 添加停车场覆盖物
*
* @param park
* @returns
*/
function addParkMarker(park) {
var lat = park.latitude;// 纬度
var lng = park.longitude;// 经度
var point = new BMap.Point(lng, lat); // 创建点坐标
//根据停车点剩余车位详情设置地图标记
var marker=setParkMakerByType(park,point);
//添加标记覆盖物到地图
map.addOverlay(marker);
marker.addEventListener("click", function(e) {
// 禁止事物冒泡
e.domEvent.stopPropagation();
// 先将之前选中的覆盖物的图标样式还原,并清空其所选项
var pointIcon=setParkMakerColor(selectPoint,selectMarkerColor,selectParkingType);
if(selectMarker!=""){
selectMarker.setIcon(pointIcon);
selectMarker = "";
selectMarkerColor=0;
selectParkingType="";
}
// 点击覆盖物之后,将搜索框的焦点移除
$("#searchInput").blur();
selectFlag = true;
showFlag(selectFlag);
// 单击覆盖物时,修改其标注样式
var selectIcon=setSelectParkMakerColor(selectIcon,park.parkingType);
marker.setIcon(selectIcon);
selectMarker=marker;
selectMarkerColor=park.parkMarkColor;
selectParkingType=park.parkingType;
selectPoint=marker.point;
// 根据parkingCode去获取停车场详情信息
getParkInfo(park);
});
return marker;
}
/**
* 根据停车点剩余车位详情设置地图标记
* @param park
*/
function setParkMakerByType(park,point){
//设置标注图标及对象
var pointIcon=setParkMakerColor(point,park.parkMarkColor,park.parkingType);
var marker = new BMap.Marker(point, {icon : pointIcon});
//设置标签文字偏移及字体颜色等
var offsetX = 8;
var parkNum = 0;
if (park.leftParkingSpaceNum < 10) {
offsetX = 11;
parkNum = park.leftParkingSpaceNum;
} else if (park.leftParkingSpaceNum < 100) {
offsetX = 8;
parkNum = park.leftParkingSpaceNum;
} else if (park.leftParkingSpaceNum < 1000) {
offsetX = 6;
parkNum = "99+";
} else{
offsetX = 6;
parkNum = "99+";
}
var label = new BMap.Label(parkNum, {
offset : new BMap.Size(offsetX,9)
});
label.setStyle({
color : "#FFFFFF",
border : 0,
padding : 0,
fontSize : "10px",
});
marker.setLabel(label);
return marker;
}
/**
* 设置标注图标及对象
* @param marker
* @param parkMarkColor
* @param parkingType 停车点类型:0-路边停车点,1-路边简易停车点,2-场内停车点
* @returns
*/
function setParkMakerColor(point,parkMarkColor,parkingType){
//设置标注图标及对象
var pointIcon;
if(parkMarkColor==2){//红色2
if(parkingType==2){
pointIcon = new BMap.Icon('/static/images/maps/place-red.png',
new BMap.Size(28, 28), {offset : new BMap.Size(14, 28)});
}else{
pointIcon = new BMap.Icon('/static/images/maps/side-red.png',
new BMap.Size(28, 28), {offset : new BMap.Size(14, 28)});
}
}else if(parkMarkColor==1){//黄色1
if(parkingType==2){
pointIcon = new BMap.Icon('/static/images/maps/place-yellow.png',
new BMap.Size(28, 28), {offset : new BMap.Size(14, 28)});
}else{
pointIcon = new BMap.Icon('/static/images/maps/side-yellow.png',
new BMap.Size(28, 28), {offset : new BMap.Size(14, 28)});
}
}else{//(默认)蓝色 0
// 当标注显示在地图上时,其所指向的地理位置距离图标左上角各偏移10像素和28像素。您可以看到在本例中该位置即是图标中央下端的尖角位置。
if(parkingType==2){
pointIcon = new BMap.Icon('/static/images/maps/place-green.png',
new BMap.Size(28, 28), {offset : new BMap.Size(14, 28)});
}else{
pointIcon = new BMap.Icon('/static/images/maps/side-green.png',
new BMap.Size(28, 28), {offset : new BMap.Size(14, 28)});
}
}
return pointIcon;
}
/**
* 单击覆盖物时,修改其标注样式
* @param selectIcon
* @param parkingType
*/
function setSelectParkMakerColor(selectIcon,parkingType){
if(parkingType==2){
selectIcon = new BMap.Icon('/static/images/maps/place-selected.png',
new BMap.Size(28, 40), {offset : new BMap.Size(28, 40)});
}else{
selectIcon = new BMap.Icon('/static/images/maps/side-selected.png',
new BMap.Size(28, 40), {offset : new BMap.Size(28, 40)});
}
return selectIcon;
}
/**
* 展示停车场详情信息
*
* @param park
* @returns
*/
function getParkInfo(park) {
// 点选搜索结果之后,先将导航栏去掉
$("#parkingNavigate").removeClass("parkingNavigate");
$("#parkingNavigate").empty();
var showDes;
if (park.distance == 0) {
showDes = park.direction;// 描述显示的是附近,故而distance=0
} else {
showDes = park.distance + '(m)';// 显示距离(m)
}
var htmlTab = '';
htmlTab += '
' + subName(park.parkingName, 10) + '' + showDes + ' |
总:' + park.totalParkingSpaceNum + '空:' + park.leftParkingSpaceNum + ' |
地址:' + subName(park.parkingAddr, 32) + ' |