Created
April 4, 2017 13:43
-
-
Save madneal/a68af93a186834d8514dd75406b9e6fb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Subway() {} | |
/** | |
* 解析XML | |
* line和station对象 | |
* 利用SVG画线和点 | |
*/ | |
var sp = Subway.prototype; | |
/** | |
* 淡出时的透明度 | |
*/ | |
sp.FADE_OPACITY = '0.3'; | |
/** | |
* 距最近地铁站的距离 | |
* @type {number} | |
*/ | |
sp.walkDistance = 0; | |
/** | |
* 起点是否是默认的最近地铁站 | |
* @type {boolean} | |
*/ | |
sp.isDefaultStart = true; | |
/** | |
* 求路的起点 | |
* @type {string} | |
*/ | |
sp.startname = ''; | |
/** | |
* 求路的终点 | |
* @type {string} | |
*/ | |
sp.endname = ''; | |
/** | |
* 路线经过的所有站点 | |
* @type {Array} | |
*/ | |
sp.routeStations = []; | |
/** | |
* 所经过站点的范围边界 | |
* @type {top: , right: ,bottom: ,left:} | |
*/ | |
sp.bounds = {}; | |
/** | |
* 气泡集合 | |
* @type {{}} | |
*/ | |
sp.bubbleMap = {}; | |
/** | |
* 气泡对象的属性集合 | |
* @type {{}} | |
*/ | |
sp.bubbleInfo = {}; | |
/** | |
* 求路得到的信息 | |
* @type {{}} | |
*/ | |
sp.routeData = {}; | |
/** | |
* 初始化 | |
* a:xml信息 | |
*/ | |
sp.init = function(a) { | |
var t = this; | |
t.FLAGNUM = 1; | |
t.config = { | |
LINE_WIDTH : 6 * t.FLAGNUM, | |
LINE_NAME_X : -12 * t.FLAGNUM, | |
LINE_NAME_Y : -12 * t.FLAGNUM, | |
LINE_NAME_SIZE : 12 * t.FLAGNUM + "px", | |
STATION_NAME_X : 0 * t.FLAGNUM, | |
STATION_NAME_Y : 12 * t.FLAGNUM, | |
STATION_X: -8, | |
STATION_Y: -8, | |
STATION_NAME_SIZE : 12 * t.FLAGNUM + "px", | |
TRANSFERSTATION_WIDTH : 16 * t.FLAGNUM, | |
TRANSFERSTATION_HEIGHT : 16 * t.FLAGNUM, | |
TRANSFERSTATION_X: 0 - 16 * t.FLAGNUM / 2, | |
TRANSFERSTATION_Y: 0 - 16 * t.FLAGNUM / 2, | |
CIRCLE_RADIUS : 5 * t.FLAGNUM, | |
CIRCLE_LINE_WIDTH : 2 * t.FLAGNUM, | |
isShowWindow : false, | |
VIEWPORT_MINIMUM: "0.6", | |
VIEWPORT_MANIMUM: "1.2", | |
BUBBLE_HEIGHT: 1.35,//气泡的高度(rem), | |
MARGIN_HOR: 60,//左右安全边距 | |
MARGIN_VER: 60//上下安全边距 | |
} | |
t.MAP_WIDTH = 2300; | |
t.MAP_HEIGHT = 2300; | |
t.SVG_WIDTH = 2300 * t.FLAGNUM; | |
t.SVG_HEIGHT = 2300 * t.FLAGNUM; | |
t.createSvg(); | |
t.loadImg(); | |
t.line = [];//存储全部线信息 | |
t.lineObj = {}; | |
t.station = [];//存储全部站点信息 | |
t.stationObj = {}; | |
t.xml = a;//获取到的xml信息 | |
t.parseXML(); | |
t.drawLine(); | |
t.drawStation(); | |
// t.setViewport(t.config.VIEWPORT_MINIMUM, t.config.VIEWPORT_MANIMUM, "0.8"); | |
t.getGPSPoint(); | |
t.nearStation(); | |
t.initMap(); | |
//点击空白处,站点信息隐藏 | |
$('#container1').on('click', function(){ | |
$('#container3').hide(); | |
}); | |
}; | |
sp.initMap = function () { | |
var t = this; | |
// $('#container1').css('transform-origin', 'left top'); | |
// $('#container1').css('transform', ''); | |
setTimeout(function() { | |
if (!t.nearStationObject)//无定位点显示页面中心 | |
t.scrollWindow(t.SVG_WIDTH / 2 - window.innerWidth / 2, t.SVG_HEIGHT / 2 - window.innerHeight / 2); | |
else {//有定位点显示定位点并弹窗 | |
var a, b = {}, c, d, f; | |
a = t.nearStationObject.ex;// + t.config.TRANSFERSTATION_X | |
if (a) {//换乘站需要 + t.config.TRANSFERSTATION_X + t.config.TRANSFERSTATION_Y | |
b.x = t.nearStationObject.x + t.config.TRANSFERSTATION_X; | |
b.y = t.nearStationObject.y + t.config.TRANSFERSTATION_Y; | |
} else { | |
c = t.nearStationObject.id; | |
//普通站需要 + t.config.STATION_X + t.config.STATION_Y | |
b.x = t.nearStationObject.x + t.config.STATION_X; | |
b.y = t.nearStationObject.y + t.config.STATION_Y; | |
} | |
b.GPS = 1; | |
//如果没有恢复线路,则起点默认填入最近的地铁站 | |
if(!sw.startname){ | |
$('#start').val(t.nearStationObject.id); | |
t.startname = t.nearStationObject.id; | |
$('#start').change(); | |
t.showMyPos(); | |
t.scrollWindow(t.nearStationObject.x - window.innerWidth / 2, t.nearStationObject.y - window.innerHeight / 2); | |
} | |
} | |
}, 50); | |
} | |
/** | |
* 绘制遮挡层 | |
*/ | |
sp.setMask = function() { | |
if(!this.mask){ | |
//插入蒙版 | |
var c1 = document.createElementNS("http://www.w3.org/2000/svg","rect"); | |
c1.setAttribute("x","-20"); | |
c1.setAttribute("y","-20"); | |
c1.setAttribute("width", '100%'); | |
c1.setAttribute("height",'100%'); | |
c1.setAttribute("fill","rgb(255,255,255)"); | |
c1.setAttribute("fill-opacity","0.8"); | |
c1.setAttribute("stroke","rgb(0,0,0)"); | |
c1.setAttribute("stroke-width","0"); | |
c1.setAttribute("id","mask"); | |
this.mask = c1; | |
} | |
this.mySVGContainer.appendChild(this.mask); | |
this.mask.style.display = 'block'; | |
}; | |
/** | |
* 移除遮挡层 | |
*/ | |
sp.removeMask = function() { | |
if(this.mask) { | |
this.mask.style.display = 'none'; | |
// this.mySVGContainer.removeChild(this.mask); | |
// this.mask = null; | |
} | |
} | |
/** | |
* 获取传过来的GPS坐标 | |
*/ | |
sp.getGPSPoint = function() { | |
var t = this, a, b = []; | |
a = getParam("loc"); | |
if (!a) { | |
return; | |
} | |
b = a.split(","); | |
t.gpsX = parseFloat(b[0]) || 0; | |
t.gpsY = parseFloat(b[1]) || 0; | |
}; | |
/** | |
* 计算到地铁站的距离 | |
*/ | |
sp.getDistance = function(pos, station){ | |
// var myx = mercator_wgs84(pos.x, pos.y)[0]; | |
// var myy = mercator_wgs84(pos.x, pos.y)[1]; | |
// var sx = mercator_wgs84(station.mx, station.my)[0]; | |
// var sy = mercator_wgs84(station.mx, station.my)[1]; | |
var tx = pos.x - station.mx; | |
var ty = pos.y - station.my; | |
var distance = Math.sqrt(tx * tx + ty * ty); | |
return parseInt(distance); | |
}; | |
/** | |
* 计算最近的地铁站 | |
*/ | |
sp.nearStation = function() { | |
var t = this, a, b, c = [], d, e = [], f, g, h; | |
if (t.gpsX && t.gpsY) { | |
a = t.station; | |
b = a.length; | |
for (var i = 0; i < b; i ++) { | |
var O = a[i]; | |
if (O.iu && O.mx && O.my) { | |
c.push(O); | |
} | |
} | |
d = c.length; | |
if (!d) | |
return; | |
for (var i = 0; i < d; i ++) { | |
var O = c[i], mx, my, tx, ty, rs; | |
mx = O.mx | |
my = O.my; | |
if (mx && my) { | |
tx = t.gpsX - mx; | |
ty = t.gpsY - my; | |
rs = Math.sqrt(tx * tx + ty * ty); | |
e.push(rs); | |
} | |
} | |
f = Array.min(e);//获得最小值 | |
t.walkDistance = f; | |
if (f >= 800) | |
return; | |
g = e.length; | |
for (var i = 0; i < g; i ++) { | |
if (f == e[i]) { | |
h = i; | |
break; | |
} | |
} | |
return t.nearStationObject = c[h]; | |
} | |
}; | |
/** | |
* 加载图片 | |
*/ | |
sp.loadImg = function() { | |
var t = this, a, b; | |
a = "data:image/png;base64,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"; | |
var b = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAIAAAC1w6d9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnNJREFUeNrsmc1LAkEYxl+3hRUMhASFAqFAocCDULdudetWt271z/QndOzmrW7eutXNDsFCgYIHIUHBQChQKOwZBqZVd2dnP9Qp9kXCanN++8zzfsyWmkwmpGWYNZs0JesMNSUziBKyhOzvkOUzdF6hrKUf2WGRilmqFPQjK+fYV8Bp6jPsqV5kQqq0qXFuxrWhST1buc8QcZW0+DXLppPdVAlrTUuyo2062Pr9dn8znsJhRJTqdHcKixdbtPZKPvK0Hd7pFsMqrLv/9qTMUuGxs3QyPvPIexGmD9DXW0skw05BEqUrC2SZVG/S+HvxPoPfFbHEdAR1QySvEdHvKgEvXlYDD0hGIGPx8TBcY8CfB4JTIkN9wud6paFiIF2gnHo1MVT8Lk/D3gc5D/p2T/Zp8KginE9unpRkhw5A2H2GxY8nPFAmUMbwk1LO/X4Ah4t9q4kp8fvZnnufGY4YUOPNsxYMx2xhq83SBc1qno/f7X1bVk1ML79DrXljQR6uk0pgVYiHG3DlAxxWuXkOSHa8M4U1+qLWgC0DMYKG4ENes66QnqomgOt/BiEDiti4RpfpFKKIz/BBabxgfycf2lcwMn71U5cUn66pP4QTfNhfaIZX6z0IWZQZQZ0P6SWpvSatLqC0ROzkvLkqMucZE9aOJczoTKgCzg7GamHGp74vlgztS9J8kHR3r2Eqcwy7iZEGannNIChUF9VIx7uQZFjS9ykBP96FftZnRLc8OhjOILcv7P11g5qDWb6l+owLJuYz8TgIxoK98F5MbJgrl0qG9SCP0+AYAsQcANaaTaUNlqehMzR19aDpfxGT7vSfyH4EGABTb7iy4zJ6TwAAAABJRU5ErkJggg=="; | |
t.pics = {}; | |
t.pics.transfer = new Image(); | |
t.pics.transfer.src = a; | |
t.pics.transfer.onload = function() { | |
transferImgLoaded = true; | |
}; | |
t.pics.icon_ap = new Image(); | |
t.pics.icon_ap.src = b; | |
t.pics.icon_ap.onload = function() { | |
ptImgLoaded = true | |
}; | |
}; | |
/** | |
* 解析XML | |
* (重点属性解释) | |
* line标签解释如下: | |
* id:线路名称标识 | |
* lb:线路全称 | |
* lbx、lby:线路名称显示的坐标 | |
* inuse:线路是否开通 | |
* loop:线路是否是环线 | |
* rx、ry:画弧度使用,利用贝塞尔曲线-quadraticCurveTo | |
* lc:线路颜色 | |
* n:线坐标的数量 | |
************************************************************************ | |
* 站点标签解释如下: | |
* id:站点名称标识(与line的id对应) | |
* lb:站点名全称 | |
* lx、ly:坐标偏移值,用来显示文字 | |
* ex:是否是换乘站 | |
* iu:站点是否启用 | |
* st、si:首末车时间 | |
* ln:站点对应的线路名称 | |
* 最好加入线路的颜色值,避免匹配 | |
*/ | |
sp.parseXML = function() { | |
var t = this, a, b, c, d, e, f, g, h; | |
a = new DOMParser(); | |
b = a.parseFromString(t.xml, "text/xml"); | |
console.log(b); | |
try{ | |
c = b.getElementsByTagName("subway")[0].getAttribute("zh"); | |
}catch(e){console.log(e);} | |
t.line.city = c;//获取城市 | |
d = b.getElementsByTagName("l");//获取线数组 | |
for (var i = 0; i < d.length; i ++) { | |
var O = d[i], line = {};//存储线信息 | |
line.points = [];//存储线的点 | |
line.id = O.getAttribute("id"); | |
line.lb = O.getAttribute("lb"); | |
line.py = parseFloat(O.getAttribute("py")) || 0; | |
line.n = parseFloat(O.getAttribute("n")) || 0; | |
line.loop = (O.getAttribute("loop") == "true"); | |
line.lbx = parseFloat(O.getAttribute("lbx")) * t.FLAGNUM || 0; | |
line.lbx = Math.floor(line.lbx + t.SVG_WIDTH / 2); | |
line.lby = parseFloat(O.getAttribute("lby")) * t.FLAGNUM || 0; | |
line.lby = Math.floor(line.lby + t.SVG_HEIGHT / 2); | |
line.inuse = parseFloat(O.getAttribute("inuse")) || 0; | |
line.lc = "#" + O.getAttribute("lc").split("0x")[1]; | |
var p = O.getElementsByTagName("p");//获取线内点的数组 | |
for (var j = 0; j < p.length; j ++) { | |
var OP = p[j], op = {}; | |
op.id = OP.getAttribute("id"); | |
op.x = parseFloat(OP.getAttribute("x")) * t.FLAGNUM; | |
(op.x != null) && (op.x = Math.floor(op.x + t.SVG_WIDTH / 2)); | |
op.y = parseFloat(OP.getAttribute("y")) * t.FLAGNUM; | |
(op.y != null) && (op.y = Math.floor(op.y + t.SVG_HEIGHT / 2)); | |
op.rx = parseFloat(OP.getAttribute("rx")) * t.FLAGNUM;//若有值,则为曲线 | |
(op.rx != null) && (op.rx = Math.floor(op.rx + t.SVG_WIDTH / 2)); | |
op.ry = parseFloat(OP.getAttribute("ry")) * t.FLAGNUM; | |
(op.ry != null) && (op.ry = Math.floor(op.ry + t.SVG_HEIGHT / 2)); | |
line.points.push(op); | |
} | |
t.line.push(line); | |
t.lineObj[line.id] = line; | |
} | |
e = b.getElementsByTagName("s");//获取站点数组 | |
for (var i = 0; i < e.length; i ++) { | |
var O = e[i], station = {};//存储站点信息 | |
station.id = O.getAttribute("id"); | |
station.lb = O.getAttribute("lb"); | |
station.x = parseFloat(O.getAttribute("x")) * t.FLAGNUM; | |
(station.x != null) && (station.x = Math.floor(station.x + t.SVG_WIDTH / 2)); | |
station.y = parseFloat(O.getAttribute("y")) * t.FLAGNUM; | |
(station.y != null) && (station.y = Math.floor(station.y + t.SVG_HEIGHT / 2)); | |
station.lx = (parseFloat(O.getAttribute("x")) + parseFloat(O.getAttribute("lx"))) * t.FLAGNUM; | |
(station.lx != null) && (station.lx = Math.floor(station.lx + t.SVG_WIDTH / 2)); | |
station.ly = (parseFloat(O.getAttribute("y")) + parseFloat(O.getAttribute("ly"))) * t.FLAGNUM; | |
(station.ly != null) && (station.ly = Math.floor(station.ly + t.SVG_HEIGHT / 2)); | |
station.ex = (O.getAttribute("ex") == "true"); | |
station.iu = (O.getAttribute("iu") == "true"); | |
station.slb = (O.getAttribute("slb") == "true"); | |
station.ln = O.getAttribute("ln"); | |
station.int = parseFloat(O.getAttribute("int")); | |
station.uid = O.getAttribute("uid"); | |
station.dataId = O.getAttribute("dataid"); | |
station.mx = parseFloat(O.getAttribute("mx")) || 0; | |
station.my = parseFloat(O.getAttribute("my")) || 0; | |
var lns = O.getElementsByTagName("ln"), snArr = []; | |
station.lns = [];//存储站点首末车时间 | |
if (lns && lns.length > 0) { | |
for (var j = 0; j < lns.length; j ++) {//获取站点首末车时间 | |
var lnO = lns[j], ln = {}, lnName, lnFlag = 0; | |
ln.id = lnO.getAttribute("id"); | |
if (ln.id.indexOf("(") > -1) { | |
lnName = ln.id.substr(0, ln.id.indexOf("(")); | |
} else | |
lnName = ln.id; | |
for (var m = 0; m < station.lns.length; m ++) { | |
var mso = station.lns[m]; | |
if (mso.id.indexOf(lnName) > -1) { | |
ln = mso; | |
lnFlag = 1; | |
break; | |
} | |
} | |
if (!lnFlag) { | |
if (t.line.length > 0) {//匹配站点颜色 | |
for (var m = 0; m < t.line.length; m ++) { | |
if (ln.id == t.line[m].id) { | |
snArr.push(t.line[m].lc); | |
break; | |
} | |
} | |
} | |
} | |
var fxs = lnO.getElementsByTagName("fx"); | |
if (!lnFlag) { | |
ln.fx = []; | |
for (var k = 0; k < fxs.length; k ++) { | |
var fxO = fxs[k],fx = {}; | |
fx.name = fxO.getAttribute("name"); | |
fx.st = fxO.getAttribute("st"); | |
fx.si = fxO.getAttribute("si"); | |
fx.et = fxO.getAttribute("et"); | |
fx.ei = fxO.getAttribute("ei"); | |
fx.msg = fxO.getAttribute("msg"); | |
ln.fx.push(fx); | |
} | |
station.lns.push(ln); | |
} else { | |
for (var k = 0; k < fxs.length; k ++) { | |
var fxO = fxs[k], fx = {}, fxFlag = 0; | |
fx.name = fxO.getAttribute("name"); | |
for (var m = 0; m < ln.fx.length; m ++) { | |
if (fx.name == ln.fx[m].name) { | |
fxFlag = 1; | |
break; | |
} | |
} | |
if (fxFlag) | |
continue; | |
fx.st = fxO.getAttribute("st"); | |
fx.si = fxO.getAttribute("si"); | |
fx.et = fxO.getAttribute("et"); | |
fx.ei = fxO.getAttribute("ei"); | |
fx.msg = fxO.getAttribute("msg"); | |
ln.fx.push(fx); | |
} | |
} | |
} | |
} | |
station.lc = snArr; | |
t.station.push(station); | |
t.stationObj[station.id] = station; | |
} | |
}; | |
/** | |
* 创建svg画布 | |
*/ | |
sp.createSvg = function() { | |
var a = document.getElementById("container1"),b,t = this; | |
if ($(SVG_ID))//删除已存在的svg画布 | |
$(SVG_ID).remove(); | |
b = document.createElementNS(SVG_NS, 'svg'); | |
b.setAttribute("class", SVG_ID) | |
b.setAttribute("id", SVG_ID); | |
b.setAttribute("width", t.SVG_WIDTH); | |
b.setAttribute("height", t.SVG_HEIGHT); | |
a.appendChild(b); | |
// var mark = document.createElementNS(SVG_NS, 'rect'); | |
// mark.setAttribute("width", "100px"); | |
// mark.setAttribute("height", "100px"); | |
// mark.setAttribute("fill", "red"); | |
// mark.setAttribute("x", "20px"); | |
// mark.setAttribute("y", "20px"); | |
// b.appendChild(mark); | |
t.mySVGContainer = b; | |
t.mySVGDocument = b.ownerDocument; | |
$("#container1").css('width', t.SVG_WIDTH + "px"); | |
$("#container1").css('height', t.SVG_HEIGHT + "px"); | |
$("#container2").css('width', t.SVG_WIDTH + "px"); | |
$("#container2").css('height', t.SVG_HEIGHT + "px"); | |
/* | |
$("container4").style.width = t.SVG_WIDTH + "px"; | |
$("container4").style.height = t.SVG_HEIGHT + "px"; | |
$("container4").style.display = "none";*/ | |
}; | |
/** | |
* 画线路 | |
* @param lineData 线路数据 | |
*/ | |
sp.drawLine = function(lineData) { | |
var _opacity = typeof(opacity) == 'string' ? opacity : '1'; | |
var t = this, a, b; | |
var _lineData = typeof (lineData ) == 'object' ? lineData : t.line; | |
b = _lineData.length; | |
if (b <= 0) { | |
alert("当前城市无地铁线路"); | |
return; | |
} | |
for (var i = 0; i < b; i ++) { | |
var O = _lineData[i], ps, lineXY = []; | |
ps = O.points; | |
for (var j = 0; j < ps.length; j ++) {//画线 | |
var psO = ps[j], z, y, x, w, v, u, s, r, q, p, o, n, m, l, k, h; | |
z = psO.id; | |
x = psO.x; | |
y = psO.y; | |
w = psO.rx; | |
v = psO.ry; | |
if (j == 0) { | |
lineXY.push("M" + x + "," + y); | |
} else { | |
if (w || v) {//如果是拐角,利用贝塞尔方法 | |
lineXY.push("Q" + w + "," + v); | |
lineXY.push(x + "," + y); | |
} else { | |
lineXY.push("L" + x + "," + y); | |
} | |
} | |
if (O.loop) {//如果是环线,需要封闭环路 | |
if (j == (ps.length - 1)) { | |
l = ps[0].x; | |
k = ps[0].y; | |
lineXY.push("L" + l + "," + k); | |
} | |
} | |
} | |
var shape = t.mySVGDocument.createElementNS(SVG_NS, "path"); | |
shape.setAttributeNS(null, "d", lineXY.join(" ")); | |
shape.setAttributeNS(null, "fill", "none"); | |
shape.setAttributeNS(null, "stroke-width", t.config.LINE_WIDTH); | |
if (O.inuse) | |
shape.setAttributeNS(null, "stroke", O.lc); | |
t.mySVGContainer.appendChild(shape); | |
var text = t.mySVGDocument.createElementNS(SVG_NS, "text"); | |
text.setAttributeNS(null, "x", O.lbx + t.config.LINE_NAME_X); | |
text.setAttributeNS(null, "y", O.lby + t.config.LINE_NAME_Y); | |
text.setAttributeNS(null, "font-size", t.config.LINE_NAME_SIZE); | |
text.setAttributeNS(null, "font-family", "宋体"); | |
if (O.inuse) | |
text.setAttributeNS(null, "fill", O.lc); | |
if(O.lb.indexOf("br") >= 0){ | |
O.lb = O.lb.replace("br", ""); | |
} | |
if (O.lb.indexOf("(") > -1) { | |
O.lb = O.lb.substr(0, O.lb.indexOf("(")); | |
} | |
text.textContent = O.lb; | |
t.mySVGContainer.appendChild(text); | |
} | |
}; | |
/** | |
* 画站点 | |
*/ | |
sp.drawStation = function(stateData) { | |
var t = this, a, b, c, z = document.getElementById("container2"); | |
var _stateData = typeof(stateData) == 'object' ? stateData : t.station; | |
b = _stateData.length; | |
for (var i = 0; i < b; i ++) { | |
var O = _stateData[i]; | |
var texts = document.querySelectorAll('text'); | |
var created = false; | |
for(var itext in texts){ | |
if(texts[itext].innerHTML == O.id){ | |
t.mySVGContainer.appendChild(texts[itext]); | |
created = true; | |
break; | |
} | |
} | |
if(!created){ | |
var text = t.mySVGDocument.createElementNS(SVG_NS, "text"); | |
text.setAttributeNS(null, "x", O.lx + t.config.STATION_NAME_X); | |
text.setAttributeNS(null, "y", O.ly + t.config.STATION_NAME_Y); | |
text.setAttributeNS(null, "font-size", t.config.STATION_NAME_SIZE); | |
text.setAttributeNS(null, "font-family", "微软雅黑"); | |
//未启用的站点灰色 | |
if(O.iu == false){ | |
text.setAttributeNS(null, "fill", "#b3afaf"); | |
text.textContent = O.lb; | |
var unable = t.mySVGDocument.createElementNS(SVG_NS, "text"); | |
unable.setAttributeNS(null, "x", O.lx + t.config.STATION_NAME_X - 12 * (4 - O.id.length) / 2); | |
unable.setAttributeNS(null, "y", O.ly + t.config.STATION_NAME_Y * 2); | |
unable.setAttributeNS(null, "font-size", t.config.STATION_NAME_SIZE); | |
unable.setAttributeNS(null, "fill", "#b3afaf"); | |
unable.textContent = '(未启用)'; | |
t.mySVGContainer.appendChild(unable); | |
} | |
else{ | |
text.setAttributeNS(null, "fill", "black"); | |
text.textContent = O.lb; | |
} | |
t.mySVGContainer.appendChild(text); | |
} | |
if (O.iu) {//已启用的站点 | |
if (O.ex) {//换乘站 | |
if (transferImgLoaded) {//换乘站图片已经加载 | |
var pic = t.mySVGDocument.createElementNS(SVG_NS, "image"); | |
pic.setAttributeNS(null, "x", O.x + t.config.TRANSFERSTATION_X); | |
pic.setAttributeNS(null, "y", O.y + t.config.TRANSFERSTATION_Y); | |
pic.setAttributeNS(null, "width", t.config.TRANSFERSTATION_WIDTH); | |
pic.setAttributeNS(null, "height", t.config.TRANSFERSTATION_HEIGHT); | |
pic.setAttributeNS("http://www.w3.org/1999/xlink", "href", t.pics.transfer.src); | |
pic.setAttributeNS(null, "data-id", O.id); | |
var _this = t; | |
pic.onclick = function(e) { | |
// e.stopPropagation(); | |
if($('#start').val() && $('#end').val()){ | |
return; | |
} | |
_this.showDetail(_this, _this.stationObj[e.target.getAttribute('data-id')]); | |
}; | |
t.mySVGContainer.appendChild(pic); | |
} else {//没有加载 | |
transferArr.push(O); | |
t.pics.transfer.onload = function() { | |
transferImgLoaded = true; | |
for (var n in transferArr) { | |
var pic = t.mySVGDocument.createElementNS(SVG_NS, "image"); | |
pic.setAttributeNS(null, "x", transferArr[n].x + t.config.TRANSFERSTATION_X); | |
pic.setAttributeNS(null, "y", transferArr[n].y + t.config.TRANSFERSTATION_Y); | |
pic.setAttributeNS(null, "width", t.config.TRANSFERSTATION_WIDTH); | |
pic.setAttributeNS(null, "height", t.config.TRANSFERSTATION_HEIGHT); | |
pic.setAttributeNS("http://www.w3.org/1999/xlink", "href", t.pics.transfer.src); | |
pic.setAttributeNS(null, "data-id", transferArr[n].id); | |
var _this = t; | |
pic.onclick = function(e) { | |
// e.stopPropagation(); | |
if($('#start').val() && $('#end').val()){ | |
return; | |
} | |
_this.showDetail(_this, _this.stationObj[e.target.getAttribute('data-id')]); | |
}; | |
t.mySVGContainer.appendChild(pic); | |
} | |
} | |
} | |
var d = t.createDiv(O); | |
z.appendChild(d); | |
} else {//普通站点(不包括未启用的站点) | |
var rect = t.mySVGDocument.createElementNS(SVG_NS, "rect"); | |
var rectWidth = '26px'; | |
rect.setAttributeNS(null, "x", parseInt(O.x) - parseInt(rectWidth) / 2 + 'px'); | |
rect.setAttributeNS(null, "y", parseInt(O.y) - parseInt(rectWidth) / 2 + 'px'); | |
rect.setAttributeNS(null, "width", rectWidth); | |
rect.setAttributeNS(null, "height", rectWidth); | |
rect.setAttributeNS(null, "fill", "#ccc"); | |
rect.setAttributeNS(null, "fill-opacity", "0"); | |
rect.setAttributeNS(null, "data-id", O.id); | |
t.mySVGContainer.appendChild(rect); | |
// rect.setAttributeNS(null, "stroke", O.lc[0]); | |
// rect.setAttributeNS(null, "stroke-width", t.config.CIRCLE_LINE_WIDTH); | |
// rect.setAttributeNS(null, "id", O.id); | |
var shape = t.mySVGDocument.createElementNS(SVG_NS, "circle"); | |
shape.setAttributeNS(null, "cx", O.x); | |
shape.setAttributeNS(null, "cy", O.y); | |
shape.setAttributeNS(null, "r", t.config.CIRCLE_RADIUS); | |
shape.setAttributeNS(null, "fill", "white"); | |
shape.setAttributeNS(null, "stroke", O.lc[0]); | |
shape.setAttributeNS(null, "stroke-width", t.config.CIRCLE_LINE_WIDTH); | |
shape.setAttributeNS(null, "id", O.id); | |
var _this = t; | |
shape.onclick = function(e) { | |
// e.stopPropagation(); | |
if($('#start').val() && $('#end').val()){ | |
return; | |
} | |
_this.showDetail(_this, _this.stationObj[e.target.id]); | |
}; | |
t.mySVGContainer.appendChild(shape); | |
rect.onclick = function(e) { | |
$('circle[id='+e.target.getAttribute('data-id')+']').trigger('click'); | |
}; | |
// var d = t.createDiv(O); | |
// z.appendChild(d); | |
} | |
/* | |
if (O.id.indexOf("航站楼") >= 0 || O.id.indexOf("机场") >= 0) {//机场画图标 | |
if (ptImgLoaded) { | |
var pic = t.mySVGDocument.createElementNS(SVG_NS, "image"); | |
pic.setAttributeNS(null, "x", Number(O.x) - 15); | |
pic.setAttributeNS(null, "y", Number(O.y) - 35); | |
pic.setAttributeNS(null, "width", 24); | |
pic.setAttributeNS(null, "height", 24); | |
pic.setAttributeNS("http://www.w3.org/1999/xlink", "href", t.pics.icon_ap.src); | |
t.mySVGContainer.appendChild(pic); | |
} else { | |
ptArr.push(O); | |
t.pics.icon_ap.onload = function() { | |
for (var n in ptArr) { | |
var pic = t.mySVGDocument.createElementNS(SVG_NS, "image"); | |
pic.setAttributeNS(null, "x", Number(ptArr[n].x) - 15); | |
pic.setAttributeNS(null, "y", Number(ptArr[n].y) - 35); | |
pic.setAttributeNS(null, "width", 24); | |
pic.setAttributeNS(null, "height", 24); | |
pic.setAttributeNS("http://www.w3.org/1999/xlink", "href", t.pics.icon_ap.src); | |
t.mySVGContainer.appendChild(pic); | |
} | |
} | |
} | |
}*/ | |
} else { | |
var shape = t.mySVGDocument.createElementNS(SVG_NS, "circle"); | |
shape.setAttributeNS(null, "cx", O.x); | |
shape.setAttributeNS(null, "cy", O.y); | |
shape.setAttributeNS(null, "r", t.config.CIRCLE_RADIUS); | |
shape.setAttributeNS(null, "fill", "white"); | |
shape.setAttributeNS(null, "stroke", "gray"); | |
shape.setAttributeNS(null, "stroke-width", t.config.CIRCLE_LINE_WIDTH); | |
shape.setAttributeNS(null, "stroke-opacity", '0.5'); | |
shape.setAttributeNS(null, "id", O.id); | |
// var _this = t; | |
// shape.onclick = function(e) { | |
// // e.stopPropagation(); | |
// if($('#start').val() && $('#end').val()){ | |
// return; | |
// } | |
// _this.showDetail(_this, _this.stationObj[e.target.id]); | |
// }; | |
t.mySVGContainer.appendChild(shape); | |
} | |
} | |
}; | |
sp.createDiv = function(a) { | |
var d = cd(), t = this; | |
if (a.ex) {//换乘站 | |
d.setAttribute("id", a.id); | |
d.setAttribute("name", a.id); | |
d.setAttribute("style", "position: absolute; left:" + (a.x + t.config.TRANSFERSTATION_X) + "px; top:" + (a.y + t.config.TRANSFERSTATION_Y) + "px; width: " + t.config.TRANSFERSTATION_WIDTH + "px; height: " + t.config.TRANSFERSTATION_HEIGHT + "px;"); | |
t.createClick(d, a); | |
} else {//非换乘站 | |
d.setAttribute("id", a.id); | |
d.setAttribute("name", a.id); | |
d.setAttribute("style", "position: absolute; left:" + (a.x - 13) + "px; top:" + (a.y - 13) + "px; width: 26px; height: 26px; border: 0px " + a.lc + "solid; background-color: transparent;z-index:100;"); | |
t.createClick(d, a); | |
} | |
return d; | |
} | |
/** | |
* 创建站点点击事件的DIV | |
* a: 站点svg对象 | |
* b:站点解析对象 | |
*/ | |
sp.createClick = function(a, b) { | |
var t = this; | |
a.onclick = function(e) { | |
// e.stopPropagation(); | |
t.showDetail(this, b); | |
} | |
}; | |
/** | |
* 显示离你最近的弹出框 | |
* a: 站点svg对象 | |
* b: 站点解析对象 | |
*/ | |
sp.showDetailNear = function(a) { | |
var left, top, o = document.getElementById("container4"); | |
left = a.x - 2; | |
top = a.y; | |
o.style.top = top + "px"; | |
o.style.left = left + "px"; | |
// o.style.display = "block"; | |
// o.innerText = '离你最近\n' + this.nearStationObject.id; | |
$('#nearfont').text(this.nearStationObject.id); | |
}; | |
/** | |
* 显示我的位置(最近的站点) | |
*/ | |
sp.showMyPos = function() { | |
if(!this.nearStationObject){ | |
return; | |
} | |
var left, top, fo = document.getElementById("nearfont"); | |
this.nearStation(); | |
left = this.nearStationObject.x; | |
top = this.nearStationObject.y; | |
$('#myPos').show(); | |
$('#myPos').css('top', (top) + "px"); | |
$('#myPos').css('left', (left) + "px"); | |
$('#container4').css('top', (top) + "px"); | |
$('#container4').css('left', (left) + "px"); | |
if(!this.mask || this.mask.style.display == 'none'){ | |
$('#container4').show(); | |
} | |
if(!$('#start').val() && !$('#end').val()){ | |
this.showDetailNear(this.nearStationObject); | |
} | |
$('#nearfont').text(this.nearStationObject.id); | |
//定位点位置 | |
var c4left = parseInt($('#container4').css('left')); | |
var c4top = parseInt($('#container4').css('top')); | |
$('#container4, #myPos').css('transform', 'translate('+ getTransX(c4left, this.scale, $('#container1')[0]) +'px,' + getTransY(c4top, this.scale, $('#container1')[0]) + 'px)'); | |
}; | |
/** | |
* 显示起点 | |
*/ | |
sp.showStart = function(name, id){ | |
if(id){ | |
sendLog("event=sw_start_map&originurltype=" + t + init + '&searchVRuserID='+encodeURIComponent(searchVRuserID)); | |
} | |
else{ | |
sendLog("event=sw_start_input&originurltype=" + t + init + '&searchVRuserID='+encodeURIComponent(searchVRuserID)); | |
} | |
if(this.startname == name){ | |
return; | |
} | |
if(!$('#start').val() || !$('#end').val()){ | |
this.removeMask(); | |
} | |
$('#closeBtn').hide(); | |
$('#linesBtn').show(); | |
$('#desktopBtn').show(); | |
var start = getStation(name); | |
this.startname = name; | |
this.isDefaultStart = false; | |
lastInput = name; | |
if($('#start').val() != name){ | |
$('#start').val(name); | |
$('#start').change(); | |
} | |
if(name == ''){ | |
$('#startFlag').hide(); | |
return; | |
} | |
$('#startFlag').css('top', start.y + 'px'); | |
$('#startFlag').css('left', start.x + 'px'); | |
if(this.scale){ | |
$('#startFlag').css('transform', 'translate('+ getTransX(parseInt(start.x), this.scale, $('#container1')[0])+'px,'+ getTransY(parseInt(start.y), this.scale, $('#container1')[0])+'px)'); | |
} | |
$('#startFlag').show(); | |
$('#container3').hide(); | |
//浏览器版本不显示输入框,因此没有change事件,需直接调用求路 | |
if(this.startname && this.endname){ | |
queryRoute(); | |
} | |
}; | |
/** | |
*显示终点 | |
*/ | |
sp.showEnd = function(name, id){ | |
if(id){ | |
sendLog("event=sw_end_map&originurltype=" + t + init + '&searchVRuserID='+encodeURIComponent(searchVRuserID)); | |
} | |
else{ | |
sendLog("event=sw_end_input&originurltype=" + t + init + '&searchVRuserID='+encodeURIComponent(searchVRuserID)); | |
} | |
if(this.endname == name){ | |
return; | |
} | |
if(!$('#start').val() || !$('#end').val()){ | |
this.removeMask(); | |
} | |
$('#closeBtn').hide(); | |
$('#linesBtn').show(); | |
$('#desktopBtn').show(); | |
var end = getStation(name); | |
this.endname = name; | |
lastInput = name; | |
if($('#end').val() != name){ | |
$('#end').val(name); | |
$('#end').change(); | |
} | |
if(name == ''){ | |
$('#endFlag').hide(); | |
return; | |
} | |
if(this.scale){ | |
$('#endFlag').css('transform', 'translate('+ getTransX(parseInt(end.x), this.scale, $('#container1')[0])+'px,'+ getTransY(parseInt(end.y), this.scale, $('#container1')[0])+'px)'); | |
} | |
$('#endFlag').css('top', end.y + 'px'); | |
$('#endFlag').css('left', end.x + 'px'); | |
$('#endFlag').show(); | |
$('#container3').hide(); | |
if(this.startname && this.endname){ | |
queryRoute(); | |
} | |
}; | |
/** | |
* 显示站点气泡 | |
* @param station | |
* | |
* @param center 线路的中心点 | |
*/ | |
sp.showBubble = function(station, info, color){ | |
//防止重复添加 | |
if(this.bubbleMap[station.id]){ | |
this.bubbleMap[station.id].show(); | |
return; | |
} | |
// if($('.bubble[data-id='+station.id+']').length){ | |
// $('.bubble[data-id='+station.id+']').show(); | |
// return; | |
// } | |
//标志点 | |
var flag; | |
if(station.id != this.startname && station.id != this.endname) { | |
flag = $('<div class="flag trans" data-id="' + station.id + '">' + | |
'<img src="images/transFlag.png">' + | |
'<div>转</div>' + | |
'</div>'); | |
var left = station.x + 'px'; | |
var top = station.y + 'px'; | |
flag.css('top', top); | |
flag.css('left', left); | |
var _this = this; | |
// setTimeout(function(){ | |
if(_this.scale){ | |
flag.css('transform', 'translate('+ getTransX(parseInt(left), this.scale, $('#container1')[0])+'px,'+ getTransY(parseInt(top), this.scale, $('#container1')[0])+'px)'); | |
} | |
$('.container').append(flag); | |
// }, 10); | |
} | |
//气泡 | |
if(station.id == this.endname){ | |
return; | |
} | |
var bubble = $(' <div class="bubble " data-id="' + station.id + '">' + | |
'<img src="images/bubble.png">'+ | |
'<div>' + | |
'<span class="name">'+station.id+'</span>'+ | |
'<span class="lineName" style="background-color: '+ color +'">'+info.linename.replace('地铁', '').replace(/\(.*\)/, '')+'</span>'+ | |
'<div class="info">'+info.direct+'方向 ' + info.passstopnum + '站</div>'+ | |
'</div>' + | |
'</div>'); | |
this.bubbleMap[station.id] = bubble; | |
var bleft = station.x + 'px'; | |
var btop = station.y + 'px'; | |
bubble.css('top', btop); | |
bubble.css('left', bleft); | |
var _this = this; | |
// setTimeout(function(){//不加setTimeout有报错 | |
if(_this.scale){ | |
// bubble.css('transform', 'translate('+ parseInt(left)*(this.scale - 1.0)+'px,'+ ((parseInt(top) + this.config.BUBBLE_OFFSET_Y)*(this.scale - 1.0))+'px)'); | |
bubble.css('transform', 'translate('+ getTransX(parseInt(bleft), _this.scale, $('#container1')[0])+'px,'+ (getTransY(parseInt(btop), _this.scale, $('#container1')[0]) - parseFloat($('html').css('font-size'))*this.config.BUBBLE_HEIGHT)+'px)'); | |
} | |
$('.container').append(bubble); | |
setDirection(station.id); | |
// }, 10); | |
} | |
/** | |
* 定位选中站点 | |
* @param top | |
* @param left | |
*/ | |
sp.focus = function(x, y){ | |
$('#container').scrollTo({ | |
// toT: top*(this.scale || 1) - window.innerHeight / 2 - 60, | |
// toL: left*(this.scale || 1)- window.innerWidth / 2, | |
toT: y + getTransY(y, this.scale || 1, $('#container1')[0]) - window.innerHeight / 2 - 60, | |
toL: x + getTransX(x, this.scale || 1, $('#container1')[0])- window.innerWidth / 2, | |
durTime : 200, //过渡动画时间 | |
// delay : 30, | |
}); | |
} | |
/** | |
* 显示popwin弹出框 | |
* a: 站点svg对象 | |
* b: 站点解析对象 | |
*/ | |
sp.showDetail = function(a, aa) { | |
if(aa.id == this.startname || aa.id == this.endname){ | |
return; | |
} | |
var t = this, b, c, d, f = [], mb = document.getElementById("msgbox"); | |
b = t.station; | |
c = b.length; | |
if (c <= 0) return; | |
d = aa.id; | |
// if (d == lastPoiId) { | |
// return; | |
// } | |
$("#container3").css('display', "none"); | |
$("#container3").css('zIndex', 0); | |
//隐藏"离你最近"的提示 | |
// $("#container4").css('display', "none"); | |
$("#container4").css('zIndex', 0); | |
mb.innerHTML = ""; | |
lastPoiId = d; | |
var left, top; | |
if (!a.GPS) { | |
if (!aa.ex) { | |
left = parseFloat(aa.x); | |
top = parseFloat(aa.y); | |
// left = parseFloat(a.getBBox().x - a.getBBox().width / 2); | |
// top = parseFloat(a.getBBox().y + a.getBBox().height / 2); | |
} else { | |
left = parseFloat(aa.x); | |
top = parseFloat(aa.y); | |
} | |
} else { | |
left = a.x; | |
top = a.y; | |
} | |
this.focus(left, top); | |
// $('#container').animate({scrollTop: top - window.innerHeight / 2 - 60 + 'px', scrollTop: left - window.innerWidth / 2+ 'px'}, 800); | |
for (var i = 0; i < c; i ++) { | |
var O = b[i], z, y, lns, p_t, p_tc, p_tn, p_lc; | |
z = O.id; | |
if (d == z) {//找到站点名 | |
lns = O.lns; | |
y = lns.length; | |
if (y <= 0) { | |
return; | |
} | |
p_t = cd(); | |
p_t.className = "top"; | |
// mb.appendChild(p_t); | |
p_tc = cd(t_c); | |
p_tc.className = "title_container"; | |
mb.appendChild(p_tc); | |
p_tn = cd(); | |
p_tn.className = "title_name floatcss"; | |
p_tn.innerHTML = O.lb; | |
p_tc.appendChild(p_tn); | |
//“离你最近”文字 | |
if(this.nearStationObject && aa.id == this.nearStationObject.id){ | |
var div_nearest = cd(); | |
div_nearest.style.verticalAlign = 'bottom'; | |
div_nearest.style.color = '#ed5026'; | |
div_nearest.style.lineHeight = '23px'; | |
div_nearest.style.float = 'left'; | |
div_nearest.style.paddingLeft = '4px'; | |
div_nearest.innerHTML = ' 离你最近'; | |
p_tc.appendChild(div_nearest); | |
} | |
p_lc = cd(); | |
p_lc.className = "line_container"; | |
mb.appendChild(p_lc); | |
for (var j = 0; j < y; j ++) { | |
var ln = lns[j], x, w, v, g, p_ln; | |
if (ln.id.indexOf("(") > 0) | |
ln.id = ln.id.substr(0, ln.id.indexOf("(")); | |
p_ln = cd(); | |
p_ln.className = "line_div floatcss"; | |
p_ln.setAttribute("lc", O.lc[j]); | |
p_ln.setAttribute("ch", O.lc[j] + "_" + ln.id); | |
p_ln.innerHTML = ln.id; | |
if (j == 0) { | |
p_ln.style.backgroundColor = O.lc[j]; | |
p_ln.style.color = "#ffffff"; | |
p_ln.style.fontWeight = "bold"; | |
p_lc.style.borderBottom = "2px solid" + O.lc[j]; | |
tempLinePanel = p_ln; | |
} else { | |
p_ln.className += " margincss"; | |
} | |
p_lc.appendChild(p_ln); | |
x = ln.fx; | |
w = x.length; | |
if (w <= 0) { | |
mb.innerHTML = ""; | |
return; | |
} | |
v = cd(); | |
v.style.marginTop = "15px"; | |
v.id = O.lc[j] + "_" + ln.id; | |
mb.appendChild(v); | |
if (j > 0) { | |
v.style.display = "none"; | |
} else { | |
v.style.display = "block"; | |
tempDetailPanel = v; | |
} | |
for (var k = 0; k < w; k ++) { | |
var fx = x[k], u, s, r, q, p, o, n, m, h; | |
u = cd(); | |
u.className = "detail_container"; | |
if (k > 0) { | |
u.style.marginTop = "15px"; | |
} | |
v.appendChild(u); | |
s = cd(); | |
s.className = "floatcss detail_fangxiang"; | |
s.innerHTML = fx.name + "方向"; | |
u.appendChild(s); | |
r = fx.ei.split(","); | |
if (r.length > 1) {//多个末班,第一个是全程 | |
q = fx.et; | |
p = q.split(","); | |
for (var l = 0; l < p.length; l ++) { | |
if (l == 0) { | |
t.appendFirstDetail(fx, u, p[l]); | |
} else { | |
o = cd(); | |
o.className = "detail_qj_container"; | |
o.style.verticalAlign = "middle"; | |
v.appendChild(o); | |
n = cd(); | |
n.className = "floatcss detail_circle"; | |
o.appendChild(n); | |
m = cd(); | |
m.className = "floatcss"; | |
m.style.color = "#999999"; | |
m.style.marginLeft = "7px"; | |
m.innerHTML = "往" + r[l]; | |
o.appendChild(m); | |
h = cd(); | |
h.className = "floatcss2"; | |
h.style.color = "#999999"; | |
h.innerHTML = p[l]; | |
o.appendChild(h); | |
} | |
} | |
} else { | |
t.appendFirstDetail(fx, u); | |
} | |
} | |
g = cd(); | |
g.style.height = "10px"; | |
g.style.width = "100%"; | |
v.appendChild(g); | |
//横线 | |
var split = cd(); | |
split.style.height = '1px'; | |
split.style.width = '106%'; | |
split.style.marginLeft = '-10px'; | |
split.style.backgroundColor = '#cccccc'; | |
v.appendChild(split); | |
//设为起点、设为终点 | |
var opGroup = cd(); | |
opGroup.style.textAlign = 'center'; | |
opGroup.style.marginTop = '0.28rem'; | |
v.appendChild(opGroup); | |
//起点 | |
var setStartBtn = cd(); | |
setStartBtn.innerText = '设为起点'; | |
setStartBtn.style.fontSize = '0.4rem'; | |
setStartBtn.style.color = '#067ffa'; | |
setStartBtn.style.height = '25px'; | |
setStartBtn.style.width = '40%'; | |
setStartBtn.style.display = 'inline-block'; | |
setStartBtn.style.textAlign = 'left'; | |
setStartBtn.onclick = t.showStart.bind(this, aa.id); | |
//竖分隔线 | |
var line = cd(); | |
line.style.width = '1px'; | |
line.style.height = '30px'; | |
line.style.display = 'inline-block'; | |
line.style.backgroundColor = '#cccccc'; | |
line.style.verticalAlign = 'middle'; | |
line.style.marginLeft = '0px'; | |
//终点 | |
var setEndBtn = cd(); | |
setEndBtn.innerText = '设为终点'; | |
setEndBtn.style.fontSize = '0.4rem'; | |
setEndBtn.style.color = '#067ffa'; | |
setEndBtn.style.display = 'inline-block'; | |
setStartBtn.style.height = '25px'; | |
setEndBtn.style.textAlign = 'right'; | |
setEndBtn.style.width = '42%'; | |
opGroup.appendChild(setStartBtn); | |
opGroup.appendChild(line); | |
opGroup.appendChild(setEndBtn); | |
setEndBtn.onclick = t.showEnd.bind(this, aa.id); | |
if (y != 1) {// | |
p_ln.onclick = function (e) { | |
e.stopPropagation(); | |
tempLinePanel.style.backgroundColor = "#e8edf2"; | |
tempLinePanel.style.color = "#999999"; | |
tempLinePanel.style.fontWeight = ""; | |
var lc = this.getAttribute("lc"); | |
this.style.backgroundColor = lc; | |
this.style.color = "#ffffff"; | |
this.style.fontWeight = "bold"; | |
this.parentElement.style.borderBottom = "2px solid" + lc; | |
tempLinePanel = this; | |
var ch = this.getAttribute("ch"); | |
var dp = document.getElementById(ch); | |
window.setTimeout( | |
function () { | |
tempDetailPanel.style.display = "none"; | |
dp.style.display = "block"; | |
tempDetailPanel = dp; | |
t.setBoxPos("container3", left, top); | |
}, 100 | |
); | |
} | |
} | |
} | |
if (t.nearStationObject) {//若是点击了附近地铁 则需要显示附近地铁的标识 | |
if (a.GPS || (d == t.nearStationObject.id)) { | |
t.displayNearStation(); | |
} | |
} | |
break; | |
} | |
} | |
window.setTimeout( | |
function () { | |
document.getElementById("container3").style.display = "block"; | |
document.getElementById("container3").style.zIndex = 200; | |
$("container3").onclick = function(e) { | |
e.stopPropagation(); | |
} | |
//$("container4").style.zIndex = 150; | |
//$("container4").style.display = "block"; | |
t.setBoxPos("container3", left, top); | |
}, 200 | |
); | |
}; | |
/** | |
* 弹出框画全程 | |
*/ | |
sp.appendFirstDetail = function(fx, u, et) { | |
var t = this, q, p, o, n, m, l; | |
q = cd(); | |
q.className = "floatcss detail_kuohao"; | |
q.innerHTML = "(全程)"; | |
u.appendChild(q); | |
p = cd(); | |
p.className = "floatcss2"; | |
p.style.fontSize = "13px"; | |
u.appendChild(p); | |
o = cd(); | |
if (fx.msg) { | |
o.className = "floatcss detail_se"; | |
o.innerHTML = fx.msg; | |
p.appendChild(o); | |
return; | |
} | |
o.className = "floatcss detail_sebg"; | |
o.style.backgroundColor = "#74bf4c"; | |
o.innerHTML = "始"; | |
p.appendChild(o); | |
n = cd(); | |
n.className = "floatcss detail_se"; | |
n.innerHTML = fx.st; | |
p.appendChild(n); | |
m = cd(); | |
m.className = "floatcss detail_sebg"; | |
m.style.backgroundColor = "#e6325c"; | |
m.style.marginLeft = "12px"; | |
m.verticalAlign = "middle"; | |
m.innerHTML = "末"; | |
p.appendChild(m); | |
l = cd(); | |
l.className = "floatcss detail_se"; | |
if (!et) | |
l.innerHTML = fx.et; | |
else | |
l.innerHTML = et; | |
p.appendChild(l); | |
}; | |
/** | |
* 显示最近地铁标识 | |
*/ | |
sp.displayNearStation = function() { | |
var t = this, a = $(t_c), b, c, d, e; | |
b = cd(); | |
b.className = "floatcss"; | |
// a.appendChild(b); | |
c = cd(); | |
c.className = "title_ov floatcss"; | |
// b.appendChild(c); | |
d = cd(); | |
// d.className = "title_near floatcss"; | |
// $('#container4').html( "离你最近" ); | |
// b.appendChild(d); | |
}; | |
/** | |
* 设置popwin弹出位置 | |
*/ | |
sp.setBoxPos = function(element, left, top) { | |
var a = document.getElementById(element).offsetHeight; | |
document.getElementById("ov").style.display = "block"; | |
if (parseInt(left) > 200) { | |
document.getElementById("ov").style.left = "50%"; | |
document.getElementById(element).style.left = (parseInt(left)) + "px"; | |
document.getElementById(element).style.marginLeft = '-148px'; | |
document.getElementById(element).style.top = (parseInt(top)) + "px"; | |
document.getElementById(element).style.marginTop = -a + 'px'; | |
} else { | |
document.getElementById("ov").style.left = "15px"; | |
document.getElementById(element).style.left = (parseInt(left) - 17) + "px"; | |
document.getElementById(element).style.top = (parseInt(top) - a) + "px" | |
} | |
if(this.scale){ | |
// document.getElementById(element).style.transform = 'translate('+ left*(this.scale - 1.0)+'px,'+top*(this.scale - 1.0)+'px)'; | |
document.getElementById(element).style.transform = 'translate('+ getTransX(left, this.scale, $('#container1')[0])+'px,'+ getTransY(top, this.scale, $('#container1')[0])+'px)'; | |
} | |
}; | |
/** | |
* 显示气泡、flag | |
*/ | |
sp.drawBubbles = function() { | |
for(var bi in sw.bubbleInfo){ | |
sw.showBubble(sw.bubbleInfo[bi].station, sw.bubbleInfo[bi].info, sw.bubbleInfo[bi].color); | |
} | |
//让气泡显示在flag上面 | |
$('.bubble').forEach(function(item){ | |
$('.container').append($(item)); | |
}); | |
} | |
/** | |
* 设置viewport,用于显示和缩放 | |
*/ | |
sp.setViewport = function(a, b, c) { | |
var d = document.querySelector("meta[name=viewport]"), e = ""; | |
if (c) { | |
e = ",initial-scale=" + c; | |
} else { | |
e = ",initial-scale=0.8"; | |
} | |
d.setAttribute("content", "width=device-width,minimum-scale=" + a + ",maximum-scale=" + b + e + ",user-scalable=yes"); | |
}; | |
/** | |
* 设置加载后 页面滚动的位置 | |
*/ | |
sp.scrollWindow = function(a, b) { | |
document.getElementById("container").scrollTop=a; | |
document.getElementById("container").scrollLeft=b; | |
//window.scrollTo(a, b); | |
}; | |
//为zepto添加scroll动画 | |
$.fn.scrollTo =function(options){ | |
var defaults = { | |
toT : 0, //滚动目标位置 | |
toL : 0, | |
durTime : 500, //过渡动画时间 | |
delay : 30, //定时器时间 | |
callback:null //回调函数 | |
}; | |
var opts = $.extend(defaults,options), | |
timer = null, | |
_this = this, | |
curTop = _this.scrollTop(),//滚动条当前的位置 | |
curLeft = _this.scrollLeft(), | |
subTop = opts.toT - curTop, //滚动条目标位置和当前位置的差值 | |
subLeft = opts.toL - curLeft, | |
delta = Math.max(subTop, subLeft), | |
index = 0, | |
dur = Math.round(opts.durTime / opts.delay), | |
smoothScroll = function(t, l){ | |
index++; | |
var perx = Math.round(subLeft/dur); | |
var pery = Math.round(subTop/dur); | |
if(index >= dur){ | |
_this.scrollTop(t); | |
_this.scrollLeft(l); | |
window.clearInterval(timer); | |
if(opts.callback && typeof opts.callback == 'function'){ | |
opts.callback(); | |
} | |
return; | |
}else{ | |
_this.scrollTop(curTop + index*pery); | |
_this.scrollLeft(curLeft + index*perx); | |
} | |
}; | |
timer = window.setInterval(function(){ | |
smoothScroll(opts.toT, opts.toL); | |
}, opts.delay); | |
return _this; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment