Commit a12d7762f68c58f8f53f487cce9b47b50beb70d7

Authored by 王通
1 parent c75b7510

1.云平台http相关链接换成https

Too many changes to show.

To preserve performance only 4 of 14 files are displayed.

src/main/resources/static/assets/css/TrafficControl.css
1 -.maplibTc {  
2 - font-size: 12px;  
3 - width: 253px;  
4 - padding: 8px 5px 8px 8px;  
5 - background: #3B3F51;  
6 - position: absolute;  
7 - color: white;  
8 - box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0  
9 - rgba(0, 0, 0, 0.19);  
10 - top: 63px;  
11 -}  
12 -  
13 -.maplibTc a {  
14 - text-decoration: none;  
15 -}  
16 -  
17 -.maplibTcColor {  
18 - background: url("../img/tools_menu.png") no-repeat scroll 128px -86px  
19 - transparent;  
20 - font-weight: bold;  
21 - margin-bottom: 9px;  
22 - height: 18px;  
23 -}  
24 -  
25 -.maplibTcUpdate {  
26 - float: left;  
27 - width: 13px;  
28 - height: 14px;  
29 - background: url(../img/tools_menu.png) no-repeat -12px -19px;  
30 - margin-left: 5px;  
31 - cursor: pointer;  
32 - margin-top: 2px;  
33 -}  
34 -  
35 -.maplibTcView {  
36 - float: right;  
37 - color: #26c281;  
38 - text-decoration: none;  
39 - line-height: 15px;  
40 - *line-height: 18px  
41 -}  
42 -  
43 -a.maplibTcView:hover {  
44 - color: #C6DDD3;  
45 -}  
46 -  
47 -a.maplibTcView:focus {  
48 - color: #26c281;  
49 -}  
50 -  
51 -.maplibTcCurTime {  
52 - float: left;  
53 - color: #ddd;  
54 -}  
55 -  
56 -.maplibTcTime {  
57 - height: 20px;  
58 - padding: 5px 3px 0 0;  
59 -}  
60 -  
61 -.maplibTcWeekDay {  
62 - height: 22px;  
63 - color: #6688CA;  
64 - padding: 3px 0;  
65 -}  
66 -  
67 -.maplibTcWeekDay a {  
68 - color: #6688CA;  
69 - padding: 3px 2px;  
70 -}  
71 -  
72 -.maplibTcWeekDay ul {  
73 - float: left;  
74 - margin: 0;  
75 - padding: 0;  
76 -}  
77 -  
78 -.maplibTcWeekDay span {  
79 - float: left;  
80 - line-height: 23px;  
81 -}  
82 -  
83 -.maplibTcWeekDay li {  
84 - float: left;  
85 - padding: 0 6px;  
86 - list-style: none;  
87 - line-height: 23px;  
88 -}  
89 -  
90 -.maplibTcRule {  
91 - background: url("../img/bar.png") no-repeat scroll 0 10px transparent;  
92 - width: 195px;  
93 - float: left;  
94 - margin-left: 20px;  
95 - *margin-left: 10px;  
96 -}  
97 -  
98 -.maplibTcRuleTxt {  
99 - float: left;  
100 - line-height: 44px;  
101 -}  
102 -  
103 -.maplibTcClear {  
104 - clear: both;  
105 -}  
106 -  
107 -.maplibTcTimeBox {  
108 - color: #6688CA;  
109 - margin-left: 137.5px;  
110 - font-size: 11px;  
111 - overflow: hidden;  
112 -}  
113 -  
114 -.maplibTcTimeline {  
115 - height: 34px;  
116 -}  
117 -  
118 -.maplibTcTimelinePrev {  
119 - overflow: hidden;  
120 - width: 9px;  
121 - height: 9px;  
122 - cursor: pointer;  
123 - float: left;  
124 - margin-top: 3px  
125 -}  
126 -  
127 -.maplibTcTimelineNext {  
128 - overflow: hidden;  
129 - width: 11px;  
130 - *width: 10px;  
131 - height: 9px;  
132 - cursor: pointer;  
133 - float: right;  
134 - margin-top: 3px  
135 -}  
136 -  
137 -.maplibTcTimeMove {  
138 - width: 9px;  
139 - height: 18px;  
140 - background: url("../img/tools_menu.png") no-repeat scroll 0pt -32px  
141 - transparent;  
142 - float: left;  
143 - cursor: pointer;  
144 - margin-left: 137.5px;  
145 - margin-top: 0px;  
146 -}  
147 -  
148 -.maplibTcHide {  
149 - display: none;  
150 -}  
151 -  
152 -.maplibTcBtn_deskTop {  
153 - background: url(http://api.map.baidu.com/images/bgs.gif) no-repeat  
154 - scroll 0px -271px transparent;  
155 - cursor: pointer;  
156 - height: 22px;  
157 - width: 73px;  
158 - z-index: 10;  
159 - position: absolute;  
160 -}  
161 -  
162 -.maplibTcBtn_mobile {  
163 - background: url(http://api.map.baidu.com/images/traffic_bgs.png)  
164 - rgba(255, 255, 255, 0.8) no-repeat scroll -30px 0px;  
165 - border: 1px solid #AFAFAF;  
166 - background-size: 60px 30px;  
167 - cursor: pointer;  
168 - height: 30px;  
169 - width: 30px;  
170 - z-index: 10;  
171 - position: absolute;  
172 -}  
173 -  
174 -.maplibTcBtn_deskTop {  
175 - background-position: 0px -249px  
176 -}  
177 -  
178 -.maplibTcBtnOff_mobile {  
179 - background-position: 0px 0px;  
180 -}  
181 -  
182 -.maplibTcColon {  
183 - float: left;  
184 -}  
185 -  
186 -.maplibTcOn {  
187 - background: #E6EFF8;  
188 -}  
189 -  
190 -.maplibTcClose {  
191 - background: url("../img/tools_menu.png") no-repeat scroll 2px -19px  
192 - transparent;  
193 - border: 0 none;  
194 - cursor: pointer;  
195 - height: 12px;  
196 - position: absolute;  
197 - right: 7px;  
198 - top: 9px;  
199 - width: 15px;  
200 -}  
201 -  
202 -/*s--------------交通流量-----------------*/  
203 -.maplibTfctr {  
204 - min-width: 9em;  
205 - height: 2.2em;  
206 - display: -webkit-box;  
207 - -webkit-box-align: center;  
208 - -webkit-border-radius: 0.3em;  
209 - border: .1em solid #989898;  
210 - -webkit-box-sizing: border-box;  
211 - background-color: #fff;  
212 - font-size: 14px;  
213 -}  
214 -  
215 -.maplibTfctrHide {  
216 - display: none;  
217 -}  
218 -  
219 -.maplibTfctr_c {  
220 - -webkit-box-flex: 1;  
221 -}  
222 -  
223 -.maplibTfctr_status {  
224 - width: 4em;  
225 - margin-right: .45em;  
226 -}  
227 -  
228 -.maplibTfctr_status span {  
229 - display: inline-block;  
230 - margin-left: .3em;  
231 - font-size: 14px;  
232 -}  
233 -  
234 -.maplibTfctr div,.maplibTfctr span {  
235 - -webkit-box-sizing: border-box;  
236 -}  
237 -  
238 -.maplibTfctr_l {  
239 - margin: 0 .15em;  
240 -}  
241 -  
242 -.maplibY {  
243 - background: #ffae00;  
244 -}  
245 -  
246 -.maplibR {  
247 - background: #ff0000;  
248 -}  
249 -  
250 -.maplibG {  
251 - background: #1fba00;  
252 -} 1 +.maplibTc {
  2 + font-size: 12px;
  3 + width: 253px;
  4 + padding: 8px 5px 8px 8px;
  5 + background: #3B3F51;
  6 + position: absolute;
  7 + color: white;
  8 + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0
  9 + rgba(0, 0, 0, 0.19);
  10 + top: 63px;
  11 +}
  12 +
  13 +.maplibTc a {
  14 + text-decoration: none;
  15 +}
  16 +
  17 +.maplibTcColor {
  18 + background: url("../img/tools_menu.png") no-repeat scroll 128px -86px
  19 + transparent;
  20 + font-weight: bold;
  21 + margin-bottom: 9px;
  22 + height: 18px;
  23 +}
  24 +
  25 +.maplibTcUpdate {
  26 + float: left;
  27 + width: 13px;
  28 + height: 14px;
  29 + background: url(../img/tools_menu.png) no-repeat -12px -19px;
  30 + margin-left: 5px;
  31 + cursor: pointer;
  32 + margin-top: 2px;
  33 +}
  34 +
  35 +.maplibTcView {
  36 + float: right;
  37 + color: #26c281;
  38 + text-decoration: none;
  39 + line-height: 15px;
  40 + *line-height: 18px
  41 +}
  42 +
  43 +a.maplibTcView:hover {
  44 + color: #C6DDD3;
  45 +}
  46 +
  47 +a.maplibTcView:focus {
  48 + color: #26c281;
  49 +}
  50 +
  51 +.maplibTcCurTime {
  52 + float: left;
  53 + color: #ddd;
  54 +}
  55 +
  56 +.maplibTcTime {
  57 + height: 20px;
  58 + padding: 5px 3px 0 0;
  59 +}
  60 +
  61 +.maplibTcWeekDay {
  62 + height: 22px;
  63 + color: #6688CA;
  64 + padding: 3px 0;
  65 +}
  66 +
  67 +.maplibTcWeekDay a {
  68 + color: #6688CA;
  69 + padding: 3px 2px;
  70 +}
  71 +
  72 +.maplibTcWeekDay ul {
  73 + float: left;
  74 + margin: 0;
  75 + padding: 0;
  76 +}
  77 +
  78 +.maplibTcWeekDay span {
  79 + float: left;
  80 + line-height: 23px;
  81 +}
  82 +
  83 +.maplibTcWeekDay li {
  84 + float: left;
  85 + padding: 0 6px;
  86 + list-style: none;
  87 + line-height: 23px;
  88 +}
  89 +
  90 +.maplibTcRule {
  91 + background: url("../img/bar.png") no-repeat scroll 0 10px transparent;
  92 + width: 195px;
  93 + float: left;
  94 + margin-left: 20px;
  95 + *margin-left: 10px;
  96 +}
  97 +
  98 +.maplibTcRuleTxt {
  99 + float: left;
  100 + line-height: 44px;
  101 +}
  102 +
  103 +.maplibTcClear {
  104 + clear: both;
  105 +}
  106 +
  107 +.maplibTcTimeBox {
  108 + color: #6688CA;
  109 + margin-left: 137.5px;
  110 + font-size: 11px;
  111 + overflow: hidden;
  112 +}
  113 +
  114 +.maplibTcTimeline {
  115 + height: 34px;
  116 +}
  117 +
  118 +.maplibTcTimelinePrev {
  119 + overflow: hidden;
  120 + width: 9px;
  121 + height: 9px;
  122 + cursor: pointer;
  123 + float: left;
  124 + margin-top: 3px
  125 +}
  126 +
  127 +.maplibTcTimelineNext {
  128 + overflow: hidden;
  129 + width: 11px;
  130 + *width: 10px;
  131 + height: 9px;
  132 + cursor: pointer;
  133 + float: right;
  134 + margin-top: 3px
  135 +}
  136 +
  137 +.maplibTcTimeMove {
  138 + width: 9px;
  139 + height: 18px;
  140 + background: url("../img/tools_menu.png") no-repeat scroll 0pt -32px
  141 + transparent;
  142 + float: left;
  143 + cursor: pointer;
  144 + margin-left: 137.5px;
  145 + margin-top: 0px;
  146 +}
  147 +
  148 +.maplibTcHide {
  149 + display: none;
  150 +}
  151 +
  152 +.maplibTcBtn_deskTop {
  153 + background: url(//api.map.baidu.com/images/bgs.gif) no-repeat
  154 + scroll 0px -271px transparent;
  155 + cursor: pointer;
  156 + height: 22px;
  157 + width: 73px;
  158 + z-index: 10;
  159 + position: absolute;
  160 +}
  161 +
  162 +.maplibTcBtn_mobile {
  163 + background: url(//api.map.baidu.com/images/traffic_bgs.png)
  164 + rgba(255, 255, 255, 0.8) no-repeat scroll -30px 0px;
  165 + border: 1px solid #AFAFAF;
  166 + background-size: 60px 30px;
  167 + cursor: pointer;
  168 + height: 30px;
  169 + width: 30px;
  170 + z-index: 10;
  171 + position: absolute;
  172 +}
  173 +
  174 +.maplibTcBtn_deskTop {
  175 + background-position: 0px -249px
  176 +}
  177 +
  178 +.maplibTcBtnOff_mobile {
  179 + background-position: 0px 0px;
  180 +}
  181 +
  182 +.maplibTcColon {
  183 + float: left;
  184 +}
  185 +
  186 +.maplibTcOn {
  187 + background: #E6EFF8;
  188 +}
  189 +
  190 +.maplibTcClose {
  191 + background: url("../img/tools_menu.png") no-repeat scroll 2px -19px
  192 + transparent;
  193 + border: 0 none;
  194 + cursor: pointer;
  195 + height: 12px;
  196 + position: absolute;
  197 + right: 7px;
  198 + top: 9px;
  199 + width: 15px;
  200 +}
  201 +
  202 +/*s--------------交通流量-----------------*/
  203 +.maplibTfctr {
  204 + min-width: 9em;
  205 + height: 2.2em;
  206 + display: -webkit-box;
  207 + -webkit-box-align: center;
  208 + -webkit-border-radius: 0.3em;
  209 + border: .1em solid #989898;
  210 + -webkit-box-sizing: border-box;
  211 + background-color: #fff;
  212 + font-size: 14px;
  213 +}
  214 +
  215 +.maplibTfctrHide {
  216 + display: none;
  217 +}
  218 +
  219 +.maplibTfctr_c {
  220 + -webkit-box-flex: 1;
  221 +}
  222 +
  223 +.maplibTfctr_status {
  224 + width: 4em;
  225 + margin-right: .45em;
  226 +}
  227 +
  228 +.maplibTfctr_status span {
  229 + display: inline-block;
  230 + margin-left: .3em;
  231 + font-size: 14px;
  232 +}
  233 +
  234 +.maplibTfctr div,.maplibTfctr span {
  235 + -webkit-box-sizing: border-box;
  236 +}
  237 +
  238 +.maplibTfctr_l {
  239 + margin: 0 .15em;
  240 +}
  241 +
  242 +.maplibY {
  243 + background: #ffae00;
  244 +}
  245 +
  246 +.maplibR {
  247 + background: #ff0000;
  248 +}
  249 +
  250 +.maplibG {
  251 + background: #1fba00;
  252 +}
253 /*e--------------交通流量-----------------*/ 253 /*e--------------交通流量-----------------*/
254 \ No newline at end of file 254 \ No newline at end of file
src/main/resources/static/assets/js/baidu/TextIconOverlay.js
1 -/**  
2 - * @fileoverview 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。  
3 - * 主入口类是<a href="symbols/BMapLib.TextIconOverlay.html">TextIconOverlay</a>,  
4 - * 基于Baidu Map API 1.2。  
5 - *  
6 - * @author Baidu Map Api Group  
7 - * @version 1.2  
8 - */  
9 -  
10 -  
11 - /**  
12 - * @namespace BMap的所有library类均放在BMapLib命名空间下  
13 - */  
14 -var BMapLib = window.BMapLib = BMapLib || {};  
15 -  
16 -(function () {  
17 -  
18 - /**  
19 - * 声明baidu包  
20 - */  
21 - var T,  
22 - baidu = T = baidu || {version: "1.3.8"};  
23 -  
24 - (function (){  
25 - //提出guid,防止在与老版本Tangram混用时  
26 - //在下一行错误的修改window[undefined]  
27 - baidu.guid = "$BAIDU$";  
28 -  
29 - //Tangram可能被放在闭包中  
30 - //一些页面级别唯一的属性,需要挂载在window[baidu.guid]上  
31 - window[baidu.guid] = window[baidu.guid] || {};  
32 -  
33 - /**  
34 - * @ignore  
35 - * @namespace baidu.dom 操作dom的方法。  
36 - */  
37 - baidu.dom = baidu.dom || {};  
38 -  
39 -  
40 - /**  
41 - * 从文档中获取指定的DOM元素  
42 - * @name baidu.dom.g  
43 - * @function  
44 - * @grammar baidu.dom.g(id)  
45 - * @param {string|HTMLElement} id 元素的id或DOM元素  
46 - * @shortcut g,T.G  
47 - * @meta standard  
48 - * @see baidu.dom.q  
49 - *  
50 - * @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数  
51 - */  
52 - baidu.dom.g = function (id) {  
53 - if ('string' == typeof id || id instanceof String) {  
54 - return document.getElementById(id);  
55 - } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {  
56 - return id;  
57 - }  
58 - return null;  
59 - };  
60 -  
61 - // 声明快捷方法  
62 - baidu.g = baidu.G = baidu.dom.g;  
63 -  
64 - /**  
65 - * 获取目标元素所属的document对象  
66 - * @name baidu.dom.getDocument  
67 - * @function  
68 - * @grammar baidu.dom.getDocument(element)  
69 - * @param {HTMLElement|string} element 目标元素或目标元素的id  
70 - * @meta standard  
71 - * @see baidu.dom.getWindow  
72 - *  
73 - * @returns {HTMLDocument} 目标元素所属的document对象  
74 - */  
75 - baidu.dom.getDocument = function (element) {  
76 - element = baidu.dom.g(element);  
77 - return element.nodeType == 9 ? element : element.ownerDocument || element.document;  
78 - };  
79 -  
80 - /**  
81 - * @ignore  
82 - * @namespace baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。  
83 - */  
84 - baidu.lang = baidu.lang || {};  
85 -  
86 - /**  
87 - * 判断目标参数是否string类型或String对象  
88 - * @name baidu.lang.isString  
89 - * @function  
90 - * @grammar baidu.lang.isString(source)  
91 - * @param {Any} source 目标参数  
92 - * @shortcut isString  
93 - * @meta standard  
94 - * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate  
95 - *  
96 - * @returns {boolean} 类型判断结果  
97 - */  
98 - baidu.lang.isString = function (source) {  
99 - return '[object String]' == Object.prototype.toString.call(source);  
100 - };  
101 -  
102 - // 声明快捷方法  
103 - baidu.isString = baidu.lang.isString;  
104 -  
105 - /**  
106 - * 从文档中获取指定的DOM元素  
107 - * **内部方法**  
108 - *  
109 - * @param {string|HTMLElement} id 元素的id或DOM元素  
110 - * @meta standard  
111 - * @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数  
112 - */  
113 - baidu.dom._g = function (id) {  
114 - if (baidu.lang.isString(id)) {  
115 - return document.getElementById(id);  
116 - }  
117 - return id;  
118 - };  
119 -  
120 - // 声明快捷方法  
121 - baidu._g = baidu.dom._g;  
122 -  
123 - /**  
124 - * @ignore  
125 - * @namespace baidu.browser 判断浏览器类型和特性的属性。  
126 - */  
127 - baidu.browser = baidu.browser || {};  
128 -  
129 - if (/msie (\d+\.\d)/i.test(navigator.userAgent)) {  
130 - //IE 8下,以documentMode为准  
131 - //在百度模板中,可能会有$,防止冲突,将$1 写成 \x241  
132 - /**  
133 - * 判断是否为ie浏览器  
134 - * @property ie ie版本号  
135 - * @grammar baidu.browser.ie  
136 - * @meta standard  
137 - * @shortcut ie  
138 - * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon  
139 - */  
140 - baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\x241'];  
141 - }  
142 -  
143 - /**  
144 - * 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE)  
145 - *  
146 - * @author berg  
147 - * @name baidu.dom.getComputedStyle  
148 - * @function  
149 - * @grammar baidu.dom.getComputedStyle(element, key)  
150 - * @param {HTMLElement|string} element 目标元素或目标元素的id  
151 - * @param {string} key 要获取的样式名  
152 - *  
153 - * @see baidu.dom.getStyle  
154 - *  
155 - * @returns {string} 目标元素的computed style值  
156 - */  
157 -  
158 - baidu.dom.getComputedStyle = function(element, key){  
159 - element = baidu.dom._g(element);  
160 - var doc = baidu.dom.getDocument(element),  
161 - styles;  
162 - if (doc.defaultView && doc.defaultView.getComputedStyle) {  
163 - styles = doc.defaultView.getComputedStyle(element, null);  
164 - if (styles) {  
165 - return styles[key] || styles.getPropertyValue(key);  
166 - }  
167 - }  
168 - return '';  
169 - };  
170 -  
171 - /**  
172 - * 提供给setStyle与getStyle使用  
173 - */  
174 - baidu.dom._styleFixer = baidu.dom._styleFixer || {};  
175 -  
176 - /**  
177 - * 提供给setStyle与getStyle使用  
178 - */  
179 - baidu.dom._styleFilter = baidu.dom._styleFilter || [];  
180 -  
181 - /**  
182 - * 为获取和设置样式的过滤器  
183 - * @private  
184 - * @meta standard  
185 - */  
186 - baidu.dom._styleFilter.filter = function (key, value, method) {  
187 - for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) {  
188 - if (filter = filter[method]) {  
189 - value = filter(key, value);  
190 - }  
191 - }  
192 - return value;  
193 - };  
194 -  
195 - /**  
196 - * @ignore  
197 - * @namespace baidu.string 操作字符串的方法。  
198 - */  
199 - baidu.string = baidu.string || {};  
200 -  
201 - /**  
202 - * 将目标字符串进行驼峰化处理  
203 - * @name baidu.string.toCamelCase  
204 - * @function  
205 - * @grammar baidu.string.toCamelCase(source)  
206 - * @param {string} source 目标字符串  
207 - * @remark  
208 - * 支持单词以“-_”分隔  
209 - * @meta standard  
210 - *  
211 - * @returns {string} 驼峰化处理后的字符串  
212 - */  
213 - baidu.string.toCamelCase = function (source) {  
214 - //提前判断,提高getStyle等的效率 thanks xianwei  
215 - if (source.indexOf('-') < 0 && source.indexOf('_') < 0) {  
216 - return source;  
217 - }  
218 - return source.replace(/[-_][^-_]/g, function (match) {  
219 - return match.charAt(1).toUpperCase();  
220 - });  
221 - };  
222 -  
223 - /**  
224 - * 获取目标元素的样式值  
225 - * @name baidu.dom.getStyle  
226 - * @function  
227 - * @grammar baidu.dom.getStyle(element, key)  
228 - * @param {HTMLElement|string} element 目标元素或目标元素的id  
229 - * @param {string} key 要获取的样式名  
230 - * @remark  
231 - *  
232 - * 为了精简代码,本模块默认不对任何浏览器返回值进行归一化处理(如使用getStyle时,不同浏览器下可能返回rgb颜色或hex颜色),也不会修复浏览器的bug和差异性(如设置IE的float属性叫styleFloat,firefox则是cssFloat)。<br />  
233 - * baidu.dom._styleFixer和baidu.dom._styleFilter可以为本模块提供支持。<br />  
234 - * 其中_styleFilter能对颜色和px进行归一化处理,_styleFixer能对display,float,opacity,textOverflow的浏览器兼容性bug进行处理。  
235 - * @shortcut getStyle  
236 - * @meta standard  
237 - * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle  
238 - *  
239 - * @returns {string} 目标元素的样式值  
240 - */  
241 - baidu.dom.getStyle = function (element, key) {  
242 - var dom = baidu.dom;  
243 -  
244 - element = dom.g(element);  
245 - key = baidu.string.toCamelCase(key);  
246 - //computed style, then cascaded style, then explicitly set style.  
247 - var value = element.style[key] ||  
248 - (element.currentStyle ? element.currentStyle[key] : "") ||  
249 - dom.getComputedStyle(element, key);  
250 -  
251 - // 在取不到值的时候,用fixer进行修正  
252 - if (!value) {  
253 - var fixer = dom._styleFixer[key];  
254 - if(fixer){  
255 - value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer);  
256 - }  
257 - }  
258 -  
259 - /* 检查结果过滤器 */  
260 - if (fixer = dom._styleFilter) {  
261 - value = fixer.filter(key, value, 'get');  
262 - }  
263 -  
264 - return value;  
265 - };  
266 -  
267 - // 声明快捷方法  
268 - baidu.getStyle = baidu.dom.getStyle;  
269 -  
270 -  
271 - if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) {  
272 - /**  
273 - * 判断是否为opera浏览器  
274 - * @property opera opera版本号  
275 - * @grammar baidu.browser.opera  
276 - * @meta standard  
277 - * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome  
278 - */  
279 - baidu.browser.opera = + RegExp['\x241'];  
280 - }  
281 -  
282 - /**  
283 - * 判断是否为webkit内核  
284 - * @property isWebkit  
285 - * @grammar baidu.browser.isWebkit  
286 - * @meta standard  
287 - * @see baidu.browser.isGecko  
288 - */  
289 - baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent);  
290 -  
291 - /**  
292 - * 判断是否为gecko内核  
293 - * @property isGecko  
294 - * @grammar baidu.browser.isGecko  
295 - * @meta standard  
296 - * @see baidu.browser.isWebkit  
297 - */  
298 - baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent);  
299 -  
300 - /**  
301 - * 判断是否严格标准的渲染模式  
302 - * @property isStrict  
303 - * @grammar baidu.browser.isStrict  
304 - * @meta standard  
305 - */  
306 - baidu.browser.isStrict = document.compatMode == "CSS1Compat";  
307 -  
308 - /**  
309 - * 获取目标元素相对于整个文档左上角的位置  
310 - * @name baidu.dom.getPosition  
311 - * @function  
312 - * @grammar baidu.dom.getPosition(element)  
313 - * @param {HTMLElement|string} element 目标元素或目标元素的id  
314 - * @meta standard  
315 - *  
316 - * @returns {Object} 目标元素的位置,键值为top和left的Object。  
317 - */  
318 - baidu.dom.getPosition = function (element) {  
319 - element = baidu.dom.g(element);  
320 - var doc = baidu.dom.getDocument(element),  
321 - browser = baidu.browser,  
322 - getStyle = baidu.dom.getStyle,  
323 - // Gecko 1.9版本以下用getBoxObjectFor计算位置  
324 - // 但是某些情况下是有bug的  
325 - // 对于这些有bug的情况  
326 - // 使用递归查找的方式  
327 - BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 &&  
328 - doc.getBoxObjectFor &&  
329 - getStyle(element, 'position') == 'absolute' &&  
330 - (element.style.top === '' || element.style.left === ''),  
331 - pos = {"left":0,"top":0},  
332 - viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement,  
333 - parent,  
334 - box;  
335 -  
336 - if(element == viewport){  
337 - return pos;  
338 - }  
339 -  
340 - if(element.getBoundingClientRect){ // IE and Gecko 1.9+  
341 -  
342 - //当HTML或者BODY有border width时, 原生的getBoundingClientRect返回值是不符合预期的  
343 - //考虑到通常情况下 HTML和BODY的border只会设成0px,所以忽略该问题.  
344 - box = element.getBoundingClientRect();  
345 -  
346 - pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);  
347 - pos.top = Math.floor(box.top) + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);  
348 -  
349 - // IE会给HTML元素添加一个border,默认是medium(2px)  
350 - // 但是在IE 6 7 的怪异模式下,可以被html { border: 0; } 这条css规则覆盖  
351 - // 在IE7的标准模式下,border永远是2px,这个值通过clientLeft 和 clientTop取得  
352 - // 但是。。。在IE 6 7的怪异模式,如果用户使用css覆盖了默认的medium  
353 - // clientTop和clientLeft不会更新  
354 - pos.left -= doc.documentElement.clientLeft;  
355 - pos.top -= doc.documentElement.clientTop;  
356 -  
357 - var htmlDom = doc.body,  
358 - // 在这里,不使用element.style.borderLeftWidth,只有computedStyle是可信的  
359 - htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')),  
360 - htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth'));  
361 - if(browser.ie && !browser.isStrict){  
362 - pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth;  
363 - pos.top -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth;  
364 - }  
365 - } else {  
366 - // safari/opera/firefox  
367 - parent = element;  
368 -  
369 - do {  
370 - pos.left += parent.offsetLeft;  
371 - pos.top += parent.offsetTop;  
372 -  
373 - // safari里面,如果遍历到了一个fixed的元素,后面的offset都不准了  
374 - if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') {  
375 - pos.left += doc.body.scrollLeft;  
376 - pos.top += doc.body.scrollTop;  
377 - break;  
378 - }  
379 -  
380 - parent = parent.offsetParent;  
381 - } while (parent && parent != element);  
382 -  
383 - // 对body offsetTop的修正  
384 - if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){  
385 - pos.top -= doc.body.offsetTop;  
386 - }  
387 -  
388 - // 计算除了body的scroll  
389 - parent = element.offsetParent;  
390 - while (parent && parent != doc.body) {  
391 - pos.left -= parent.scrollLeft;  
392 - // see https://bugs.opera.com/show_bug.cgi?id=249965  
393 - if (!browser.opera || parent.tagName != 'TR') {  
394 - pos.top -= parent.scrollTop;  
395 - }  
396 - parent = parent.offsetParent;  
397 - }  
398 - }  
399 -  
400 - return pos;  
401 - };  
402 -  
403 - /**  
404 - * @ignore  
405 - * @namespace baidu.event 屏蔽浏览器差异性的事件封装。  
406 - * @property target 事件的触发元素  
407 - * @property pageX 鼠标事件的鼠标x坐标  
408 - * @property pageY 鼠标事件的鼠标y坐标  
409 - * @property keyCode 键盘事件的键值  
410 - */  
411 - baidu.event = baidu.event || {};  
412 -  
413 - /**  
414 - * 事件监听器的存储表  
415 - * @private  
416 - * @meta standard  
417 - */  
418 - baidu.event._listeners = baidu.event._listeners || [];  
419 -  
420 - /**  
421 - * 为目标元素添加事件监听器  
422 - * @name baidu.event.on  
423 - * @function  
424 - * @grammar baidu.event.on(element, type, listener)  
425 - * @param {HTMLElement|string|window} element 目标元素或目标元素id  
426 - * @param {string} type 事件类型  
427 - * @param {Function} listener 需要添加的监听器  
428 - * @remark  
429 - *  
430 - 1. 不支持跨浏览器的鼠标滚轮事件监听器添加<br>  
431 - 2. 改方法不为监听器灌入事件对象,以防止跨iframe事件挂载的事件对象获取失败  
432 -  
433 - * @shortcut on  
434 - * @meta standard  
435 - * @see baidu.event.un  
436 - *  
437 - * @returns {HTMLElement|window} 目标元素  
438 - */  
439 - baidu.event.on = function (element, type, listener) {  
440 - type = type.replace(/^on/i, '');  
441 - element = baidu.dom._g(element);  
442 -  
443 - var realListener = function (ev) {  
444 - // 1. 这里不支持EventArgument, 原因是跨frame的事件挂载  
445 - // 2. element是为了修正this  
446 - listener.call(element, ev);  
447 - },  
448 - lis = baidu.event._listeners,  
449 - filter = baidu.event._eventFilter,  
450 - afterFilter,  
451 - realType = type;  
452 - type = type.toLowerCase();  
453 - // filter过滤  
454 - if(filter && filter[type]){  
455 - afterFilter = filter[type](element, type, realListener);  
456 - realType = afterFilter.type;  
457 - realListener = afterFilter.listener;  
458 - }  
459 -  
460 - // 事件监听器挂载  
461 - if (element.addEventListener) {  
462 - element.addEventListener(realType, realListener, false);  
463 - } else if (element.attachEvent) {  
464 - element.attachEvent('on' + realType, realListener);  
465 - }  
466 -  
467 - // 将监听器存储到数组中  
468 - lis[lis.length] = [element, type, listener, realListener, realType];  
469 - return element;  
470 - };  
471 -  
472 - // 声明快捷方法  
473 - baidu.on = baidu.event.on;  
474 -  
475 - /**  
476 - * 返回一个当前页面的唯一标识字符串。  
477 - * @name baidu.lang.guid  
478 - * @function  
479 - * @grammar baidu.lang.guid()  
480 - * @version 1.1.1  
481 - * @meta standard  
482 - *  
483 - * @returns {String} 当前页面的唯一标识字符串  
484 - */  
485 -  
486 - (function(){  
487 - //不直接使用window,可以提高3倍左右性能  
488 - var guid = window[baidu.guid];  
489 -  
490 - baidu.lang.guid = function() {  
491 - return "TANGRAM__" + (guid._counter ++).toString(36);  
492 - };  
493 -  
494 - guid._counter = guid._counter || 1;  
495 - })();  
496 -  
497 - /**  
498 - * 所有类的实例的容器  
499 - * key为每个实例的guid  
500 - * @meta standard  
501 - */  
502 -  
503 - window[baidu.guid]._instances = window[baidu.guid]._instances || {};  
504 -  
505 - /**  
506 - * 判断目标参数是否为function或Function实例  
507 - * @name baidu.lang.isFunction  
508 - * @function  
509 - * @grammar baidu.lang.isFunction(source)  
510 - * @param {Any} source 目标参数  
511 - * @version 1.2  
512 - * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate  
513 - * @meta standard  
514 - * @returns {boolean} 类型判断结果  
515 - */  
516 - baidu.lang.isFunction = function (source) {  
517 - // chrome下,'function' == typeof /a/ 为true.  
518 - return '[object Function]' == Object.prototype.toString.call(source);  
519 - };  
520 -  
521 - /**  
522 - *  
523 - * @ignore  
524 - * @class Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。  
525 - * @name baidu.lang.Class  
526 - * @grammar baidu.lang.Class(guid)  
527 - * @param {string} guid 对象的唯一标识  
528 - * @meta standard  
529 - * @remark baidu.lang.Class和它的子类的实例均包含一个全局唯一的标识guid。guid是在构造函数中生成的,因此,继承自baidu.lang.Class的类应该直接或者间接调用它的构造函数。<br>baidu.lang.Class的构造函数中产生guid的方式可以保证guid的唯一性,及每个实例都有一个全局唯一的guid。  
530 - * @meta standard  
531 - * @see baidu.lang.inherits,baidu.lang.Event  
532 - */  
533 - baidu.lang.Class = function(guid) {  
534 - this.guid = guid || baidu.lang.guid();  
535 - window[baidu.guid]._instances[this.guid] = this;  
536 - };  
537 - window[baidu.guid]._instances = window[baidu.guid]._instances || {};  
538 -  
539 - /**  
540 - * 释放对象所持有的资源,主要是自定义事件。  
541 - * @name dispose  
542 - * @grammar obj.dispose()  
543 - */  
544 - baidu.lang.Class.prototype.dispose = function(){  
545 - delete window[baidu.guid]._instances[this.guid];  
546 -  
547 - for(var property in this){  
548 - if (!baidu.lang.isFunction(this[property])) {  
549 - delete this[property];  
550 - }  
551 - }  
552 - this.disposed = true;  
553 - };  
554 -  
555 - /**  
556 - * 重载了默认的toString方法,使得返回信息更加准确一些。  
557 - * @return {string} 对象的String表示形式  
558 - */  
559 - baidu.lang.Class.prototype.toString = function(){  
560 - return "[object " + (this._className || "Object" ) + "]";  
561 - };  
562 -  
563 - /**  
564 - * @ignore  
565 - * @class 自定义的事件对象。  
566 - * @name baidu.lang.Event  
567 - * @grammar baidu.lang.Event(type[, target])  
568 - * @param {string} type 事件类型名称。为了方便区分事件和一个普通的方法,事件类型名称必须以"on"(小写)开头。  
569 - * @param {Object} [target]触发事件的对象  
570 - * @meta standard  
571 - * @remark 引入该模块,会自动为Class引入3个事件扩展方法:addEventListener、removeEventListener和dispatchEvent。  
572 - * @meta standard  
573 - * @see baidu.lang.Class  
574 - */  
575 - baidu.lang.Event = function (type, target) {  
576 - this.type = type;  
577 - this.returnValue = true;  
578 - this.target = target || null;  
579 - this.currentTarget = null;  
580 - };  
581 -  
582 - /**  
583 - * 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。  
584 - * @grammar obj.addEventListener(type, handlers[, key])  
585 - * @param {string} type 自定义事件的名称  
586 - * @param {Function} handler 自定义事件被触发时应该调用的回调函数  
587 - * @param {string} [key] 为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。  
588 - * @remark 事件类型区分大小写。如果自定义事件名称不是以小写"on"开头,该方法会给它加上"on"再进行判断,即"click"和"onclick"会被认为是同一种事件。  
589 - */  
590 - baidu.lang.Class.prototype.addEventListener = function (type, handler, key) {  
591 - if (!baidu.lang.isFunction(handler)) {  
592 - return;  
593 - }  
594 -  
595 - !this.__listeners && (this.__listeners = {});  
596 -  
597 - var t = this.__listeners, id;  
598 - if (typeof key == "string" && key) {  
599 - if (/[^\w\-]/.test(key)) {  
600 - throw("nonstandard key:" + key);  
601 - } else {  
602 - handler.hashCode = key;  
603 - id = key;  
604 - }  
605 - }  
606 - type.indexOf("on") != 0 && (type = "on" + type);  
607 -  
608 - typeof t[type] != "object" && (t[type] = {});  
609 - id = id || baidu.lang.guid();  
610 - handler.hashCode = id;  
611 - t[type][id] = handler;  
612 - };  
613 -  
614 - /**  
615 - * 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。  
616 - * @grammar obj.removeEventListener(type, handlers)  
617 - * @param {string} type 事件类型  
618 - * @param {Function|string} handler 要移除的事件监听函数或者监听函数的key  
619 - * @remark 如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。  
620 - */  
621 - baidu.lang.Class.prototype.removeEventListener = function (type, handler) {  
622 - if (typeof handler != "undefined") {  
623 - if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode))  
624 - || (! baidu.lang.isString(handler))  
625 - ){  
626 - return;  
627 - }  
628 - }  
629 -  
630 - !this.__listeners && (this.__listeners = {});  
631 -  
632 - type.indexOf("on") != 0 && (type = "on" + type);  
633 -  
634 - var t = this.__listeners;  
635 - if (!t[type]) {  
636 - return;  
637 - }  
638 - if (typeof handler != "undefined") {  
639 - t[type][handler] && delete t[type][handler];  
640 - } else {  
641 - for(var guid in t[type]){  
642 - delete t[type][guid];  
643 - }  
644 - }  
645 - };  
646 -  
647 - /**  
648 - * 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。  
649 - * @grammar obj.dispatchEvent(event, options)  
650 - * @param {baidu.lang.Event|String} event Event对象,或事件名称(1.1.1起支持)  
651 - * @param {Object} options 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持)  
652 - * @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。例如:<br>  
653 - myobj.onMyEvent = function(){}<br>  
654 - myobj.addEventListener("onMyEvent", function(){});  
655 - */  
656 - baidu.lang.Class.prototype.dispatchEvent = function (event, options) {  
657 - if (baidu.lang.isString(event)) {  
658 - event = new baidu.lang.Event(event);  
659 - }  
660 - !this.__listeners && (this.__listeners = {});  
661 -  
662 - // 20100603 添加本方法的第二个参数,将 options extend到event中去传递  
663 - options = options || {};  
664 - for (var i in options) {  
665 - event[i] = options[i];  
666 - }  
667 -  
668 - var i, t = this.__listeners, p = event.type;  
669 - event.target = event.target || this;  
670 - event.currentTarget = this;  
671 -  
672 - p.indexOf("on") != 0 && (p = "on" + p);  
673 -  
674 - baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments);  
675 -  
676 - if (typeof t[p] == "object") {  
677 - for (i in t[p]) {  
678 - t[p][i].apply(this, arguments);  
679 - }  
680 - }  
681 - return event.returnValue;  
682 - };  
683 -  
684 -  
685 - baidu.lang.inherits = function (subClass, superClass, className) {  
686 - var key, proto,  
687 - selfProps = subClass.prototype,  
688 - clazz = new Function();  
689 -  
690 - clazz.prototype = superClass.prototype;  
691 - proto = subClass.prototype = new clazz();  
692 - for (key in selfProps) {  
693 - proto[key] = selfProps[key];  
694 - }  
695 - subClass.prototype.constructor = subClass;  
696 - subClass.superClass = superClass.prototype;  
697 -  
698 - // 类名标识,兼容Class的toString,基本没用  
699 - if ("string" == typeof className) {  
700 - proto._className = className;  
701 - }  
702 - };  
703 - // 声明快捷方法  
704 - baidu.inherits = baidu.lang.inherits;  
705 - })();  
706 -  
707 -  
708 - /**  
709 -  
710 - * 图片的路径  
711 -  
712 - * @private  
713 - * @type {String}  
714 -  
715 - */  
716 - var _IMAGE_PATH = 'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m';  
717 -  
718 - /**  
719 -  
720 - * 图片的后缀名  
721 -  
722 - * @private  
723 - * @type {String}  
724 -  
725 - */  
726 - var _IMAGE_EXTENSION = 'png';  
727 -  
728 - /**  
729 - *@exports TextIconOverlay as BMapLib.TextIconOverlay  
730 - */  
731 - var TextIconOverlay =  
732 - /**  
733 - * TextIconOverlay  
734 - * @class 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。文字通常是数字(0-9)或字母(A-Z ),而文字与图标之间有一定的映射关系。  
735 - *该覆盖物适用于以下类似的场景:需要在地图上添加一系列覆盖物,这些覆盖物之间用不同的图标和文字来区分,文字可能表示了该覆盖物的某一属性值,根据该文字和一定的映射关系,自动匹配相应颜色和大小的图标。  
736 - *  
737 - *@constructor  
738 - *@param {Point} position 表示一个经纬度坐标位置。  
739 - *@param {String} text 表示该覆盖物显示的文字信息。  
740 - *@param {Json Object} options 可选参数,可选项包括:<br />  
741 - *"<b>styles</b>":{Array<IconStyle>} 一组图标风格。单个图表风格包括以下几个属性:<br />  
742 - * url {String} 图片的url地址。(必选)<br />  
743 - * size {Size} 图片的大小。(必选)<br />  
744 - * anchor {Size} 图标定位在地图上的位置相对于图标左上角的偏移值,默认偏移值为图标的中心位置。(可选)<br />  
745 - * offset {Size} 图片相对于可视区域的偏移值,此功能的作用等同于CSS中的background-position属性。(可选)<br />  
746 - * textSize {Number} 文字的大小。(可选,默认10)<br />  
747 - * textColor {String} 文字的颜色。(可选,默认black)<br />  
748 - */  
749 - BMapLib.TextIconOverlay = function(position, text, options){  
750 - this._position = position;  
751 - this._text = text;  
752 - this._options = options || {};  
753 - this._styles = this._options['styles'] || [];  
754 - (!this._styles.length) && this._setupDefaultStyles();  
755 - };  
756 -  
757 - T.lang.inherits(TextIconOverlay, BMap.Overlay, "TextIconOverlay");  
758 -  
759 - TextIconOverlay.prototype._setupDefaultStyles = function(){  
760 - var sizes = [53, 56, 66, 78, 90];  
761 - for(var i = 0, size; size = sizes[i]; i++){  
762 - this._styles.push({  
763 - url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION,  
764 - size: new BMap.Size(size, size)  
765 - });  
766 - }//for循环的简洁写法  
767 - };  
768 -  
769 - /**  
770 - *继承Overlay的intialize方法,自定义覆盖物时必须。  
771 - *@param {Map} map BMap.Map的实例化对象。  
772 - *@return {HTMLElement} 返回覆盖物对应的HTML元素。  
773 - */  
774 - TextIconOverlay.prototype.initialize = function(map){  
775 - this._map = map;  
776 -  
777 - this._domElement = document.createElement('div');  
778 - this._updateCss();  
779 - this._updateText();  
780 - this._updatePosition();  
781 -  
782 - this._bind();  
783 -  
784 - this._map.getPanes().markerMouseTarget.appendChild(this._domElement);  
785 - return this._domElement;  
786 - };  
787 -  
788 - /**  
789 - *继承Overlay的draw方法,自定义覆盖物时必须。  
790 - *@return 无返回值。  
791 - */  
792 - TextIconOverlay.prototype.draw = function(){  
793 - this._map && this._updatePosition();  
794 - };  
795 -  
796 - /**  
797 - *获取该覆盖物上的文字。  
798 - *@return {String} 该覆盖物上的文字。  
799 - */  
800 - TextIconOverlay.prototype.getText = function(){  
801 - return this._text;  
802 - };  
803 -  
804 - /**  
805 - *设置该覆盖物上的文字。  
806 - *@param {String} text 要设置的文字,通常是字母A-Z或数字0-9。  
807 - *@return 无返回值。  
808 - */  
809 - TextIconOverlay.prototype.setText = function(text){  
810 - if(text && (!this._text || (this._text.toString() != text.toString()))){  
811 - this._text = text;  
812 - this._updateText();  
813 - this._updateCss();  
814 - this._updatePosition();  
815 - }  
816 - };  
817 -  
818 - /**  
819 - *获取该覆盖物的位置。  
820 - *@return {Point} 该覆盖物的经纬度坐标。  
821 - */  
822 - TextIconOverlay.prototype.getPosition = function () {  
823 - return this._position;  
824 - };  
825 -  
826 - /**  
827 - *设置该覆盖物的位置。  
828 - *@param {Point} position 要设置的经纬度坐标。  
829 - *@return 无返回值。  
830 - */  
831 - TextIconOverlay.prototype.setPosition = function (position) {  
832 - if(position && (!this._position || !this._position.equals(position))){  
833 - this._position = position;  
834 - this._updatePosition();  
835 - }  
836 - };  
837 -  
838 - /**  
839 - *由文字信息获取风格数组的对应索引值。  
840 - *内部默认的对应函数为文字转换为数字除以10的结果,比如文字8返回索引0,文字25返回索引2.  
841 - *如果需要自定义映射关系,请覆盖该函数。  
842 - *@param {String} text 文字。  
843 - *@param {Array<IconStyle>} styles 一组图标风格。  
844 - *@return {Number} 对应的索引值。  
845 - */  
846 - TextIconOverlay.prototype.getStyleByText = function(text, styles){  
847 - var count = parseInt(text);  
848 - var index = parseInt(count / 10);  
849 - index = Math.max(0, index);  
850 - index = Math.min(index, styles.length - 1);  
851 - return styles[index];  
852 - }  
853 -  
854 - /**  
855 - *更新相应的CSS。  
856 - *@return 无返回值。  
857 - */  
858 - TextIconOverlay.prototype._updateCss = function(){  
859 - var style = this.getStyleByText(this._text, this._styles);  
860 - this._domElement.style.cssText = this._buildCssText(style);  
861 - };  
862 -  
863 - /**  
864 - *更新覆盖物的显示文字。  
865 - *@return 无返回值。  
866 - */  
867 - TextIconOverlay.prototype._updateText = function(){  
868 - if (this._domElement) {  
869 - this._domElement.innerHTML = this._text;  
870 - }  
871 - };  
872 -  
873 - /**  
874 - *调整覆盖物在地图上的位置更新覆盖物的显示文字。  
875 - *@return 无返回值。  
876 - */  
877 - TextIconOverlay.prototype._updatePosition = function(){  
878 - if (this._domElement && this._position) {  
879 - var style = this._domElement.style;  
880 - var pixelPosition= this._map.pointToOverlayPixel(this._position);  
881 - pixelPosition.x -= Math.ceil(parseInt(style.width) / 2);  
882 - pixelPosition.y -= Math.ceil(parseInt(style.height) / 2);  
883 - style.left = pixelPosition.x + "px";  
884 - style.top = pixelPosition.y + "px";  
885 - }  
886 - };  
887 -  
888 - /**  
889 - * 为该覆盖物的HTML元素构建CSS  
890 - * @param {IconStyle} 一个图标的风格。  
891 - * @return {String} 构建完成的CSSTEXT。  
892 - */  
893 - TextIconOverlay.prototype._buildCssText = function(style) {  
894 - //根据style来确定一些默认值  
895 - var url = style['url'];  
896 - var size = style['size'];  
897 - var anchor = style['anchor'];  
898 - var offset = style['offset'];  
899 - var textColor = style['textColor'] || 'black';  
900 - var textSize = style['textSize'] || 10;  
901 -  
902 - var csstext = [];  
903 - if (T.browser["ie"] < 7) {  
904 - csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' +  
905 - 'sizingMethod=scale,src="' + url + '");');  
906 - } else {  
907 - csstext.push('background-image:url(' + url + ');');  
908 - var backgroundPosition = '0 0';  
909 - (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px');  
910 - csstext.push('background-position:' + backgroundPosition + ';');  
911 - }  
912 -  
913 - if (size instanceof BMap.Size){  
914 - if (anchor instanceof BMap.Size) {  
915 - if (anchor.height > 0 && anchor.height < size.height) {  
916 - csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;');  
917 - }  
918 - if(anchor.width > 0 && anchor.width < size.width){  
919 - csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;');  
920 - }  
921 - } else {  
922 - csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;');  
923 - csstext.push('width:' + size.width + 'px; text-align:center;');  
924 - }  
925 - }  
926 -  
927 - csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' +  
928 - textSize + 'px; font-family:Arial,sans-serif; font-weight:bold');  
929 - return csstext.join('');  
930 - };  
931 -  
932 -  
933 - /**  
934 -  
935 - * 当鼠标点击该覆盖物时会触发该事件  
936 -  
937 - * @name TextIconOverlay#click  
938 -  
939 - * @event  
940 -  
941 - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:  
942 -  
943 - * <br />"<b>type</b> : {String} 事件类型  
944 -  
945 - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标  
946 -  
947 - *  
948 -  
949 - */  
950 -  
951 - /**  
952 -  
953 - * 当鼠标进入该覆盖物区域时会触发该事件  
954 -  
955 - * @name TextIconOverlay#mouseover  
956 -  
957 - * @event  
958 - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:  
959 -  
960 - * <br />"<b>type</b> : {String} 事件类型  
961 -  
962 - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标  
963 -  
964 - * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象  
965 -  
966 - * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象  
967 -  
968 - *  
969 -  
970 - * @example <b>参考示例:</b><br />  
971 -  
972 - * myTextIconOverlay.addEventListener("mouseover", function(e) { alert(e.point); });  
973 -  
974 - */  
975 -  
976 - /**  
977 -  
978 - * 当鼠标离开该覆盖物区域时会触发该事件  
979 -  
980 - * @name TextIconOverlay#mouseout  
981 -  
982 - * @event  
983 -  
984 - * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:  
985 -  
986 - * <br />"<b>type</b> : {String} 事件类型  
987 -  
988 - * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标  
989 -  
990 - * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象  
991 -  
992 - * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象  
993 -  
994 - *  
995 -  
996 - * @example <b>参考示例:</b><br />  
997 -  
998 - * myTextIconOverlay.addEventListener("mouseout", function(e) { alert(e.point); });  
999 -  
1000 - */  
1001 -  
1002 -  
1003 - /**  
1004 - * 为该覆盖物绑定一系列事件  
1005 - * 当前支持click mouseover mouseout  
1006 - * @return 无返回值。  
1007 - */  
1008 - TextIconOverlay.prototype._bind = function(){  
1009 - if (!this._domElement){  
1010 - return;  
1011 - }  
1012 -  
1013 - var me = this;  
1014 - var map = this._map;  
1015 -  
1016 - var BaseEvent = T.lang.Event;  
1017 - function eventExtend(e, be){  
1018 - var elem = e.srcElement || e.target;  
1019 - var x = e.clientX || e.pageX;  
1020 - var y = e.clientY || e.pageY;  
1021 - if (e && be && x && y && elem){  
1022 - var offset = T.dom.getPosition(map.getContainer());  
1023 - be.pixel = new BMap.Pixel(x - offset.left, y - offset.top);  
1024 - be.point = map.pixelToPoint(be.pixel);  
1025 - }  
1026 - return be;  
1027 - }//给事件参数增加pixel和point两个值  
1028 -  
1029 - T.event.on(this._domElement,"mouseover", function(e){  
1030 - me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseover")));  
1031 - });  
1032 - T.event.on(this._domElement,"mouseout", function(e){  
1033 - me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseout")));  
1034 - });  
1035 - T.event.on(this._domElement,"click", function(e){  
1036 - me.dispatchEvent(eventExtend(e, new BaseEvent("onclick")));  
1037 - });  
1038 - };  
1039 - 1 +/**
  2 + * @fileoverview 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。
  3 + * 主入口类是<a href="symbols/BMapLib.TextIconOverlay.html">TextIconOverlay</a>,
  4 + * 基于Baidu Map API 1.2。
  5 + *
  6 + * @author Baidu Map Api Group
  7 + * @version 1.2
  8 + */
  9 +
  10 +
  11 + /**
  12 + * @namespace BMap的所有library类均放在BMapLib命名空间下
  13 + */
  14 +var BMapLib = window.BMapLib = BMapLib || {};
  15 +
  16 +(function () {
  17 +
  18 + /**
  19 + * 声明baidu包
  20 + */
  21 + var T,
  22 + baidu = T = baidu || {version: "1.3.8"};
  23 +
  24 + (function (){
  25 + //提出guid,防止在与老版本Tangram混用时
  26 + //在下一行错误的修改window[undefined]
  27 + baidu.guid = "$BAIDU$";
  28 +
  29 + //Tangram可能被放在闭包中
  30 + //一些页面级别唯一的属性,需要挂载在window[baidu.guid]上
  31 + window[baidu.guid] = window[baidu.guid] || {};
  32 +
  33 + /**
  34 + * @ignore
  35 + * @namespace baidu.dom 操作dom的方法。
  36 + */
  37 + baidu.dom = baidu.dom || {};
  38 +
  39 +
  40 + /**
  41 + * 从文档中获取指定的DOM元素
  42 + * @name baidu.dom.g
  43 + * @function
  44 + * @grammar baidu.dom.g(id)
  45 + * @param {string|HTMLElement} id 元素的id或DOM元素
  46 + * @shortcut g,T.G
  47 + * @meta standard
  48 + * @see baidu.dom.q
  49 + *
  50 + * @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数
  51 + */
  52 + baidu.dom.g = function (id) {
  53 + if ('string' == typeof id || id instanceof String) {
  54 + return document.getElementById(id);
  55 + } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {
  56 + return id;
  57 + }
  58 + return null;
  59 + };
  60 +
  61 + // 声明快捷方法
  62 + baidu.g = baidu.G = baidu.dom.g;
  63 +
  64 + /**
  65 + * 获取目标元素所属的document对象
  66 + * @name baidu.dom.getDocument
  67 + * @function
  68 + * @grammar baidu.dom.getDocument(element)
  69 + * @param {HTMLElement|string} element 目标元素或目标元素的id
  70 + * @meta standard
  71 + * @see baidu.dom.getWindow
  72 + *
  73 + * @returns {HTMLDocument} 目标元素所属的document对象
  74 + */
  75 + baidu.dom.getDocument = function (element) {
  76 + element = baidu.dom.g(element);
  77 + return element.nodeType == 9 ? element : element.ownerDocument || element.document;
  78 + };
  79 +
  80 + /**
  81 + * @ignore
  82 + * @namespace baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。
  83 + */
  84 + baidu.lang = baidu.lang || {};
  85 +
  86 + /**
  87 + * 判断目标参数是否string类型或String对象
  88 + * @name baidu.lang.isString
  89 + * @function
  90 + * @grammar baidu.lang.isString(source)
  91 + * @param {Any} source 目标参数
  92 + * @shortcut isString
  93 + * @meta standard
  94 + * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
  95 + *
  96 + * @returns {boolean} 类型判断结果
  97 + */
  98 + baidu.lang.isString = function (source) {
  99 + return '[object String]' == Object.prototype.toString.call(source);
  100 + };
  101 +
  102 + // 声明快捷方法
  103 + baidu.isString = baidu.lang.isString;
  104 +
  105 + /**
  106 + * 从文档中获取指定的DOM元素
  107 + * **内部方法**
  108 + *
  109 + * @param {string|HTMLElement} id 元素的id或DOM元素
  110 + * @meta standard
  111 + * @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数
  112 + */
  113 + baidu.dom._g = function (id) {
  114 + if (baidu.lang.isString(id)) {
  115 + return document.getElementById(id);
  116 + }
  117 + return id;
  118 + };
  119 +
  120 + // 声明快捷方法
  121 + baidu._g = baidu.dom._g;
  122 +
  123 + /**
  124 + * @ignore
  125 + * @namespace baidu.browser 判断浏览器类型和特性的属性。
  126 + */
  127 + baidu.browser = baidu.browser || {};
  128 +
  129 + if (/msie (\d+\.\d)/i.test(navigator.userAgent)) {
  130 + //IE 8下,以documentMode为准
  131 + //在百度模板中,可能会有$,防止冲突,将$1 写成 \x241
  132 + /**
  133 + * 判断是否为ie浏览器
  134 + * @property ie ie版本号
  135 + * @grammar baidu.browser.ie
  136 + * @meta standard
  137 + * @shortcut ie
  138 + * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon
  139 + */
  140 + baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\x241'];
  141 + }
  142 +
  143 + /**
  144 + * 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE)
  145 + *
  146 + * @author berg
  147 + * @name baidu.dom.getComputedStyle
  148 + * @function
  149 + * @grammar baidu.dom.getComputedStyle(element, key)
  150 + * @param {HTMLElement|string} element 目标元素或目标元素的id
  151 + * @param {string} key 要获取的样式名
  152 + *
  153 + * @see baidu.dom.getStyle
  154 + *
  155 + * @returns {string} 目标元素的computed style值
  156 + */
  157 +
  158 + baidu.dom.getComputedStyle = function(element, key){
  159 + element = baidu.dom._g(element);
  160 + var doc = baidu.dom.getDocument(element),
  161 + styles;
  162 + if (doc.defaultView && doc.defaultView.getComputedStyle) {
  163 + styles = doc.defaultView.getComputedStyle(element, null);
  164 + if (styles) {
  165 + return styles[key] || styles.getPropertyValue(key);
  166 + }
  167 + }
  168 + return '';
  169 + };
  170 +
  171 + /**
  172 + * 提供给setStyle与getStyle使用
  173 + */
  174 + baidu.dom._styleFixer = baidu.dom._styleFixer || {};
  175 +
  176 + /**
  177 + * 提供给setStyle与getStyle使用
  178 + */
  179 + baidu.dom._styleFilter = baidu.dom._styleFilter || [];
  180 +
  181 + /**
  182 + * 为获取和设置样式的过滤器
  183 + * @private
  184 + * @meta standard
  185 + */
  186 + baidu.dom._styleFilter.filter = function (key, value, method) {
  187 + for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) {
  188 + if (filter = filter[method]) {
  189 + value = filter(key, value);
  190 + }
  191 + }
  192 + return value;
  193 + };
  194 +
  195 + /**
  196 + * @ignore
  197 + * @namespace baidu.string 操作字符串的方法。
  198 + */
  199 + baidu.string = baidu.string || {};
  200 +
  201 + /**
  202 + * 将目标字符串进行驼峰化处理
  203 + * @name baidu.string.toCamelCase
  204 + * @function
  205 + * @grammar baidu.string.toCamelCase(source)
  206 + * @param {string} source 目标字符串
  207 + * @remark
  208 + * 支持单词以“-_”分隔
  209 + * @meta standard
  210 + *
  211 + * @returns {string} 驼峰化处理后的字符串
  212 + */
  213 + baidu.string.toCamelCase = function (source) {
  214 + //提前判断,提高getStyle等的效率 thanks xianwei
  215 + if (source.indexOf('-') < 0 && source.indexOf('_') < 0) {
  216 + return source;
  217 + }
  218 + return source.replace(/[-_][^-_]/g, function (match) {
  219 + return match.charAt(1).toUpperCase();
  220 + });
  221 + };
  222 +
  223 + /**
  224 + * 获取目标元素的样式值
  225 + * @name baidu.dom.getStyle
  226 + * @function
  227 + * @grammar baidu.dom.getStyle(element, key)
  228 + * @param {HTMLElement|string} element 目标元素或目标元素的id
  229 + * @param {string} key 要获取的样式名
  230 + * @remark
  231 + *
  232 + * 为了精简代码,本模块默认不对任何浏览器返回值进行归一化处理(如使用getStyle时,不同浏览器下可能返回rgb颜色或hex颜色),也不会修复浏览器的bug和差异性(如设置IE的float属性叫styleFloat,firefox则是cssFloat)。<br />
  233 + * baidu.dom._styleFixer和baidu.dom._styleFilter可以为本模块提供支持。<br />
  234 + * 其中_styleFilter能对颜色和px进行归一化处理,_styleFixer能对display,float,opacity,textOverflow的浏览器兼容性bug进行处理。
  235 + * @shortcut getStyle
  236 + * @meta standard
  237 + * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle
  238 + *
  239 + * @returns {string} 目标元素的样式值
  240 + */
  241 + baidu.dom.getStyle = function (element, key) {
  242 + var dom = baidu.dom;
  243 +
  244 + element = dom.g(element);
  245 + key = baidu.string.toCamelCase(key);
  246 + //computed style, then cascaded style, then explicitly set style.
  247 + var value = element.style[key] ||
  248 + (element.currentStyle ? element.currentStyle[key] : "") ||
  249 + dom.getComputedStyle(element, key);
  250 +
  251 + // 在取不到值的时候,用fixer进行修正
  252 + if (!value) {
  253 + var fixer = dom._styleFixer[key];
  254 + if(fixer){
  255 + value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer);
  256 + }
  257 + }
  258 +
  259 + /* 检查结果过滤器 */
  260 + if (fixer = dom._styleFilter) {
  261 + value = fixer.filter(key, value, 'get');
  262 + }
  263 +
  264 + return value;
  265 + };
  266 +
  267 + // 声明快捷方法
  268 + baidu.getStyle = baidu.dom.getStyle;
  269 +
  270 +
  271 + if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) {
  272 + /**
  273 + * 判断是否为opera浏览器
  274 + * @property opera opera版本号
  275 + * @grammar baidu.browser.opera
  276 + * @meta standard
  277 + * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome
  278 + */
  279 + baidu.browser.opera = + RegExp['\x241'];
  280 + }
  281 +
  282 + /**
  283 + * 判断是否为webkit内核
  284 + * @property isWebkit
  285 + * @grammar baidu.browser.isWebkit
  286 + * @meta standard
  287 + * @see baidu.browser.isGecko
  288 + */
  289 + baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent);
  290 +
  291 + /**
  292 + * 判断是否为gecko内核
  293 + * @property isGecko
  294 + * @grammar baidu.browser.isGecko
  295 + * @meta standard
  296 + * @see baidu.browser.isWebkit
  297 + */
  298 + baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent);
  299 +
  300 + /**
  301 + * 判断是否严格标准的渲染模式
  302 + * @property isStrict
  303 + * @grammar baidu.browser.isStrict
  304 + * @meta standard
  305 + */
  306 + baidu.browser.isStrict = document.compatMode == "CSS1Compat";
  307 +
  308 + /**
  309 + * 获取目标元素相对于整个文档左上角的位置
  310 + * @name baidu.dom.getPosition
  311 + * @function
  312 + * @grammar baidu.dom.getPosition(element)
  313 + * @param {HTMLElement|string} element 目标元素或目标元素的id
  314 + * @meta standard
  315 + *
  316 + * @returns {Object} 目标元素的位置,键值为top和left的Object。
  317 + */
  318 + baidu.dom.getPosition = function (element) {
  319 + element = baidu.dom.g(element);
  320 + var doc = baidu.dom.getDocument(element),
  321 + browser = baidu.browser,
  322 + getStyle = baidu.dom.getStyle,
  323 + // Gecko 1.9版本以下用getBoxObjectFor计算位置
  324 + // 但是某些情况下是有bug的
  325 + // 对于这些有bug的情况
  326 + // 使用递归查找的方式
  327 + BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 &&
  328 + doc.getBoxObjectFor &&
  329 + getStyle(element, 'position') == 'absolute' &&
  330 + (element.style.top === '' || element.style.left === ''),
  331 + pos = {"left":0,"top":0},
  332 + viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement,
  333 + parent,
  334 + box;
  335 +
  336 + if(element == viewport){
  337 + return pos;
  338 + }
  339 +
  340 + if(element.getBoundingClientRect){ // IE and Gecko 1.9+
  341 +
  342 + //当HTML或者BODY有border width时, 原生的getBoundingClientRect返回值是不符合预期的
  343 + //考虑到通常情况下 HTML和BODY的border只会设成0px,所以忽略该问题.
  344 + box = element.getBoundingClientRect();
  345 +
  346 + pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);
  347 + pos.top = Math.floor(box.top) + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);
  348 +
  349 + // IE会给HTML元素添加一个border,默认是medium(2px)
  350 + // 但是在IE 6 7 的怪异模式下,可以被html { border: 0; } 这条css规则覆盖
  351 + // 在IE7的标准模式下,border永远是2px,这个值通过clientLeft 和 clientTop取得
  352 + // 但是。。。在IE 6 7的怪异模式,如果用户使用css覆盖了默认的medium
  353 + // clientTop和clientLeft不会更新
  354 + pos.left -= doc.documentElement.clientLeft;
  355 + pos.top -= doc.documentElement.clientTop;
  356 +
  357 + var htmlDom = doc.body,
  358 + // 在这里,不使用element.style.borderLeftWidth,只有computedStyle是可信的
  359 + htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')),
  360 + htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth'));
  361 + if(browser.ie && !browser.isStrict){
  362 + pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth;
  363 + pos.top -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth;
  364 + }
  365 + } else {
  366 + // safari/opera/firefox
  367 + parent = element;
  368 +
  369 + do {
  370 + pos.left += parent.offsetLeft;
  371 + pos.top += parent.offsetTop;
  372 +
  373 + // safari里面,如果遍历到了一个fixed的元素,后面的offset都不准了
  374 + if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') {
  375 + pos.left += doc.body.scrollLeft;
  376 + pos.top += doc.body.scrollTop;
  377 + break;
  378 + }
  379 +
  380 + parent = parent.offsetParent;
  381 + } while (parent && parent != element);
  382 +
  383 + // 对body offsetTop的修正
  384 + if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){
  385 + pos.top -= doc.body.offsetTop;
  386 + }
  387 +
  388 + // 计算除了body的scroll
  389 + parent = element.offsetParent;
  390 + while (parent && parent != doc.body) {
  391 + pos.left -= parent.scrollLeft;
  392 + // see https://bugs.opera.com/show_bug.cgi?id=249965
  393 + if (!browser.opera || parent.tagName != 'TR') {
  394 + pos.top -= parent.scrollTop;
  395 + }
  396 + parent = parent.offsetParent;
  397 + }
  398 + }
  399 +
  400 + return pos;
  401 + };
  402 +
  403 + /**
  404 + * @ignore
  405 + * @namespace baidu.event 屏蔽浏览器差异性的事件封装。
  406 + * @property target 事件的触发元素
  407 + * @property pageX 鼠标事件的鼠标x坐标
  408 + * @property pageY 鼠标事件的鼠标y坐标
  409 + * @property keyCode 键盘事件的键值
  410 + */
  411 + baidu.event = baidu.event || {};
  412 +
  413 + /**
  414 + * 事件监听器的存储表
  415 + * @private
  416 + * @meta standard
  417 + */
  418 + baidu.event._listeners = baidu.event._listeners || [];
  419 +
  420 + /**
  421 + * 为目标元素添加事件监听器
  422 + * @name baidu.event.on
  423 + * @function
  424 + * @grammar baidu.event.on(element, type, listener)
  425 + * @param {HTMLElement|string|window} element 目标元素或目标元素id
  426 + * @param {string} type 事件类型
  427 + * @param {Function} listener 需要添加的监听器
  428 + * @remark
  429 + *
  430 + 1. 不支持跨浏览器的鼠标滚轮事件监听器添加<br>
  431 + 2. 改方法不为监听器灌入事件对象,以防止跨iframe事件挂载的事件对象获取失败
  432 +
  433 + * @shortcut on
  434 + * @meta standard
  435 + * @see baidu.event.un
  436 + *
  437 + * @returns {HTMLElement|window} 目标元素
  438 + */
  439 + baidu.event.on = function (element, type, listener) {
  440 + type = type.replace(/^on/i, '');
  441 + element = baidu.dom._g(element);
  442 +
  443 + var realListener = function (ev) {
  444 + // 1. 这里不支持EventArgument, 原因是跨frame的事件挂载
  445 + // 2. element是为了修正this
  446 + listener.call(element, ev);
  447 + },
  448 + lis = baidu.event._listeners,
  449 + filter = baidu.event._eventFilter,
  450 + afterFilter,
  451 + realType = type;
  452 + type = type.toLowerCase();
  453 + // filter过滤
  454 + if(filter && filter[type]){
  455 + afterFilter = filter[type](element, type, realListener);
  456 + realType = afterFilter.type;
  457 + realListener = afterFilter.listener;
  458 + }
  459 +
  460 + // 事件监听器挂载
  461 + if (element.addEventListener) {
  462 + element.addEventListener(realType, realListener, false);
  463 + } else if (element.attachEvent) {
  464 + element.attachEvent('on' + realType, realListener);
  465 + }
  466 +
  467 + // 将监听器存储到数组中
  468 + lis[lis.length] = [element, type, listener, realListener, realType];
  469 + return element;
  470 + };
  471 +
  472 + // 声明快捷方法
  473 + baidu.on = baidu.event.on;
  474 +
  475 + /**
  476 + * 返回一个当前页面的唯一标识字符串。
  477 + * @name baidu.lang.guid
  478 + * @function
  479 + * @grammar baidu.lang.guid()
  480 + * @version 1.1.1
  481 + * @meta standard
  482 + *
  483 + * @returns {String} 当前页面的唯一标识字符串
  484 + */
  485 +
  486 + (function(){
  487 + //不直接使用window,可以提高3倍左右性能
  488 + var guid = window[baidu.guid];
  489 +
  490 + baidu.lang.guid = function() {
  491 + return "TANGRAM__" + (guid._counter ++).toString(36);
  492 + };
  493 +
  494 + guid._counter = guid._counter || 1;
  495 + })();
  496 +
  497 + /**
  498 + * 所有类的实例的容器
  499 + * key为每个实例的guid
  500 + * @meta standard
  501 + */
  502 +
  503 + window[baidu.guid]._instances = window[baidu.guid]._instances || {};
  504 +
  505 + /**
  506 + * 判断目标参数是否为function或Function实例
  507 + * @name baidu.lang.isFunction
  508 + * @function
  509 + * @grammar baidu.lang.isFunction(source)
  510 + * @param {Any} source 目标参数
  511 + * @version 1.2
  512 + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
  513 + * @meta standard
  514 + * @returns {boolean} 类型判断结果
  515 + */
  516 + baidu.lang.isFunction = function (source) {
  517 + // chrome下,'function' == typeof /a/ 为true.
  518 + return '[object Function]' == Object.prototype.toString.call(source);
  519 + };
  520 +
  521 + /**
  522 + *
  523 + * @ignore
  524 + * @class Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。
  525 + * @name baidu.lang.Class
  526 + * @grammar baidu.lang.Class(guid)
  527 + * @param {string} guid 对象的唯一标识
  528 + * @meta standard
  529 + * @remark baidu.lang.Class和它的子类的实例均包含一个全局唯一的标识guid。guid是在构造函数中生成的,因此,继承自baidu.lang.Class的类应该直接或者间接调用它的构造函数。<br>baidu.lang.Class的构造函数中产生guid的方式可以保证guid的唯一性,及每个实例都有一个全局唯一的guid。
  530 + * @meta standard
  531 + * @see baidu.lang.inherits,baidu.lang.Event
  532 + */
  533 + baidu.lang.Class = function(guid) {
  534 + this.guid = guid || baidu.lang.guid();
  535 + window[baidu.guid]._instances[this.guid] = this;
  536 + };
  537 + window[baidu.guid]._instances = window[baidu.guid]._instances || {};
  538 +
  539 + /**
  540 + * 释放对象所持有的资源,主要是自定义事件。
  541 + * @name dispose
  542 + * @grammar obj.dispose()
  543 + */
  544 + baidu.lang.Class.prototype.dispose = function(){
  545 + delete window[baidu.guid]._instances[this.guid];
  546 +
  547 + for(var property in this){
  548 + if (!baidu.lang.isFunction(this[property])) {
  549 + delete this[property];
  550 + }
  551 + }
  552 + this.disposed = true;
  553 + };
  554 +
  555 + /**
  556 + * 重载了默认的toString方法,使得返回信息更加准确一些。
  557 + * @return {string} 对象的String表示形式
  558 + */
  559 + baidu.lang.Class.prototype.toString = function(){
  560 + return "[object " + (this._className || "Object" ) + "]";
  561 + };
  562 +
  563 + /**
  564 + * @ignore
  565 + * @class 自定义的事件对象。
  566 + * @name baidu.lang.Event
  567 + * @grammar baidu.lang.Event(type[, target])
  568 + * @param {string} type 事件类型名称。为了方便区分事件和一个普通的方法,事件类型名称必须以"on"(小写)开头。
  569 + * @param {Object} [target]触发事件的对象
  570 + * @meta standard
  571 + * @remark 引入该模块,会自动为Class引入3个事件扩展方法:addEventListener、removeEventListener和dispatchEvent。
  572 + * @meta standard
  573 + * @see baidu.lang.Class
  574 + */
  575 + baidu.lang.Event = function (type, target) {
  576 + this.type = type;
  577 + this.returnValue = true;
  578 + this.target = target || null;
  579 + this.currentTarget = null;
  580 + };
  581 +
  582 + /**
  583 + * 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
  584 + * @grammar obj.addEventListener(type, handlers[, key])
  585 + * @param {string} type 自定义事件的名称
  586 + * @param {Function} handler 自定义事件被触发时应该调用的回调函数
  587 + * @param {string} [key] 为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。
  588 + * @remark 事件类型区分大小写。如果自定义事件名称不是以小写"on"开头,该方法会给它加上"on"再进行判断,即"click"和"onclick"会被认为是同一种事件。
  589 + */
  590 + baidu.lang.Class.prototype.addEventListener = function (type, handler, key) {
  591 + if (!baidu.lang.isFunction(handler)) {
  592 + return;
  593 + }
  594 +
  595 + !this.__listeners && (this.__listeners = {});
  596 +
  597 + var t = this.__listeners, id;
  598 + if (typeof key == "string" && key) {
  599 + if (/[^\w\-]/.test(key)) {
  600 + throw("nonstandard key:" + key);
  601 + } else {
  602 + handler.hashCode = key;
  603 + id = key;
  604 + }
  605 + }
  606 + type.indexOf("on") != 0 && (type = "on" + type);
  607 +
  608 + typeof t[type] != "object" && (t[type] = {});
  609 + id = id || baidu.lang.guid();
  610 + handler.hashCode = id;
  611 + t[type][id] = handler;
  612 + };
  613 +
  614 + /**
  615 + * 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
  616 + * @grammar obj.removeEventListener(type, handlers)
  617 + * @param {string} type 事件类型
  618 + * @param {Function|string} handler 要移除的事件监听函数或者监听函数的key
  619 + * @remark 如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。
  620 + */
  621 + baidu.lang.Class.prototype.removeEventListener = function (type, handler) {
  622 + if (typeof handler != "undefined") {
  623 + if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode))
  624 + || (! baidu.lang.isString(handler))
  625 + ){
  626 + return;
  627 + }
  628 + }
  629 +
  630 + !this.__listeners && (this.__listeners = {});
  631 +
  632 + type.indexOf("on") != 0 && (type = "on" + type);
  633 +
  634 + var t = this.__listeners;
  635 + if (!t[type]) {
  636 + return;
  637 + }
  638 + if (typeof handler != "undefined") {
  639 + t[type][handler] && delete t[type][handler];
  640 + } else {
  641 + for(var guid in t[type]){
  642 + delete t[type][guid];
  643 + }
  644 + }
  645 + };
  646 +
  647 + /**
  648 + * 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
  649 + * @grammar obj.dispatchEvent(event, options)
  650 + * @param {baidu.lang.Event|String} event Event对象,或事件名称(1.1.1起支持)
  651 + * @param {Object} options 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持)
  652 + * @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。例如:<br>
  653 + myobj.onMyEvent = function(){}<br>
  654 + myobj.addEventListener("onMyEvent", function(){});
  655 + */
  656 + baidu.lang.Class.prototype.dispatchEvent = function (event, options) {
  657 + if (baidu.lang.isString(event)) {
  658 + event = new baidu.lang.Event(event);
  659 + }
  660 + !this.__listeners && (this.__listeners = {});
  661 +
  662 + // 20100603 添加本方法的第二个参数,将 options extend到event中去传递
  663 + options = options || {};
  664 + for (var i in options) {
  665 + event[i] = options[i];
  666 + }
  667 +
  668 + var i, t = this.__listeners, p = event.type;
  669 + event.target = event.target || this;
  670 + event.currentTarget = this;
  671 +
  672 + p.indexOf("on") != 0 && (p = "on" + p);
  673 +
  674 + baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments);
  675 +
  676 + if (typeof t[p] == "object") {
  677 + for (i in t[p]) {
  678 + t[p][i].apply(this, arguments);
  679 + }
  680 + }
  681 + return event.returnValue;
  682 + };
  683 +
  684 +
  685 + baidu.lang.inherits = function (subClass, superClass, className) {
  686 + var key, proto,
  687 + selfProps = subClass.prototype,
  688 + clazz = new Function();
  689 +
  690 + clazz.prototype = superClass.prototype;
  691 + proto = subClass.prototype = new clazz();
  692 + for (key in selfProps) {
  693 + proto[key] = selfProps[key];
  694 + }
  695 + subClass.prototype.constructor = subClass;
  696 + subClass.superClass = superClass.prototype;
  697 +
  698 + // 类名标识,兼容Class的toString,基本没用
  699 + if ("string" == typeof className) {
  700 + proto._className = className;
  701 + }
  702 + };
  703 + // 声明快捷方法
  704 + baidu.inherits = baidu.lang.inherits;
  705 + })();
  706 +
  707 +
  708 + /**
  709 +
  710 + * 图片的路径
  711 +
  712 + * @private
  713 + * @type {String}
  714 +
  715 + */
  716 + var _IMAGE_PATH = '//api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m';
  717 +
  718 + /**
  719 +
  720 + * 图片的后缀名
  721 +
  722 + * @private
  723 + * @type {String}
  724 +
  725 + */
  726 + var _IMAGE_EXTENSION = 'png';
  727 +
  728 + /**
  729 + *@exports TextIconOverlay as BMapLib.TextIconOverlay
  730 + */
  731 + var TextIconOverlay =
  732 + /**
  733 + * TextIconOverlay
  734 + * @class 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。文字通常是数字(0-9)或字母(A-Z ),而文字与图标之间有一定的映射关系。
  735 + *该覆盖物适用于以下类似的场景:需要在地图上添加一系列覆盖物,这些覆盖物之间用不同的图标和文字来区分,文字可能表示了该覆盖物的某一属性值,根据该文字和一定的映射关系,自动匹配相应颜色和大小的图标。
  736 + *
  737 + *@constructor
  738 + *@param {Point} position 表示一个经纬度坐标位置。
  739 + *@param {String} text 表示该覆盖物显示的文字信息。
  740 + *@param {Json Object} options 可选参数,可选项包括:<br />
  741 + *"<b>styles</b>":{Array<IconStyle>} 一组图标风格。单个图表风格包括以下几个属性:<br />
  742 + * url {String} 图片的url地址。(必选)<br />
  743 + * size {Size} 图片的大小。(必选)<br />
  744 + * anchor {Size} 图标定位在地图上的位置相对于图标左上角的偏移值,默认偏移值为图标的中心位置。(可选)<br />
  745 + * offset {Size} 图片相对于可视区域的偏移值,此功能的作用等同于CSS中的background-position属性。(可选)<br />
  746 + * textSize {Number} 文字的大小。(可选,默认10)<br />
  747 + * textColor {String} 文字的颜色。(可选,默认black)<br />
  748 + */
  749 + BMapLib.TextIconOverlay = function(position, text, options){
  750 + this._position = position;
  751 + this._text = text;
  752 + this._options = options || {};
  753 + this._styles = this._options['styles'] || [];
  754 + (!this._styles.length) && this._setupDefaultStyles();
  755 + };
  756 +
  757 + T.lang.inherits(TextIconOverlay, BMap.Overlay, "TextIconOverlay");
  758 +
  759 + TextIconOverlay.prototype._setupDefaultStyles = function(){
  760 + var sizes = [53, 56, 66, 78, 90];
  761 + for(var i = 0, size; size = sizes[i]; i++){
  762 + this._styles.push({
  763 + url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION,
  764 + size: new BMap.Size(size, size)
  765 + });
  766 + }//for循环的简洁写法
  767 + };
  768 +
  769 + /**
  770 + *继承Overlay的intialize方法,自定义覆盖物时必须。
  771 + *@param {Map} map BMap.Map的实例化对象。
  772 + *@return {HTMLElement} 返回覆盖物对应的HTML元素。
  773 + */
  774 + TextIconOverlay.prototype.initialize = function(map){
  775 + this._map = map;
  776 +
  777 + this._domElement = document.createElement('div');
  778 + this._updateCss();
  779 + this._updateText();
  780 + this._updatePosition();
  781 +
  782 + this._bind();
  783 +
  784 + this._map.getPanes().markerMouseTarget.appendChild(this._domElement);
  785 + return this._domElement;
  786 + };
  787 +
  788 + /**
  789 + *继承Overlay的draw方法,自定义覆盖物时必须。
  790 + *@return 无返回值。
  791 + */
  792 + TextIconOverlay.prototype.draw = function(){
  793 + this._map && this._updatePosition();
  794 + };
  795 +
  796 + /**
  797 + *获取该覆盖物上的文字。
  798 + *@return {String} 该覆盖物上的文字。
  799 + */
  800 + TextIconOverlay.prototype.getText = function(){
  801 + return this._text;
  802 + };
  803 +
  804 + /**
  805 + *设置该覆盖物上的文字。
  806 + *@param {String} text 要设置的文字,通常是字母A-Z或数字0-9。
  807 + *@return 无返回值。
  808 + */
  809 + TextIconOverlay.prototype.setText = function(text){
  810 + if(text && (!this._text || (this._text.toString() != text.toString()))){
  811 + this._text = text;
  812 + this._updateText();
  813 + this._updateCss();
  814 + this._updatePosition();
  815 + }
  816 + };
  817 +
  818 + /**
  819 + *获取该覆盖物的位置。
  820 + *@return {Point} 该覆盖物的经纬度坐标。
  821 + */
  822 + TextIconOverlay.prototype.getPosition = function () {
  823 + return this._position;
  824 + };
  825 +
  826 + /**
  827 + *设置该覆盖物的位置。
  828 + *@param {Point} position 要设置的经纬度坐标。
  829 + *@return 无返回值。
  830 + */
  831 + TextIconOverlay.prototype.setPosition = function (position) {
  832 + if(position && (!this._position || !this._position.equals(position))){
  833 + this._position = position;
  834 + this._updatePosition();
  835 + }
  836 + };
  837 +
  838 + /**
  839 + *由文字信息获取风格数组的对应索引值。
  840 + *内部默认的对应函数为文字转换为数字除以10的结果,比如文字8返回索引0,文字25返回索引2.
  841 + *如果需要自定义映射关系,请覆盖该函数。
  842 + *@param {String} text 文字。
  843 + *@param {Array<IconStyle>} styles 一组图标风格。
  844 + *@return {Number} 对应的索引值。
  845 + */
  846 + TextIconOverlay.prototype.getStyleByText = function(text, styles){
  847 + var count = parseInt(text);
  848 + var index = parseInt(count / 10);
  849 + index = Math.max(0, index);
  850 + index = Math.min(index, styles.length - 1);
  851 + return styles[index];
  852 + }
  853 +
  854 + /**
  855 + *更新相应的CSS。
  856 + *@return 无返回值。
  857 + */
  858 + TextIconOverlay.prototype._updateCss = function(){
  859 + var style = this.getStyleByText(this._text, this._styles);
  860 + this._domElement.style.cssText = this._buildCssText(style);
  861 + };
  862 +
  863 + /**
  864 + *更新覆盖物的显示文字。
  865 + *@return 无返回值。
  866 + */
  867 + TextIconOverlay.prototype._updateText = function(){
  868 + if (this._domElement) {
  869 + this._domElement.innerHTML = this._text;
  870 + }
  871 + };
  872 +
  873 + /**
  874 + *调整覆盖物在地图上的位置更新覆盖物的显示文字。
  875 + *@return 无返回值。
  876 + */
  877 + TextIconOverlay.prototype._updatePosition = function(){
  878 + if (this._domElement && this._position) {
  879 + var style = this._domElement.style;
  880 + var pixelPosition= this._map.pointToOverlayPixel(this._position);
  881 + pixelPosition.x -= Math.ceil(parseInt(style.width) / 2);
  882 + pixelPosition.y -= Math.ceil(parseInt(style.height) / 2);
  883 + style.left = pixelPosition.x + "px";
  884 + style.top = pixelPosition.y + "px";
  885 + }
  886 + };
  887 +
  888 + /**
  889 + * 为该覆盖物的HTML元素构建CSS
  890 + * @param {IconStyle} 一个图标的风格。
  891 + * @return {String} 构建完成的CSSTEXT。
  892 + */
  893 + TextIconOverlay.prototype._buildCssText = function(style) {
  894 + //根据style来确定一些默认值
  895 + var url = style['url'];
  896 + var size = style['size'];
  897 + var anchor = style['anchor'];
  898 + var offset = style['offset'];
  899 + var textColor = style['textColor'] || 'black';
  900 + var textSize = style['textSize'] || 10;
  901 +
  902 + var csstext = [];
  903 + if (T.browser["ie"] < 7) {
  904 + csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' +
  905 + 'sizingMethod=scale,src="' + url + '");');
  906 + } else {
  907 + csstext.push('background-image:url(' + url + ');');
  908 + var backgroundPosition = '0 0';
  909 + (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px');
  910 + csstext.push('background-position:' + backgroundPosition + ';');
  911 + }
  912 +
  913 + if (size instanceof BMap.Size){
  914 + if (anchor instanceof BMap.Size) {
  915 + if (anchor.height > 0 && anchor.height < size.height) {
  916 + csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;');
  917 + }
  918 + if(anchor.width > 0 && anchor.width < size.width){
  919 + csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;');
  920 + }
  921 + } else {
  922 + csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;');
  923 + csstext.push('width:' + size.width + 'px; text-align:center;');
  924 + }
  925 + }
  926 +
  927 + csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' +
  928 + textSize + 'px; font-family:Arial,sans-serif; font-weight:bold');
  929 + return csstext.join('');
  930 + };
  931 +
  932 +
  933 + /**
  934 +
  935 + * 当鼠标点击该覆盖物时会触发该事件
  936 +
  937 + * @name TextIconOverlay#click
  938 +
  939 + * @event
  940 +
  941 + * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:
  942 +
  943 + * <br />"<b>type</b> : {String} 事件类型
  944 +
  945 + * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标
  946 +
  947 + *
  948 +
  949 + */
  950 +
  951 + /**
  952 +
  953 + * 当鼠标进入该覆盖物区域时会触发该事件
  954 +
  955 + * @name TextIconOverlay#mouseover
  956 +
  957 + * @event
  958 + * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:
  959 +
  960 + * <br />"<b>type</b> : {String} 事件类型
  961 +
  962 + * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标
  963 +
  964 + * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象
  965 +
  966 + * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象
  967 +
  968 + *
  969 +
  970 + * @example <b>参考示例:</b><br />
  971 +
  972 + * myTextIconOverlay.addEventListener("mouseover", function(e) { alert(e.point); });
  973 +
  974 + */
  975 +
  976 + /**
  977 +
  978 + * 当鼠标离开该覆盖物区域时会触发该事件
  979 +
  980 + * @name TextIconOverlay#mouseout
  981 +
  982 + * @event
  983 +
  984 + * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:
  985 +
  986 + * <br />"<b>type</b> : {String} 事件类型
  987 +
  988 + * <br />"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标
  989 +
  990 + * <br />"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象
  991 +
  992 + * <br />"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象
  993 +
  994 + *
  995 +
  996 + * @example <b>参考示例:</b><br />
  997 +
  998 + * myTextIconOverlay.addEventListener("mouseout", function(e) { alert(e.point); });
  999 +
  1000 + */
  1001 +
  1002 +
  1003 + /**
  1004 + * 为该覆盖物绑定一系列事件
  1005 + * 当前支持click mouseover mouseout
  1006 + * @return 无返回值。
  1007 + */
  1008 + TextIconOverlay.prototype._bind = function(){
  1009 + if (!this._domElement){
  1010 + return;
  1011 + }
  1012 +
  1013 + var me = this;
  1014 + var map = this._map;
  1015 +
  1016 + var BaseEvent = T.lang.Event;
  1017 + function eventExtend(e, be){
  1018 + var elem = e.srcElement || e.target;
  1019 + var x = e.clientX || e.pageX;
  1020 + var y = e.clientY || e.pageY;
  1021 + if (e && be && x && y && elem){
  1022 + var offset = T.dom.getPosition(map.getContainer());
  1023 + be.pixel = new BMap.Pixel(x - offset.left, y - offset.top);
  1024 + be.point = map.pixelToPoint(be.pixel);
  1025 + }
  1026 + return be;
  1027 + }//给事件参数增加pixel和point两个值
  1028 +
  1029 + T.event.on(this._domElement,"mouseover", function(e){
  1030 + me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseover")));
  1031 + });
  1032 + T.event.on(this._domElement,"mouseout", function(e){
  1033 + me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseout")));
  1034 + });
  1035 + T.event.on(this._domElement,"click", function(e){
  1036 + me.dispatchEvent(eventExtend(e, new BaseEvent("onclick")));
  1037 + });
  1038 + };
  1039 +
1040 })(); 1040 })();
1041 \ No newline at end of file 1041 \ No newline at end of file
src/main/resources/static/gpsTest/test.html
1 -<!DOCTYPE html>  
2 -<html>  
3 -<head>  
4 -<meta charset="UTF-8">  
5 -<title>GPS点测试</title>  
6 -<meta name=”renderer” content=”webkit”>  
7 -<meta http-equiv=”X-UA-Compatible” content=”IE=Edge,chrome=1″>  
8 -  
9 -<meta http-equiv="Pragma" content="no-cache">  
10 -<meta http-equiv="Cache-control" content="no-cache">  
11 -<meta http-equiv="Cache" content="no-cache">  
12 -<head>  
13 -<!-- select2 下拉框插件 -->  
14 -<link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css"  
15 - rel="stylesheet" type="text/css" />  
16 -<style type="text/css">  
17 -html,body {  
18 - height: 100%;  
19 - overflow: hidden;  
20 -}  
21 -  
22 -#mapContainer {  
23 - width: 100%;  
24 - height: calc(100% - 93px);  
25 -}  
26 -  
27 -form {  
28 - padding: 25px;  
29 -}  
30 -  
31 -form .item {  
32 - display: inline-block;  
33 -}  
34 -  
35 -form .item input {  
36 - height: 26px;  
37 - width: 110px;  
38 -}  
39 -  
40 -form .item select {  
41 - height: 32px;  
42 -}  
43 -</style>  
44 -</head>  
45 -<body>  
46 - <form action="">  
47 - <div class="item">  
48 - 线路: <select name="xl" style="width: 150px;">  
49 - </select>  
50 - </div>  
51 - <div class="item">  
52 - 方向: <select name="directions" style="width: 70px;">  
53 - <option value="0">上行</option>  
54 - <option value="1">下行</option>  
55 - </select>  
56 - </div>  
57 - <div class="item">  
58 - 设备号: <input name="device" value="059L0903" />  
59 - </div>  
60 - <div class="item">  
61 - 开始时间戳: <input type="number" name="startTime" value="1461380940000" />  
62 - </div>  
63 - <div class="item">  
64 - 结束时间戳: <input type="number" name="endTime" value="1461381960000" />  
65 - </div>  
66 - <div class="item">  
67 - <input type="button" value="查询GPS轨迹" onclick="searchGps()">  
68 - </div>  
69 - <div class="item">  
70 - <input type="button" value="开启测距" onclick="myDis.open();"  
71 - style="width: 75px" /> <input type="button" value="关闭测距"  
72 - onclick="myDis.close()" style="width: 75px" />  
73 -  
74 - </div>  
75 -  
76 - <div class="item">  
77 - <a target="_blank" href="http://tool.chinaz.com/Tools/unixtime.aspx"  
78 - style="font-size: 12px; color: red;">毫秒时间戳转换</a>  
79 - </div>  
80 - </form>  
81 -  
82 - <div id="mapContainer"></div>  
83 - <script src="/assets/plugins/pinyin.js"></script>  
84 - <script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>  
85 - <script src="/assets/plugins/jquery.serializejson.js"></script>  
86 - <script  
87 - src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script>  
88 - <script type="text/javascript"  
89 - src="http://api.map.baidu.com/library/DistanceTool/1.2/src/DistanceTool_min.js"></script>  
90 - <!-- moment.js 日期处理类库 -->  
91 - <script src="/assets/plugins/moment-with-locales.js"></script>  
92 - <!-- select2 下拉框 -->  
93 - <script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script>  
94 - <script>  
95 -  
96 - var inMark = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA1CAYAAABSrotqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAGW0lEQVRYw62XX2wc1RWHv3vv7NhrQkKCIa0poaKRmjdUFUGr+IH+ITy0Kg/0qVRV1ZamVV95al94oPSBVmoRUZTIKRFBLW1aapBK6gIChYTgFJRQHoITqCCO7eC1vY7t2Z1/954+zK69Xs9mx4mPdLWjmTvnO79z7zl3VlHAvv3XmXuM8R4EBpVSu1DqpiQRBJlH5APn5KQ4NzzycP/pbr7U1R5+6y+Vr2njP6EVX1FKoRTZAOJUQMBlP4gIIrwtNvnlyMO3vL4u4AND49vMjZsOaqMfUgpMA+ZEiBJIrJAkQslT+B4YrXACzknj1x4N6rWfnfrJ7XNdgd888NEOs+XmEaPVLq0zRVEiRGnmsGlJsnKtFfT4ih5PIQJWwDr3QRJUHzix9wsXOwLvOzDW72269ZQxeqcxIAL1WLAtoDzgMlgr+vwsG6kTrOXDoDL91Xcf/eLM8pxWuJT7j4hSO5UC66AW5cM6mXNCEDmsA60UAjv9rf1HWoU1L9Tg0OT3dU/5Wd9TeFpRiwWRFZhNhSvTMbX5hDh0uNhR6jWUb/LYvL0H460kSyko+xrrhCgVJAp/MPrzgecAMVkuH/PuuHv335VSW3s8TZgIrgUWzKdMXagRLqU4KygF4gRnhSiwLFZivF6N32tWAhTwPUWSCmhz18RC3z4+fsNpgN3f+/H9oO4ESO3qNNaupFQ+qWeRa5U7AGY/rlO7kq5Kb+qkUUrqzru/+8M9zTXUeKUHs92miG3LmlhhbjJCGVVoVCdCnG3ZyamgVRaQLvV+B9AeoJUu3QtgdLZWy6mspgigzdpyFS+/ZwTVhBv7/WyOgDbZBtTa3NMEKqX0Dsg6RqvFoUN3cOyczr2f1F3+FtbmDkB5gEKzFQFr215OBe3lO9Yu33GSrg47XUnxtiYQRKUgpdadCaAbnSMfmK+8Pf3L74ssATSAtorSt7a/vKnPUA87pMhTa9cAKJfzMwKysAwU56aUWQvcssUQJ/lA6aBw8xaPJHe+m4asLERcOpb3cvkGg1/SeEatGSZn+CVFeZPJDQRnxwDJgDY5nzcniIXbBkq5zo3Jyqg5PAMDAz5BlL/oLo0uLAOT4MqZvEnWCbEoPjfgU/LUKoDRK/BSSXHbgE8kqmOzt+HiGUA8QBY+Ov127823u0YAq1VGDno0n9/hs7BoWQocSSKIQKmk6OvTbN5sqAZCLeqw3uBmz791ChBFdmL4g4dnziptdnXYYhit2FxWlH2N72WHcmqhFjkW61c/xsTZc6OP3PIlIPayAHA2Dt/wem/oCLROqAZCNchU5B3AnczF9dcBR0sKxQZzI4U9rNOS+vwrDWHLJ76bOH7gTZBwo2GCBDOv/OF4Q+EyUCb+sW/JJeGxDQfG4b8vjRwK2hUKYNPF6gsbDUyC6lHAtgMB3NTfnv5ns+dtkL6F2eF9/6KRznagXDyxvyZx9PJG4WxUf+niif01Wtr8KiBgo8VPj24UMA5mXqAlne1AAPfhc79+DZHZ66aJq0wM/eJVWtKZB5Tqu0frNlr80/Xy0jB4fmbsZNQVCNj6+LlDoFxh7+2mkHjy3OFGOtse5U2H3sE/Xn5ZeT33dfJ5tdYmNjk5+tPt9wMhbd8Fed8DAqTJwuyhaxWYLM4MASk5HyGdPkDshT8/+hLiLq8XJuIu/+/Ir4bz0nk1oMyNHgttuPTseoGuvnh4/uzwqtorBATszNnXDqyvoUu48N6rB2mrvSJAAHd+/48mbVgr3AhsGDw/NvTIFG2lUBQoQFr/5L2nipSIgAvH//s0HTZL01QXPwro3X3o8rAu9expfdBeFpJGx0b3fvYhckqhqMJllVFl/PfdFNanx5/qpq6IwmZQvYPPTB9XpvTlPIWSxqOjez/z9YY6181ZN3NAEs5d+k2nCfHc5JNA0g1WVGGLyspbynh3tSp0aXLm9N7tg0XUFVXYVJlG81NPrlE3P/k7srUr1OyLAgHS/zzxjRex9v3mDbHp+2d/u+fFBrBwqoqaUKnEYfXS480b4dzk41QqMV125vWYBvoGn5l+596Dn74D9K0z6MY/4M7WvqkESOPK+GNRlsRm3eXNK+SwVYkPlBpBacA05uvGfVgpBSFr2K4RRALE5GykTif+toZT1WFu87pVSft1Asy1q70WhYrVwOa4ZoXred7JOq7h/wF6az0ukZgX/AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wNy0yNVQyMTo1MDo0MyswODowMOgS43cAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTMtMTEtMjBUMjI6NDc6MTErMDg6MDAou1syAAAATnRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA2LjguOC0xMCBRMTYgeDg2XzY0IDIwMTUtMDctMTkgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmcFDJw1AAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAA1Mwmpb+QAAAAWdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjgpleAmAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADEzODQ5NTg4MzEXUMEwAAAAE3RFWHRUaHVtYjo6U2l6ZQA0LjUzS0JC/AyPiAAAAFp0RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzExMjk3LzExMjk3NzIucG5nqXNeUQAAAABJRU5ErkJggg==';  
97 - var outMark = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAvCAMAAAC18jgTAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABO1BMVEUAAAAiu4ggv40gvowgvowgvosgvowfvo0jv44hv40gvosgvowcxo4fvowgvowdvYogv4whvo0gvowhvYwrqoAhv4wnxIkgv4wA//8gvIshvosgvowhvIshvowgvowrv5Ugv4ohvosgvowhv4wgv4whvYwXuYsgvowgvowiu4gfvo0zzJkhvowktpIgvowgv40hvo0gv4wgvowAqqogvosgvowjv4sgvowivIskv4khvowgvYsiu44hvosfvI0hv4sgvYofvowgvowgv40gv4wjuYsgvowhvowfvIsgvYsgvo0hvoxAv4Agv4wgvowgvoshvo0mv4whvowgvowfwo8gv4wgv40duokAAAAfvYsgvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAYjGUYj2kAAAAAAAAAAAAgvoz///9v2GMAAAAAZ3RSTlMAD1eZyOr4miSc950Jivoj0i/pfAarDaoBWH3JLuv5DDDL0ZunbQvu/h6CBbQO5jhOkNwDtfAsz0Qc42EtdUGLYKKOwsYW7/s5f7nMBCj9N40U8/YZh48aAaOmAggNERMWF0lLGBkanzLKGQAAAAFiS0dEaMts9CIAAAGZSURBVDjLfZRnW8IwFIUvyN6FUlCx4AZxKw7cA/eeKKNUwfz/f2ChZNAmnC+U+54m9548KQCRwznicns8bpfX6QC7fP4AIgoEfRYcCkfQgCLhEMujMWRTLEq55EYcuSXyPpcbjv4aoRgSKGb2EUZChXvzRcSGSHfaIP0fT0iyLCXitOI38qP5JBWzKSVFE3OAk/I0HiudJMVR8JL1FRqMQgb3ggs/Jthox3B1HIg3wxoyuDoBKn6UWYOMqyp4uIYsNfC3yNEtJoc3OQXT3DFJmDNMUCkaFI1yFubmqcMedb4AsMAeVqaYzbGHtWj4l5bFx51f6a64mhca/OaeayK+3m9qY5PPS1tk7G0eV3doMLtlToN7bLT7JZvhYPByHqoWfmS93ceD/CRtNcApy89kG4fiOeXlCucLAoULzC+vgCvSxjUIdGPy2zuR4b53jx8eQagn5gi5en5B6PVtiAHeEfoYxqHiUT9FrNrT17f5a8O1eqOptXT951fXW1qzUa9ZXtfanU7nry/jsa1VuSsYtjZ3BdIDFin/A1AVNdoKDyAYAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA3LTI1VDIxOjUwOjQzKzA4OjAw6BLjdwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMy0xMS0yMFQyMjo0NzoxMyswODowML8kShsAAABOdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDYuOC44LTEwIFExNiB4ODZfNjQgMjAxNS0wNy0xOSBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZwUMnDUAAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAXdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADQ3F9+avAAAABZ0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAzMtBbOHkAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTM4NDk1ODgzM/leoBwAAAATdEVYdFRodW1iOjpTaXplADQuMDFLQkKe5chzAAAAWnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvMTEyOTcvMTEyOTc4Ni5wbmetpUpEAAAAAElFTkSuQmCC';  
98 -  
99 - var inOuts = [outMark, inMark];  
100 -  
101 - var stationCodeMap = {};  
102 -  
103 - var map = new BMap.Map("mapContainer");  
104 - map.centerAndZoom(new BMap.Point(121.544336, 31.221315), 15);  
105 - map.enableScrollWheelZoom();  
106 - //中心点和缩放级别  
107 - map.setCurrentCity("上海");  
108 - var myDis = new BMapLib.DistanceTool(map);  
109 -  
110 -  
111 - $.get('/line/all', function(rs){  
112 - var data = [];  
113 - $.each(rs, function(){  
114 - data.push({id: this.id, text: this.name});  
115 - });  
116 -  
117 - initPinYinSelect2('select[name=xl]', data);  
118 - });  
119 -  
120 - function searchGps(){  
121 - var params = $('form').serializeJSON();  
122 - //查询线路路由站点  
123 - $.get('/test/gps/route', params, function(rs){  
124 - var array = rs[0].children[0].children  
125 - ,coords,circle, cdsArray, points, polygon;  
126 - //画出站点  
127 - console.log(array);  
128 - $.each(array, function(){  
129 - stationCodeMap[this.stationStationCod] = this.name;  
130 - if(this.stationShapesType === 'r'){  
131 - //画圆  
132 - coords = this.stationBJwpoints.split(' ');  
133 - circle = new BMap.Circle(new BMap.Point(coords[0], coords[1]),this.stationRadius);  
134 - circle.setStrokeColor('red');  
135 - circle.setStrokeWeight(2)  
136 - map.addOverlay(circle);  
137 - }  
138 - else if(this.stationShapesType === 'd'){  
139 - //画多边形  
140 - coords = this.stationBPolygonGrid.substring(9, this.stationBPolygonGrid.length - 2);  
141 - cdsArray = coords.split(',');  
142 - points = [];  
143 - $.each(cdsArray, function(){  
144 - coords = this.split(' ');  
145 - points.push(new BMap.Point(coords[0], coords[1]));  
146 - });  
147 -  
148 - polygon = new BMap.Polygon(points, {strokeColor:"red", strokeWeight:2, strokeOpacity:0.5});  
149 - map.addOverlay(polygon);  
150 - }  
151 - });  
152 - coords = array[array.length / 2].stationBJwpoints.split(' ');  
153 - map.setCenter(new BMap.Point(coords[0], coords[1]))  
154 - });  
155 -  
156 - //查询gps点  
157 - $.get('/gps/history/' + params.device, params, function(gpsArray){  
158 - console.log(stationCodeMap);  
159 - var marker, label, point, state, text;  
160 - $.each(gpsArray, function(){  
161 - point = new BMap.Point(this.lon, this.lat);  
162 - marker = new BMap.Marker(point);  
163 - state = this.inout_stop;  
164 -  
165 - if(state == 0 || state == 1){  
166 - text = state == 0?'出':'进';  
167 -  
168 - console.log(stationCodeMap[this.stopNo], this);  
169 - marker.setIcon(new BMap.Icon(inOuts[this.inout_stop], new BMap.Size(25,25)));  
170 - label = new BMap.Label(  
171 - stationCodeMap[this.stopNo] + '/' +moment(this.ts).format('HH:mm.ss') + ' -'+text  
172 - , {position: point, offset: new BMap.Size(-25,-18)});  
173 - marker.setLabel(label);  
174 - }  
175 - else{  
176 - label = new BMap.Label(moment(this.ts).format('HH:mm.ss')  
177 - , {position: point, offset: new BMap.Size(-25,-18)});  
178 - marker.setLabel(label);  
179 - }  
180 -  
181 - map.addOverlay(marker);  
182 - });  
183 - });  
184 - }  
185 -  
186 -  
187 - /**  
188 - * 支持拼音搜索的select2  
189 - * @param selector  
190 - * @param data  
191 - */  
192 - function initPinYinSelect2(selector, data, cb){  
193 -  
194 - $.each(data, function(){  
195 - this.fullChars = pinyin.getFullChars(this.text).toUpperCase();  
196 - this.camelChars = pinyin.getCamelChars(this.text);  
197 - });  
198 -  
199 - $.fn.select2.amd.require(['select2/compat/matcher'], function (oldMatcher) {  
200 - $(selector).select2({  
201 - data: data,  
202 - matcher: oldMatcher(function(term, text, item){  
203 - var upTerm = term.toUpperCase();  
204 - if(item.fullChars.indexOf(upTerm) != -1  
205 - || item.camelChars.indexOf(upTerm) != -1)  
206 - return true;  
207 -  
208 - return text.indexOf(term) != -1;  
209 - })  
210 - });  
211 -  
212 - cb && cb();  
213 - });  
214 -  
215 - return $(selector);  
216 - }  
217 -</script>  
218 -</body>  
219 -</html> 1 +<!DOCTYPE html>
  2 +<html>
  3 +<head>
  4 +<meta charset="UTF-8">
  5 +<title>GPS点测试</title>
  6 +<meta name=”renderer” content=”webkit”>
  7 +<meta http-equiv=”X-UA-Compatible” content=”IE=Edge,chrome=1″>
  8 +
  9 +<meta http-equiv="Pragma" content="no-cache">
  10 +<meta http-equiv="Cache-control" content="no-cache">
  11 +<meta http-equiv="Cache" content="no-cache">
  12 +<head>
  13 +<!-- select2 下拉框插件 -->
  14 +<link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css"
  15 + rel="stylesheet" type="text/css" />
  16 +<style type="text/css">
  17 +html,body {
  18 + height: 100%;
  19 + overflow: hidden;
  20 +}
  21 +
  22 +#mapContainer {
  23 + width: 100%;
  24 + height: calc(100% - 93px);
  25 +}
  26 +
  27 +form {
  28 + padding: 25px;
  29 +}
  30 +
  31 +form .item {
  32 + display: inline-block;
  33 +}
  34 +
  35 +form .item input {
  36 + height: 26px;
  37 + width: 110px;
  38 +}
  39 +
  40 +form .item select {
  41 + height: 32px;
  42 +}
  43 +</style>
  44 +</head>
  45 +<body>
  46 + <form action="">
  47 + <div class="item">
  48 + 线路: <select name="xl" style="width: 150px;">
  49 + </select>
  50 + </div>
  51 + <div class="item">
  52 + 方向: <select name="directions" style="width: 70px;">
  53 + <option value="0">上行</option>
  54 + <option value="1">下行</option>
  55 + </select>
  56 + </div>
  57 + <div class="item">
  58 + 设备号: <input name="device" value="059L0903" />
  59 + </div>
  60 + <div class="item">
  61 + 开始时间戳: <input type="number" name="startTime" value="1461380940000" />
  62 + </div>
  63 + <div class="item">
  64 + 结束时间戳: <input type="number" name="endTime" value="1461381960000" />
  65 + </div>
  66 + <div class="item">
  67 + <input type="button" value="查询GPS轨迹" onclick="searchGps()">
  68 + </div>
  69 + <div class="item">
  70 + <input type="button" value="开启测距" onclick="myDis.open();"
  71 + style="width: 75px" /> <input type="button" value="关闭测距"
  72 + onclick="myDis.close()" style="width: 75px" />
  73 +
  74 + </div>
  75 +
  76 + <div class="item">
  77 + <a target="_blank" href="http://tool.chinaz.com/Tools/unixtime.aspx"
  78 + style="font-size: 12px; color: red;">毫秒时间戳转换</a>
  79 + </div>
  80 + </form>
  81 +
  82 + <div id="mapContainer"></div>
  83 + <script src="/assets/plugins/pinyin.js"></script>
  84 + <script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>
  85 + <script src="/assets/plugins/jquery.serializejson.js"></script>
  86 + <script
  87 + src="//api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script>
  88 + <script type="text/javascript"
  89 + src="//api.map.baidu.com/library/DistanceTool/1.2/src/DistanceTool_min.js"></script>
  90 + <!-- moment.js 日期处理类库 -->
  91 + <script src="/assets/plugins/moment-with-locales.js"></script>
  92 + <!-- select2 下拉框 -->
  93 + <script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script>
  94 + <script>
  95 +
  96 + var inMark = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA1CAYAAABSrotqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAGW0lEQVRYw62XX2wc1RWHv3vv7NhrQkKCIa0poaKRmjdUFUGr+IH+ITy0Kg/0qVRV1ZamVV95al94oPSBVmoRUZTIKRFBLW1aapBK6gIChYTgFJRQHoITqCCO7eC1vY7t2Z1/954+zK69Xs9mx4mPdLWjmTvnO79z7zl3VlHAvv3XmXuM8R4EBpVSu1DqpiQRBJlH5APn5KQ4NzzycP/pbr7U1R5+6y+Vr2njP6EVX1FKoRTZAOJUQMBlP4gIIrwtNvnlyMO3vL4u4AND49vMjZsOaqMfUgpMA+ZEiBJIrJAkQslT+B4YrXACzknj1x4N6rWfnfrJ7XNdgd888NEOs+XmEaPVLq0zRVEiRGnmsGlJsnKtFfT4ih5PIQJWwDr3QRJUHzix9wsXOwLvOzDW72269ZQxeqcxIAL1WLAtoDzgMlgr+vwsG6kTrOXDoDL91Xcf/eLM8pxWuJT7j4hSO5UC66AW5cM6mXNCEDmsA60UAjv9rf1HWoU1L9Tg0OT3dU/5Wd9TeFpRiwWRFZhNhSvTMbX5hDh0uNhR6jWUb/LYvL0H460kSyko+xrrhCgVJAp/MPrzgecAMVkuH/PuuHv335VSW3s8TZgIrgUWzKdMXagRLqU4KygF4gRnhSiwLFZivF6N32tWAhTwPUWSCmhz18RC3z4+fsNpgN3f+/H9oO4ESO3qNNaupFQ+qWeRa5U7AGY/rlO7kq5Kb+qkUUrqzru/+8M9zTXUeKUHs92miG3LmlhhbjJCGVVoVCdCnG3ZyamgVRaQLvV+B9AeoJUu3QtgdLZWy6mspgigzdpyFS+/ZwTVhBv7/WyOgDbZBtTa3NMEKqX0Dsg6RqvFoUN3cOyczr2f1F3+FtbmDkB5gEKzFQFr215OBe3lO9Yu33GSrg47XUnxtiYQRKUgpdadCaAbnSMfmK+8Pf3L74ssATSAtorSt7a/vKnPUA87pMhTa9cAKJfzMwKysAwU56aUWQvcssUQJ/lA6aBw8xaPJHe+m4asLERcOpb3cvkGg1/SeEatGSZn+CVFeZPJDQRnxwDJgDY5nzcniIXbBkq5zo3Jyqg5PAMDAz5BlL/oLo0uLAOT4MqZvEnWCbEoPjfgU/LUKoDRK/BSSXHbgE8kqmOzt+HiGUA8QBY+Ov127823u0YAq1VGDno0n9/hs7BoWQocSSKIQKmk6OvTbN5sqAZCLeqw3uBmz791ChBFdmL4g4dnziptdnXYYhit2FxWlH2N72WHcmqhFjkW61c/xsTZc6OP3PIlIPayAHA2Dt/wem/oCLROqAZCNchU5B3AnczF9dcBR0sKxQZzI4U9rNOS+vwrDWHLJ76bOH7gTZBwo2GCBDOv/OF4Q+EyUCb+sW/JJeGxDQfG4b8vjRwK2hUKYNPF6gsbDUyC6lHAtgMB3NTfnv5ns+dtkL6F2eF9/6KRznagXDyxvyZx9PJG4WxUf+niif01Wtr8KiBgo8VPj24UMA5mXqAlne1AAPfhc79+DZHZ66aJq0wM/eJVWtKZB5Tqu0frNlr80/Xy0jB4fmbsZNQVCNj6+LlDoFxh7+2mkHjy3OFGOtse5U2H3sE/Xn5ZeT33dfJ5tdYmNjk5+tPt9wMhbd8Fed8DAqTJwuyhaxWYLM4MASk5HyGdPkDshT8/+hLiLq8XJuIu/+/Ir4bz0nk1oMyNHgttuPTseoGuvnh4/uzwqtorBATszNnXDqyvoUu48N6rB2mrvSJAAHd+/48mbVgr3AhsGDw/NvTIFG2lUBQoQFr/5L2nipSIgAvH//s0HTZL01QXPwro3X3o8rAu9expfdBeFpJGx0b3fvYhckqhqMJllVFl/PfdFNanx5/qpq6IwmZQvYPPTB9XpvTlPIWSxqOjez/z9YY6181ZN3NAEs5d+k2nCfHc5JNA0g1WVGGLyspbynh3tSp0aXLm9N7tg0XUFVXYVJlG81NPrlE3P/k7srUr1OyLAgHS/zzxjRex9v3mDbHp+2d/u+fFBrBwqoqaUKnEYfXS480b4dzk41QqMV125vWYBvoGn5l+596Dn74D9K0z6MY/4M7WvqkESOPK+GNRlsRm3eXNK+SwVYkPlBpBacA05uvGfVgpBSFr2K4RRALE5GykTif+toZT1WFu87pVSft1Asy1q70WhYrVwOa4ZoXred7JOq7h/wF6az0ukZgX/AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wNy0yNVQyMTo1MDo0MyswODowMOgS43cAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTMtMTEtMjBUMjI6NDc6MTErMDg6MDAou1syAAAATnRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA2LjguOC0xMCBRMTYgeDg2XzY0IDIwMTUtMDctMTkgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmcFDJw1AAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAA1Mwmpb+QAAAAWdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjgpleAmAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADEzODQ5NTg4MzEXUMEwAAAAE3RFWHRUaHVtYjo6U2l6ZQA0LjUzS0JC/AyPiAAAAFp0RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzExMjk3LzExMjk3NzIucG5nqXNeUQAAAABJRU5ErkJggg==';
  97 + var outMark = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAvCAMAAAC18jgTAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABO1BMVEUAAAAiu4ggv40gvowgvowgvosgvowfvo0jv44hv40gvosgvowcxo4fvowgvowdvYogv4whvo0gvowhvYwrqoAhv4wnxIkgv4wA//8gvIshvosgvowhvIshvowgvowrv5Ugv4ohvosgvowhv4wgv4whvYwXuYsgvowgvowiu4gfvo0zzJkhvowktpIgvowgv40hvo0gv4wgvowAqqogvosgvowjv4sgvowivIskv4khvowgvYsiu44hvosfvI0hv4sgvYofvowgvowgv40gv4wjuYsgvowhvowfvIsgvYsgvo0hvoxAv4Agv4wgvowgvoshvo0mv4whvowgvowfwo8gv4wgv40duokAAAAfvYsgvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAYjGUYj2kAAAAAAAAAAAAgvoz///9v2GMAAAAAZ3RSTlMAD1eZyOr4miSc950Jivoj0i/pfAarDaoBWH3JLuv5DDDL0ZunbQvu/h6CBbQO5jhOkNwDtfAsz0Qc42EtdUGLYKKOwsYW7/s5f7nMBCj9N40U8/YZh48aAaOmAggNERMWF0lLGBkanzLKGQAAAAFiS0dEaMts9CIAAAGZSURBVDjLfZRnW8IwFIUvyN6FUlCx4AZxKw7cA/eeKKNUwfz/f2ChZNAmnC+U+54m9548KQCRwznicns8bpfX6QC7fP4AIgoEfRYcCkfQgCLhEMujMWRTLEq55EYcuSXyPpcbjv4aoRgSKGb2EUZChXvzRcSGSHfaIP0fT0iyLCXitOI38qP5JBWzKSVFE3OAk/I0HiudJMVR8JL1FRqMQgb3ggs/Jthox3B1HIg3wxoyuDoBKn6UWYOMqyp4uIYsNfC3yNEtJoc3OQXT3DFJmDNMUCkaFI1yFubmqcMedb4AsMAeVqaYzbGHtWj4l5bFx51f6a64mhca/OaeayK+3m9qY5PPS1tk7G0eV3doMLtlToN7bLT7JZvhYPByHqoWfmS93ceD/CRtNcApy89kG4fiOeXlCucLAoULzC+vgCvSxjUIdGPy2zuR4b53jx8eQagn5gi5en5B6PVtiAHeEfoYxqHiUT9FrNrT17f5a8O1eqOptXT951fXW1qzUa9ZXtfanU7nry/jsa1VuSsYtjZ3BdIDFin/A1AVNdoKDyAYAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA3LTI1VDIxOjUwOjQzKzA4OjAw6BLjdwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMy0xMS0yMFQyMjo0NzoxMyswODowML8kShsAAABOdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDYuOC44LTEwIFExNiB4ODZfNjQgMjAxNS0wNy0xOSBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZwUMnDUAAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAXdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADQ3F9+avAAAABZ0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAzMtBbOHkAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTM4NDk1ODgzM/leoBwAAAATdEVYdFRodW1iOjpTaXplADQuMDFLQkKe5chzAAAAWnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvMTEyOTcvMTEyOTc4Ni5wbmetpUpEAAAAAElFTkSuQmCC';
  98 +
  99 + var inOuts = [outMark, inMark];
  100 +
  101 + var stationCodeMap = {};
  102 +
  103 + var map = new BMap.Map("mapContainer");
  104 + map.centerAndZoom(new BMap.Point(121.544336, 31.221315), 15);
  105 + map.enableScrollWheelZoom();
  106 + //中心点和缩放级别
  107 + map.setCurrentCity("上海");
  108 + var myDis = new BMapLib.DistanceTool(map);
  109 +
  110 +
  111 + $.get('/line/all', function(rs){
  112 + var data = [];
  113 + $.each(rs, function(){
  114 + data.push({id: this.id, text: this.name});
  115 + });
  116 +
  117 + initPinYinSelect2('select[name=xl]', data);
  118 + });
  119 +
  120 + function searchGps(){
  121 + var params = $('form').serializeJSON();
  122 + //查询线路路由站点
  123 + $.get('/test/gps/route', params, function(rs){
  124 + var array = rs[0].children[0].children
  125 + ,coords,circle, cdsArray, points, polygon;
  126 + //画出站点
  127 + console.log(array);
  128 + $.each(array, function(){
  129 + stationCodeMap[this.stationStationCod] = this.name;
  130 + if(this.stationShapesType === 'r'){
  131 + //画圆
  132 + coords = this.stationBJwpoints.split(' ');
  133 + circle = new BMap.Circle(new BMap.Point(coords[0], coords[1]),this.stationRadius);
  134 + circle.setStrokeColor('red');
  135 + circle.setStrokeWeight(2)
  136 + map.addOverlay(circle);
  137 + }
  138 + else if(this.stationShapesType === 'd'){
  139 + //画多边形
  140 + coords = this.stationBPolygonGrid.substring(9, this.stationBPolygonGrid.length - 2);
  141 + cdsArray = coords.split(',');
  142 + points = [];
  143 + $.each(cdsArray, function(){
  144 + coords = this.split(' ');
  145 + points.push(new BMap.Point(coords[0], coords[1]));
  146 + });
  147 +
  148 + polygon = new BMap.Polygon(points, {strokeColor:"red", strokeWeight:2, strokeOpacity:0.5});
  149 + map.addOverlay(polygon);
  150 + }
  151 + });
  152 + coords = array[array.length / 2].stationBJwpoints.split(' ');
  153 + map.setCenter(new BMap.Point(coords[0], coords[1]))
  154 + });
  155 +
  156 + //查询gps点
  157 + $.get('/gps/history/' + params.device, params, function(gpsArray){
  158 + console.log(stationCodeMap);
  159 + var marker, label, point, state, text;
  160 + $.each(gpsArray, function(){
  161 + point = new BMap.Point(this.lon, this.lat);
  162 + marker = new BMap.Marker(point);
  163 + state = this.inout_stop;
  164 +
  165 + if(state == 0 || state == 1){
  166 + text = state == 0?'出':'进';
  167 +
  168 + console.log(stationCodeMap[this.stopNo], this);
  169 + marker.setIcon(new BMap.Icon(inOuts[this.inout_stop], new BMap.Size(25,25)));
  170 + label = new BMap.Label(
  171 + stationCodeMap[this.stopNo] + '/' +moment(this.ts).format('HH:mm.ss') + ' -'+text
  172 + , {position: point, offset: new BMap.Size(-25,-18)});
  173 + marker.setLabel(label);
  174 + }
  175 + else{
  176 + label = new BMap.Label(moment(this.ts).format('HH:mm.ss')
  177 + , {position: point, offset: new BMap.Size(-25,-18)});
  178 + marker.setLabel(label);
  179 + }
  180 +
  181 + map.addOverlay(marker);
  182 + });
  183 + });
  184 + }
  185 +
  186 +
  187 + /**
  188 + * 支持拼音搜索的select2
  189 + * @param selector
  190 + * @param data
  191 + */
  192 + function initPinYinSelect2(selector, data, cb){
  193 +
  194 + $.each(data, function(){
  195 + this.fullChars = pinyin.getFullChars(this.text).toUpperCase();
  196 + this.camelChars = pinyin.getCamelChars(this.text);
  197 + });
  198 +
  199 + $.fn.select2.amd.require(['select2/compat/matcher'], function (oldMatcher) {
  200 + $(selector).select2({
  201 + data: data,
  202 + matcher: oldMatcher(function(term, text, item){
  203 + var upTerm = term.toUpperCase();
  204 + if(item.fullChars.indexOf(upTerm) != -1
  205 + || item.camelChars.indexOf(upTerm) != -1)
  206 + return true;
  207 +
  208 + return text.indexOf(term) != -1;
  209 + })
  210 + });
  211 +
  212 + cb && cb();
  213 + });
  214 +
  215 + return $(selector);
  216 + }
  217 +</script>
  218 +</body>
  219 +</html>
src/main/resources/static/pages/base/geo_data_edit/main.html
1 -<!DOCTYPE html>  
2 -<html lang="zh-cn">  
3 -  
4 -<head>  
5 - <meta charset="UTF-8">  
6 - <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/>  
7 - <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" />  
8 - <!-- jquery contextMenu style -->  
9 - <link rel="stylesheet" href="/real_control_v2/assets/css/jquery.contextMenu.min.css" />  
10 - <link rel="stylesheet"  
11 - href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"  
12 - type="text/css" />  
13 - <!-- main css -->  
14 - <link rel="stylesheet" href="/pages/base/geo_data_edit/css/mian.css" />  
15 - <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css">  
16 -</head>  
17 -  
18 -<body>  
19 -<div class="loading">  
20 - <div><span uk-spinner></span><span class="text">正在加载...</span></div>  
21 -</div>  
22 -<div class="ct_page" >  
23 - <div class="instructions_tips uk-animation-slide-top-medium">  
24 - <button type="button" uk-close></button>  
25 - <div>  
26 - <h4>说明</h4>  
27 - <ul class="uk-list">  
28 - <li>1、所有的改道、缩线、并线等对走向调整都必须新建版本,以保留原走向版本。</li>  
29 - <li>2、只有在人工数据录入错误的情况下,才有理由对当前启用的版本进行走向编辑。</li>  
30 - <li>3、走向版本可以任意切换,但是必须维护好一个准确的“版本切换记录”。</li>  
31 - <hr>  
32 - <li>4、调整缓冲区、修改站点名称、修改路段名称 不算走向调整,不需要新建版本。</li>  
33 - </ul>  
34 - </div>  
35 - </div>  
36 - <div id="map_wrap"></div>  
37 - <div class="main_left_panel_m_layer"></div>  
38 - <div class="main_left_panel">  
39 - <div class="_line_info">  
40 - <div class="_line_name">  
41 - <a class="dropdown_txt"></a>  
42 - <div class="line_change_panel" uk-dropdown="mode: click">  
43 - <div class="uk-inline">  
44 - <a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: search"></a>  
45 - <input class="uk-input" type="text" id="line_search_input">  
46 - </div>  
47 - <ul class="uk-list"></ul>  
48 - </div>  
49 -  
50 -  
51 -  
52 - <a uk-icon="icon: trash" class="remove_line_version_icon uk-animation-slide-right-small" title="删除线路版本" style="display: none" uk-tooltip></a>  
53 - <a uk-icon="icon: plus" class="add_line_version_icon" title="新增一个线路版本" uk-tooltip></a>  
54 - </div>  
55 - <div class="_version_dropdown_wrap">  
56 - <a class="_version_text"></a>  
57 - <div uk-dropdown>  
58 - <ul class="uk-nav uk-dropdown-nav all_version_list">  
59 - </ul>  
60 - </div>  
61 - </div>  
62 - <a class="clock_enable_version"></a>  
63 - </div>  
64 -  
65 - <div class="_route_info_wrap">  
66 - <ul uk-tab>  
67 - <li><a>上行</a></li>  
68 - <li><a>下行</a></li>  
69 -  
70 - </ul>  
71 -  
72 - <ul class="uk-switcher uk-margin up_down_route_list">  
73 - <li>  
74 - <div class="station_route"></div>  
75 - <div class="road_route"></div>  
76 - </li>  
77 - <li>  
78 - <div class="station_route"></div>  
79 - <div class="road_route"></div>  
80 - </li>  
81 - </ul>  
82 - <div class="pos_tb_icon">  
83 - <a uk-icon="icon: chevron-down;"></a>  
84 - </div>  
85 - </div>  
86 - </div>  
87 - <div class="main_lt_search_panel">  
88 - <div class="uk-inline ct_s_i_wrap">  
89 - <span class="uk-form-icon uk-form-icon-flip" uk-icon="icon: search"></span>  
90 - <input class="uk-input ct_search_input" placeholder="搜索地图位置" type="text">  
91 - </div>  
92 - <div class="ct_search_result"></div>  
93 - </div>  
94 - <div class="main_rt_tools_panel">  
95 - <!--<a style="color: red;" uk-icon="icon: unlock;ratio: .9" class="_icon" title="当前版本有变更未启用" uk-tooltip="pos:bottom"></a>-->  
96 -  
97 - <a uk-icon="icon: bookmark;ratio: .9" class="_icon" title="走向版本变更记录" uk-tooltip="pos:bottom"></a>  
98 - <a uk-icon="icon: expand;ratio: .9" class="_icon full_screen_icon"></a>  
99 - </div>  
100 -</div>  
101 -  
102 -<script id="geo_d_e_search_result-temp" type="text/html">  
103 - <ul class="s_list uk-list">  
104 - {{each list as obj i}}  
105 - <li data-lat="{{obj.point.lat}}" data-lng="{{obj.point.lng}}">  
106 - <span class="_title">{{obj.title}}</span>  
107 - <span class="_address">{{obj.address}}</span>  
108 - </li>  
109 - {{/each}}  
110 -  
111 - {{if list.length==0}}  
112 - <li class="_empty">没有搜索到相关数据!</li>  
113 - {{/if}}  
114 - </ul>  
115 -</script>  
116 -  
117 -<script id="geo_d_e_dropdown_list-temp" type="text/html">  
118 - {{each list as obj i}}  
119 - <li data-code="{{obj.code}}">  
120 - <div class="name">{{obj.name}}</div>  
121 - <div class="code">{{obj.code}}</div>  
122 - </li>  
123 - {{/each}}  
124 - {{if ellipsis}}  
125 - <li>...</li>  
126 - {{/if}}  
127 -</script>  
128 -<!-- 百度 -->  
129 -<script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script>  
130 -<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>  
131 -<script src="/assets/plugins/uk3.0/uikit.min.js"></script>  
132 -<script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script>  
133 -<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" ></script>  
134 -<!-- EventProxy -->  
135 -<script src="/assets/js/eventproxy.js"></script>  
136 -<!-- art-template 模版引擎 -->  
137 -<script src="/assets/plugins/template.js"></script>  
138 -<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script>  
139 -<!-- jquery.serializejson JSON序列化插件 -->  
140 -<script src="/assets/plugins/jquery.serializejson.js" merge="plugins"></script>  
141 -<!-- common js -->  
142 -<script src="/pages/base/geo_data_edit/js/ct_common.js"></script>  
143 -<script src="/assets/js/TransGPS.js" ></script>  
144 -<!-- Geolib -->  
145 -<script src="/real_control_v2/geolib/geolib.js" ></script>  
146 -<!-- jquery contextMenu -->  
147 -<script src="/real_control_v2/assets/js/jquery.contextMenu.min.js" ></script>  
148 -<script src="/assets/js/baidu/bd_GeoUtils_min.js" ></script>  
149 -<!-- flatpickr -->  
150 -<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" ></script>  
151 -<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" ></script>  
152 -<script src="/assets/plugins/pinyin.js"></script>  
153 -  
154 -<script>  
155 - var $loadPanel = $('body>.loading');  
156 - //___________________________________  
157 - var storage = window.localStorage;  
158 - //___________________________________  
159 -  
160 - top.document.title = "绘制线路";  
161 -  
162 - // 关闭左侧栏  
163 - if (!top.$('body').hasClass('page-sidebar-closed')) {top.$('.menu-toggler.sidebar-toggler').click();}  
164 - //全屏  
165 - $('.full_screen_icon').on('click', function () {  
166 - var $iframe = window.parent.$('#geo_edit_wrap_iframe'),  
167 - icon;  
168 - if($(this).attr('uk-icon').indexOf('expand') != -1){  
169 - $iframe.addClass('full_screen');  
170 - icon = 'shrink';  
171 - }  
172 - else{  
173 - $iframe.removeClass('full_screen');  
174 - icon = 'expand';  
175 - }  
176 - $(this).attr('uk-icon', 'icon: '+icon+';ratio: .9');  
177 - });  
178 -  
179 - var gb_main_ep;  
180 - //文件加载  
181 - var res_load_ep = EventProxy.create('load_common_data', 'load_station_route','load_road_route'  
182 - , 'load_version_manage', 'load_history_edit_logs', 'load_map', function () {  
183 - startup(function () {  
184 - $('.instructions_tips').show();  
185 - });  
186 -  
187 - gb_change_line.init();  
188 - });  
189 -  
190 - var g_line_code;  
191 - var g_version;  
192 - var startup = function (cb) {  
193 - g_line_code = storage.getItem('geo_data_edit_line_code');  
194 -  
195 - gb_main_ep = new EventProxy();  
196 - var eq = gb_main_ep;  
197 -  
198 - //站点  
199 - gb_station_route.init(g_emit('init_road'));  
200 - //路段  
201 - eq.once('init_road', function () {  
202 - gb_road_route.init(g_emit('init_map'))  
203 - });  
204 - //地图  
205 - eq.once('init_map', function () {  
206 - gb_ct_map._render(g_emit('end'));  
207 - });  
208 -  
209 - eq.once('end', function () {  
210 - //线路版本信息  
211 - gb_version_manage.init(storage.getItem("geo_data_edit_line_version"));  
212 -  
213 - $loadPanel.hide();  
214 - gb_ct_search.init();  
215 -  
216 - cb && cb();  
217 - });  
218 - };  
219 -  
220 - var clearAll = function () {  
221 - $('.up_down_route_list .station_route').empty();  
222 - $('.up_down_route_list .road_route').empty();  
223 - gb_ct_map.clearAll();  
224 - };  
225 -  
226 - function g_emit(id) {  
227 - console.log('g_emit [' + id + ']');  
228 - return function () {  
229 - console.log('eq.emitLater(' + id + ')');  
230 - return gb_main_ep.emitLater(id);  
231 - };  
232 - }  
233 -  
234 - //滚动条  
235 - $('._route_info_wrap>ul.uk-switcher').perfectScrollbar({suppressScrollX: true});  
236 -  
237 - //to top btttom  
238 - $('.pos_tb_icon a').on('click', function () {  
239 - UIkit.notification('top top...');  
240 - });  
241 -  
242 - function getUpDown(){  
243 - return $('.up_down_route_list>li:first').hasClass('uk-active')?0:1;  
244 - }  
245 -  
246 - //切换上下行显示  
247 - $('.up_down_route_list').on('show', function () {  
248 - gb_ct_map.changeUpDown();  
249 - });  
250 -  
251 - $(document).on('submit', 'form', function (e) {  
252 - e.stopPropagation();  
253 - return false;  
254 - });  
255 -  
256 - $(document).on('click', 'button.cancel', function (e) {  
257 - e.stopPropagation();  
258 - return false;  
259 - });  
260 -  
261 - //关闭说明  
262 - $('.instructions_tips .uk-close').on('click', function () {  
263 - $('.instructions_tips').remove();  
264 - });  
265 -</script>  
266 -  
267 -  
268 -<script src="/pages/base/geo_data_edit/js/server_timer.js" ></script>  
269 -<!--- js -->  
270 -<script src="/pages/base/geo_data_edit/js/common_data.js" ></script>  
271 -<script src="/pages/base/geo_data_edit/js/station_route.js" ></script>  
272 -<script src="/pages/base/geo_data_edit/js/road_route.js" ></script>  
273 -<script src="/pages/base/geo_data_edit/js/version_manage.js" ></script>  
274 -<script src="/pages/base/geo_data_edit/js/history_edit_logs.js" ></script>  
275 -<script src="/pages/base/geo_data_edit/js/map.js" ></script>  
276 -<script src="/pages/base/geo_data_edit/js/submit.js" ></script>  
277 -<script src="/pages/base/geo_data_edit/js/search.js" ></script>  
278 -<script src="/pages/base/geo_data_edit/js/change_line.js" ></script>  
279 -  
280 -<script type="text/javascript"  
281 - src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>  
282 -</body> 1 +<!DOCTYPE html>
  2 +<html lang="zh-cn">
  3 +
  4 +<head>
  5 + <meta charset="UTF-8">
  6 + <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/>
  7 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" />
  8 + <!-- jquery contextMenu style -->
  9 + <link rel="stylesheet" href="/real_control_v2/assets/css/jquery.contextMenu.min.css" />
  10 + <link rel="stylesheet"
  11 + href="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"
  12 + type="text/css" />
  13 + <!-- main css -->
  14 + <link rel="stylesheet" href="/pages/base/geo_data_edit/css/mian.css" />
  15 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css">
  16 +</head>
  17 +
  18 +<body>
  19 +<div class="loading">
  20 + <div><span uk-spinner></span><span class="text">正在加载...</span></div>
  21 +</div>
  22 +<div class="ct_page" >
  23 + <div class="instructions_tips uk-animation-slide-top-medium">
  24 + <button type="button" uk-close></button>
  25 + <div>
  26 + <h4>说明</h4>
  27 + <ul class="uk-list">
  28 + <li>1、所有的改道、缩线、并线等对走向调整都必须新建版本,以保留原走向版本。</li>
  29 + <li>2、只有在人工数据录入错误的情况下,才有理由对当前启用的版本进行走向编辑。</li>
  30 + <li>3、走向版本可以任意切换,但是必须维护好一个准确的“版本切换记录”。</li>
  31 + <hr>
  32 + <li>4、调整缓冲区、修改站点名称、修改路段名称 不算走向调整,不需要新建版本。</li>
  33 + </ul>
  34 + </div>
  35 + </div>
  36 + <div id="map_wrap"></div>
  37 + <div class="main_left_panel_m_layer"></div>
  38 + <div class="main_left_panel">
  39 + <div class="_line_info">
  40 + <div class="_line_name">
  41 + <a class="dropdown_txt"></a>
  42 + <div class="line_change_panel" uk-dropdown="mode: click">
  43 + <div class="uk-inline">
  44 + <a class="uk-form-icon uk-form-icon-flip" uk-icon="icon: search"></a>
  45 + <input class="uk-input" type="text" id="line_search_input">
  46 + </div>
  47 + <ul class="uk-list"></ul>
  48 + </div>
  49 +
  50 +
  51 +
  52 + <a uk-icon="icon: trash" class="remove_line_version_icon uk-animation-slide-right-small" title="删除线路版本" style="display: none" uk-tooltip></a>
  53 + <a uk-icon="icon: plus" class="add_line_version_icon" title="新增一个线路版本" uk-tooltip></a>
  54 + </div>
  55 + <div class="_version_dropdown_wrap">
  56 + <a class="_version_text"></a>
  57 + <div uk-dropdown>
  58 + <ul class="uk-nav uk-dropdown-nav all_version_list">
  59 + </ul>
  60 + </div>
  61 + </div>
  62 + <a class="clock_enable_version"></a>
  63 + </div>
  64 +
  65 + <div class="_route_info_wrap">
  66 + <ul uk-tab>
  67 + <li><a>上行</a></li>
  68 + <li><a>下行</a></li>
  69 +
  70 + </ul>
  71 +
  72 + <ul class="uk-switcher uk-margin up_down_route_list">
  73 + <li>
  74 + <div class="station_route"></div>
  75 + <div class="road_route"></div>
  76 + </li>
  77 + <li>
  78 + <div class="station_route"></div>
  79 + <div class="road_route"></div>
  80 + </li>
  81 + </ul>
  82 + <div class="pos_tb_icon">
  83 + <a uk-icon="icon: chevron-down;"></a>
  84 + </div>
  85 + </div>
  86 + </div>
  87 + <div class="main_lt_search_panel">
  88 + <div class="uk-inline ct_s_i_wrap">
  89 + <span class="uk-form-icon uk-form-icon-flip" uk-icon="icon: search"></span>
  90 + <input class="uk-input ct_search_input" placeholder="搜索地图位置" type="text">
  91 + </div>
  92 + <div class="ct_search_result"></div>
  93 + </div>
  94 + <div class="main_rt_tools_panel">
  95 + <!--<a style="color: red;" uk-icon="icon: unlock;ratio: .9" class="_icon" title="当前版本有变更未启用" uk-tooltip="pos:bottom"></a>-->
  96 +
  97 + <a uk-icon="icon: bookmark;ratio: .9" class="_icon" title="走向版本变更记录" uk-tooltip="pos:bottom"></a>
  98 + <a uk-icon="icon: expand;ratio: .9" class="_icon full_screen_icon"></a>
  99 + </div>
  100 +</div>
  101 +
  102 +<script id="geo_d_e_search_result-temp" type="text/html">
  103 + <ul class="s_list uk-list">
  104 + {{each list as obj i}}
  105 + <li data-lat="{{obj.point.lat}}" data-lng="{{obj.point.lng}}">
  106 + <span class="_title">{{obj.title}}</span>
  107 + <span class="_address">{{obj.address}}</span>
  108 + </li>
  109 + {{/each}}
  110 +
  111 + {{if list.length==0}}
  112 + <li class="_empty">没有搜索到相关数据!</li>
  113 + {{/if}}
  114 + </ul>
  115 +</script>
  116 +
  117 +<script id="geo_d_e_dropdown_list-temp" type="text/html">
  118 + {{each list as obj i}}
  119 + <li data-code="{{obj.code}}">
  120 + <div class="name">{{obj.name}}</div>
  121 + <div class="code">{{obj.code}}</div>
  122 + </li>
  123 + {{/each}}
  124 + {{if ellipsis}}
  125 + <li>...</li>
  126 + {{/if}}
  127 +</script>
  128 +<!-- 百度 -->
  129 +<script src="//api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script>
  130 +<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>
  131 +<script src="/assets/plugins/uk3.0/uikit.min.js"></script>
  132 +<script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script>
  133 +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" ></script>
  134 +<!-- EventProxy -->
  135 +<script src="/assets/js/eventproxy.js"></script>
  136 +<!-- art-template 模版引擎 -->
  137 +<script src="/assets/plugins/template.js"></script>
  138 +<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script>
  139 +<!-- jquery.serializejson JSON序列化插件 -->
  140 +<script src="/assets/plugins/jquery.serializejson.js" merge="plugins"></script>
  141 +<!-- common js -->
  142 +<script src="/pages/base/geo_data_edit/js/ct_common.js"></script>
  143 +<script src="/assets/js/TransGPS.js" ></script>
  144 +<!-- Geolib -->
  145 +<script src="/real_control_v2/geolib/geolib.js" ></script>
  146 +<!-- jquery contextMenu -->
  147 +<script src="/real_control_v2/assets/js/jquery.contextMenu.min.js" ></script>
  148 +<script src="/assets/js/baidu/bd_GeoUtils_min.js" ></script>
  149 +<!-- flatpickr -->
  150 +<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" ></script>
  151 +<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" ></script>
  152 +<script src="/assets/plugins/pinyin.js"></script>
  153 +
  154 +<script>
  155 + var $loadPanel = $('body>.loading');
  156 + //___________________________________
  157 + var storage = window.localStorage;
  158 + //___________________________________
  159 +
  160 + top.document.title = "绘制线路";
  161 +
  162 + // 关闭左侧栏
  163 + if (!top.$('body').hasClass('page-sidebar-closed')) {top.$('.menu-toggler.sidebar-toggler').click();}
  164 + //全屏
  165 + $('.full_screen_icon').on('click', function () {
  166 + var $iframe = window.parent.$('#geo_edit_wrap_iframe'),
  167 + icon;
  168 + if($(this).attr('uk-icon').indexOf('expand') != -1){
  169 + $iframe.addClass('full_screen');
  170 + icon = 'shrink';
  171 + }
  172 + else{
  173 + $iframe.removeClass('full_screen');
  174 + icon = 'expand';
  175 + }
  176 + $(this).attr('uk-icon', 'icon: '+icon+';ratio: .9');
  177 + });
  178 +
  179 + var gb_main_ep;
  180 + //文件加载
  181 + var res_load_ep = EventProxy.create('load_common_data', 'load_station_route','load_road_route'
  182 + , 'load_version_manage', 'load_history_edit_logs', 'load_map', function () {
  183 + startup(function () {
  184 + $('.instructions_tips').show();
  185 + });
  186 +
  187 + gb_change_line.init();
  188 + });
  189 +
  190 + var g_line_code;
  191 + var g_version;
  192 + var startup = function (cb) {
  193 + g_line_code = storage.getItem('geo_data_edit_line_code');
  194 +
  195 + gb_main_ep = new EventProxy();
  196 + var eq = gb_main_ep;
  197 +
  198 + //站点
  199 + gb_station_route.init(g_emit('init_road'));
  200 + //路段
  201 + eq.once('init_road', function () {
  202 + gb_road_route.init(g_emit('init_map'))
  203 + });
  204 + //地图
  205 + eq.once('init_map', function () {
  206 + gb_ct_map._render(g_emit('end'));
  207 + });
  208 +
  209 + eq.once('end', function () {
  210 + //线路版本信息
  211 + gb_version_manage.init(storage.getItem("geo_data_edit_line_version"));
  212 +
  213 + $loadPanel.hide();
  214 + gb_ct_search.init();
  215 +
  216 + cb && cb();
  217 + });
  218 + };
  219 +
  220 + var clearAll = function () {
  221 + $('.up_down_route_list .station_route').empty();
  222 + $('.up_down_route_list .road_route').empty();
  223 + gb_ct_map.clearAll();
  224 + };
  225 +
  226 + function g_emit(id) {
  227 + console.log('g_emit [' + id + ']');
  228 + return function () {
  229 + console.log('eq.emitLater(' + id + ')');
  230 + return gb_main_ep.emitLater(id);
  231 + };
  232 + }
  233 +
  234 + //滚动条
  235 + $('._route_info_wrap>ul.uk-switcher').perfectScrollbar({suppressScrollX: true});
  236 +
  237 + //to top btttom
  238 + $('.pos_tb_icon a').on('click', function () {
  239 + UIkit.notification('top top...');
  240 + });
  241 +
  242 + function getUpDown(){
  243 + return $('.up_down_route_list>li:first').hasClass('uk-active')?0:1;
  244 + }
  245 +
  246 + //切换上下行显示
  247 + $('.up_down_route_list').on('show', function () {
  248 + gb_ct_map.changeUpDown();
  249 + });
  250 +
  251 + $(document).on('submit', 'form', function (e) {
  252 + e.stopPropagation();
  253 + return false;
  254 + });
  255 +
  256 + $(document).on('click', 'button.cancel', function (e) {
  257 + e.stopPropagation();
  258 + return false;
  259 + });
  260 +
  261 + //关闭说明
  262 + $('.instructions_tips .uk-close').on('click', function () {
  263 + $('.instructions_tips').remove();
  264 + });
  265 +</script>
  266 +
  267 +
  268 +<script src="/pages/base/geo_data_edit/js/server_timer.js" ></script>
  269 +<!--- js -->
  270 +<script src="/pages/base/geo_data_edit/js/common_data.js" ></script>
  271 +<script src="/pages/base/geo_data_edit/js/station_route.js" ></script>
  272 +<script src="/pages/base/geo_data_edit/js/road_route.js" ></script>
  273 +<script src="/pages/base/geo_data_edit/js/version_manage.js" ></script>
  274 +<script src="/pages/base/geo_data_edit/js/history_edit_logs.js" ></script>
  275 +<script src="/pages/base/geo_data_edit/js/map.js" ></script>
  276 +<script src="/pages/base/geo_data_edit/js/submit.js" ></script>
  277 +<script src="/pages/base/geo_data_edit/js/search.js" ></script>
  278 +<script src="/pages/base/geo_data_edit/js/change_line.js" ></script>
  279 +
  280 +<script type="text/javascript"
  281 + src="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
  282 +</body>
283 </html> 283 </html>
284 \ No newline at end of file 284 \ No newline at end of file