├── LICENSE ├── README.md ├── dist ├── echarts-en.common.js ├── echarts-en.common.min.js ├── echarts-en.js ├── echarts-en.js.map ├── echarts-en.min.js ├── echarts-en.simple.js ├── echarts-en.simple.min.js ├── echarts.common.js ├── echarts.common.min.js ├── echarts.js ├── echarts.js.map ├── echarts.min.js ├── echarts.simple.js ├── echarts.simple.min.js └── extension │ ├── bmap.js │ ├── bmap.js.map │ ├── bmap.min.js │ ├── dataTool.js │ ├── dataTool.js.map │ └── dataTool.min.js ├── geo-lines.bmp ├── geoLine3.bmp ├── geoLine7.bmp ├── geoLine9.bmp ├── heatmap1.bmp ├── heatmap2.bmp ├── map ├── js │ ├── china-contour.js │ ├── china.js │ ├── province │ │ ├── anhui.js │ │ ├── aomen.js │ │ ├── beijing.js │ │ ├── chongqing.js │ │ ├── fujian.js │ │ ├── gansu.js │ │ ├── guangdong.js │ │ ├── guangxi.js │ │ ├── guizhou.js │ │ ├── hainan.js │ │ ├── hebei.js │ │ ├── heilongjiang.js │ │ ├── henan.js │ │ ├── hubei.js │ │ ├── hunan.js │ │ ├── jiangsu.js │ │ ├── jiangxi.js │ │ ├── jilin.js │ │ ├── liaoning.js │ │ ├── neimenggu.js │ │ ├── ningxia.js │ │ ├── qinghai.js │ │ ├── shandong.js │ │ ├── shanghai.js │ │ ├── shanxi.js │ │ ├── shanxi1.js │ │ ├── sichuan.js │ │ ├── taiwan.js │ │ ├── tianjin.js │ │ ├── xianggang.js │ │ ├── xinjiang.js │ │ ├── xizang.js │ │ ├── yunnan.js │ │ └── zhejiang.js │ └── world.js └── json │ ├── china-cities.json │ ├── china-contour.json │ ├── china.json │ ├── cityDatas.json │ ├── gaotietest.json │ ├── heatmap │ ├── heatmap0.json │ ├── heatmap1.json │ └── heatmap2.json │ ├── hsrail │ ├── hsrail0.json │ ├── hsrail1.json │ └── hsrail2.json │ ├── lines-bus-test1.json │ ├── lines-rail.json │ ├── result8.json │ ├── world.json │ └── zhongguo-shiji.json └── test ├── data ├── aqi │ ├── BJdata.js │ ├── GZdata.js │ ├── SHdata.js │ └── processAQI.js ├── gaotie.json └── map │ ├── data-anhui.json │ ├── data-aomen.json │ ├── data-beijing.json │ ├── data-china.json │ ├── data-chongqing.json │ ├── data-fujian.json │ ├── data-gansu.json │ ├── data-guangdong.json │ ├── data-guangxi.json │ ├── data-guizhou.json │ ├── data-hainan.json │ ├── data-hebei.json │ ├── data-heilongjiang.json │ ├── data-henan.json │ ├── data-hubei.json │ ├── data-hunan.json │ ├── data-jiangsu.json │ ├── data-jiangxi.json │ ├── data-jilin.json │ ├── data-liaoning.json │ ├── data-neimenggu.json │ ├── data-ningxia.json │ ├── data-qinghai.json │ ├── data-shangdong.json │ ├── data-shanghai.json │ ├── data-shangxi.json │ ├── data-shanxi.json │ ├── data-sichuan.json │ ├── data-tianjin.json │ ├── data-world.json │ ├── data-xianggang.json │ ├── data-xinjiang.json │ ├── data-xizang.json │ ├── data-yunnan.json │ ├── data-zhejiang.json │ └── world.json ├── geo-lines.html ├── geo-map.html ├── geoLine.html ├── geoLine2.html ├── geoLine3.html ├── geoLine6.html ├── geoLine7.html ├── geoLine9.html ├── heatmap.html ├── heatmap1.html ├── heatmap2.html ├── heatmap3.html ├── lib ├── caseFrame.css ├── caseFrame.js ├── config.js ├── countup.js ├── dat.gui.min.js ├── draggable.js ├── esl.js ├── facePrint.js ├── frameInsight.js ├── jquery.min.js ├── perlin.js ├── rearrange.js ├── requireES.js ├── reset.css ├── rollup.browser.js └── testHelper.js └── node └── scatter-gps.js /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # echarts-map 2 | echarts 绘制地图 连线 时间轴 热力图等 3 | 使用echarts绘制了地图、连线、散点图、热力图、时间轴等 4 | 5 | 使用方法:在文件目录下打开控制台,开启一个python开启一个http服务,命令:python -m http.server 6 | 在浏览器中输入http://127.0.0.1:8000/test/geoLine7.html 即可看到效果 7 | 8 | ![geoline7](https://github.com/bolanlaike/echarts-map/blob/master/geoLine7.bmp) 9 | 10 | ![heatmap1](https://github.com/bolanlaike/echarts-map/blob/master/heatmap1.bmp) 11 | 12 | heatmap2里写了一个异步加载,感觉写得不太好,如果有更好的写法的话可以给我提交issue或者pr 13 | ![heatmap2](https://github.com/bolanlaike/echarts-map/blob/master/heatmap2.bmp) 14 | -------------------------------------------------------------------------------- /dist/extension/bmap.min.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | 22 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("echarts")):"function"==typeof define&&define.amd?define(["exports","echarts"],e):e(t.bmap={},t.echarts)}(this,function(t,e){"use strict";function o(t,e){this._bmap=t,this.dimensions=["lng","lat"],this._mapOffset=[0,0],this._api=e,this._projection=new BMap.MercatorProjection}function n(t,o){return o=o||[0,0],e.util.map([0,1],function(e){var n=o[e],i=t[e]/2,a=[],r=[];return a[e]=n-i,r[e]=n+i,a[1-e]=r[1-e]=o[1-e],Math.abs(this.dataToPoint(a)[e]-this.dataToPoint(r)[e])},this)}function i(){function t(t){this._root=t}return t.prototype=new BMap.Overlay,t.prototype.initialize=function(t){return t.getPanes().labelPane.appendChild(this._root),this._root},t.prototype.draw=function(){},t}function a(t,e){return t&&e&&t[0]===e[0]&&t[1]===e[1]}o.prototype.dimensions=["lng","lat"],o.prototype.setZoom=function(t){this._zoom=t},o.prototype.setCenter=function(t){this._center=this._projection.lngLatToPoint(new BMap.Point(t[0],t[1]))},o.prototype.setMapOffset=function(t){this._mapOffset=t},o.prototype.getBMap=function(){return this._bmap},o.prototype.dataToPoint=function(t){var e=new BMap.Point(t[0],t[1]),o=this._bmap.pointToOverlayPixel(e),n=this._mapOffset;return[o.x-n[0],o.y-n[1]]},o.prototype.pointToData=function(t){var e=this._mapOffset;return[(t=this._bmap.overlayPixelToPoint({x:t[0]+e[0],y:t[1]+e[1]})).lng,t.lat]},o.prototype.getViewRect=function(){var t=this._api;return new e.graphic.BoundingRect(0,0,t.getWidth(),t.getHeight())},o.prototype.getRoamTransform=function(){return e.matrix.create()},o.prototype.prepareCustoms=function(t){var o=this.getViewRect();return{coordSys:{type:"bmap",x:o.x,y:o.y,width:o.width,height:o.height},api:{coord:e.util.bind(this.dataToPoint,this),size:e.util.bind(n,this)}}};var r;o.dimensions=o.prototype.dimensions,o.create=function(t,e){var n,a=e.getDom();t.eachComponent("bmap",function(t){var p=e.getZr().painter,s=p.getViewportRoot();if("undefined"==typeof BMap)throw new Error("BMap api is not loaded");if(r=r||i(),n)throw new Error("Only one bmap component can exist");if(!t.__bmap){var m=a.querySelector(".ec-extension-bmap");m&&(s.style.left="0px",s.style.top="0px",a.removeChild(m)),(m=document.createElement("div")).style.cssText="width:100%;height:100%",m.classList.add("ec-extension-bmap"),a.appendChild(m);var c=t.__bmap=new BMap.Map(m),d=new r(s);c.addOverlay(d),p.getViewportRootOffset=function(){return{offsetLeft:0,offsetTop:0}}}var c=t.__bmap,f=t.get("center"),l=t.get("zoom");if(f&&l){var h=new BMap.Point(f[0],f[1]);c.centerAndZoom(h,l)}(n=new o(c,e)).setMapOffset(t.__mapOffset||[0,0]),n.setZoom(l),n.setCenter(f),t.coordinateSystem=n}),t.eachSeries(function(t){"bmap"===t.get("coordinateSystem")&&(t.coordinateSystem=n)})},e.extendComponentModel({type:"bmap",getBMap:function(){return this.__bmap},setCenterAndZoom:function(t,e){this.option.center=t,this.option.zoom=e},centerOrZoomChanged:function(t,e){var o=this.option;return!(a(t,o.center)&&e===o.zoom)},defaultOption:{center:[104.114129,37.550339],zoom:5,mapStyle:{},roam:!1}}),e.extendComponentView({type:"bmap",render:function(t,e,o){function n(){i||o.dispatchAction({type:"bmapRoam"})}var i=!0,a=t.getBMap(),r=o.getZr().painter.getViewportRoot(),p=t.coordinateSystem,s=function(e,n){if(!i){var a=r.parentNode.parentNode.parentNode,s=[-parseInt(a.style.left,10)||0,-parseInt(a.style.top,10)||0];r.style.left=s[0]+"px",r.style.top=s[1]+"px",p.setMapOffset(s),t.__mapOffset=s,o.dispatchAction({type:"bmapRoam"})}};a.removeEventListener("moving",this._oldMoveHandler),a.removeEventListener("zoomend",this._oldZoomEndHandler),a.addEventListener("moving",s),a.addEventListener("zoomend",n),this._oldMoveHandler=s,this._oldZoomEndHandler=n;var m=t.get("roam");m&&"scale"!==m?a.enableDragging():a.disableDragging(),m&&"move"!==m?(a.enableScrollWheelZoom(),a.enableDoubleClickZoom(),a.enablePinchToZoom()):(a.disableScrollWheelZoom(),a.disableDoubleClickZoom(),a.disablePinchToZoom());var c=t.__mapStyle,d=t.get("mapStyle")||{},f=JSON.stringify(d);JSON.stringify(c)!==f&&(Object.keys(d).length&&a.setMapStyle(d),t.__mapStyle=JSON.parse(f)),i=!1}}),e.registerCoordinateSystem("bmap",o),e.registerAction({type:"bmapRoam",event:"bmapRoam",update:"updateLayout"},function(t,e){e.eachComponent("bmap",function(t){var e=t.getBMap(),o=e.getCenter();t.setCenterAndZoom([o.lng,o.lat],e.getZoom())})});t.version="1.0.0"}); 23 | -------------------------------------------------------------------------------- /dist/extension/dataTool.min.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | 22 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("echarts")):"function"==typeof define&&define.amd?define(["exports","echarts"],t):t(e.dataTool={},e.echarts)}(this,function(e,t){"use strict";function r(e,t,r){if(e&&t){if(e.map&&e.map===c)return e.map(t,r);for(var a=[],n=0,o=e.length;nm){var w=[l,x];"vertical"===t.layout&&w.reverse(),a.push(w)}}}return{boxData:r,outliers:a,axisData:n}};t.dataTool&&(t.dataTool.version="1.0.0",t.dataTool.gexf=p,t.dataTool.prepareBoxplotData=d),e.version="1.0.0",e.gexf=p,e.prepareBoxplotData=d}); 23 | -------------------------------------------------------------------------------- /geo-lines.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bolanlaike/echarts-map/074f3504ec362e4df9a6ce2341152282b7d1db92/geo-lines.bmp -------------------------------------------------------------------------------- /geoLine3.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bolanlaike/echarts-map/074f3504ec362e4df9a6ce2341152282b7d1db92/geoLine3.bmp -------------------------------------------------------------------------------- /geoLine7.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bolanlaike/echarts-map/074f3504ec362e4df9a6ce2341152282b7d1db92/geoLine7.bmp -------------------------------------------------------------------------------- /geoLine9.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bolanlaike/echarts-map/074f3504ec362e4df9a6ce2341152282b7d1db92/geoLine9.bmp -------------------------------------------------------------------------------- /heatmap1.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bolanlaike/echarts-map/074f3504ec362e4df9a6ce2341152282b7d1db92/heatmap1.bmp -------------------------------------------------------------------------------- /heatmap2.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bolanlaike/echarts-map/074f3504ec362e4df9a6ce2341152282b7d1db92/heatmap2.bmp -------------------------------------------------------------------------------- /map/js/china-contour.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | (function (root, factory) { 21 | if (typeof define === 'function' && define.amd) { 22 | // AMD. Register as an anonymous module. 23 | define(['exports', 'echarts'], factory); 24 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 25 | // CommonJS 26 | factory(exports, require('echarts')); 27 | } else { 28 | // Browser globals 29 | factory({}, root.echarts); 30 | } 31 | }(this, function (exports, echarts) { 32 | var log = function (msg) { 33 | if (typeof console !== 'undefined') { 34 | console && console.error && console.error(msg); 35 | } 36 | } 37 | if (!echarts) { 38 | log('ECharts is not Loaded'); 39 | return; 40 | } 41 | if (!echarts.registerMap) { 42 | log('ECharts Map is not loaded') 43 | return; 44 | } 45 | echarts.registerMap('china-contour', {"type":"FeatureCollection","features":[{"id":"100000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@š¦ŜiÀºƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅ó­@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ AɞÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĒĞȠzÐŘΰH¨ȔBĠ "],["@@ƛĴÕƊÉɼģºðʀI̠ÔĚäœθؾNJŨxĚĮǂƺòƌ‚ĪŐĮXŦţƸZûЋƕƑ’ʳÛDžƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"],["@@Óɖ± dƊ½ǒÂň×äı–§ĤƩ™¶hlçxĬŸĄŞkâ’ÌwøàIJaĞ‚fƠ¥Ž„Ŕdž˜®UɎÖ¢aƆúŪtŠųƠjd•ƺŠƺÅìnŽŢ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼìĴPðŀbþ¹ļD¢¹œ\\ĜÑ̔ùўÊ‰ȮŒǪűŽÀêZǚŐ¤qȂ\\`ºłĤ\\ºs|zºÿŐãѦvĪĺĺ†ĈłÈ͚FÞºĠUƢ¾ªì°`öøu®Ì¼ãÐUÞ˶¬æɒlʐߨvWʚ”ÖÕÁÜÅŵ­_«”E”ÍɪëÏ÷ÅyXo͂ĝĂÛÎf`Þ…¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘETėº¯ɀáMĺŝOéȇ¿ÖğǤǷŔ²å]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±‚řü›]µȺrĦáŖuҞª«IJ‡πdƺÏɌ]͚œĐ™ǂZɔ¹ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥Ǖǚk˦ӷxūД̵nơԆ|DŽŽࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãɜRצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´ԜÃƲÀɠmǐnȺĸƠ´ǠNˠŜ‚¶ƌĆĘźʆȬμƒĞGȖƴƀj`ĢçĶȅŚē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDƞŧǘÛۨĝȘIJžªǬ”¾äʀƪ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊ˰ȎŜHĦðDĝŒ|ø˂˜ƮÐ¬ҌqjĔ²Äw°dždĞéĸdîàŎjɒĚŌ‡ŜWÈ|Ŗ‡¶îÎFC•ĊZĀēƄNĤ¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Šų¬K°ȧǵÂcḷ̌ĚǣȄɧ\\ĵœŇ‹ȣFέ̿ʏƶɷØ̫»ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔDzlжøZh¤Ɛ E ĈDJ˜ì¸̚¸ƎGú´Pž¬WÄì–HsIJ¾wLVnƽCw`h`¥V”„¦U¤¸}€¾Ô[~âxh¢ªHÆÂr–iĐɘǜhÀoRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚ÈÄ[|òDȎŸÖdH„Ʈ–Àì~Ǝ†â•¦^¢ķ¶e”ÐÚEꖄɡČÅyġLû™ŇV®ŠÄ‰Ðź~ϰƂŤǒȦÒŬÂezÂvǴZ„{ĘFǜĴAΜĐȄEÔ¤ØQĄ–Ą»ΈZǺ¨ìSŊÄƸwŠn¼–c]—ܬì¯DŽ]ȘŏńzƺŷɄeeOĨS’Œfm Ɋ’̎ēz©þ†ÐÙÊmgŸÇsJ¥ƔˆŊśÎÔsÁtÃßGo—À­ xňË_½ä@êíuáĠ[ġ¥g“ɊדûÏWXáǠDZÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Dz¡SíċġHµ ¡EŃļƒrĉŘóƢFƺ«øxÊk†”ƈdƬÌr|©ÛńRŀƒøďŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^gēĊĕƯǏx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ɏ‘~”ȰCĐ´Ƕ£’fNÎèâ_ÐŮeʆNJǘuȔ\\¤ÒĨA¢Ê͠æÔ ŬGƠ”ƦYê‹ŊàƆXvkmŸͥœ@čŅĻA“¶çÎqC½Ĉ»NŸăëK™ďÍQ“Ʌ›řęgßÔÇOÝáWáħ£˯ā¡ÑķĎÛ寰WKɱ_d_}}vyŸõu¬ïÏҽ@gÏ¿rýб…Cd‰µ—°MFYxw¿CG£ǧ«»ó¡Ɵš¿BÇƻğëšܭNJĭôµ}‰čÓpg±˜ƒǫŋRwŕnéÑƕfSŸŋ‹®ÍšD Ûǖ֍Ÿ]gr¡µŷzįm³~S«“„›þeo³l™•{iē¥yZ÷īŖõġMRÇģZ“mÃ|¡™ģTɟij“Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜTNJŋB…h–¬ƩDoˆ±enq©G`™wGçǑ‚“K‰‹F‚“›uNĝw‡őXtW·Ýďæßa}xV•—XR‰ãQ`­©GŒM»­”ďϝd‡©ÑW_ÏǷr¡…é\\ƒɹ~ɍuØ©Bš¤ÝĤ½¢Å_Á¿•LŅñuT\\rÅIs®y}’ywdS™DZtCmûvašʋJr€Ư‚⦳P‡rbbÍzš€wBG’ĭ€T†Ák‘»ƒlY­ċ²z“Ç£—^§»d¯íŻŽ£ćGŵDžƍÓ]í“M^o•£Ã]ªUóo½~ŕ‘|ŋݘ¥ċh“¹·CÉ­Dřlg‡ȵë[‘’}ģS}xƃği©ĝ‡ɝǡF꼵áƣ©‚Hžĕoƫ€Ňqƒr³Ãg[„šÃS–ő_†±ÅFC¥Pq{‚ñg—¿įX…•ƝıĉNj•ûěʼn³F‘¦oĵ—hŸÕP{¯~TÍl¸ÓßYÏàs{ÃVU™™eĎwk±ʼnVÓ½ŽJūĉ»Jm°fϑdF~ˆ€ĀeĖ€O˜² Ĉ‰żĀiÂd^~ăÔHˆ¦\\§|ĄVez¤NP ǹӗR™ÆƇP[¦´Âghwm}ÐШźhI|žVVŽ—Ž|p[¦À¶èNä¶ÒCÀ¢^h—PfvƾĪ×òúNZÞÒKxpw|ÊEZŽI¨®œİFÜçmĩ‚WĪñt‘ÞʼnËÝ^³uL‚±|Əlĉ¥čn§ßÅc‘˜B× CNƒǟ‹_ñŧı¯Y]ăٟ™Ľѷť‹³ÃAR‹‡ZRlʑýSëÍDěïÿȧ¢ÙġƒěŗŷęŸUªhJˆƁ™ƅn³gF‹³HàŋÅÃƉÀKšť`ċŮÁõYėé÷`ٚ_Ïǵ—R§òoEÅąLœŐœƜVµąłíļĐ·ũ̈«ªdÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿäćú y±¨Mf~C¿`€à_ŒÿƌfQnð³ƬˆŲŎ¥ĠʦĘĒØ‰¼Â†±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«Múīô‰Ö°ʊkŲÆM|²@¤u•ƒ¤Û´Œä«̰\\„}ēƒ‹ÅM•¼Ã­]NągoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøC̍ƃhÛ­–Ň\\bÅxì²ƝýN‰īCȽĿǃšŖÕy\\‡¹kx‡Ã£Č×G¿Ï¤ÁçFQ¡„KtŵΥëÚź—Љ«ėn½ĉŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕñžx———Z¯u™Œ…Ï•˜ï{éƵP—™_K«™pÍÁwƏčaE›U”£uݘāɌŁFŴu»¹İ×ȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±hǥ®jű¢KOķÅ}`åÂK­_Юƫ²ʯÊ^H{ǸÃĆēĤȍzȥݵċF͓ŸI©Õ͈ǫȌȥ¦ŋEӏ“†ıŪěřÀåżȟLƏ—ŽąđGǛģLjƧĎOłčȶʋÀBŖÕªˆŠÁŐTőŕåqûõi¨hÜ·ƒñt»¹ýv_[«²Kƒ{L¯‰SªƒGѵ¸•gÑpY´«•ęœƘʑcoċ\\œ­gěŧ«Āý¶ŧ·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZ~﵉fzʼnfåÂȝǷÕĕÊĉ{ğč±uƁí]Í»ęX\\­•Ip™¡éĥZE‹ãoP…þy—¸k³—†¡ƽŸ¿å³BRضˆœWlâþäą`“]aģc— ĹGµ¶H™åՌ‰¾xĨ‡ôȉðX«½đCIŇOK³Á‰Äţ¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNrį~IМ‘êĘÎG§Ė¥Ý™F{ WK}ùaH‘āÖ{OoužHEÅǍqĬuë±KEò£‰UplÀ÷tMāe£bYÂý¡a±Öcp©®^ö±q…ÇGjųªKy¬ŏ–®¤ÉEŸ–ĀåA¬ˆV{Xģ‰Đƒpě…¼³Ăp·¤ƒīyÚ¡ŅLĻŗž§qlŸÀh¬µ»åÇGnùčÙmÆß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěYÓ±]ÓđīkWó«íěCŸŇͱ™‘čvĭõĉ‚ę÷N¹³ĉoTĵËçŁYلǝŕ¹tȏģ·Ĕĭ|đėÊK™½R‘ē ó]™ĀęAx–ŸNk©|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™áÎÁąÏŸHcòßÎſ¿Çdğ·ùT×Çūʄ¡XgWÀLJƟψOj YÇ÷Sğ³kzőȝğ§õ¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰Ƈ׫BhlmtÃPµy‹ÓɉUīí}†€GBȅ‰ŹãĻFŷŽǩoo¿ē‹±ß}ŽwƋtƺ—CőØEîǻīƓʑã͘ƍ“DĈ±ÌŒÜӔĨ£LóɢVȞĆĖMĸĤfˆÜǗjđĆ»ýͥãğ¶ĞØO¤Ǜn³Žő}‹¦…·z€YŠwa™–šőűMę§ZĨ훘Û]é’ÛUćİȹ¯…dƒy¹TcÂĕ½A´µê÷wĻþÙ`K€¦˜…¢ÍeœĥR¡ˆã…‚Ĉu¼dl‰t‚†U¶¶ď\\zœ}ưŬ–{ÚfKš¶Ð_„ÂÒ¿C©Ö•TmuŸ¼ãl‰›ŇÕVåĤĵfÝYYįk‘ÒīØſNQĠ³r³øÓrŸÖͳgÍſGįÅ_—±he¡ÅM²Ɠ綾ßīZgmk„ǭƁć¦UĔťƒ×ëǟ…e˭ʔħǛāĘPªij¶‘Ņăw§n‰ď£S»şŒÍļɉŀ‰}ÛÞ»å£_ˆŸıęÏZ—÷`…[„ùx½}ÑRH‘YėĺďsÍn‘™é½Ya¤Ïm¬ĝg•ĂsA•ØÅwď‚õ¤q}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónȯ×âpÒŌ“Ø Tˆêa²ËX€€c̋lLìģËŁkŻƑŷÉăP¹æƧÝ¡¦}•veèÆ´UvÅ~§‡½˜“Ġ²Ŵwæč\\Dƒ}O÷š£[ŽăŒá[™‚į‰ŷvŸœRsdĒƄwžŎĒo~t¾ÍŶÒtD¦Ú„iôö‰€z«Ųƭ¸Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†AĦw\\ưĆ ¦g–ʉË£¢ι‰ǫßK‘ÙIįóVesb‘aĕ ǠƺpªqŒ‚ďŒE˜®tŸôřk˜ȌwêżĔÂe‚nËÂQƞ´’¼ŲƝÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“¬oêDŽŲÚr^¯°’^º{ªBHŒ²Ö¤ɦ§Țv€qĸ„ ­viļ€ndĜ­ĆfŒ“xÝgyށqóžSᝑ³X_ĞçêtrmÚ§z„¦c¦¥jnŞi˜¯´ÓH@ÂċĂჷÌ_þ·–¹_wzË£Z­¹|ŕWM‰“|O¥ÃWTÕ­ùÔQ†¥‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnkòəėªƒ²œm˽ŏġǝʅįĭạ̃ūȹ]ΓͧŹəăЕ·ƭˆęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖƝ^ęuůÞiĊÄÀ\\Æs¦ÓRäšřÌkÄŷ¶½÷ùCMÝۛĥ°G¬ĩ`£Øą‚ğ¯ß”§aëbéüÑOčœk£ÍI ïCċÀÕÕĻSŧʼnïŽŗãWÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔŠƦ›Ú@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxĉWù׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRÑÈěVVе‚õ‡«Œ¯ůĉ¥áºaeõ|uĐh`Ü³ç@šƋĿa©|z²Ý¼ŸĴ貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaňæêSĈ½Ž½KÙóĿeƃÆBŽ·¬ƃV×ĴƳ˜lŒµ`bԑ¨ˆÐÓ@s¬ƿ‚ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSÄį¤Ç[ǾµMW¢ĭiÕØ¿@ŠÂ…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨^“ƒ±ze…ė·¥Ó@~¯‹éīB™Š\\”āƚǗÀƷŘóQīÈáP•œǥ@ŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­Z±đ[‰Âÿiñ¬‰Òj°ŁŤ_uµ^‘°ŒìÇÊĶĒ¡Æ‡MğźİĨƥôRŽāð©[wâ䥩Ô\\°ÝĄ̄Ƣ’ăk™néǀůŠ˜ĆK„ĒĬœ¶è‰âz¨u¦¥L~ƄýÎIƖߔµĔƱĐċņbÎՂĄæ_ƞZRÖíŽJ²öLĸҜcºƖÎ\\ñºÛqY–Ѩ`x¥’ù^•}ƒÌđYªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´Aňńňĕuĩt[{ù°ŁÏ•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGǣ@Dü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKÕK‡ÄNô‡ŠfœƫVó¼dz—H‘‹QµâFšù­Âœ³¦{Y‹Â¢ĚÜO „€{Ö¦ÞͨJÜÄƨ€lŽU˧ªÍE˨¡ĐĬĬùÎRƠŸHÕŔ_ƪàÒKäȇĬə²ȕnáûl—÷eǛò•Ğ\\ªÑò˜Üìc\\üqˆÕ[ēdžċªbØ­Œø|€¶ȴZdÆÂšońéŒGšŠǚnìÈƲ‚ہȖưòTxÊǪMīИÖŲÃɎO̚ǰއRěò—¿ġ~åŊœú‰¬ô¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ŀ¤ĄYÒ©ÊfºmԈȈ¡DŽ~¤„s²‚”ʘچžȂVƼîèW²æIJXŔþɔÖĚêϜêĮŢɨJ€˜¯ÎrDDšĤ€`€Q¾§~wâJÂ˜ñÈOú¤p¨ŪŊMǎÀW|ų ¿¾ɄĦƖAiƒ÷fØĶK¢ȝ˔"]],"encodeOffsets":[[[112750,20508]],[[123335,22980]],[[82455,44869]]]},"properties":{"cp":[116.3683244,39.915085],"name":"中华人民共和国","childNum":3}}],"UTF8Encoding":true}); 46 | })); -------------------------------------------------------------------------------- /map/js/province/aomen.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | (function (root, factory) { 21 | if (typeof define === 'function' && define.amd) { 22 | // AMD. Register as an anonymous module. 23 | define(['exports', 'echarts'], factory); 24 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 25 | // CommonJS 26 | factory(exports, require('echarts')); 27 | } else { 28 | // Browser globals 29 | factory({}, root.echarts); 30 | } 31 | }(this, function (exports, echarts) { 32 | var log = function (msg) { 33 | if (typeof console !== 'undefined') { 34 | console && console.error && console.error(msg); 35 | } 36 | } 37 | if (!echarts) { 38 | log('ECharts is not Loaded'); 39 | return; 40 | } 41 | if (!echarts.registerMap) { 42 | log('ECharts Map is not loaded') 43 | return; 44 | } 45 | echarts.registerMap('澳门', {"type":"FeatureCollection","features":[{"id":"820001","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@LADC^umZ@DONWE@DALBBF@H@DFBBTC"],["@@P@LC@AGM@OECMBABBTCD@DDH"]],"encodeOffsets":[[[116285,22746]],[[116303,22746]]]},"properties":{"cp":[113.552965,22.207882],"name":"花地玛堂区","childNum":2}},{"id":"820002","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@MK@CA@AAGDEB@NVFJG"],"encodeOffsets":[[116281,22734]]},"properties":{"cp":[113.549052,22.199175],"name":"花王堂区","childNum":1}},{"id":"820003","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@EGOB@DNLHE@C"],"encodeOffsets":[[116285,22729]]},"properties":{"cp":[113.550252,22.193791],"name":"望德堂区","childNum":1}},{"id":"820004","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ŸYMVAN@BFCBBDAFHDBBFDHIJJEFDPCHHlYJQ"],"encodeOffsets":[[116313,22707]]},"properties":{"cp":[113.55374,22.188119],"name":"大堂区","childNum":1}},{"id":"820005","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@JICGAECACGEBAAEDBFNXB@"],"encodeOffsets":[[116266,22728]]},"properties":{"cp":[113.54167,22.187778],"name":"风顺堂区","childNum":1}},{"id":"820006","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ ZNWRquZCBCC@AEA@@ADCDCAACEAGBQ@INEL"],"encodeOffsets":[[116265,22694]]},"properties":{"cp":[113.558783,22.154124],"name":"嘉模堂区","childNum":1}},{"id":"820007","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@MOIAIEI@@GE@AAUCBdCFIFR@HAFBBDDBDCBC@@FB@BDDDA\\M"],"encodeOffsets":[[116316,22676]]},"properties":{"cp":[113.56925,22.136546],"name":"路凼填海区","childNum":1}},{"id":"820008","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@DKMMa_GC_COD@dVDBBF@@HJ@JFJBNPZK"],"encodeOffsets":[[116329,22670]]},"properties":{"cp":[113.559954,22.124049],"name":"圣方济各堂区","childNum":1}}],"UTF8Encoding":true}); 46 | })); -------------------------------------------------------------------------------- /map/js/province/shanghai.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | !function(B,A){"function"==typeof define&&define.amd?define(["exports","echarts"],A):"object"==typeof exports&&"string"!=typeof exports.nodeName?A(exports,require("echarts")):A({},B.echarts)}(this,function(B,A){var D=function(B){"undefined"!=typeof console&&console&&console.error&&console.error(B)};A?A.registerMap?A.registerMap("上海",{type:"FeatureCollection",features:[{id:"310101",type:"Feature",geometry:{type:"Polygon",coordinates:["@@AHV@BDCPEPLENFHCJHFBNCAGBGXWFIBGCGMUKKCCcGCDGBALCPIAAPGR"],encodeOffsets:[[124373,31970]]},properties:{cp:[121.490317,31.222771],name:"黄浦区",childNum:1}},{id:"310104",type:"Feature",geometry:{type:"Polygon",coordinates:["@@CEAMMAA@C@AFA@@BC@ABC@@BD@@BH@@BB@EHDDCBECADGEEAEBFNET]CMRELQjOEGRFBAHDBAHH@@B@BDA`H@F@BC@AB@FD@DD@@@CH@DDAFDD^LEPF@DFTDPHHQBOJBDOBKHADCOGCEAE@EFOBMAEUW@GBEHILMBE@KGM"],encodeOffsets:[[124381,31859]]},properties:{cp:[121.43752,31.179973],name:"徐汇区",childNum:1}},{id:"310105",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@AACE@FO]KCCBECCG@@D@@CCmBSAcKG@EBAEGC@DC@QE@CA@@BEBMTNFAFDBA`D@BDA@AA@FFBBLD@@@IBDBABDB@@DBADB@CHA@@DC@C@@@BBABFDH@AHD@ACDA@FD@BCA@@CJCNWJ@BCHAFEF@XCV@DFH@VFBBCFD@HEFFFBB@@IDAJFBABIFK"],encodeOffsets:[[124354,31964]]},properties:{cp:[121.4222,31.218123],name:"长宁区",childNum:1}},{id:"310106",type:"Feature",geometry:{type:"Polygon",coordinates:["@@AB@PCJBNG@ABBDBB@DNBAJJ@@FB@@H@@@DF@ENB@BDD@BAT@BENDFDPB@AF@A]G@BOCKCEBA@G@KBEDCLMVQ@EACDECABCDKECGDMEKFFODOACU@BGOGUCELAJABIECBBNFHJBTLHB@BADDD@FB@@DC@BHOVUJCFIG"],encodeOffsets:[[124340,32022]]},properties:{cp:[121.448224,31.229003],name:"静安区",childNum:1}},{id:"310107",type:"Feature",geometry:{type:"Polygon",coordinates:["@@DB@DHBBCDBB@A@DF@@DFDDHGBDDALZCB@@EBA@ACQ@@DGBEFBB@FD@J@BFMBCCCDID@AODAEIDBDEBABBB@DC@AF@@AFGACBADBB@@NFADD@@BB@B@BAB@@@BBDA@HBB@AJ@@AD@@BB@AFHBDCJFHBGQAAJA@ALCBBF@@AB@@BD@@@JABDABD@@BHBBBNACEJA@ADAAA@B@ADAAAJBIQB@FCBBD@AGJ@@EJA@EHADDAB@BFANNDEVIPUAGD@@CA@@ECCBC@AGASKIAEGACA@EAEEA@EFC@DEAAUEG@CEU@WDE@EFGBADI@MV"],encodeOffsets:[[124267,31987]]},properties:{cp:[121.392499,31.241701],name:"普陀区",childNum:1}},{id:"310109",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@OHWVFBABIKK@MJCJGBKV[C@@I[AOEODCACCCLADDBCFBD@FURQT@J@F@HABDFDLAPH@BTVCLBBE"],encodeOffsets:[[124402,32064]]},properties:{cp:[121.491832,31.26097],name:"虹口区",childNum:1}},{id:"310110",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@JD@U\\ALIHID@NLLAJABUEGX@PVA@ZDDADGFX`ZKDHFAFHpSNGDCDGDM@cBGL[BKAGEGMOcY[GWA"],encodeOffsets:[[124433,31997]]},properties:{cp:[121.522797,31.270755],name:"杨浦区",childNum:1}},{id:"310112",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@EBAD@@A@E_GCB@A@AG@BGCABGEAHQPFRiFKNQ^DFSEMFAFBHFBCFDDACCFGA@@AG@@AC@@AD@BAD@@AB@BED@B@F@B@FBBNDFLCDBCBFB@DFG@CBBABDB@CDBAFCB@DABD@B@DB@BD@@B@BB@B@@FJ@DKLFB@DMDBBABBCFDB@@HB@BBABBDCBGNBDAB@@BPDBAF@@AB@@AB@@CDB@BF@DGB@@CD@FDADF@BADDDCBBDCAAC@BCFEAAB@FECABC@ADBBEB@@EGCABAB@@CAA@CAIABAAA@@ECDGD@BCBBD@BBHBFALABAFBD@@CGA@BC@BCEAA@A@@AEA@@AAA@G@DCG@CCBAAA@ADBDAEAC@ACE@BCC@BG@ACBBAEAAA@B@CECDEAEBAB@BDB@DBD@BBD@FDBGBBFCAABCBDBCEC@UBACA@AAA@ABB@CCCE@AA@ADCD@@BF@@FB@@BDB@CDB@ED@DFB@ABB@HDAADCBE@CCACC@CACIABA@@@BD@@AD@DICABCECFA@AMEO@@CC@ABA@@ABA@GCACBADCDA@@BAAAB@BICADE@@BEAABC@GHC@E@@FD@@BA@CFC@@BC@AASEKG@ACAIZBFGDYCIAKGKAU@OCGAKIMIMCOEeC‘WOBQHI@C@CBB\\HBPTBHJHABECM@ADBB@J@F@D@B@FBDAD@NBBBN@T@DBBADFCFDDGTDJFAFNB@DB@EFFBADD@@DFDDCDBADERCDAB@DELGAADMCEPHB@AB@@BHF@@GNQV@DEJCDC@ADD@@BCFABADA@@FCB@DCD@DABA@EJEF@BEJCLGJABCHAB@BABCFCB@BED@BA@@BABADGFAAA@@CAAKGCAKAUTC@CDDBADIHDFCF@@CDBDCHDBAHGDBDCDABCAABAFKACBDDABBF@@@BHBBDDBC@BDFFFBBDD@@AH@HB@EFC@ABC@FFCFBB@LCFBBAEGFEDABGJMJCL@XGNFH@PDBB@FHDBAAA@@D@D@@CB@DGA@BCCA@@CABACAJA@@C@AKEA@EBBB@ACC@B_CABEMENSFA@AB@@DRFD@@CHDBFFAH@dLTBjA"],encodeOffsets:[[124327,31940]]},properties:{cp:[121.375972,31.111658],name:"闵行区",childNum:1}},{id:"310113",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@JE@@BOAECMCAFS@ABC@ACA@FME@@C@@@GA@@EI@BIMA@CCA@CBAH@AMDI@OBACEEB@ABACCGB@FIB@FI@BHC@AAEDA@JRIABBCB@B@ABBCB@BIBDFMBAAGA@AC@BAACIB@@C@@AA@@BE@AAKD@BIBBBHRC@ICCCCDGABEA@@AC@@BI@@BAA@GCBAAA@ABBBCDAAEJFDB@P\\J@@FB@@DGA@FD@@DAAADCF@@ABBBCDDB@DF@CLCAEFEB@DG@@HD@DB@BB@@FHD@BADA@CFCFABDB@BED@BCDEFFBABB@ADG@GNCBFHAFA@@DCAIB@DB@@FBBEF^JBAH@AFD@A@@DA@@BFDABD@@JB@@BA@AD@DB@@FCJ@FA@C@ABAAABENDB@BCDCFG@ADDBEDDDABA@ADB@ADF@BD@BEACD@BCBJF@BABA@BBCFE@ABCLABBBAFEB@A@BCDEBADD@CBBBBAADBBD@B@BBADFADDDA@ED@ACB@FF@DFBBCB@@AC@@GF@B@AFD@@DB@@AD@@BD@\\PfK^I|]BAEGBE\\Q`W|i\\UdSXUBD@DFAEG\\UQQQY@QJONIVIEGEBCGYLW_HEBCCC@YUBAFKAUD"],encodeOffsets:[[124384,32068]]},properties:{cp:[121.489934,31.398896],name:"宝山区",childNum:1}},{id:"310114",type:"Feature",geometry:{type:"Polygon",coordinates:["@@A@A@@AC@BCME@@AABCDAHBBE@@BED@@CAABAFAACJCBFPC@BJCDCDDNAAEI@C@@EAAFEHA@CR@BDB@FA@@DAKYCBACGHCCCE@@CEB@A@CAADGA@CCAADGB@DB@ADC@@ECBBDC@BGG@CCIC@EAAOCG@OEUHK@IDINAHCBEFFHABEAKDA@EAED@EAD@BED@FGAG@@BC@@AC@@DA@@CCBEA@DGAKFOB@CG@@BAA@CGCBAEA@CA@@DEA@FCFB@ABAAABAC@AAACFGEBCABCCABCCABCAB@@CC@ADGDEEC@EDCA@BA@BDA@ACEFECABC@@BB@BDC@AJIJCAADC@CGEB@@AB@BDF@JDD@DHBABD@B@@BCHE@@BC@@DCA@DC@@DDBADA@EDFBIPCFIIBCMAE@AJ@B@FAB@DAJDB@DDB@FD@@BCBBBB@@DABAB@DCBBBAHBB@FMCKB@HF@EHIACBE@BFCBBLAH@DD@@CD@D@BFNBCDGBAFTHBEBB@DB@@AJD@ANFABBBD@ABD@@ANDBDCD@BABA@ABLDCFDBF@ABC@ABDB@BFDADJDDCCDBDCDAAABBB@BC@ABA@ABC@@HA@C@@DJ@@DFB@BD@HB@AD@ABBDFA@HA@@CA@BDABOBMFAFB@ADBDAB\\LDAHBBADBHAPFJFAFBFFD@BJHRD@FHFNHDACCLADBH@DDFABHCB@BHJF@AJ@@FAFDB@AEFE@CBIHB@AC@@AA@DEHD@BD@ADB@BDB@AKD@@DBA@@@AD@DBBDBBDBD@@FDDBA@CDAHDBBHDADB@FA@BD@DCD@BFFCJD@DA@FBBDFADC@A@BFABEAABADKBAF@DEAAB@BA@AIEDA@ADCFB@AACE@BCA@BCB@BACCFCCABCH@DEDC@ACAFMBABBBAD@B@@EDI@EA@@CBCB@@AA@@IC@BAEC@AB@@CB@C@BEG@AB]IFEAA@EA@@CJADB@CB@BEEGDAHMH@BCA@BAEAFEDC@AFC@ACABALQGC@ECCE@@GH@@CFAFEDBDKE@@CCADCAABA@@DEBCBB@CC@@EHB@CA@@EI@GMEMICFIBBBABAAA"],encodeOffsets:[[124249,32046]]},properties:{cp:[121.250333,31.383524],name:"嘉定区",childNum:1}},{id:"310115",type:"Feature",geometry:{type:"MultiPolygon",coordinates:[["@@bM²WLCļÑNI^_È€sJQ¶±`e`Z¡LƒD‡CsEWOWs@GBI\\wsYg|QNUBģFq„AZHZB@@JHBAJFRA@BB@HABB@@J@HBDBLAJC@@BD@ABA@B@AD@FB@@BA@@BA@G@@FC@AB@DA@ABCAC@@DEA@DD@BDEF@FQJE@CAGJA@ABCAEDBDGHADWR_TYJI@G@SD@AA@@AA@IDGB@A@BQBmAA@CBOAGFELC@AAaDACS@C@@AIAABKA@BEBFDADDBCJC@@BC@@A@@ABJBBD@DDDDB@DAFCDBBGCA@BAA@CEC@@FCA@DCA@AA@@EE@@AC@CD@BBBF@DD@DAA@BBB@BDBAB@VFDADACADBBEDAAAHECC@AAC@CAA@ACA@ABBFCFFD@D@ABBFBABDA@BAHD@ADF@BDD@FBCBCA@BBBABDDH@CDH@B@BB@@FB@BB@B@FBADD@@AHB@DC@EAABKBEBGAAAC@AAADC@CHFD@@BBABJBDBB@DB@@BABAHD@FA@AFCA@BADDBEFA@BBEFADD@BBCDAACDCCABE@BCECC@@DA@CHE@@ACA@DA@@BA@@BE@ABOC@AA@CBMAAHCDAAAB@AGA@@CADEAAABCACNA@KECLC@E@@EA@A@@A@AC@@AAAA@A@C@BA@CDABEAAADCABAAA@DEH@CEADACAKDHN@LAFKNGJAF@D@DBFNLHLANEP@FBFJJJDdHDDLLNVDHAHEJWXAF@FJFHDtDXHhZNPFHBHALK\\AH@dCNCHCDMHoTUJMJIP@RRZRR"],["@@PDNAvOFGBKCeEQGEI@IBMNY\\GJELATBJ"],["@@HRHJNBX@XCRGfEFGBM@eYuGIgCIAK@KDMPIREVCXARBP"]],encodeOffsets:[[[124438,32149]],[[124808,31991]],[[124870,31965]]]},properties:{cp:[121.567706,31.245944],name:"浦东新区",childNum:3}},{id:"310116",type:"Feature",geometry:{type:"MultiPolygon",coordinates:[["@@DBBAGCBD"],["@@HADA@AGCKHBBF@"],["@@FACAAD"],["@@DB@EB@@CB@@GEQ@IEKAM@ATE@EHADF@GDCFFPD^BBED@@BD@@DPBB@@CDB@BLC@ADB@BF@@CF@@DB@BDCDA@@DCACBC@AB@HDBRTHGBCHBDB@AF@B@NACQ@@@AC@@CC@CIEE@CFCFHDBHABDN@BED@BDNA@HAF@FCBADDLD@DAAC@AB@@ANC@ANC@TDBL@DGJC^BDBDBJ@^F\\VHGPB@CD@BAF@DKDBBCA@BAC@FK@E@BD@@BNABCF@@AFB@AD@BADB@GA@@AF@BCFBDKB@@BDBB@BEDBBDF@@CFB@HD@@F@@@HA@BBA@BDC@BJADBBLB@AA@@ED@DIHA@BB@BDDBBCBA@@@BF@@CB@ABFBBCFB@BD@FCF@DBBAD@BAD@BABBBAHDJ@ABDDABDBHCBDJIBOFE@IDKJAFCBAJELAAEBCBKAA@GD@AIBEAIDOK@@EDEAABA@A@BB@@@B@B@AAD@@ADA@EJ@@CB@H@BLDBFA@@B@@GEB@EB@@CB@DETAAADA@GH@BHLAPA@ABBD@JU@ABBFCB@‚£«ugW›OCOCgB‡DaAE`@HCBBFCBAJA@AFDFAFFD@FDFCFBBA@BBAFBDA@CDAAA@STCBWLAAABBBCBAACB@AABBBIFAPCHCFBBCB@HA@CAABGPIBO@ICCEDMGAILADACCBCA@CECEAKCADCBADAAKAEC@HEBCAEDQBACEAAB@BGCYDEJCB@BBFN@B@@JDbHRJL@D@FA@@CCB@DABBDEFACSDA@AAA@DDBLFHAB@BABCAIDADABCEKCABC@CDABBBC@@B@BA@BBcO[@MGDCC@DK_KFMGBCFGADEA@AGCA@@DAD@AFB@BCB@DGOCCLKR]JADEAMMABBCA@CB@BABCAACB@CEAB@CAAGBDFGFHFGBBDFHF@BDB@ABBFDADFF@DHD@DFFADDGDDDADDABDA@DDCDFFBDEBFFDCDBCBDDEBBDB@@@CDCDI@GB@BBFAB]DAHCDDH@DDBHB@DHABDB@@FG@CABJBl@FEFCFBB@LB@J@@GPDA@DD@AD@D@@CCA@BCA@CB@A@@AF@BGFAADDB@ARF"]],encodeOffsets:[[[124321,31442]],[[124337,31429]],[[124341,31419]],[[123933,31687]]]},properties:{cp:[121.330736,30.724697],name:"金山区",childNum:4}},{id:"310117",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@DLB@BFTHAFB@DABHFELFBBAH@DIHB@GB@@CB@BEDAB@LAPB@DFBADD@@BBBN@@DRB@BADALHABlH@@\\ABAFQPOLDBDBDCJBBJFA@FCJC@@DCAABDDBDKHB@CDBDEBCEINHDABFB@DDDD@F@@ABCAA@EB@@CH@B@BCBABD@DLBBCB@R@ADD@BAJ@BBBB@BA@@NG@AFELC@AB@@CBA@KJAAA@CAC@CLD@ABBBGJDBBDCFBBDCFDADBBDCABB@@BA@HHDBABFFDCBBDCB@BABB@AFEBBBED@FEDDBED@BALB@CD@DEHBBGDBBCB@BFB@@LC@@FJA@AJB@@B@@FB@@HH@@BJ@CJDDADDBB@B@BCJD@DB@AB@FC@@FC@@D@FDA@X\\ILF@CAA@ABBJ@DEXFPBI_CM@CF@NFF@BBB@BAADBLFBJABHKB@@L@BHXCAGBAF@@BB@@BCFBDDBD@BB^ENNEFEAEHCC@DBB@BB@AH@BFCD@B@ABDB@@FAF@ABXFnNHKB@BA@CDC@CDA@EB@BCBADE@AC@BCD@DCFI@CRUHM@@GE@AA@@BGAFONDBCHBFK@CBAHODICACDEC@CC@BCEAFEA@@CMABEIESCCHECEDBCAA@WAMAA@MBCAC@E@A@C@E@IAABCN@FDBAIGAGOSGAA[DAD@J@XIJ@PDDI@ODK@UD@BCAAGADSG@CAA@AABAAAA@@BECBC@IFCBC@CIG@A@AGDCABACCBAA@@@G@GCCB@AABC@ABC@ABCAE@EDC@@AEAADEABAA@@DE@@A@@ABADCAACA@@AGBCJC@@FB@@BMCBCAID@ACB@AAB@@G@@@EC@@GEA@DE@ACCAAFA@CA@AA@CLEAADE@@BB@@HCAABC@@BEA@BE@ADMB@AC@@A@FELD@ABB@ADCACLE@ABC@@DOAGH[U]EI@CACA]AIDCHK@CA@SMD@BMD@BA@@BBDCBC@CKBCDA@EBE@GMBACC@AFM@ACGBCAEGED@DFFDJD@@DD@@B@@DRMBA@E@@BCAGAADGHQSCA@GBAD@DADB@CB@DCACA@@CE@@DE@@ACA@BKD@ACA@DA@OA@CC@@AC@AF]AOCEECD@HCEGB@FSF@BBNFL@JFR@HA@@DA@@FCA"],encodeOffsets:[[123933,31687]]},properties:{cp:[121.223543,31.03047],name:"松江区",childNum:1}},{id:"310118",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@GCIBA@@FADHD@BCDBJIBID@ACA@@AD@BAFDFEBDB@ACB@@ADBFCD@FFHCBCD@@DA@DBBADDBADDBAADHFDEBB@BBDBABBBAA@DE@EFB@CB@@DFBABHD@DBB@AH@@DPALEHB@CFBDA@DB@@CD@AAEAEEACD@CAACGA@A@@AEBACCDALBBEBADBBADCACHCBGCADGACDC@@DECEJGBCCADCD@VSLBDBLHBB@DB@BBFCDEBA@AB@@AFC@ADADEBA@ABADGBAHIDKJOmMWEBAE@EB@@CABAA@C@ED@ABGA@@AAA@CDDFGFBFEMM]FAAC@CAACDE@AA@@AE@ABBHWDAGK@@@LAAGIBEAAKBCABA@AAE@MEE@@DDNJ`OAWECFI@AA@BBB@DKE[J@WCB@E@CD@@ED@@EBAA@@CICADA@A@CABCCCDII@@AG@@GA@@EA@@@IA@BIB@ED@@KA@AEA@ADCAAHGACFC@@DKAABC@AFCCEFC@AFAAEF@BAAABA@CDAACDEEBACAGGB@@AA@BACDAABCECCDAADGAACAHIAABAC@@EDEB@HBBBLIB@DA@@BAD@FKBEH@@MB@@AAAAAI@ABC@BCQ@A@ADKA@CACABADA@G@@DA@@FBBAD@BE@C@CC@CEABAGCJMDFFAACDCA@LGACCCBADB@CD@DI@EEBAIIACDCACAPKROBEBA@[G@AkGBBKBC@AQA@CM@AA@AC@BCEA@COAKBA@CBAFA@@DA@@HGACJG@ABEAFKGEBA@CEAGBEUKA@CQE@BCABCEBAHE@@BB@A@@DDB@ADB@DC@C@@BCCB@OC@HM@AHC@AHF@CHBF@BC@@DB@ADBB@BNB@BB@@FDB@DC@A@CRA@CFBBAFGAADDB@HA@@DB@@D@@ADBBEJDBM@ADg@ABFFABGBCNGBC@CACBAADAAEFACK[AAAJK@AC@GBEDG@ACOFOEAD@JQ@@FBdCDEL@FCD@H@JHXBPHABDEJ@BEDCACHCFAHA@@EG@QB@BBDE@@DE@AAE@@CG@ABADA@ABCAABCDBLD@DHNJDD@HDHHHJFdDPCTD\\JnE€MPDvBJHADHBBD@BD@@EHBFCBEDB@AD@HREB@FHD@DHBBGD@H@ABDBL@@AB@@AD@@CFA@BAFFD@BBB@CB@@FHDADB@@DEAADJB@DCHEAABBB@BFBAFEFADJDABIAADFB@DAB@B@BDBABCB@BE@@DD@Kz@DD@@HD@@DC@ADA@A@AFFB@HBA@BAB@FC@@AIBDBDABD@NA@BBBBABBRA@@@dFFDDHEBBHDNFFABDBDADCB@@AB@BCFO@ABCHCD@BBC@@@FDPRF@FA@DB@@AHAACFCHA@DFAACD@BBDAAABAD@BBD@@CDALBFB"],encodeOffsets:[[124062,32028]]},properties:{cp:[121.113021,31.151209],name:"青浦区",childNum:1}},{id:"310120",type:"Feature",geometry:{type:"Polygon",coordinates:["@@LBBAJB@BD@T@BDbCBBD@FKHEPBDAB@nBRA@A@BHAJCB@@BB@@BTCH@J@ZI`SXQBCHGACFCDBBAB@HIDBF@NGDA@EFEACC@@CFB@CD@DBBAB@@CBAD@@EH@B@@AB@@AA@@EBCA@B@BAC@@AD@BIAKAC@G@IA@BA@GAAB@EQBIGA@IA@GYBYrƒĥDƒEŸU¡_‰[g¤A@EDAA@BIVC@AA@BOBKBAGG@@HCBBBSBCFA@@DA@@FFA@HA@@@EBCAAKG@A@@DI@@FCB@BC@BBA@A@@@A@@A@BABBBCF@FL@CPBJAFBJC@@HBBALADBFKBIFABEDIBCL@JEFAPKJHFBFADED@JADFD@AB@BBABBBB@DBH@CTHBBBADC@@VCL@PCJ‚TfD^JNJLJHBPDV@LBLHJBZDHCAEJYDB@BLHTFBBD@@AD@DEB@@AC@@EF@D@HGD@BAFB@AF@BCJD@ABABB@AB@DCBCDADB@HAB@BB@BAD@@DP@NF"],encodeOffsets:[[124489,31743]]},properties:{cp:[121.458472,30.912345],name:"奉贤区",childNum:1}},{type:"Feature",properties:{name:"崇明区"},geometry:{id:"310151",type:"MultiPolygon",coordinates:[["@@Ɯp@dG¶ƒY€IЏtuÆu¬RWˆWckĜyPVĆgðÕTUm…U¥c}S“H¥|÷Œ^oGĝ¬åеxƒb™žcAXor‘š]dš€"],["@@”MšURm@kYiD[YRwRmdS^ChQv"],["@@¬Q˜SzoMUægLShQ”e^sFwS_aL“’ïž{d\\ungZeNGZ"]],encodeOffsets:[[[124119,32586]],[[124716,32134]],[[124427,32249]]]}}],UTF8Encoding:!0}):D("ECharts Map is not loaded"):D("ECharts is not Loaded")}); -------------------------------------------------------------------------------- /map/js/province/tianjin.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | (function (root, factory) { 21 | if (typeof define === 'function' && define.amd) { 22 | // AMD. Register as an anonymous module. 23 | define(['exports', 'echarts'], factory); 24 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 25 | // CommonJS 26 | factory(exports, require('echarts')); 27 | } else { 28 | // Browser globals 29 | factory({}, root.echarts); 30 | } 31 | }(this, function (exports, echarts) { 32 | var log = function (msg) { 33 | if (typeof console !== 'undefined') { 34 | console && console.error && console.error(msg); 35 | } 36 | } 37 | if (!echarts) { 38 | log('ECharts is not Loaded'); 39 | return; 40 | } 41 | if (!echarts.registerMap) { 42 | log('ECharts Map is not loaded') 43 | return; 44 | } 45 | echarts.registerMap('天津', {"type":"FeatureCollection","features":[{"id":"120101","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@BhB`R@DA@CD@DCFCHBLDF@DABKFIJGQG@COEQM@@OASB"],"encodeOffsets":[[119992,40041]]},"properties":{"cp":[117.195907,39.118327],"name":"和平区","childNum":1}},{"id":"120102","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@XFFIE@BGGA@KVBN_]CCCLg†MGE@CD@AGB@AEGMEACB@BA@BFWFACKA@DA@@DA@C@CCCDGIAKMBWLGFERWT]bADCNE@DDIDEFBHTHBD@DLMPJj@ARX@"],"encodeOffsets":[[120075,40099]]},"properties":{"cp":[117.226568,39.122125],"name":"河东区","childNum":1}},{"id":"120103","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@TAPB@@RNPF@DRHPSXSFQHEXK‚E@CMIFUQA@DC@CCA@CDE@CEE@FOc@@D{@ch]IGFCFE`A\\"],"encodeOffsets":[[119992,40041]]},"properties":{"cp":[117.217536,39.101897],"name":"河西区","childNum":1}},{"id":"120104","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@C@@DCBQ@AcAmBOFaDEHEgKID]ZQTINCJEdkhHDRNCB@FD@BAFDFHB@JIDANFDECCZCBA\\B@Hd@LB@CAU"],"encodeOffsets":[[120007,40074]]},"properties":{"cp":[117.164143,39.120474],"name":"南开区","childNum":1}},{"id":"120105","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@FBBAJBFDJK\\NFEFBLKBBBATP`]QOLB@AHBBEJ@DDDE@QW@BQi@OIKN@CACQECG@CFCJCCCMCGAEDCFBT@DSTQN@BFDBDCJBJAHKAIFDDXDAB"],"encodeOffsets":[[119993,40130]]},"properties":{"cp":[117.201569,39.156632],"name":"河北区","childNum":1}},{"id":"120106","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@JELBBGAIDIACEC@ARMTSKAc@@G[AABYDDDCFMECBIJC@CPHZ@LHNFFNHBCDAZBB@DEJE"],"encodeOffsets":[[119980,40125]]},"properties":{"cp":[117.163301,39.175066],"name":"红桥区","childNum":1}},{"id":"120110","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@CK@QOCEAEK@KAAKAKEoRECIYK{\\Af@BMb@@WAGBC@GV@KYBUkB@@OD@AEUE@IQDAGSJEDFD@CIDAAKDE@KECOKKEABMVMRGBSGE@KDCDADDN@FCHCBGAIGUKUEcB]JULINIZGD[AU@QDMDGFQR_NODiBcDBLHJDCDDF@@CB@@CLBBDXEAEB@@ADAFBHNBFA@BHC@@DHF…NKhDD^DM`UA@LHBAHF@EJWE@RCFCCI@AFGA@BKARP_^ZXZL\\JfHNHEdEAAFBBQCAFPHRGtMBEB@NB^Cb@lECFHDPD@DNBJCFE@CEG@GTCPHBF`@JFBCHJJKRCP@JGTIAQGIDAPAVH@GCEKEEBAAVEBDADPFBBCFBBHE@WHClQPCFBTARE"],"encodeOffsets":[[120391,40118]]},"properties":{"cp":[117.313967,39.087764],"name":"东丽区","childNum":1}},{"id":"120111","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@CGECABC@@EDAQMGClgD]DM^c^YHCF@‚VrwJBBINBHAFAHBDAN@LDDGCCA@AC@AACBAAEFKA@KDCCJCJDFGF@DCBGDQJERFHGMCLEAAGAFGMMAWE@BHQLKIBAJECCCAAGQW[DAAjS@AIYXKGGƒT@NBFEBABOJBDMFADGG@BGH@@AACFKGCG@FMWMDABCBAACLCIGCAE@[P¥\\]N¯˜MNORU^Ž]XKF`_XIIAIkDDZF@@FMDJLmTSDaHgDBJE@@DOBDH[HFJCBCGCBIMKH[L@AAAADUBACECGHWKCHTHBHaJDLF@JNF@FNLAH\\FABPD@EF@@HELCHVF@GXBB@DJBI\\PB@BN@BHK@GBAJ\\F@AACLABBAB@DFHB@FFJCDL@BA@@DF@JEBKHB@CjHBENDH@HSFBDKEAFG\\H@DE@AF@HHBANH@BQ@CBGNFT@`LFABIN@ALDBCFRHFB`D`ANANCG[DM"],"encodeOffsets":[[119940,40092]]},"properties":{"cp":[117.012247,39.139446],"name":"西青区","childNum":1}},{"id":"120112","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ZAZEVKXSPGVEnDHCJYJMVKNEPCdAZHRJJHHBDADG@ECMBCDCLCF@THHANQPWD@DBXRJ@HAJERSJAJBDCEOCAKYBQCA@GBCDSGAGBIHSNA@KCQMCF]IN‡aCuOSGU{zm_yENH@HDELBD@BG@AHH@CHEBCNIAAPABEFMAS@„HHWLJZ@BiTBB\\CRXBHDBDDIFABLJRKAGF@BXNNEHHBBBKFNDGHQEIFCRAHCDE@EHICIDDDLCB@ELBFABBD@BBDB@DDCHKCM@CBGAEBGBMAAJIAMP|@@Cd@EPF@DFF@DCB@DDD@@CRBEVNJ@D"],"encodeOffsets":[[120108,40016]]},"properties":{"cp":[117.382549,38.989577],"name":"津南区","childNum":1}},{"id":"120113","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@PQFFJICABACCDAKGJGLHRMVMMERKHH`WBFFCRFJHHIBOK_MC@QLCDIBAMA@COCGCDEkFa@]DMAA@AFsNQHOGBERDAABEFBFcMGeG[IQGGCmgABAAKLEAEF[MILECKA@BA@CABAWCCCIFEFYACBADICIIGM@KMDgDO@UCWIDECABKM@AJEB_KS@MEAH@DARG@BMGA@GBEF@@C[GEHFBCLEAGTG@MCAFgGA@@DGAALIFE@@CB@@ACKIDIGQJ@DHD@@GAAH@FDPbB@BDEJ@BBAFBNBHDBCDBDHBEJFBBDCFANA@AFTFFARPBNLABARA@DD@BB@HFA@PXBBLDACRKEAJF@GPD@AN@BjHCGZFJUN@BA^F@FIAAFNDCF@B\\LONADtJTAFBDCPBDGPETBADNDFFDFCD@LHBBKJFALIA@DB@@BNFBGHBBEN@@DHD@FFBDAH@AHBBCLDBF@@HFBBGJ@BBAFfLLABCH@ADLFJENAHKLAFBDEH@AHBDJB@DB@B@AADEFCLBNCDMDER@BKGA@ADEZDBELH"],"encodeOffsets":[[120140,40274]]},"properties":{"cp":[117.13482,39.225555],"name":"北辰区","childNum":1}},{"id":"120114","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@DKEC^QZS^QwVMAAB@CCI@@CB@H@JCBCFEDBCFF@D@H@FALIXMBIECM@ADE@OABEPA@CBCD@HEDIGEC@AC@KJ@DCH@@DFADEDAFBFALGBMFABKGAAA@CAALEJOFAFIFEB@JKDEJBDCCAEAFI@IDIDINECABGBQBCFC@AOKIHED@EKG@JDFOH@EIEDEFOC@BCEACAACAEI@AAHUXC@GD@AMDED@BEF@BBHAKADID@BGCIBEIIGCAFOAGAEF@BHBALQ@CFCNMDKAEDCFBBC@@CIAACBGG@CFEAKBGLMBIFKEBCG@ADKBeKBEAAI@AHEA@GE@CADKAABGG@CBEA@EGC@CM@AFGAAHME@AA@@CJBBKIEALGA@KDCCEEEMCBCSAOFCHOACDEASBsIBCPM[K@ADEMCBEJB@E]EABM@IVYEDHiG@ABMC@HOE@BILFDQCBAKWA@OEB@GAAC@@CQBABKBAMQOEBSEBEB@BMDEACEAFIGAACDCCAAGAMBEAAI@CF@AaACO@EBGHB@@GC@CRICE@CBAAAKBBD@B[EBIHAL@AGM@@AOAJ[IA@CAAHWM@AHJ@G^G@AF@DA@@FEBBFcJqAEDECFFABBRCHBFEDDNAHA@@`@@CHG@AT`D@AH@@PBBCJDBFABGB@@BBAB@BIFBBDJ@@FE@DHKD@JA@@FGCCDE@AZFDM\\JBCZCRKA@FGA@JHB@FBBXFBCFB@BB@CRJ@DJ@HCTF@ADB@AHEAIFKACH@CA@CLA@FBAFB@@DH@CFE@ADIEKA@FAABIB@BCG@@CC@BAOMCJGG[C@BABG\\AAAD@FL@@DJBADHB@BA@ABOCCDC@@BC@ADB@ADA@AFL@@A\\D@FFBBEB@CLB@ELB@@BAB@DBB@DEA@DD@AFCACDBHJDALF@AFFBBCPB@DB@ABBBBBD@@DDBFB@DHBCHDBLEJNMF@DKCIFCFQCBAA@@AEBAA@@EA@DOICDGD@BB@ALDA@BYLKA@BBGGA@AMHEABCC@GNLE@NC@@DAAAFEAAJKBBBF@CB@BF@AFH@@BN@ADZF@DD@@DF@DCFBEBF@@JB@EDCPA@@FI@@BF@@DDCCTH@C@TD@BB@G^FAGPECBGG@@BSAEDALG@AJA@AHC@ABC@@FEAAHB@@DB@BDF@AHHFA@DBABD@D@CBBBCBXH@DB@AFH@EHCACFCBCFA@CFDACL@BB@AFB@BCDBBA@BBBBCFBADE@B@@BCBBBD@ABE@ABAA@BLD@BHDBEGA@AD@CABEL@CJHBEHDBEJBBPDFCBEJDDBH@@FADHBMNIHFDEFFD@AJFADBBBAF@D@AHDBRDBD@RCBBJV@@BD@BDPBFEBBCDTHL@DAHBBCDBABTDCJJBGJNBAND@ADFBHE@DED@H@@@FH@X@BCBBBCB@DFZ@DMA@CFA@GMCADGAGBCNMAAIA@KXGCODOJMD@LJJC@C@KC@BCFAFDRDBAD@CD^F@DF@BFFA@FJB@DbEPEbElMTIZGAAFA@CJ@BE@@@FHA@EJA@CHBADBGPA@BG@AFBBVGHFL@BBABD@"],"encodeOffsets":[[119960,40574]]},"properties":{"cp":[117.057959,39.376925],"name":"武清区","childNum":1}},{"id":"120115","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@GBAAE@AFC@CFBNC@@HWDGVBBJ@BFBDDBFBADD@EPCFJF@FPGCE@ILH@FFCJGPL@BEDADARAHDBMFCJCJ@JEJFBDBCDIACFILA@EFEJEBIPKFBB@DBBHBALEBANKHEBEACBCFEB@CG@CDI@@LBDD@HFCJGFC@AD@DOBAFPBF@BCN@FDAJWNKJEBG@C@E@DECAEFADIDG@ADJ@DDA@BBUNx]RYT]RFDCLJBADDBGDBDHBFJJ@TBBHB@@DH@AFKBCB@HE@@BEA@D@@ADBHC@@AA@@DCB@DB@@FJ@@FD@@HH@E\\F@ADB@ARBBBFED@BD@@BCA@HD@AJE@@ACAAHDB@BH@AHCB@EAAADGB@BE@BBK@FLEBDDADA@BDNB@DJCBBIR@DBBDBFALDX@DHL@DJFA@BH@HHKJAB@DC@GFOHED@BCBAZE@ADE@AFGACEEDA@@AGAAVJ@IVB@@DB@@DHGJB@JpFBCFBEPPBBCNFBGHBPC@EHBFFRDRA^GD@JCFDJGHBLGFECCBGHBBCFBDCFB@EFGD@@BF@@DPALEDCECDEDABED@HCHJH@FDDEFDHENCLBDDDA@ERABEN@JEDDBACEJ@AINMRBJGAIDCZEJCLAFRTJHAHJHFD@@AEKBAFBRJGF@BPAFBHEDBFHBAFO@@NFH@BEFGHAD@BFBBJID@BFDBDEB@J@AGDCL@FBNIBBFJD@HKDCNDF@DAFGFCdE@A@AICBCJC@C@AGAEFC@@MIBAABC@CKA@CBANACAGC@ARBJG@GLGHCX@LENBNE@EDAFBHHD@DCDIIMLCBGN@@AIEBANEGKLEJDDAAGIKHKCIBECIECSF@GBKGCIDC@FKAAGCBOC@OB@MKGC@CHCAAEFUB@HDLPJDBCAIFGDARDHGBC@EIKDGB@N@PHJHBLHBNARQXGFG@GIGK@IDEFEAAC@EHILCP@JCDGCEOFCBGABCKCBSEEK@ADIGO@AEOCEDDBqNAAH]MKiIAW@@CA@GA@DIMA@CGAAD_EEH@FIA@HIAAHUEDOHAFIOSKGSEcDAEI@@CBCOEC@CDCFEBKEFIMEGEA@@BIA@ERFBDQCABADQDCCAHMJBDEMEADGAUCCC@CDA@CCCICGO@BDJG@CADGK@CCGFICCBKEEDGBCAAEKDAABGFE@ACABCAAeA@HM@GBYD@BE@@NABGB@CCAW@@ACAEF_BYECII@CG"],"encodeOffsets":[[120145,40295]]},"properties":{"cp":[117.308094,39.716965],"name":"宝坻区","childNum":1}},{"id":"120116","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@@LCFBLCBDJC@CEIFHTCBJRF@FXPC@@lAAVLZU@@HADBH@Xa@ANe@[BL|J\\FBpQLFLBBB@LFLFBPD@RDLpMpGBPNREHE@@dVF@BJB@BD@@DFDLBDGHGDA^c\\@@cFDŠ@@jEBJZFLhrePFBEJGAENE@IVC@@RBLV@DPT@zJLHPFVDNECC@SACjQJBJCACIDMQhQD@tŽCD]LBHDBH@GLHNB@DQHBAFDHE@@DEBDFFAD@@BF@BBAB@BNFBEHCXDT@JGAGVEBEDCDB@BF@@DRC@BZ@PAP@BCFAJ@@B@BTC@DB@JEAAB@FB@ACAB@@CC@BCHOF@BADAAADCHBH@HECEB@BCHBDBBCFDBAACBAD@BBPGJF@@ABDB@BD@ABBDDAFCBC@CB@CCAKNECG@EF@@EzQBiAC@Ey@BUI@±]GaQaý¥Y_YeK]EaDqPmHcD{DK˜QBMMaKEUC_BOASY_YAYD—XSIaa¹JgCeOQ[@‘RUbK¶MPGJMA¯CUSQÓgOKMWEa³OqIGFG@EBEACIGCFK]EE@@DFD@B@BG@BHCFC@@EEAIHEACBC@BFCBQCaDFKACEBECADE@SSKMIKHQKHEJ@[UGCoO@d[CFSMIAIE@AH[A@DOA@AQKOEEBARGNI@G@BSgE@AOACJSKMVC@IXF@hJAFmKCHB@PVVFAHHB@JC@CH@BABD@ABMFC@@BSB@BAAAHG@JL@BBBWABHHB@N@BMBMAEEESMA@EA@@CCE@FC@AEQ@@GCAA@AJC@BEK@AAABSGA@@FEA@BCBC@@EC@@DK@LHBD@HCDBFCBABB@F@@FB@@DFJ@HB@BLADK@HBDBCBG@@DH@@F@DCJIB@JK@AJFBCLBHH@DCBJFF@PATBHB@ABDTbB@DaCAAE@@CAACAOF@HADE@@BICAFBHEBhTBPDBJCFCªvEFeVTROJVT`O„€FH®_\\OF@DBJHKDBDABADCB¶ˆn`|yHVPTŽvbDMˆ^JDERNLDB@TMJGHAHBCTAD@HDBARLZDBFPCDIAGBUVOFGB"],"encodeOffsets":[[120348,39943]]},"properties":{"cp":[117.654173,39.032846],"name":"滨海新区","childNum":1}},{"id":"120117","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ABCJKD@RNDL`APGJIGQEEDAE_XGGQLNFUNQNKGIHLHCBDDABDBIJEEORFFAFDJAHC@CJLBDHJ@DJZF`AFEDB@BX@DB@DHABA@MF@@AZCHAN@@GfBBBADDB@BEFAHBBLCBFDBHAFCLFDAJDHEDDL@CHDBH@CI@AHPJDDD@DCB@DDDVDHBBCNFCFIAGNDBCDCRABDBCREAQ‚@FJB@AB@HFNFEJLFFADEDCD@PFAD@DJ@BFdCTFLHPTEJGBCPVFBGJB@GJB@EFG`FBCHB@DNBCJB@@HDB@@BXjJNLGZ@DBBrMACFANDBFP@JHBCL@FFATLDADHBDAPEAC@EBIFIJGNJJ@JBJJHJHFSZA@BND@@LVB@BJ@AFDBBDEDILjTABlEHHTBvWVAPDHCDFL@LHHB`MFALDNC^M^GJIEKABEGACC@IMA@AOB@EACIGAAEBAECCBDAAAAADAAEFCBDB@ACB@AAAABEBAD@AG@ADFAEB@A@GKSCCgG@AEJA@AFO@ECCQEEEOBGYG@B—qGBKXBFKCYJKOIKNEASCeA_ECSBGFENEF@HDZ@FCBE`TEFB@EFHFFEECBCFDFADBDEUWCOGBAIECLG@CEIFA@CF@CGBEGACRA@GMHKG@CAAG^KDCsC@gRNRJCBDIDIAiRBD@TDDMFUCOEKGyIS@COU@AK@QD@JUF@FMHBFIEAfOgqEKIYFA@i‰@EC@d[@]dCBGHCHKAEC@CC@@AIA@AUE@cF@FGMQAOgF‰VSBEAODkRGD@XGFAADEAAOEBCACUFBBFALFDF@HUGOBCBHJBRSJIHO@QDILGIADIE_@AEOGSD@HFH@DEFID"],"encodeOffsets":[[120221,40183]]},"properties":{"cp":[117.82828,39.328886],"name":"宁河区","childNum":1}},{"id":"120118","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@AHC@@FCA@DHB@JS@@DA@@H]BCTKfG@BHK@@FEAADJD@RJhNNI@@FQBBDCBQA@BBLMIBNFJADHHEBuK@IA@AKU@UDDH—KI@HAGAAC]@CDCA@MSAHPGBOEMEIA@EC@@DA@MBAASB@BCB@TE@@BBBBDAHCBDFABFNGBBFKBBFC@BDB@FPC@BPCPMACEoBE@AAC@@DcB_D@ECB@A@BA@B@@DC@@CA@@IE@AAG@BDK@EBABQA@JE@@HC@ABA@@BB@ADOA@DIAACA@NxQB@FIBHXHABFKBFLIDLPDTF@DNC@CAGB@FA@BJDXmBAœ[@@ˆD@@NL@BHB@H\\BTD@HRB@JF@FL@FHDNDABJDCDTD@DTA@@LF@BB@XGBADE@@B@B@DJXJ@XEDFHAFHCBBDBDJBBHTCAIGBAAGBEA@EC@BCB@@BBAC@@AB@@CD@@DB@@DJ@DDF@DAF@@CLABBF@@AB@BBJ@@IBBDBB@ACJBJDR@@HD@@GfBAFXBCLH@GTPFjKAGSGDGXLHGFDBDVABCBB@B\\KLGJNDADHDAEI\\GCGPA@CF@AIhCbGTCnSIKNC@EE@CYlCBJJJ`W~W\\M^W€V]^_°—VIEGƒ_PUSPISQfUFE©uEDIDCAAOgSFAAGBEJD@AF@BC@GPEDBBB@DF@BBbD@CaACSBAA@AGBS@OEEAICDG@AGDKEABIL@@IJADI@C@EG@@CH@DACAGAL@@OA@@GEI@CA@@EE@A@BADAAEDC@GACOKB@BMEB@ESEAABECAWBAECBBCC@CIBCS@@IWD"],"encodeOffsets":[[119909,39513]]},"properties":{"cp":[116.925304,38.935671],"name":"静海区","childNum":1}},{"id":"120119","type":"Feature","geometry":{"type":"Polygon","coordinates":[],"encodeOffsets":[]},"properties":{"cp":[117.407449,40.045342],"name":"蓟州区","childNum":0}}],"UTF8Encoding":true}); 46 | })); -------------------------------------------------------------------------------- /map/json/china-contour.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"id":"100000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@š¦ŜiÀºƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅ó­@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ AɞÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĒĞȠzÐŘΰH¨ȔBĠ "],["@@ƛĴÕƊÉɼģºðʀI̠ÔĚäœθؾNJŨxĚĮǂƺòƌ‚ĪŐĮXŦţƸZûЋƕƑ’ʳÛDžƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"],["@@Óɖ± dƊ½ǒÂň×äı–§ĤƩ™¶hlçxĬŸĄŞkâ’ÌwøàIJaĞ‚fƠ¥Ž„Ŕdž˜®UɎÖ¢aƆúŪtŠųƠjd•ƺŠƺÅìnŽŢ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼìĴPðŀbþ¹ļD¢¹œ\\ĜÑ̔ùўÊ‰ȮŒǪűŽÀêZǚŐ¤qȂ\\`ºłĤ\\ºs|zºÿŐãѦvĪĺĺ†ĈłÈ͚FÞºĠUƢ¾ªì°`öøu®Ì¼ãÐUÞ˶¬æɒlʐߨvWʚ”ÖÕÁÜÅŵ­_«”E”ÍɪëÏ÷ÅyXo͂ĝĂÛÎf`Þ…¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘETėº¯ɀáMĺŝOéȇ¿ÖğǤǷŔ²å]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±‚řü›]µȺrĦáŖuҞª«IJ‡πdƺÏɌ]͚œĐ™ǂZɔ¹ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥Ǖǚk˦ӷxūД̵nơԆ|DŽŽࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãɜRצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´ԜÃƲÀɠmǐnȺĸƠ´ǠNˠŜ‚¶ƌĆĘźʆȬμƒĞGȖƴƀj`ĢçĶȅŚē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDƞŧǘÛۨĝȘIJžªǬ”¾äʀƪ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊ˰ȎŜHĦðDĝŒ|ø˂˜ƮÐ¬ҌqjĔ²Äw°dždĞéĸdîàŎjɒĚŌ‡ŜWÈ|Ŗ‡¶îÎFC•ĊZĀēƄNĤ¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Šų¬K°ȧǵÂcḷ̌ĚǣȄɧ\\ĵœŇ‹ȣFέ̿ʏƶɷØ̫»ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔDzlжøZh¤Ɛ E ĈDJ˜ì¸̚¸ƎGú´Pž¬WÄì–HsIJ¾wLVnƽCw`h`¥V”„¦U¤¸}€¾Ô[~âxh¢ªHÆÂr–iĐɘǜhÀoRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚ÈÄ[|òDȎŸÖdH„Ʈ–Àì~Ǝ†â•¦^¢ķ¶e”ÐÚEꖄɡČÅyġLû™ŇV®ŠÄ‰Ðź~ϰƂŤǒȦÒŬÂezÂvǴZ„{ĘFǜĴAΜĐȄEÔ¤ØQĄ–Ą»ΈZǺ¨ìSŊÄƸwŠn¼–c]—ܬì¯DŽ]ȘŏńzƺŷɄeeOĨS’Œfm Ɋ’̎ēz©þ†ÐÙÊmgŸÇsJ¥ƔˆŊśÎÔsÁtÃßGo—À­ xňË_½ä@êíuáĠ[ġ¥g“ɊדûÏWXáǠDZÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Dz¡SíċġHµ ¡EŃļƒrĉŘóƢFƺ«øxÊk†”ƈdƬÌr|©ÛńRŀƒøďŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^gēĊĕƯǏx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ɏ‘~”ȰCĐ´Ƕ£’fNÎèâ_ÐŮeʆNJǘuȔ\\¤ÒĨA¢Ê͠æÔ ŬGƠ”ƦYê‹ŊàƆXvkmŸͥœ@čŅĻA“¶çÎqC½Ĉ»NŸăëK™ďÍQ“Ʌ›řęgßÔÇOÝáWáħ£˯ā¡ÑķĎÛ寰WKɱ_d_}}vyŸõu¬ïÏҽ@gÏ¿rýб…Cd‰µ—°MFYxw¿CG£ǧ«»ó¡Ɵš¿BÇƻğëšܭNJĭôµ}‰čÓpg±˜ƒǫŋRwŕnéÑƕfSŸŋ‹®ÍšD Ûǖ֍Ÿ]gr¡µŷzįm³~S«“„›þeo³l™•{iē¥yZ÷īŖõġMRÇģZ“mÃ|¡™ģTɟij“Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜTNJŋB…h–¬ƩDoˆ±enq©G`™wGçǑ‚“K‰‹F‚“›uNĝw‡őXtW·Ýďæßa}xV•—XR‰ãQ`­©GŒM»­”ďϝd‡©ÑW_ÏǷr¡…é\\ƒɹ~ɍuØ©Bš¤ÝĤ½¢Å_Á¿•LŅñuT\\rÅIs®y}’ywdS™DZtCmûvašʋJr€Ư‚⦳P‡rbbÍzš€wBG’ĭ€T†Ák‘»ƒlY­ċ²z“Ç£—^§»d¯íŻŽ£ćGŵDžƍÓ]í“M^o•£Ã]ªUóo½~ŕ‘|ŋݘ¥ċh“¹·CÉ­Dřlg‡ȵë[‘’}ģS}xƃği©ĝ‡ɝǡF꼵áƣ©‚Hžĕoƫ€Ňqƒr³Ãg[„šÃS–ő_†±ÅFC¥Pq{‚ñg—¿įX…•ƝıĉNj•ûěʼn³F‘¦oĵ—hŸÕP{¯~TÍl¸ÓßYÏàs{ÃVU™™eĎwk±ʼnVÓ½ŽJūĉ»Jm°fϑdF~ˆ€ĀeĖ€O˜² Ĉ‰żĀiÂd^~ăÔHˆ¦\\§|ĄVez¤NP ǹӗR™ÆƇP[¦´Âghwm}ÐШźhI|žVVŽ—Ž|p[¦À¶èNä¶ÒCÀ¢^h—PfvƾĪ×òúNZÞÒKxpw|ÊEZŽI¨®œİFÜçmĩ‚WĪñt‘ÞʼnËÝ^³uL‚±|Əlĉ¥čn§ßÅc‘˜B× CNƒǟ‹_ñŧı¯Y]ăٟ™Ľѷť‹³ÃAR‹‡ZRlʑýSëÍDěïÿȧ¢ÙġƒěŗŷęŸUªhJˆƁ™ƅn³gF‹³HàŋÅÃƉÀKšť`ċŮÁõYėé÷`ٚ_Ïǵ—R§òoEÅąLœŐœƜVµąłíļĐ·ũ̈«ªdÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿäćú y±¨Mf~C¿`€à_ŒÿƌfQnð³ƬˆŲŎ¥ĠʦĘĒØ‰¼Â†±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«Múīô‰Ö°ʊkŲÆM|²@¤u•ƒ¤Û´Œä«̰\\„}ēƒ‹ÅM•¼Ã­]NągoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøC̍ƃhÛ­–Ň\\bÅxì²ƝýN‰īCȽĿǃšŖÕy\\‡¹kx‡Ã£Č×G¿Ï¤ÁçFQ¡„KtŵΥëÚź—Љ«ėn½ĉŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕñžx———Z¯u™Œ…Ï•˜ï{éƵP—™_K«™pÍÁwƏčaE›U”£uݘāɌŁFŴu»¹İ×ȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±hǥ®jű¢KOķÅ}`åÂK­_Юƫ²ʯÊ^H{ǸÃĆēĤȍzȥݵċF͓ŸI©Õ͈ǫȌȥ¦ŋEӏ“†ıŪěřÀåżȟLƏ—ŽąđGǛģLjƧĎOłčȶʋÀBŖÕªˆŠÁŐTőŕåqûõi¨hÜ·ƒñt»¹ýv_[«²Kƒ{L¯‰SªƒGѵ¸•gÑpY´«•ęœƘʑcoċ\\œ­gěŧ«Āý¶ŧ·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZ~﵉fzʼnfåÂȝǷÕĕÊĉ{ğč±uƁí]Í»ęX\\­•Ip™¡éĥZE‹ãoP…þy—¸k³—†¡ƽŸ¿å³BRضˆœWlâþäą`“]aģc— ĹGµ¶H™åՌ‰¾xĨ‡ôȉðX«½đCIŇOK³Á‰Äţ¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNrį~IМ‘êĘÎG§Ė¥Ý™F{ WK}ùaH‘āÖ{OoužHEÅǍqĬuë±KEò£‰UplÀ÷tMāe£bYÂý¡a±Öcp©®^ö±q…ÇGjųªKy¬ŏ–®¤ÉEŸ–ĀåA¬ˆV{Xģ‰Đƒpě…¼³Ăp·¤ƒīyÚ¡ŅLĻŗž§qlŸÀh¬µ»åÇGnùčÙmÆß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěYÓ±]ÓđīkWó«íěCŸŇͱ™‘čvĭõĉ‚ę÷N¹³ĉoTĵËçŁYلǝŕ¹tȏģ·Ĕĭ|đėÊK™½R‘ē ó]™ĀęAx–ŸNk©|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™áÎÁąÏŸHcòßÎſ¿Çdğ·ùT×Çūʄ¡XgWÀLJƟψOj YÇ÷Sğ³kzőȝğ§õ¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰Ƈ׫BhlmtÃPµy‹ÓɉUīí}†€GBȅ‰ŹãĻFŷŽǩoo¿ē‹±ß}ŽwƋtƺ—CőØEîǻīƓʑã͘ƍ“DĈ±ÌŒÜӔĨ£LóɢVȞĆĖMĸĤfˆÜǗjđĆ»ýͥãğ¶ĞØO¤Ǜn³Žő}‹¦…·z€YŠwa™–šőűMę§ZĨ훘Û]é’ÛUćİȹ¯…dƒy¹TcÂĕ½A´µê÷wĻþÙ`K€¦˜…¢ÍeœĥR¡ˆã…‚Ĉu¼dl‰t‚†U¶¶ď\\zœ}ưŬ–{ÚfKš¶Ð_„ÂÒ¿C©Ö•TmuŸ¼ãl‰›ŇÕVåĤĵfÝYYįk‘ÒīØſNQĠ³r³øÓrŸÖͳgÍſGįÅ_—±he¡ÅM²Ɠ綾ßīZgmk„ǭƁć¦UĔťƒ×ëǟ…e˭ʔħǛāĘPªij¶‘Ņăw§n‰ď£S»şŒÍļɉŀ‰}ÛÞ»å£_ˆŸıęÏZ—÷`…[„ùx½}ÑRH‘YėĺďsÍn‘™é½Ya¤Ïm¬ĝg•ĂsA•ØÅwď‚õ¤q}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónȯ×âpÒŌ“Ø Tˆêa²ËX€€c̋lLìģËŁkŻƑŷÉăP¹æƧÝ¡¦}•veèÆ´UvÅ~§‡½˜“Ġ²Ŵwæč\\Dƒ}O÷š£[ŽăŒá[™‚į‰ŷvŸœRsdĒƄwžŎĒo~t¾ÍŶÒtD¦Ú„iôö‰€z«Ųƭ¸Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†AĦw\\ưĆ ¦g–ʉË£¢ι‰ǫßK‘ÙIįóVesb‘aĕ ǠƺpªqŒ‚ďŒE˜®tŸôřk˜ȌwêżĔÂe‚nËÂQƞ´’¼ŲƝÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“¬oêDŽŲÚr^¯°’^º{ªBHŒ²Ö¤ɦ§Țv€qĸ„ ­viļ€ndĜ­ĆfŒ“xÝgyށqóžSᝑ³X_ĞçêtrmÚ§z„¦c¦¥jnŞi˜¯´ÓH@ÂċĂჷÌ_þ·–¹_wzË£Z­¹|ŕWM‰“|O¥ÃWTÕ­ùÔQ†¥‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnkòəėªƒ²œm˽ŏġǝʅįĭạ̃ūȹ]ΓͧŹəăЕ·ƭˆęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖƝ^ęuůÞiĊÄÀ\\Æs¦ÓRäšřÌkÄŷ¶½÷ùCMÝۛĥ°G¬ĩ`£Øą‚ğ¯ß”§aëbéüÑOčœk£ÍI ïCċÀÕÕĻSŧʼnïŽŗãWÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔŠƦ›Ú@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxĉWù׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRÑÈěVVе‚õ‡«Œ¯ůĉ¥áºaeõ|uĐh`Ü³ç@šƋĿa©|z²Ý¼ŸĴ貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaňæêSĈ½Ž½KÙóĿeƃÆBŽ·¬ƃV×ĴƳ˜lŒµ`bԑ¨ˆÐÓ@s¬ƿ‚ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSÄį¤Ç[ǾµMW¢ĭiÕØ¿@ŠÂ…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨^“ƒ±ze…ė·¥Ó@~¯‹éīB™Š\\”āƚǗÀƷŘóQīÈáP•œǥ@ŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­Z±đ[‰Âÿiñ¬‰Òj°ŁŤ_uµ^‘°ŒìÇÊĶĒ¡Æ‡MğźİĨƥôRŽāð©[wâ䥩Ô\\°ÝĄ̄Ƣ’ăk™néǀůŠ˜ĆK„ĒĬœ¶è‰âz¨u¦¥L~ƄýÎIƖߔµĔƱĐċņbÎՂĄæ_ƞZRÖíŽJ²öLĸҜcºƖÎ\\ñºÛqY–Ѩ`x¥’ù^•}ƒÌđYªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´Aňńňĕuĩt[{ù°ŁÏ•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGǣ@Dü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKÕK‡ÄNô‡ŠfœƫVó¼dz—H‘‹QµâFšù­Âœ³¦{Y‹Â¢ĚÜO „€{Ö¦ÞͨJÜÄƨ€lŽU˧ªÍE˨¡ĐĬĬùÎRƠŸHÕŔ_ƪàÒKäȇĬə²ȕnáûl—÷eǛò•Ğ\\ªÑò˜Üìc\\üqˆÕ[ēdžċªbØ­Œø|€¶ȴZdÆÂšońéŒGšŠǚnìÈƲ‚ہȖưòTxÊǪMīИÖŲÃɎO̚ǰއRěò—¿ġ~åŊœú‰¬ô¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ŀ¤ĄYÒ©ÊfºmԈȈ¡DŽ~¤„s²‚”ʘچžȂVƼîèW²æIJXŔþɔÖĚêϜêĮŢɨJ€˜¯ÎrDDšĤ€`€Q¾§~wâJÂ˜ñÈOú¤p¨ŪŊMǎÀW|ų ¿¾ɄĦƖAiƒ÷fØĶK¢ȝ˔"]],"encodeOffsets":[[[112750,20508]],[[123335,22980]],[[82455,44869]]]},"properties":{"cp":[116.3683244,39.915085],"name":"中华人民共和国","childNum":3}}],"UTF8Encoding":true} -------------------------------------------------------------------------------- /map/json/cityDatas.json: -------------------------------------------------------------------------------- 1 | {"六安市":[116.3123,31.8329],"安庆市":[116.7517,30.5255],"滁州市":[118.1909,32.536],"宣城市":[118.8062,30.6244],"阜阳市":[115.7629,32.9919],"宿州市":[117.5208,33.6841],"黄山市":[118.0481,29.9542],"巢湖市":[117.7734,31.4978],"亳州市":[116.1914,33.4698],"池州市":[117.3889,30.2014],"合肥市":[117.29,32.0581],"蚌埠市":[117.4109,33.1073],"芜湖市":[118.3557,31.0858],"淮北市":[116.6968,33.6896],"淮南市":[116.7847,32.7722],"马鞍山市":[118.6304,31.5363],"铜陵市":[117.9382,30.9375],"澳门":[113.5547,22.1484],"密云县":[117.0923,40.5121],"怀柔区":[116.6377,40.6219],"房山区":[115.8453,39.7163],"延庆县":[116.1543,40.5286],"门头沟区":[115.8,39.9957],"昌平区":[116.1777,40.2134],"大兴区":[116.4716,39.6352],"顺义区":[116.7242,40.1619],"平谷区":[117.1706,40.2052],"通州区":[116.7297,39.8131],"朝阳区":[116.4977,39.949],"海淀区":[116.2202,40.0239],"丰台区":[116.2683,39.8309],"石景山区":[116.1887,39.9346],"西城区":[116.3631,39.9353],"东城区":[116.418,39.9367],"宣武区":[116.3603,39.8852],"崇文区":[116.4166,39.8811],"新疆":[84.9023,41.748],"西藏":[88.7695,31.6846],"内蒙古":[117.5977,44.3408],"青海":[96.2402,35.4199],"四川":[102.9199,30.1904],"黑龙江":[128.1445,48.5156],"甘肃":[95.7129,40.166],"云南":[101.8652,25.1807],"广西":[108.2813,23.6426],"湖南":[111.5332,27.3779],"陕西":[109.5996,35.6396],"广东":[113.4668,22.8076],"吉林":[126.4746,43.5938],"河北":[115.4004,37.9688],"湖北":[112.2363,31.1572],"贵州":[106.6113,26.9385],"山东":[118.7402,36.4307],"江西":[116.0156,27.29],"河南":[113.4668,33.8818],"辽宁":[122.3438,41.0889],"山西":[112.4121,37.6611],"安徽":[117.2461,32.0361],"福建":[118.3008,25.9277],"浙江":[120.498,29.0918],"江苏":[120.0586,32.915],"重庆":[107.7539,30.1904],"宁夏":[105.9961,37.3096],"海南":[109.9512,19.2041],"台湾":[121.0295,23.6082],"北京":[116.4551,40.2539],"天津":[117.4219,39.4189],"上海":[121.4648,31.2891],"香港":[114.2784,22.3057],"酉阳土家族苗族自治县":[108.8196,28.8666],"奉节县":[109.3909,30.9265],"巫溪县":[109.3359,31.4813],"开县":[108.4131,31.2561],"彭水苗族土家族自治县":[108.2043,29.3994],"云阳县":[108.8306,31.0089],"万州区":[108.3911,30.6958],"城口县":[108.7756,31.9098],"江津区":[106.2158,28.9874],"石柱土家族自治县":[108.2813,30.1025],"巫山县":[109.8853,31.1188],"涪陵区":[107.3364,29.6796],"丰都县":[107.8418,29.9048],"武隆县":[107.655,29.35],"南川区":[107.1716,29.1302],"秀山土家族苗族自治县":[109.0173,28.5205],"黔江区":[108.7207,29.4708],"合川区":[106.3257,30.108],"綦江县":[106.6553,28.8171],"忠县":[107.8967,30.3223],"梁平县":[107.7429,30.6519],"巴南区":[106.7322,29.4214],"潼南县":[105.7764,30.1135],"永川区":[105.8643,29.2566],"垫江县":[107.4573,30.2454],"渝北区":[106.7212,29.8499],"长寿区":[107.1606,29.9762],"大足县":[105.7544,29.6136],"铜梁县":[106.0291,29.8059],"荣昌县":[105.5127,29.4708],"璧山县":[106.2048,29.5807],"北碚区":[106.5674,29.8883],"万盛区":[106.908,28.9325],"九龙坡区":[106.3586,29.4049],"沙坪坝区":[106.3696,29.6191],"南岸区":[106.6663,29.5367],"江北区":[106.8311,29.6191],"大渡口区":[106.4905,29.4214],"双桥区":[105.7874,29.4928],"渝中区":[106.5344,29.5477],"南平市":[118.136,27.2845],"三明市":[117.5317,26.3013],"龙岩市":[116.8066,25.2026],"宁德市":[119.6521,26.9824],"福州市":[119.4543,25.9222],"漳州市":[117.5757,24.3732],"泉州市":[118.3228,25.1147],"莆田市":[119.0918,25.3455],"厦门市":[118.1689,24.6478],"酒泉市":[96.2622,40.4517],"张掖市":[99.7998,38.7433],"甘南藏族自治州":[102.9199,34.6893],"武威市":[103.0188,38.1061],"陇南市":[105.304,33.5632],"庆阳市":[107.5342,36.2],"白银市":[104.8645,36.5076],"定西市":[104.5569,35.0848],"天水市":[105.6445,34.6289],"兰州市":[103.5901,36.3043],"平凉市":[107.0728,35.321],"临夏回族自治州":[103.2715,35.5737],"金昌市":[102.074,38.5126],"嘉峪关市":[98.1738,39.8035],"清远市":[112.9175,24.3292],"韶关市":[113.7964,24.7028],"湛江市":[110.3577,20.9894],"梅州市":[116.1255,24.1534],"河源市":[114.917,23.9722],"肇庆市":[112.1265,23.5822],"惠州市":[114.6204,23.1647],"茂名市":[111.0059,22.0221],"江门市":[112.6318,22.1484],"阳江市":[111.8298,22.0715],"云浮市":[111.7859,22.8516],"广州市":[113.5107,23.2196],"汕尾市":[115.5762,23.0438],"揭阳市":[116.1255,23.313],"珠海市":[113.7305,22.1155],"佛山市":[112.8955,23.1097],"潮州市":[116.7847,23.8293],"汕头市":[117.1692,23.3405],"深圳市":[114.5435,22.5439],"东莞市":[113.8953,22.901],"中山市":[113.4229,22.478],"百色市":[106.6003,23.9227],"河池市":[107.8638,24.5819],"桂林市":[110.5554,25.318],"南宁市":[108.479,23.1152],"柳州市":[109.3799,24.9774],"崇左市":[107.3364,22.4725],"来宾市":[109.7095,23.8403],"玉林市":[110.2148,22.3792],"梧州市":[110.9949,23.5052],"贺州市":[111.3135,24.4006],"钦州市":[109.0283,22.0935],"贵港市":[109.9402,23.3459],"防城港市":[108.0505,21.9287],"北海市":[109.314,21.6211],"遵义市":[106.908,28.1744],"黔东南苗族侗族自治州":[108.4241,26.4166],"毕节地区":[105.1611,27.0648],"黔南布依族苗族自治州":[107.2485,25.8398],"铜仁地区":[108.6218,28.0096],"黔西南布依族苗族自治州":[105.5347,25.3949],"六盘水市":[104.7546,26.0925],"安顺市":[105.9082,25.9882],"贵阳市":[106.6992,26.7682],"儋州市":[109.3291,19.5653],"文昌市":[110.8905,19.7823],"乐东黎族自治县":[109.0283,18.6301],"三亚市":[109.3716,18.3698],"琼中黎族苗族自治县":[109.8413,19.0736],"东方市":[108.8498,19.0414],"海口市":[110.3893,19.8516],"万宁市":[110.3137,18.8388],"澄迈县":[109.9937,19.7314],"白沙黎族自治县":[109.3703,19.211],"琼海市":[110.4208,19.224],"昌江黎族自治县":[109.0407,19.2137],"临高县":[109.6957,19.8063],"陵水黎族自治县":[109.9924,18.5415],"屯昌县":[110.0377,19.362],"定安县":[110.3384,19.4698],"保亭黎族苗族自治县":[109.6284,18.6108],"五指山市":[109.5282,18.8299],"黑河市":[127.1448,49.2957],"大兴安岭地区":[124.1016,52.2345],"哈尔滨市":[127.9688,45.368],"齐齐哈尔市":[124.541,47.5818],"牡丹江市":[129.7815,44.7089],"绥化市":[126.7163,46.8018],"伊春市":[129.1992,47.9608],"佳木斯市":[133.0005,47.5763],"鸡西市":[132.7917,45.7361],"双鸭山市":[133.5938,46.7523],"大庆市":[124.7717,46.4282],"鹤岗市":[130.4407,47.7081],"七台河市":[131.2756,45.9558],"承德市":[117.5757,41.4075],"张家口市":[115.1477,40.8527],"保定市":[115.0488,39.0948],"唐山市":[118.4766,39.6826],"沧州市":[116.8286,38.2104],"石家庄市":[114.4995,38.1006],"邢台市":[114.8071,37.2821],"邯郸市":[114.4775,36.535],"秦皇岛市":[119.2126,40.0232],"衡水市":[115.8838,37.7161],"廊坊市":[116.521,39.0509],"南阳市":[112.4011,33.0359],"信阳市":[114.8291,32.0197],"洛阳市":[112.0605,34.3158],"驻马店市":[114.1589,32.9041],"周口市":[114.873,33.6951],"商丘市":[115.741,34.2828],"三门峡市":[110.8301,34.3158],"新乡市":[114.2029,35.3595],"平顶山市":[112.9724,33.739],"郑州市":[113.4668,34.6234],"安阳市":[114.5325,36.0022],"开封市":[114.5764,34.6124],"焦作市":[112.8406,35.1508],"许昌市":[113.6975,34.0466],"濮阳市":[115.1917,35.799],"漯河市":[113.8733,33.6951],"鹤壁市":[114.3787,35.744],"怀化市":[109.9512,27.4438],"永州市":[111.709,25.752],"邵阳市":[110.9619,26.8121],"郴州市":[113.2361,25.8673],"常德市":[111.4014,29.2676],"湘西土家族苗族自治州":[109.7864,28.6743],"衡阳市":[112.4121,26.7902],"岳阳市":[113.2361,29.1357],"益阳市":[111.731,28.3832],"长沙市":[113.0823,28.2568],"株洲市":[113.5327,27.0319],"张家界市":[110.5115,29.328],"娄底市":[111.6431,27.7185],"湘潭市":[112.5439,27.7075],"盐城市":[120.2234,33.5577],"徐州市":[117.5208,34.3268],"南通市":[121.1023,32.1625],"淮安市":[118.927,33.4039],"苏州市":[120.6519,31.3989],"宿迁市":[118.5535,33.7775],"连云港市":[119.1248,34.552],"扬州市":[119.4653,32.8162],"南京市":[118.8062,31.9208],"泰州市":[120.0586,32.5525],"无锡市":[120.3442,31.5527],"常州市":[119.4543,31.5582],"镇江市":[119.4763,31.9702],"赣州市":[115.2795,25.8124],"吉安市":[114.884,26.9659],"上饶市":[117.8613,28.7292],"九江市":[115.4224,29.3774],"抚州市":[116.4441,27.4933],"宜春市":[115.0159,28.3228],"南昌市":[116.0046,28.6633],"景德镇市":[117.334,29.3225],"萍乡市":[113.9282,27.4823],"鹰潭市":[117.0813,28.2349],"新余市":[114.95,27.8174],"延边朝鲜族自治州":[129.397,43.2587],"吉林市":[126.8372,43.6047],"白城市":[123.0029,45.2637],"松原市":[124.0906,44.7198],"长春市":[125.8154,44.2584],"白山市":[127.2217,42.0941],"通化市":[125.9583,41.8579],"四平市":[124.541,43.4894],"辽源市":[125.343,42.7643],"大连市":[122.2229,39.4409],"朝阳市":[120.0696,41.4899],"丹东市":[124.541,40.4242],"铁岭市":[124.2773,42.7423],"沈阳市":[123.1238,42.1216],"抚顺市":[124.585,41.8579],"葫芦岛市":[120.1575,40.578],"阜新市":[122.0032,42.2699],"锦州市":[121.6626,41.4294],"鞍山市":[123.0798,40.6055],"本溪市":[124.1455,41.1987],"营口市":[122.4316,40.4297],"辽阳市":[123.4094,41.1383],"盘锦市":[121.9482,41.0449],"呼伦贝尔市":[120.8057,50.2185],"阿拉善盟":[102.019,40.1001],"锡林郭勒盟":[115.6421,44.176],"鄂尔多斯市":[108.9734,39.2487],"赤峰市":[118.6743,43.2642],"巴彦淖尔市":[107.5562,41.3196],"通辽市":[121.4758,43.9673],"乌兰察布市":[112.5769,41.77],"兴安盟":[121.3879,46.1426],"包头市":[110.3467,41.4899],"呼和浩特市":[111.4124,40.4901],"乌海市":[106.886,39.4739],"吴忠市":[106.853,37.3755],"中卫市":[105.4028,36.9525],"固原市":[106.1389,35.9363],"银川市":[106.3586,38.1775],"石嘴山市":[106.4795,39.0015],"海西蒙古族藏族自治州":[94.9768,37.1118],"玉树藏族自治州":[93.5925,33.9368],"果洛藏族自治州":[99.3823,34.0466],"海南藏族自治州":[100.3711,35.9418],"海北藏族自治州":[100.3711,37.9138],"黄南藏族自治州":[101.5686,35.1178],"海东地区":[102.3706,36.2988],"西宁市":[101.4038,36.8207],"崇明县":[121.5637,31.5383],"南汇区":[121.8755,30.954],"奉贤区":[121.5747,30.8475],"浦东新区":[121.6928,31.2561],"金山区":[121.2657,30.8112],"青浦区":[121.1751,31.1909],"松江区":[121.1984,31.0268],"嘉定区":[121.2437,31.3625],"宝山区":[121.4346,31.4051],"闵行区":[121.4992,31.0838],"杨浦区":[121.528,31.2966],"普陀区":[121.3879,31.2602],"徐汇区":[121.4333,31.1607],"长宁区":[121.3852,31.2115],"闸北区":[121.4511,31.2794],"虹口区":[121.4882,31.2788],"黄浦区":[121.4868,31.219],"卢湾区":[121.4758,31.2074],"静安区":[121.4484,31.2286],"榆林市":[109.8743,38.205],"延安市":[109.1052,36.4252],"汉中市":[106.886,33.0139],"安康市":[109.1162,32.7722],"商洛市":[109.8083,33.761],"宝鸡市":[107.1826,34.3433],"渭南市":[109.7864,35.0299],"咸阳市":[108.4131,34.8706],"西安市":[109.1162,34.2004],"铜川市":[109.0393,35.1947],"忻州市":[112.4561,38.8971],"吕梁市":[111.3574,37.7325],"临汾市":[111.4783,36.1615],"晋中市":[112.7747,37.37],"运城市":[111.1487,35.2002],"大同市":[113.7854,39.8035],"长治市":[112.8625,36.4746],"朔州市":[113.0713,39.6991],"晋城市":[112.7856,35.6342],"太原市":[112.3352,37.9413],"阳泉市":[113.4778,38.0951],"甘孜藏族自治州":[99.9207,31.0803],"阿坝藏族羌族自治州":[102.4805,32.4536],"凉山彝族自治州":[101.9641,27.6746],"绵阳市":[104.7327,31.8713],"达州市":[107.6111,31.333],"广元市":[105.6885,32.2284],"雅安市":[102.6672,29.8938],"宜宾市":[104.6558,28.548],"乐山市":[103.5791,29.1742],"南充市":[106.2048,31.1517],"巴中市":[107.0618,31.9977],"泸州市":[105.4578,28.493],"成都市":[103.9526,30.7617],"资阳市":[104.9744,30.1575],"攀枝花市":[101.6895,26.7133],"眉山市":[103.8098,30.0146],"广安市":[106.6333,30.4376],"德阳市":[104.48,31.1133],"内江市":[104.8535,29.6136],"遂宁市":[105.5347,30.6683],"自贡市":[104.6667,29.2786],"蓟县":[117.4672,40.004],"武清区":[117.0621,39.4121],"宝坻区":[117.4274,39.5913],"静海县":[116.9824,38.8312],"宁河县":[117.6801,39.3853],"大港区":[117.3875,38.757],"塘沽区":[117.6801,38.9987],"西青区":[117.1829,39.0022],"北辰区":[117.1761,39.2548],"东丽区":[117.4013,39.1223],"汉沽区":[117.8888,39.2191],"津南区":[117.3958,38.9603],"河西区":[117.2365,39.0804],"河东区":[117.2571,39.1209],"南开区":[117.1527,39.1065],"河北区":[117.2145,39.1615],"红桥区":[117.1596,39.1663],"和平区":[117.2008,39.1189],"巴音郭楞蒙古自治州":[88.1653,39.6002],"和田地区":[81.167,36.9855],"哈密地区":[93.7793,42.9236],"阿克苏地区":[82.9797,41.0229],"阿勒泰地区":[88.2971,47.0929],"喀什地区":[77.168,37.8534],"塔城地区":[86.6272,45.8514],"昌吉回族自治州":[89.6814,44.4507],"克孜勒苏柯尔克孜自治州":[74.6301,39.5233],"吐鲁番地区":[89.6375,42.4127],"伊犁哈萨克自治州":[82.5513,43.5498],"博尔塔拉蒙古自治州":[81.8481,44.6979],"乌鲁木齐市":[87.9236,43.5883],"克拉玛依市":[85.2869,45.5054],"阿拉尔市":[81.2769,40.6549],"图木舒克市":[79.1345,39.8749],"五家渠市":[87.5391,44.3024],"石河子市":[86.0229,44.2914],"那曲地区":[88.1982,33.3215],"阿里地区":[82.3645,32.7667],"日喀则地区":[86.2427,29.5093],"林芝地区":[95.4602,29.1138],"昌都地区":[97.0203,30.7068],"山南地区":[92.2083,28.3392],"拉萨市":[91.1865,30.1465],"普洱市":[100.7446,23.4229],"红河哈尼族彝族自治州":[103.0408,23.6041],"文山壮族苗族自治州":[104.8865,23.5712],"曲靖市":[103.9417,25.7025],"楚雄彝族自治州":[101.6016,25.3619],"大理白族自治州":[99.9536,25.6805],"临沧市":[99.613,24.0546],"迪庆藏族自治州":[99.4592,27.9327],"昭通市":[104.0955,27.6031],"昆明市":[102.9199,25.4663],"丽江市":[100.448,26.955],"西双版纳傣族自治州":[100.8984,21.8628],"保山市":[99.0637,24.9884],"玉溪市":[101.9312,23.8898],"怒江傈僳族自治州":[99.1516,26.5594],"德宏傣族景颇族自治州":[98.1299,24.5874],"丽水市":[119.5642,28.1854],"杭州市":[119.5313,29.8773],"温州市":[120.498,27.8119],"宁波市":[121.5967,29.6466],"舟山市":[122.2559,30.2234],"台州市":[121.1353,28.6688],"金华市":[120.0037,29.1028],"衢州市":[118.6853,28.8666],"绍兴市":[120.564,29.7565],"嘉兴市":[120.9155,30.6354],"湖州市":[119.8608,30.7782],"烟台市":[120.7397,37.5128],"临沂市":[118.3118,35.2936],"潍坊市":[119.0918,36.524],"青岛市":[120.4651,36.3373],"菏泽市":[115.6201,35.2057],"济宁市":[116.8286,35.3375],"德州市":[116.6858,37.2107],"滨州市":[117.8174,37.4963],"聊城市":[115.9167,36.4032],"东营市":[118.7073,37.5513],"济南市":[117.1582,36.8701],"泰安市":[117.0264,36.0516],"威海市":[121.9482,37.1393],"日照市":[119.2786,35.5023],"淄博市":[118.0371,36.6064],"枣庄市":[117.323,34.8926],"莱芜市":[117.6526,36.2714],"恩施土家族苗族自治州":[109.5007,30.2563],"十堰市":[110.5115,32.3877],"宜昌市":[111.1707,30.7617],"襄樊市":[111.9397,31.9263],"黄冈市":[115.2686,30.6628],"荆州市":[113.291,30.0092],"荆门市":[112.6758,30.9979],"咸宁市":[114.2578,29.6631],"随州市":[113.4338,31.8768],"孝感市":[113.9502,31.1188],"武汉市":[114.3896,30.6628],"黄石市":[115.0159,29.9213],"神农架林区":[110.4565,31.5802],"天门市":[113.0273,30.6409],"仙桃市":[113.3789,30.3003],"潜江市":[112.7637,30.3607],"鄂州市":[114.7302,30.4102]} -------------------------------------------------------------------------------- /map/json/gaotietest.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "秦沈客运专线", 3 | "Mnst": [{ 4 | "name": "山海关", 5 | "value": [119.77388140000001, 40.00667542] 6 | }, { 7 | "name": "绥中北", 8 | "value": [120.33091399999999, 40.35437741] 9 | }, { 10 | "name": "葫芦岛北", 11 | "value": [120.77012690000001, 40.7489857] 12 | }, { 13 | "name": "锦州南", 14 | "value": [121.1323628, 41.02243317] 15 | }, { 16 | "name": "盘锦北", 17 | "value": [121.81389850000001, 41.34232744] 18 | }, { 19 | "name": "台安", 20 | "value": [122.43739369999999, 41.45202684] 21 | }, { 22 | "name": "辽中", 23 | "value": [122.77815849999999, 41.56478504] 24 | }, { 25 | "name": "沈阳北", 26 | "value": [123.44241240000001, 41.82534092] 27 | }] 28 | }, { 29 | "name": "胶济客运专线", 30 | "Mnst": [{ 31 | "name": "济南", 32 | "value": [116.99745349999999, 36.67671802] 33 | }, { 34 | "name": "济南东", 35 | "value": [117.03610649999999, 36.6868321] 36 | }, { 37 | "name": "淄博", 38 | "value": [118.0635775, 36.79562670000001] 39 | }, { 40 | "name": "青州市", 41 | "value": [118.51036370000001, 36.77730592] 42 | }, { 43 | "name": "昌乐", 44 | "value": [118.84552649999999, 36.71656394] 45 | }, { 46 | "name": "潍坊", 47 | "value": [119.10501380000001, 36.70319829] 48 | }, { 49 | "name": "高密", 50 | "value": [119.7742317, 36.39873738] 51 | }, { 52 | "name": "青岛", 53 | "value": [120.3189288, 36.07075992] 54 | }] 55 | }] -------------------------------------------------------------------------------- /map/json/hsrail/hsrail0.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "京沪高速铁路", 3 | "Mnst": [{ 4 | "name": "北京南", 5 | "value": [39.929986, 116.395645] 6 | }, { 7 | "name": "廊坊", 8 | "value": [39.51527215, 116.7152693] 9 | }, { 10 | "name": "天津南", 11 | "value": [39.14393, 117.21081299999999] 12 | }, { 13 | "name": "沧州西", 14 | "value": [38.297615, 116.86380600000001] 15 | }, { 16 | "name": "徳州东", 17 | "value": [37.410505, 116.455455] 18 | }, { 19 | "name": "济南西", 20 | "value": [36.682784999999996, 117.02496699999999] 21 | }, { 22 | "name": "泰安", 23 | "value": [36.188078000000004, 117.08941499999999] 24 | }, { 25 | "name": "曲阜东", 26 | "value": [35.615761, 117.03178999999999] 27 | }, { 28 | "name": "滕州东", 29 | "value": [35.065791, 117.14761599999999] 30 | }, { 31 | "name": "枣庄", 32 | "value": [34.807883000000004, 117.27930500000001] 33 | }, { 34 | "name": "徐州东", 35 | "value": [34.271553000000004, 117.188107] 36 | }, { 37 | "name": "宿州东", 38 | "value": [33.68151649, 117.2569305] 39 | }, { 40 | "name": "蚌埠南", 41 | "value": [32.929499, 117.35708000000001] 42 | }, { 43 | "name": "定远", 44 | "value": [32.59115638, 117.8428631] 45 | }, { 46 | "name": "滁州", 47 | "value": [32.317351, 118.32457] 48 | }, { 49 | "name": "南京南", 50 | "value": [32.057235999999996, 118.778074] 51 | }, { 52 | "name": "镇江南", 53 | "value": [32.204409000000005, 119.45583500000001] 54 | }, { 55 | "name": "丹阳北", 56 | "value": [31.960263, 119.644304] 57 | }, { 58 | "name": "常州北", 59 | "value": [31.771396999999997, 119.98186100000001] 60 | }, { 61 | "name": "无锡东", 62 | "value": [31.570037, 120.305456] 63 | }, { 64 | "name": "苏州北", 65 | "value": [31.256696999999996, 120.736328] 66 | }, { 67 | "name": "昆山南", 68 | "value": [31.328937, 120.96580800000001] 69 | }, { 70 | "name": "上海虹桥", 71 | "value": [31.200862, 121.327401] 72 | }] 73 | }, 74 | { 75 | "name": "京津城际铁路", 76 | "Mnst": [{ 77 | "name": "北京南", 78 | "value": [39.929986, 116.395645] 79 | }, { 80 | "name": "亦庄", 81 | "value": [39.810555, 116.536898] 82 | }, { 83 | "name": "武清", 84 | "value": [39.457043, 117.034578] 85 | }, { 86 | "name": "天津", 87 | "value": [39.14393, 117.21081299999999] 88 | }] 89 | }, { 90 | "name": "京广高速铁路武广段", 91 | "Mnst": [{ 92 | "name": "武汉", 93 | "value": [30.581084000000004, 114.3162] 94 | }, { 95 | "name": "咸宁北", 96 | "value": [29.880657, 114.30006100000001] 97 | }, { 98 | "name": "赤壁北", 99 | "value": [29.742561, 113.889168] 100 | }, { 101 | "name": "岳阳东", 102 | "value": [29.378007, 113.146196] 103 | }, { 104 | "name": "汩罗东", 105 | "value": [29.372319, 113.122389] 106 | }, { 107 | "name": "长沙南", 108 | "value": [28.213478000000002, 112.979353] 109 | }, { 110 | "name": "株洲西", 111 | "value": [27.827433000000003, 113.131695] 112 | }, { 113 | "name": "衡山", 114 | "value": [27.281912, 112.71963000000001] 115 | }, { 116 | "name": "衡阳东", 117 | "value": [26.898164, 112.58381899999999] 118 | }, { 119 | "name": "耒阳西", 120 | "value": [26.423993, 112.921552] 121 | }, { 122 | "name": "郴州西", 123 | "value": [25.782264, 113.037704] 124 | }, { 125 | "name": "韶关", 126 | "value": [24.802960000000002, 113.59446100000001] 127 | }, { 128 | "name": "英德西", 129 | "value": [24.22568, 113.323169] 130 | }, { 131 | "name": "清远", 132 | "value": [23.698469, 113.040773] 133 | }, { 134 | "name": "广州北", 135 | "value": [23.120048999999998, 113.30765] 136 | }, { 137 | "name": "广州南", 138 | "value": [23.120048999999998, 113.30765] 139 | }] 140 | }] -------------------------------------------------------------------------------- /map/json/hsrail/hsrail1.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "京沪高速铁路", 3 | "Mnst": [{ 4 | "name": "北京南", 5 | "value": [39.929986, 116.395645] 6 | }, { 7 | "name": "廊坊", 8 | "value": [39.51527215, 116.7152693] 9 | }, { 10 | "name": "天津南", 11 | "value": [39.14393, 117.21081299999999] 12 | }, { 13 | "name": "沧州西", 14 | "value": [38.297615, 116.86380600000001] 15 | }, { 16 | "name": "徳州东", 17 | "value": [37.410505, 116.455455] 18 | }, { 19 | "name": "济南西", 20 | "value": [36.682784999999996, 117.02496699999999] 21 | }, { 22 | "name": "泰安", 23 | "value": [36.188078000000004, 117.08941499999999] 24 | }, { 25 | "name": "曲阜东", 26 | "value": [35.615761, 117.03178999999999] 27 | }, { 28 | "name": "滕州东", 29 | "value": [35.065791, 117.14761599999999] 30 | }, { 31 | "name": "枣庄", 32 | "value": [34.807883000000004, 117.27930500000001] 33 | }, { 34 | "name": "徐州东", 35 | "value": [34.271553000000004, 117.188107] 36 | }, { 37 | "name": "宿州东", 38 | "value": [33.68151649, 117.2569305] 39 | }, { 40 | "name": "蚌埠南", 41 | "value": [32.929499, 117.35708000000001] 42 | }, { 43 | "name": "定远", 44 | "value": [32.59115638, 117.8428631] 45 | }, { 46 | "name": "滁州", 47 | "value": [32.317351, 118.32457] 48 | }, { 49 | "name": "南京南", 50 | "value": [32.057235999999996, 118.778074] 51 | }, { 52 | "name": "镇江南", 53 | "value": [32.204409000000005, 119.45583500000001] 54 | }, { 55 | "name": "丹阳北", 56 | "value": [31.960263, 119.644304] 57 | }, { 58 | "name": "常州北", 59 | "value": [31.771396999999997, 119.98186100000001] 60 | }, { 61 | "name": "无锡东", 62 | "value": [31.570037, 120.305456] 63 | }, { 64 | "name": "苏州北", 65 | "value": [31.256696999999996, 120.736328] 66 | }, { 67 | "name": "昆山南", 68 | "value": [31.328937, 120.96580800000001] 69 | }, { 70 | "name": "上海虹桥", 71 | "value": [31.200862, 121.327401] 72 | }] 73 | }, 74 | { 75 | "name": "京津城际铁路", 76 | "Mnst": [{ 77 | "name": "北京南", 78 | "value": [39.929986, 116.395645] 79 | }, { 80 | "name": "亦庄", 81 | "value": [39.810555, 116.536898] 82 | }, { 83 | "name": "武清", 84 | "value": [39.457043, 117.034578] 85 | }, { 86 | "name": "天津", 87 | "value": [39.14393, 117.21081299999999] 88 | }] 89 | }, { 90 | "name": "京广高速铁路武广段", 91 | "Mnst": [{ 92 | "name": "武汉", 93 | "value": [30.581084000000004, 114.3162] 94 | }, { 95 | "name": "咸宁北", 96 | "value": [29.880657, 114.30006100000001] 97 | }, { 98 | "name": "赤壁北", 99 | "value": [29.742561, 113.889168] 100 | }, { 101 | "name": "岳阳东", 102 | "value": [29.378007, 113.146196] 103 | }, { 104 | "name": "汩罗东", 105 | "value": [29.372319, 113.122389] 106 | }, { 107 | "name": "长沙南", 108 | "value": [28.213478000000002, 112.979353] 109 | }, { 110 | "name": "株洲西", 111 | "value": [27.827433000000003, 113.131695] 112 | }, { 113 | "name": "衡山", 114 | "value": [27.281912, 112.71963000000001] 115 | }, { 116 | "name": "衡阳东", 117 | "value": [26.898164, 112.58381899999999] 118 | }, { 119 | "name": "耒阳西", 120 | "value": [26.423993, 112.921552] 121 | }, { 122 | "name": "郴州西", 123 | "value": [25.782264, 113.037704] 124 | }, { 125 | "name": "韶关", 126 | "value": [24.802960000000002, 113.59446100000001] 127 | }, { 128 | "name": "英德西", 129 | "value": [24.22568, 113.323169] 130 | }, { 131 | "name": "清远", 132 | "value": [23.698469, 113.040773] 133 | }, { 134 | "name": "广州北", 135 | "value": [23.120048999999998, 113.30765] 136 | }, { 137 | "name": "广州南", 138 | "value": [23.120048999999998, 113.30765] 139 | }] 140 | },{ 141 | "name": "秦沈客运专线", 142 | "Mnst": [{ 143 | "name": "秦皇岛", 144 | "value": [39.945462, 119.604368] 145 | }, { 146 | "name": "山海关", 147 | "value": [40.0329, 119.71361599999999] 148 | }, { 149 | "name": "绥中北", 150 | "value": [40.305129, 120.026302] 151 | }, { 152 | "name": "葫芦岛北", 153 | "value": [40.74303, 120.860758] 154 | }, { 155 | "name": "锦州南", 156 | "value": [41.130879, 121.147749] 157 | }, { 158 | "name": "盘锦北", 159 | "value": [41.141248, 122.073228] 160 | }, { 161 | "name": "台安", 162 | "value": [41.3471, 122.44368300000001] 163 | }, { 164 | "name": "辽中", 165 | "value": [41.50033, 122.798576] 166 | }, { 167 | "name": "沈阳北", 168 | "value": [41.808645, 123.432791] 169 | }] 170 | }, { 171 | "name": "宁蓉铁路合宁段", 172 | "Mnst": [{ 173 | "name": "南京南", 174 | "value": [32.057235999999996, 118.778074] 175 | }, { 176 | "name": "全椒", 177 | "value": [32.069933, 118.105778] 178 | }, { 179 | "name": "巢北", 180 | "value": [31.97023, 117.8042] 181 | }, { 182 | "name": "肥东", 183 | "value": [32.003189, 117.57585700000001] 184 | }, { 185 | "name": "合肥南", 186 | "value": [31.866941999999998, 117.282699] 187 | }] 188 | }, { 189 | "name": "胶济客运专线", 190 | "Mnst": [{ 191 | "name": "济南", 192 | "value": [36.682784999999996, 117.02496699999999] 193 | }, { 194 | "name": "济南东", 195 | "value": [36.687324, 117.034645] 196 | }, { 197 | "name": "淄博", 198 | "value": [36.804685, 118.05913400000001] 199 | }, { 200 | "name": "青州市", 201 | "value": [36.680584, 118.47018700000001] 202 | }, { 203 | "name": "昌乐", 204 | "value": [36.535532, 118.91391399999999] 205 | }, { 206 | "name": "潍坊", 207 | "value": [36.716115, 119.14263400000002] 208 | }, { 209 | "name": "高密", 210 | "value": [36.387318, 119.70251200000001] 211 | }, { 212 | "name": "城阳", 213 | "value": [36.284247, 120.346326] 214 | }, { 215 | "name": "沧口", 216 | "value": [36.179438, 120.383488] 217 | }, { 218 | "name": "四方", 219 | "value": [36.131582, 120.376979] 220 | }, { 221 | "name": "青岛", 222 | "value": [36.105215, 120.384428] 223 | }] 224 | }, { 225 | "name": "沪昆高速铁路沪杭段", 226 | "Mnst": [{ 227 | "name": "上海虹桥", 228 | "value": [31.200862, 121.327401] 229 | }, { 230 | "name": "松江南", 231 | "value": [31.021245, 121.22679099999999] 232 | }, { 233 | "name": "金山北", 234 | "value": [30.90003523, 121.0960515] 235 | }, { 236 | "name": "嘉善南", 237 | "value": [30.905748, 120.908873] 238 | }, { 239 | "name": "嘉兴南", 240 | "value": [30.657984999999996, 120.492581] 241 | }, { 242 | "name": "桐乡", 243 | "value": [30.612340999999997, 120.49041100000001] 244 | }, { 245 | "name": "海宁西", 246 | "value": [30.442177, 120.618727] 247 | }, { 248 | "name": "余杭", 249 | "value": [30.38812, 119.998089] 250 | }, { 251 | "name": "杭州东", 252 | "value": [30.259244, 120.219375] 253 | }] 254 | }, { 255 | "name": "宁蓉铁路宜凉段", 256 | "Mnst": [{ 257 | "name": "宜昌东", 258 | "value": [30.732758, 111.31098100000001] 259 | }, { 260 | "name": "巴东", 261 | "value": [30.827453000000002, 110.30061699999999] 262 | }, { 263 | "name": "建始", 264 | "value": [30.578576, 109.939599] 265 | }, { 266 | "name": "恩施", 267 | "value": [30.35431153, 109.49217140000002] 268 | }, { 269 | "name": "利川", 270 | "value": [30.239967, 108.8271] 271 | }] 272 | }, { 273 | "name": "海南东环铁路", 274 | "Mnst": [{ 275 | "name": "海口", 276 | "value": [20.022071, 110.330802] 277 | }, { 278 | "name": "海口东", 279 | "value": [20.022071, 110.330802] 280 | }, { 281 | "name": "美兰", 282 | "value": [19.942909, 110.507269] 283 | }, { 284 | "name": "文昌", 285 | "value": [19.750947, 110.78090900000001] 286 | }, { 287 | "name": "琼海", 288 | "value": [19.21483, 110.414359] 289 | }, { 290 | "name": "博鳌", 291 | "value": [19.14284855, 110.4930433] 292 | }, { 293 | "name": "万宁", 294 | "value": [18.839886, 110.292505] 295 | }, { 296 | "name": "神州", 297 | "value": [18.73098083, 110.3144405] 298 | }, { 299 | "name": "陵水", 300 | "value": [18.575985, 109.94866100000002] 301 | }, { 302 | "name": "亚龙湾", 303 | "value": [18.30251, 109.6023] 304 | }, { 305 | "name": "三亚", 306 | "value": [18.257776, 109.52277099999999] 307 | }] 308 | } 309 | 310 | ] -------------------------------------------------------------------------------- /map/json/lines-bus-test1.json: -------------------------------------------------------------------------------- 1 | [[[117.105104, 38.057953], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.838384, 38.569646], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.089452, 38.44149], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.229814, 38.056141], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.709171, 38.042439], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.542062, 37.88655], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.123844, 38.189661], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.343803, 38.369238], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.570163, 38.073479], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.79372, 37.649619], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.574929, 37.332848], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.216657, 37.729115], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.390507, 37.777724], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.307076, 37.453923], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.867028, 37.192044], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.078627, 37.209527], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.642554, 36.934485], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.433904, 37.164465], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.003816, 36.950501], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.758394, 36.795497], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.156369, 37.310544], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.176035, 36.976772], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.54069, 36.71209], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.74588, 36.561049], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.99898, 36.657354], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.996086, 36.693374], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.947921, 36.668205], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.455054, 36.286923], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.063744, 36.681744], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.03862, 36.664169], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.04353, 36.1841], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.461052, 35.930467], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.766092, 35.910387], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.129984, 36.189313], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.763703, 36.1856], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.799297, 35.76754], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[116.991885, 35.592788], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.557281, 34.856651], [117.30554, 34.78126], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.265293, 34.79789], [117.30554, 34.78126], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.458968, 35.096077], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.458968, 35.096077], [117.30554, 34.78126], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.586316, 34.767713], [117.30554, 34.78126], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.734747, 34.564815], [117.30554, 34.78126], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.162098, 35.088498], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]], [[117.162098, 35.088498], [117.30554, 34.78126], [117.257683, 35.090542], [117.069102, 35.556544], [117.035353, 36.172188], [116.892552, 36.669033], [116.461465, 37.409545], [116.76789, 38.306999], [116.379092, 39.864881], [116.603039, 40.080525]]] -------------------------------------------------------------------------------- /test/data/aqi/BJdata.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | [1,55,9,56,0.46,18,6,"良"], 3 | [2,25,11,21,0.65,34,9,"优"], 4 | [3,56,7,63,0.3,14,5,"良"], 5 | [4,33,7,29,0.33,16,6,"优"], 6 | [5,42,24,44,0.76,40,16,"优"], 7 | [6,82,58,90,1.77,68,33,"良"], 8 | [7,74,49,77,1.46,48,27,"良"], 9 | [8,78,55,80,1.29,59,29,"良"], 10 | [9,267,216,280,'-',108,64,"重度污染"], 11 | [10,185,127,216,2.52,61,27,"中度污染"], 12 | [11,39,19,38,0.57,31,15,"优"], 13 | [12,41,11,40,0.43,21,7,"优"], 14 | [13,64,38,74,1.04,46,22,"良"], 15 | [14,108,79,120,1.7,75,41,"轻度污染"], 16 | [15,108,63,116,1.48,44,26,"轻度污染"], 17 | [16,33,6,29,0.34,13,5,"优"], 18 | [17,94,66,110,1.54,62,31,"良"], 19 | [18,186,142,192,3.88,93,79,"中度污染"], 20 | [19,57,31,54,0.96,32,14,"良"], 21 | [20,22,8,17,0.48,23,10,"优"], 22 | [21,39,15,36,0.61,29,13,"优"], 23 | [22,94,69,114,2.08,73,39,"良"], 24 | [23,99,73,110,2.43,76,48,"良"], 25 | [24,31,12,30,0.5,32,16,"优"], 26 | [25,42,27,43,1,53,22,"优"], 27 | [26,154,117,157,3.05,92,58,"中度污染"], 28 | [27,234,185,230,4.09,123,69,"重度污染"], 29 | [28,160,120,186,2.77,91,50,"中度污染"], 30 | [29,134,96,165,2.76,83,41,"轻度污染"], 31 | [30,52,24,60,1.03,50,21,"良"], 32 | [31,46,5,49,0.28,10,6,"优"] 33 | ]); -------------------------------------------------------------------------------- /test/data/aqi/GZdata.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | [1,26,37,27,1.163,27,13,"优"], 3 | [2,85,62,71,1.195,60,8,"良"], 4 | [3,78,38,74,1.363,37,7,"良"], 5 | [4,21,21,36,0.634,40,9,"优"], 6 | [5,41,42,46,0.915,81,13,"优"], 7 | [6,56,52,69,1.067,92,16,"良"], 8 | [7,64,30,28,0.924,51,2,"良"], 9 | [8,55,48,74,1.236,75,26,"良"], 10 | [9,76,85,113,1.237,114,27,"良"], 11 | [10,91,81,104,1.041,56,40,"良"], 12 | [11,84,39,60,0.964,25,11,"良"], 13 | [12,64,51,101,0.862,58,23,"良"], 14 | [13,70,69,120,1.198,65,36,"良"], 15 | [14,77,105,178,2.549,64,16,"良"], 16 | [15,109,68,87,0.996,74,29,"轻度污染"], 17 | [16,73,68,97,0.905,51,34,"良"], 18 | [17,54,27,47,0.592,53,12,"良"], 19 | [18,51,61,97,0.811,65,19,"良"], 20 | [19,91,71,121,1.374,43,18,"良"], 21 | [20,73,102,182,2.787,44,19,"良"], 22 | [21,73,50,76,0.717,31,20,"良"], 23 | [22,84,94,140,2.238,68,18,"良"], 24 | [23,93,77,104,1.165,53,7,"良"], 25 | [24,99,130,227,3.97,55,15,"良"], 26 | [25,146,84,139,1.094,40,17,"轻度污染"], 27 | [26,113,108,137,1.481,48,15,"轻度污染"], 28 | [27,81,48,62,1.619,26,3,"良"], 29 | [28,56,48,68,1.336,37,9,"良"], 30 | [29,82,92,174,3.29,0,13,"良"], 31 | [30,106,116,188,3.628,101,16,"轻度污染"], 32 | [31,118,50,0,1.383,76,11,"轻度污染"] 33 | ] 34 | ); -------------------------------------------------------------------------------- /test/data/aqi/SHdata.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | [1,91,45,125,0.82,34,23,"良"], 3 | [2,65,27,78,0.86,45,29,"良"], 4 | [3,83,60,84,1.09,73,27,"良"], 5 | [4,109,81,121,1.28,68,51,"轻度污染"], 6 | [5,106,77,114,1.07,55,51,"轻度污染"], 7 | [6,109,81,121,1.28,68,51,"轻度污染"], 8 | [7,106,77,114,1.07,55,51,"轻度污染"], 9 | [8,89,65,78,0.86,51,26,"良"], 10 | [9,53,33,47,0.64,50,17,"良"], 11 | [10,80,55,80,1.01,75,24,"良"], 12 | [11,117,81,124,1.03,45,24,"轻度污染"], 13 | [12,99,71,142,1.1,62,42,"良"], 14 | [13,95,69,130,1.28,74,50,"良"], 15 | [14,116,87,131,1.47,84,40,"轻度污染"], 16 | [15,108,80,121,1.3,85,37,"轻度污染"], 17 | [16,134,83,167,1.16,57,43,"轻度污染"], 18 | [17,79,43,107,1.05,59,37,"良"], 19 | [18,71,46,89,0.86,64,25,"良"], 20 | [19,97,71,113,1.17,88,31,"良"], 21 | [20,84,57,91,0.85,55,31,"良"], 22 | [21,87,63,101,0.9,56,41,"良"], 23 | [22,104,77,119,1.09,73,48,"轻度污染"], 24 | [23,87,62,100,1,72,28,"良"], 25 | [24,168,128,172,1.49,97,56,"中度污染"], 26 | [25,65,45,51,0.74,39,17,"良"], 27 | [26,39,24,38,0.61,47,17,"优"], 28 | [27,39,24,39,0.59,50,19,"优"], 29 | [28,93,68,96,1.05,79,29,"良"], 30 | [29,188,143,197,1.66,99,51,"中度污染"], 31 | [30,174,131,174,1.55,108,50,"中度污染"], 32 | [31,187,143,201,1.39,89,53,"中度污染"] 33 | ] 34 | ); -------------------------------------------------------------------------------- /test/data/aqi/processAQI.js: -------------------------------------------------------------------------------- 1 | function processAQI(arr) { 2 | for (var i = 0; i < arr.length; i++) { 3 | var line = arr[i]; 4 | var aqi = line[1]; 5 | 6 | if (aqi <= 50) { 7 | line[7] = '"优"'; 8 | } 9 | else if (aqi <= 100) { 10 | line[7] = '"良"'; 11 | } 12 | else if (aqi <= 150) { 13 | line[7] = '"轻度污染"'; 14 | } 15 | else if (aqi <= 200) { 16 | line[7] = '"中度污染"'; 17 | } 18 | else if (aqi <= 300) { 19 | line[7] = '"重度污染"'; 20 | } 21 | else { 22 | line[7] = '"严重污染"'; 23 | } 24 | } 25 | 26 | console.log(arr.join('],\n [')); 27 | } -------------------------------------------------------------------------------- /test/data/gaotie.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name":"秦沈客运专线", 4 | "Mnst":[ 5 | {"name":"秦皇岛","value":[117.105104, 38.057953]}, 6 | {"name":"山海关","value":[116.76789, 38.306999]}, 7 | {"name":"绥中北","value":[116.379092, 39.864881]}, 8 | {"name":"山海关","value":[116.76789, 38.306999]}, 9 | {"name":"葫芦岛北","value":[116.603039, 40.080525]} 10 | ] 11 | }, 12 | { 13 | "name":"宁蓉铁路合宁段", 14 | "Mnst":[ 15 | {"name":"全椒","value":[116.379092, 39.864881]}, 16 | {"name":"巢北","value":[116.603039, 40.080525]}, 17 | {"name":"肥东","value":[116.123844, 38.189661]}, 18 | {"name":"合肥南","value":[116.76789, 38.306999]} 19 | ] 20 | } 21 | ] -------------------------------------------------------------------------------- /test/data/map/data-aomen.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"id":"820001","geometry":{"type":"Polygon","coordinates":["@@LADC^umZ@DONWEBDCLHBH@DFBBNA"],"encodeOffsets":[[116285,22746]]},"properties":{"cp":[113.5528956,22.20787],"name":"花地瑪堂區","childNum":1}},{"id":"820002","geometry":{"type":"Polygon","coordinates":["@@MK@CA@AAGDEB@NVFHE"],"encodeOffsets":[[116281,22734]]},"properties":{"cp":[113.5489608,22.1992075],"name":"花王堂區","childNum":1}},{"id":"820003","geometry":{"type":"Polygon","coordinates":["@@EGOB@DNLHE@C"],"encodeOffsets":[[116285,22729]]},"properties":{"cp":[113.5501828,22.19372083],"name":"望德堂區","childNum":1}},{"id":"820004","geometry":{"type":"Polygon","coordinates":["@@ŸYIPEL@JFCBBFADHDBBFDHIJJEFDPCHHlY"],"encodeOffsets":[[116313,22707]]},"properties":{"cp":[113.5536475,22.18853944],"name":"大堂區","childNum":1}},{"id":"820005","geometry":{"type":"Polygon","coordinates":["@@JICGAECACGEBAAEDP^"],"encodeOffsets":[[116266,22728]]},"properties":{"cp":[113.5419278,22.18736806],"name":"風順堂區","childNum":1}},{"id":"820006","geometry":{"type":"Polygon","coordinates":["@@ ZNWRquZCBCC@AEA@@ADCDCAACEAGBQ@IN"],"encodeOffsets":[[116265,22694]]},"properties":{"cp":[113.5587044,22.15375944],"name":"嘉模堂區","childNum":1}},{"id":"820007","geometry":{"type":"Polygon","coordinates":["@@MOIAIEI@@GE@AAUCBdCFIFR@HAFBBDDBDCBCDB@BFDDC"],"encodeOffsets":[[116316,22676]]},"properties":{"cp":[113.5695992,22.13663],"name":"路氹填海區","childNum":1}},{"id":"820008","geometry":{"type":"Polygon","coordinates":["@@DKMMa_GC_COD@dVDBBF@@HJ@JFJBNP"],"encodeOffsets":[[116329,22670]]},"properties":{"cp":[113.5599542,22.12348639],"name":"聖方濟各堂區","childNum":1}}],"UTF8Encoding":true} -------------------------------------------------------------------------------- /test/data/map/data-ningxia.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"id":"640100","geometry":{"type":"Polygon","coordinates":["@@[ŅUco•YkIGĩË@ENOBEZEH@BCVGHCRQ^aRK„Yv[ZIVAhGPCRIvMfQRAZSVUbQVGŽKPC@CFGUKGQCMBSH[НJSEGmUQBLYgSeHECWBUJgBGV[DAPHHBrDDAG]DG@[FBCV[VP’GA[GYMYWu{‰sUoOWECCE_FgF‹DMAk¹FÅ`KY}WkMEGCJOTGJSLONW^OJja^[\\EFcTUJaDaZYLS^GJaRg^BLM@CDKAIBSBUH@H@BUJCHGF@DGLBDFB@BIFFFBDI@BFE@@BJTCD@BJBADHBzB\\FD@FCTBBBXVHRID@xIBaBA`EBw@MLADBFJDTV@B]TIP@FABQJUKA@M`GDCD@BH@BDADIB@JEFDD@DQLKFEDKVCPIJMHSFAFCFBD@HHXHHTJFH@LS^CJBHiHABGHSFDPCBKCOBIDMJIDOAEAAAMOGIGBArED]JFF@DAD[FAAEGC@WDADJJADGH@DNDADMD@DNFBDADIAAAWUICCCCKAEWUEAkRMBEHAG@GGOsLEGU{AA@@s`HRVjbzGL™`aJEFGJGDGLJLXFTHNBDQZ]\\K`GJIHAPIJCLBFFLV^@DGXENBVDNGJBFJHT@PL@DINCPKNCRJJ@NPPAJENBLXPJJBV@TCPIT@PFNBBVFBBDHBHADKHABAJCJOLARELAH@NDHJLNJJFFDBFCNBFFFNJV\\BBAJQ\\@FBDTLHJJDBBDL@JCNCFCDADFRFHBDKJGHAL@HDBVDFFPFLLR@BBAHBDLNDFFHVPNFFHDLTFXRHLDLLHBHN@jKZ@NAFAXUJ@PITIRI\\C^ADCBMDILGFEDANCxAJALEV@BKLCJ@`PPFJIHQBCH@VDFAZMJGLA@MDAH@JBPLXBDAEI@EBEHGJAVBHHXENEfDRFBGKSAKnEAK@iHE^GF@JFNEP@FKMODQBEhNLPZ@NC^O€ALGLKXEjEr@@[EOKIbChM`GHGAgPK"],"encodeOffsets":[[109223,39528]]},"properties":{"cp":[106.278179,38.46637],"name":"银川市","childNum":1}},{"id":"640200","geometry":{"type":"Polygon","coordinates":["@@J{AQWËIO¥‘ue“‡_]gkEKCCQWEKWYcqŸ{MU‘ěYZOLBhGH_HgNaDLJFP@\\q@iFWFKLKHB]PMDY@KOgMAFCRNPELO@MFIEE@]HGF@jBLmFBLLTAHQEeCMFWFGGUAIBGHAH@DFJABYAOKKAG@APKBIHYNEBUCG@ADGRIJOE_OI@KDALU@KFIBwBQFQRCFANAD{FQJSJOJI@WVEBMBY@iLM@@@GB[CKLOVCNANHNNLZRFBZRRZNN\\NLBPATLDJ@JJTFFLBHNLNDJBLABGHGFEHFHJH@@IFFN@RJZLNDVJLPLHJL^JNFJLR\\bVP\\FNIHMRORERAHAzENGJALFNHZHPHDDBJLTDLCPKVAR@JDfCLAVGVC`BFHJLHJ@ND\\ANDJA^LfH\\FLAVDNBJBPCV@`CPEbCRGBA\\GjGHBJHBF@LJF@LBDDBALFBDFCFR@NPJBFFPFDDBDHDFFDHLNHDJHJRRXDFJHzSPKJCjEV@LBXRpTVCLBTLNDD@DIDELAV@TALIFIP[@CIO@ELQPO@GIW@SH_COUaCM@IJGFKAICK@MLKXKXQHYHa^uLkJQXUVMlMFCDAFAFBHAF@VGFBHIHABEBIDCPBLKDCJB"],"encodeOffsets":[[109535,39993]]},"properties":{"cp":[106.376173,39.01333],"name":"石嘴山市","childNum":1}},{"id":"640300","geometry":{"type":"Polygon","coordinates":["@@HCPDTCNDFF@LDJLLJLDBHAHIhETADBLFD@DCRODGXQ^GFIJOPK`IbEVK`AN@lQHCFKPUPKLEDOBC^UPOVaFCLAZAVCJEHG@EJEBAo…KYBCNK~ORR`Ff@HERS°ÜkVMJCLID]SqG]KSggK@KDGNEDEJC@KCGDBLEBGCIG@ABCJELBF@@A@EM@YMg@{GoMIKG]DYCWCMGOMMYQOCI@mII@EBUNIBgCEKJ[zIJAA[CCgHEAomCCQK@CDGGEGCOGeBCCGA[HhsXEtNHIBGEICOCECSESEKIGESIK[UkYGC]IMMCG@SBmAQQ‹ESSg@MBCDWAIIOAKFI@GHWL[FKLILEBCJCBEDB@EDC@AFABCAAHEACDEBB@EDABKDAACBEACBA@C@CAAE@SFGBOGUCEC@C@EJGXM^URIFEJB@EFCBCE@FCD@BABIDA@GFAACDA@EFAACDAACDEBEACDCEABEB@@AGEFCCEBAAABCEADCGCBCAEBCKG@CCCEKECC@AC@CG@BGIMKRIFADCAEFADCFEF@@CBBBABAAGFEACEHEBM@@KACEHAHDD@@AGCBKHGJE@AMFGAKDgNEAIKME@DCFA@@DC@GJCBADGBADC@CDCD@BGFCFGBADKFEFGDORUGK@UCE@KCI@KCCAGCAAEAECGACBQE@COKEACFGDGLE@IFG@IAGCCCC@SHEFGAQPGBCDIQ@ABIDCBGDGAQC@ADGFE@QFICIJQFIGDAHCBGJC@AGCIDM@UFKBODAD@HINWTKDEDGDADKDABM@SJKCAA@GKECA@CZMB@DBNADMDCUA@K@CHCBEAAE@K@CAGEACBGGAIHKLUPWCG@]XGFCCIJEBIJCFEFGDS@UNADCDEBCA@BGDCAE@@@DAEAD@DCFE@AEEC@CL@AEA@CCMEABECC@CJQDE@CKKCGIGGIDENGEIASA@KHGJCJDFCFIBKACFBHACCAMJ@NDJABIAQAKDQGGDGHGNAAKKISECGACFALAHEDCBUESIGTK@GFOFEBCAACDGEFA@GCCCBAHIFM@EJMFQFGDAFMLANQHS@EAEBC@CDEBOFGACBGNI@KHEHCBCKOECQJE@IADE@C@AHIAECEEODKGMBKFKMB[GCDEAEBOBSJCDACGG@K@EDEBMDGGAGCGCGAIDGLCFBBH@FCHDUVBDCBCDGBGFQPGPGFC@ACAIFG@GNOHMFEECAECIBELGFBHIPCDDNALIFINANCHKFEBIECCEFK@CCBIFAABC@CFGHEACDABEHLHBBHNFD@JEDELG@AAAGBECAAFEBCHE@ECAKFDE@AEAGECBAAJE\\K@ACAFGAC@GAE@GGENAJBACBCBCPIBEC@AC@CDCAEE@ECEFA@AABIE@CA@CFC@GAGEE@CEB@EAADACCDCAA@A@CBG@ECC@KCEAGK@AAJOCKD@@GFEDADEJABCBAAAEAKFECA@a^@@ACCAAIKNCHG@IL@FCBG@EKAAEBMDC@@A@EEEDICCG@YJA@AIAAG@EAABCAAIEBIHAC@GIEGEKAEEJK@AD@DCBEBCLWC@KDAC@AGACFA@CDAACBECEB[KAC@GBIHOCOHKDK@CG@@AC_SC]MKBEAEFSDEACBEBKRCBAA@I@ASGACEDI@MISDMBE@ICHG@CACEEO@QCyQ]KUBEBMTCHOBKAOGABCNUJIDCC@C@GMKC@EDQFIB]EEACG@M@UBGC@IJUBYCWOEA]RCVGNLZAJgjYLAZW\\A`y|SlHd[VU\\cXD`E\\qd[CMJOEIF@H\\XILBX_TCTKHI@AJJB@HiZAREBK@CA@I@A]QGAECEBCFEBC@IELQ^[@IIIKEDGIMOQIEKECCBKACCCSCCA@GGE[GECCO@OCOIEEACBCN@NCJKJODKAOEKGM@OAOBGJC@WQECA@ILBBDHGPCNAZ@JDHJBJD@HEXBH\\^ABGLQJOND@HEDBJAHCFETCAHBFLJJDJ@BJDFBBF@HFRJDDJDHHPDLJDD@FDDALBDADDHBBB@NHD@FDF@MNÔ]rED}@MJspIF]H[NOXKbAJFFBH@RCFEB@PADCDmAGAkPWBIA[@IBKHCLMJSDHDT@LBDBBDFB^ARDf`LFLJZZfTJLFDB@HGBCGAAA@ADCBIHCHGHUFK@OGEACAGEGACLEBEDC^WJI@IZBX@LDL@FD`BNDNJADE@CHBDBDFADBDDADKHECCBAFBFADB@DCD@@BABOJDHF@@BEFMHCAGHBDABDDGDBLED@DCB@BCD@HAHQZGH@BjNNBZHLLLBJFDNBBŌUPHPRDJBF@HGHKHKLWLU@aRWDIDoZKHADDFDRDBDBhG^@DBAHSb@BPPNFpJD@LGDCB@FDL@DBFJAZžLB@ABEBBDEABDE@FFE@@DEB@DGFABA@BDIECDE@ABC@AFPDJAR@NHHALEH@HFLBLNBLDJBFDBNLNFFRFDF@FCL@FFBDFDVFLADBBBIJGFMTOHYBMHEJDBDAB@@BsrILEN@DDPJHZAHHCNAJBHFH@JALEDSFIJCB_@KDEDEBW@OCM@SHILEDEB@CBK@EAIIOKGGMKMEMAMAAAAkBABFHRN@DKRCLMH@DDDBD@JCDJPFXBb@fVTFFCXABMEUAcHW@QUGD_HGBICQDUBQDG@UKWIM@Y@qHGCUCKCS@OAaIUIEIgEgAFHHX@€LrHDNDL@JAREdCNGL@tPTFNJhJNHRHXVN`DPFJFJXXLLDHFTC\\EREJCNAjBNBFXlX\\P`PVBF@HCHCDMXUXS\\_`YdQpG\\BPAJDPDrFRAHBPLXDHPNHJRLLDXJZNRNBLTfŽIB@HKHCHIFEbIš_HKayUiGQt_X~FHtKHP@HBHFGNAlQFBXVBFDLDDJDXVBBJBBCACME@CNCBCMC@CHGBCIIBCXCD@FHBB\\EBC@CEE^IFCBqHAHJNPBBFBPBJCNIJCPALDDACOTEHGBAjGAGDIT]@KEGSIGGGW@GACDEBETENGJIDOLUFCLERK@CCCFE@IJABCACG@@ADCHCN_B@VLRIBA@EJO^S@ASUICAEBCNKx@FAB_bAJA@wJCGQWUAASAEDC@[EyAGABCIA@ADCIS@AF@AEJ@ACEEJE@AEAACHK@CHEDGVI@A@GVGTAJALBDCN@AKh]bQHIT]ZKbYbCVIdSFE\\[b]ŽiPIX]PMTKHIPSDIFHlN~XLZÆ_ºEBlCNEŒEhF`DDXFpPtV|ŠXvNZHZB\\‘HUOU\\ADEŽ@\\CHH^CBqCGAOGCBU\\AHIhAVDXGFTfZhŽKRAnVFHIT‰°G\\ATDNHRVLEH@DQZIVER@bM‚QÄUL@DLFBJALBRGJAN@DDPNDHLHFAJGTGB@HJF@"],"encodeOffsets":[[109666,39051]]},"properties":{"cp":[106.199409,37.986165],"name":"吴忠市","childNum":1}},{"id":"640400","geometry":{"type":"MultiPolygon","coordinates":[["@@AKGACBBDABD@BDDDD@","@@AGBAC@EJBH","@@@@A@OLBLAL@BD@FGLG@AEIBG","@@FCBCCIFG@CCGAKGIKCKKAC@CEK@AHAHEDG@GGCCICDE@ALKBAIBKAC@IGGBAHCXFHCLQB@FHFCJABCCEACBELEDEAECAI@MHODCBCCBUACC@CECAB@AA@DEBKEBAAA@HIDANIBKAGDI@CCAINIDCNKPIFCHCCGDAAOCAABKNOLSBGFEH@FIHADGDADIFBDHLBHCLKTGJKBADBDHBBHCD@DBHFFJAFDD@FELBFCHDH@DJEF@PEDBBCHFF@@IDI@AD@DABCDCBEDJF@@DBDCH@JDF@DFFD@B@DGBAB]DEFBBFF@FKD@LGD@HCD@BLDTHHB@HEEAAC@GDMAIDGLCDBBRD@LGHDDHNBBB@AHAADABHDHGFSNQBG@ID@BEDAJB@CDCLGBFDDTINJ@AFIFC@DFAJMRIBABABBDCDB@BD@DED@DCBRBDD@PKBPHBBAJCFGBEDABCHCDABHDDADLDDDDCFB@CJGFXHDJQD[AB@CD@DEDBFC@@ADBDBDF@HADBAC@CJIFIBQFEFCDED@DDDAFE@CJMF@DDJBBA@CHGFKHCFACIEGDECIACFGD@BDDGBAFBCK@CDFDG@JBJDBHLFB@AAMAG@AESHEHDHPHHDAHGIE@GAABMABA@A@AAE@PMP@DU@B@FDC@FDABC@GCGDC@IDAEAGB@@DB@BM@DGAEBBBAAEMCCACC@GACBCFABBJ@CEE@@C@@AK@WECQC@GAEAM@GFCDCRAFENBAGCABOCGGGQEGKAAEDA@AKIEEK@]ACC@EDAF@JDD@FCDEDACEBGCA@BHADA@CCCDABAAHUBKFGFCJCDBTCFPDDFBHAH@FFHKBGDC@CGQGFEACEMGMDCDGDGI@CAAEBBO@IG@IHIDE@MESSA@CDIAEDA@BCECDCDI@EYK@CFGJCLATCB@BHBBHEDE@EDEAEEDCBCFE@GG@CF@BCJ[@ABBABBJD@DCAOBCTU@CJGDEDATJBADCJSEE@CBARABE@CCCICA@EFCBKAGBEDGAAEDCFBD@BSDAHBBAEABAHBBA@KECHKGB@ABKAEEAMNCAACCOBE@AWBA@DJ@HCDQJE@C@EE@CBGCSB[CKAAIBMJGBMCMBCKCBCJEDK@EAAC@ELQAAEDEEFC@EEKKKIEIBEFALABECCAED@DC@AAA@CHGAAAA@EFIE@B@JCBEAMIC@AFE@AABICWDEKGAADEJDD@DKAEGAIDE@IEEFAEA@ABAFA@GDYTiVIJAJA@CCE@ABHHABEBICAIEG@AFK@AKF@GEBEGI@CBGNAA@GCAG@CBCDOFQXCX@HCBC@EECK@ICAAB@PADE@AHABGBCC@E@EFEAEGGC@KDO@EHK@GHCBS@KDKAMBCBK@ACBI@QCAG^K@IEK@GBSAECBC@AKEDC@ECA[EMCU]EEIMEAE@MG@YBGFG@ACC@CBCLDB@BQFGBETGCIGEAGDELGJIBCAI@OBAFCDCJ]AGDCJEBCA@EAKDMHG@A@IWEQCIACFKCKDABEMEMO@AFMLADCCG@EVIFEBKDGAUJCNDH@LDD@BECSESJAIIAGBGHGR]BOHEBA@ACCKSEUBAFADICG@KJIBECEBAPMAAG@KKIBACCQEGFOAAIGIMECEECCQEK@@CCAQKACEAADE@CAAAKEEKGECKGEC@IHC@GGWCKGULI@ECAEDKLQBKACIEACKIK@CBEFANABGDUAGDKREDGBADDN@HMJGLIAIBCDAFEDIFGF@FBDBHOTITMBK@OJAHCPGHIHAHDHLHBH@FKHG\\@FANCRS@QFC@CCOAM@KBEDCHEXC@@CCACAAD@PADIDECCOEMQG[[SKK@DGAECEAKEGBCAEC@CDE@ECACHMAEI@CBCHANGN@FFFBDABMD@FFH@FABY@KXDFBHMRDJ@HEJ@F@BGBADD@BAHF@BCDE@GHDJBFCRCNAB@JDDLBHAH@BBH@DJBBLDDB@FADGHCDQBICEGBGCOCCC@ABCVCBAA@EAAE@CBEBCAA@@CYCSCSAEBAD@JKJADBBH@DFATCDG@CACEC@OLGDQBIDC@EBUA]JU@[FQBMFGFCDC@KCM@GCBGAIUBIHGSAOCMCCGCGYIOEAC@KJAdALFJADAD@NANCDSIADFHFF@DG@CJADFJEHAJELMIMCEECBOREHMH@BEF@DB@J@DD@DGFDBABGFODI@GBKJBHCBIACFBDHBJ@DD@HHNADGDCACEAGGEQF@FFPAFEDG@IAEEE@KNABE@CB@BADFPHH@BAHBDDBBD@DEJGDMBIJYEABBP@DAJJHHDJCDBBFHHDNFHJJF@BCAGAAFKBUBEH@LCFBHLLJFJDBBDFPAFEFKCEFC@GEAICAEBMPEBK@CBEHI@EAGGWHAB@PABI@C@AC@KAAC@EBADAJAFABG@@AIAIEEBCEG@CCMAECACG@@CEAOGaEMECC@CBCACSBICMDI@@CFMDG@GCKGCEGC@CFCPNVBJCJILEBWDQKC@KJE@WGKGC@GHE@IACFCBSBGFAFG`ADABGDEAKII@@PDJDXAFSLMCEBIPCtALCBEAIIA@ABANADC@IAYUEIKWEEEBCDIRBDVX@BKEE@CBBFDF@DEVGNAD^TLMHABBBDBLCLGHKHMHICGBKDMLCEKAQHORKZAHFFFDF@FADBENAZCFQNAFBDDDBFFFF^ANDNCjFFD@AB@BH@@PBDEFBFBBABDDAFDDBHFAFBDANFDAJ@ELCB@DFLJJFABHLJH@DBDCDLDEBD@RBDJ@FFLIDBT\\HFFBLVJ@DABBB@FIBHH@FBBCDABDJHH@DABCFEDBDCDBDABDB@FEDBHABBBDFAPfBB@FENPCBJDLNPCFQLGF@LKFBFENGPBFAFNABFjVRPVN‚XNJLDNBDED@BCVCFI@O@CJGLEJIFIAIFAFCLEDGFAHK`WLKNI\\EH@LDTZPJXDXAPADBFHHDJ@TIJOLWYUKEGIDEL@LHHDJ@JCPBPFH@JCFKBMBCJEDBRNVXRHPLJ^LRRVRLCPALBJBJDDr@tEX@JC^Q^MZCR@E^AbMlQ`UlIPBHFHNDDBBHCLBFHH\\C`GHJBJJJ\\@fLFAJEVIDBBHBFJ@DALO^OH@NLLDJB^@bN`HPFZDFDFPFHpffTFBF@\\CJBDFBJNjBBJGFANBJHF@NCHBBBAVBNDNHRPX@BA@KKEAC@@RCXGHBJJDLFPBLNDPVADDDJHHLFF@LFH@dKR@PHDDAFNCHELBJFB@RSXUHAJFHGFDDAF@FCBMLMH@BDF@CFFPBBB@PS\\E","@@R@DECGIMAMFIEGFIAKCACJI@EB@F@FKNAFEBGCGGMAAA@EOK@EFI@CMIC@ABBHAFOJAADGAOACQAKCEAACBCKCCACAABELABC@EGO@AC@IA@A@IFQBCCGGE@EAMCCCO@KGCDANELA\\BJBFLH`DB@FGH@DBJBTPJ@PBFFL@NFHHJBFCRHDDBBF@FBJ@D@FBFFDBLCNDLJHBNCFDFB"]],"encodeOffsets":[[[109061,36594],[108620,36306],[108619,36271],[109075,37357],[108594,36341]]]},"properties":{"cp":[106.285241,36.004561],"name":"固原市","childNum":5}},{"id":"640500","geometry":{"type":"Polygon","coordinates":["@@CCOGG@I@[JGBG@KEE@KEGGCICCUBCOIKAAOAKEICAE@EFABCDW@QD@FBLLB@@AOWGQCMAMBUAAGAMDE@IGMAEBIHAAMiAICEIA[DE@EAeSoeEGEOECYCOE_GaM]@IAKCMKG@]PKPCBI@AEAGCAUJIFEBeK[@IIAIGI_H[DGGAEDKAGCAMCEGAGJOVkR_NkBaF]Q@YD]N]RIDW@sFq@CCAIAIBKDOQKQUKQI]OKQGUWQMCAIFADANELIDG@OEOAIDI@GCKGK@CFHJLFZVKXIPSJI@GCEGCAOBWBWCOISYKCG@[FMJKL_XGLEBCHKFEDEBBJEJIJKFIH@D@PEJUDADC@CFMAKCMIWUMQOiUAEMBGJ@LEAABBJ@FEHEBADIFKDGFEZBHHHHPENGJ@HDDJJL@DDFR@LGNIJOJCFCFAPABQFU@EFMD@PABEBCDADDFG@ADC@EDAFCDBBABEBAF@DELB@X@FD@DFHINWBA@In@LFX@HCBIFGFAFED]G@IAAABIJAFBFLX@JBFCDELBLDFAJCNGPYVIJMHCHQNINC@OEECIKCAC@EDMBGAKECHEAA@CFAFEACBEFA@EAEVQDHNTJF@JHH@DBELDLAFIHGPBBHFAFONUCKXE@@B@V@BO@CBAFE@CDGACBADFFAHFJBTFJEJa`M\\@JAHBDFJFDRdTJJCP@BDAJ@DBB^@^EFB@JHJ@DBBNCP@NCRMH@RBTRHVHBHD@FI^@LCN@JCLIAOHQNKFIJCF@LGDCB@FBBF@BHeTBBBHAL@HADGB]VWVEEC@ADFFIFEEE@OOCDALGEEDUJGCGDAEEAECBEC@BC@AYLFLGBBDHCBHC\\IZTEEF@BDB@HADBJGDBDGDCRBFEHIDCDE^@ZODUAOBS@ODGBMB_LGFOFOBQJOJKEG@MMEKAAK@EDCDaNF^SHYAEHAACGA@YCEAGBUR@~ANEHEDaF]TCFHR@DAFINEDIHMDBBAB@BDBCFDD@HBDGAEH@FGNCHIB@DIHYLAB@LADIHADBfEFBDADOJ_LKLABMBO@IJCACCKCEAAFCBAFGLUJSOOAMEEKICIIMECGWMW@YGKBGEIDI@IAIJA@AAACICUBECGAMBIFCNKHGJGDShAD@PHTLPDHADFDJBHAFF@JKLBHHFPBZQH@H@JLNFBXLJNFH@N@\\VDBPCDDBHFHAXG@UIMBIFSFODIDM\\AHBFHHDFDJBTBDPJBFQH[BGDCDSDGBQEQ@GDE@KNEBqB_FUGKAGCGHCBGBEDADSDGICAI@EGOGOAMDgEMBQJGVOTC@KCsKIEQEIIUCGIKCiD…KYAUP@N`\\hNJ@PIJ@bLPPNHjA`HFdR~VAFHĤHâHþRîNJBv`†XŽ@lLĈNbN¢xjdDDRFJ@VD~\\nLVLNLbPTD^B`JbDbPhNR@L@^F`BZF`APDHBXC\\CfQpEHBhApBh@¨H^@JDLJhBhFFJVJbJPBT@LDVDHDrGZ@N@XJVLH@RCVARCJDHA`GHCRVX@dGVBNFBADWEEUS@eAaEWIODC@IACCC@CNGDKLQ@CQMEGBAlABBBBBNFNLNHNLHJPBJ@FAL@DFAFCJKTGN@PDX@FAFCLC`@DAJITEFCBK@IEGAGBIDMGGYBIGCO@CFMJKtq@AA@CBCAFINGZAPGNSHEJIAACAKBUEECACEEK@EDE@ECEQMEMKCAAECIAKKMKAGEG@KFGBMGQ@IBOCBED@BAF@DCJFACB@BAHE@CFA@CF@EEF@ACFBACFABAA@KBYEICAK@ECA@CDKHC@oIMEOO@ATaBGCA]@gHCACACQCEBCTMhSJCXCbQV@XKDCTOHG@GEOOQOGŋVAACMIEKAKKYGMAiM@AHGRYBG@GDC@ADA@CFCAKHCCCBAACHGDBNGFE@AE@CGPIBA@AC@CDA@BCAEBEDAFDLGBCCCCAEBCEDIF@BCMIMC_AECK@KCW@YA@JIJ]XCDAFKFBDFHBHBDHF@PELGVGHGDAJCD@BBBHBADGHA@ECIKeSYYKIKEe_QC]BEAACCAKAS@GCTCNIDKLGJA\\@JBXAlOHBnBDCBC@OFADE@QAGEEBILaPW\\M^GJEtoNI~@FC^qžÓNME@ECC@MGA@AACGBCACBKCC@ECCKIOCGGICCCQIGEE@AACEAII@ICKIAEBGSDEFGDIBCAGFC@PMRIHKBA[]AGFW@GICIACG@IBYDMHOCGAAJKB@FDXRD@HIPAPBN@LHPFLBPCLIDI@MDMDAFBJFDP@PDPFD\\HHF@HDBTDDDBDALDDLFJFPRJNCHLFJJ@J]\\KRJFD@FADEFAFDLBPNJD@B@JDBL@FABQjY@GIABIJ@LGDS`SAWJK[W@GJEPFNI\\DrcF[C_dWV[\\UGcTkz{B_X[BYZKhiBIKYHMDU^QFBXPZDVAJID@AH@V@NDHFB^FJAREFCD@NL@H@DDDJCVIDMBAPHLBPADGNSFAVA^LzRRDP@FFBD@DGHJDF@NATCNJJ@FCBDTH@B@JDBNSFAFABCBO@ECC@EA@@KDEDCL@FEFABCBEHC@CNEM@QEM@@ABAJCHIAECAAIO@EEKFQASFCBADSPWJ@ADCACAGEIDGEGEDIJC@INKFEHC@CBA@BEEA@ETY@QXGNFN@JCJM@EJCJEDICAAEIE@A"],"encodeOffsets":[[108966,37393]]},"properties":{"cp":[105.189568,37.514951],"name":"中卫市","childNum":1}}],"UTF8Encoding":true} -------------------------------------------------------------------------------- /test/data/map/data-shanghai.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"id":"310101","geometry":{"type":"Polygon","coordinates":["@@AE@GDEVSHMAGOYKKCCcGCDGBALCPIAAPIV@DV@BDCPEPLENFHCJHFB"],"encodeOffsets":[[124411,31993]]},"properties":{"cp":[121.490317,31.222771],"name":"黄浦区","childNum":1}},{"id":"310104","geometry":{"type":"Polygon","coordinates":["@@FOBOJBDOBKHADCOGCEAE@EFOBMAEUW@GBEHILMBE@KKSAMMAE@AFA@@BC@ABC@@BD@@BH@@BB@EHDDCBECADGEEAEBFNET]CMRELQjOEGRFBAHDBAHH@@B@BDA`H@F@BC@AB@FD@DD@@@CH@DDAFDD^LEPF@DFTDLHD@@A"],"encodeOffsets":[[124374,31969]]},"properties":{"cp":[121.43752,31.179973],"name":"徐汇区","childNum":1}},{"id":"310105","geometry":{"type":"Polygon","coordinates":["@@CEE@FO]KCCBECCG@@D@@CCmBSAcKG@EBAEGC@DC@QE@CA@@BEBMTNFAFDBA`D@BDA@AA@FFBBLD@@@IBDBABDB@@DBADB@CHA@@DC@C@@@BBABFDH@AHD@ACDA@FD@BCA@@CJCNWJ@BCHAFEF@XCV@DFH@VFBBCFLEFFFBB@@IDAJFBABIFK"],"encodeOffsets":[[124355,31964]]},"properties":{"cp":[121.4222,31.218123],"name":"长宁区","childNum":1}},{"id":"310106","geometry":{"type":"Polygon","coordinates":["@@DOACU@BGSGQCELAJABIECBBNFHJB\\PNKD@JHFM"],"encodeOffsets":[[124382,31984]]},"properties":{"cp":[121.448224,31.229003],"name":"静安区","childNum":1}},{"id":"310107","geometry":{"type":"Polygon","coordinates":["@@DB@DHBBCDBB@A@DF@@DFDDHGBDDALZIDA@ACQ@@DGBEFBB@FD@J@BFMBCCCDID@AODAEIDBDEBABBB@DC@AF@@AFGACBADBB@@NFADD@@BB@B@BAB@BBDA@HBB@AJ@@AD@@BB@AFHBDCJFHBGQAAJA@ALCBBF@@AB@@BD@@@JABDABD@@BHBBBNACEJA@ADAAA@B@ADAAAJBIQB@FCBBD@AGJ@@EJA@EHADDAB@BFANNDEVIPUAGD@@CA@@ECCBC@AGASKIAEGACA@EAEEA@EFC@DEAAUEG@CEU@WDE@EFGBADI@IP"],"encodeOffsets":[[124267,31987]]},"properties":{"cp":[121.392499,31.241701],"name":"普陀区","childNum":1}},{"id":"310108","geometry":{"type":"Polygon","coordinates":["@@ASG@BOCKCEBA@G@KBEDCLMVQ@EACDECABCDKECGDMEKFIGC@ONDF@FB@@DC@BHOVUJCFIGA@@RCJBNG@ABBDBB@DNBAJJ@@FB@@H@@@DF@ENB@BDD@BAT@BENDFDPB@AF@@G"],"encodeOffsets":[[124384,32068]]},"properties":{"cp":[121.465689,31.25318],"name":"闸北区","childNum":1}},{"id":"310109","geometry":{"type":"Polygon","coordinates":["@@VCNB@UHWVFBABIKK@MJCJGBKV[C@@I[AOEODCACCCLADDBCFBD@FURKNCDAF@L@HABDFDLAPH@BR"],"encodeOffsets":[[124384,32068]]},"properties":{"cp":[121.491832,31.26097],"name":"虹口区","childNum":1}},{"id":"310110","geometry":{"type":"Polygon","coordinates":["@@pSNGDCDGDM@cBGL[BKAGEGMOcY[GWA@JD@U\\ALIHID@NLLAJABUEGX@PVA@ZDDADGFX`ZKDHFA"],"encodeOffsets":[[124443,32100]]},"properties":{"cp":[121.522797,31.270755],"name":"杨浦区","childNum":1}},{"id":"310112","geometry":{"type":"Polygon","coordinates":["@@BAAA@@D@D@@CB@DGA@BCCA@@CABACAJA@@C@AKEA@EBBB@ACC@B_CABEMENSFA@AB@@DRFD@@CHDBFNA`JVDlA@EBAD@@A@E_GCB@A@AG@BGCABGEAHQPFRiFKNQ^DFSEMFAFBHFBCFDDACCFGA@@AG@@AC@@AD@BAD@@AB@BEF@F@B@FBBNDFLCDBCBFB@DFG@CBBABDB@CDBAFCB@DABD@B@DB@BD@@B@BB@B@@FJ@DKLFB@DMDBBABBCFDB@@HB@BBABBDCBGNBDAB@@BPDBAF@@AB@@AB@@CDB@BF@DGB@@CD@FDADF@BADDDCBBDCAAC@BCFEAAB@FECABC@ADBBEB@@EGCABAB@@CAA@CAIABAAA@@ECDGD@BCBBD@BBHBFALABAFBD@@CGA@BC@BCEAA@A@@AEA@@AAA@G@DCG@CCBAAA@ADBDAEAC@ACE@BCC@BG@ACBBAEAAA@B@CECDEAEBAB@BDB@DBD@BBD@FDBGBBFCAABCBDBCEC@UBACA@AAA@ABB@CCCE@AA@ADCD@@BF@@FB@@BDB@CDB@ED@DFB@ABB@HDAADCBE@CCACC@CACIABA@@@BD@@AD@DICABCECFA@AMEO@@CC@ABA@@ABA@GCACBADCDA@@BAAAB@BICADE@@BEAABC@GHC@E@@FD@@BA@CFC@@BC@AASEKG@ACAIZBFGDYCIAKGKAU@OCGAKIMIMCOEeC‘WOBWHG@CDBZHBPTBHJHABECM@ADBB@J@F@D@B@FBDAD@NBBBN@T@DBBADFCFDDGTDJFAFNB@DB@EFFBADD@@DFDDCDBCJGPAB@DELGAADMCEPHB@AB@@BHF@BABCAABA@AFFB@@CDCAEHB@EHBBCF@BADEJE@ADD@BDGFADA@@FCB@DCDAFA@ABGA@BE@ABHD@@BB@DABABEJAFCHEHABAFCD@BABCFCB@BED@BA@@BABADGFAAA@@CAAKGCAKAUTC@CDDBADIHDFCF@@CDBDCHDBAHGDBDCDABCAAB@BA@@DKACBDDABBF@@@BHBBDDBC@BDFFFBBDD@@AH@HB@EFC@ABC@FFCFBB@LCFBBAEGFEDABGJMJCL@XGNFH@PDBB@DDD"],"encodeOffsets":[[124251,31988]]},"properties":{"cp":[121.375972,31.111658],"name":"闵行区","childNum":1}},{"id":"310113","geometry":{"type":"Polygon","coordinates":["@@@FMAUD@JE@@BOAECMCAFS@ABC@ACA@FME@@C@@@GA@@EI@BIMA@CCA@CBAH@AMDI@OBACEEB@ABACCGB@FIB@FI@BHC@AAEDA@JRIABBCB@B@ABBCB@BIBDFMBAAGA@AC@BAACIB@@C@@AA@@BE@AAKD@BIBBBHRC@ICCCCDGABEA@@AC@@BI@@BAA@GCBAAA@ABBBCDAAEJFDB@P\\J@@FB@@DGA@FD@@DAAADCF@@ABBBCDDB@DF@CLCAEFEB@DG@@HD@DB@BB@@FHD@BADA@CFCFABDB@BED@BCDEFFBABB@ADG@GNCBFHAFA@@DCAIB@DB@@FBBEF^JBAH@AFD@A@@DA@@BFDABD@@JB@@BA@AD@DB@@FCJ@FA@C@ABAAABENDB@BCDCFG@ADDBEDDDABA@ADB@ADF@BD@BEACD@BCBJF@BABA@BBCFE@ABCLABBBAFEB@A@BCDEBADD@CBBBBAADBBD@B@BBADFADDDA@ED@ACB@FF@DFBBCB@@AC@@GF@B@AFD@@DB@@AD@@BD@\\P^GVGŒcBAEGBE\\Q`W|i\\UdSTQb[QQQY@QJONIVIEGEBCGYLW_HEBCCC@YUB"],"encodeOffsets":[[124402,32064]]},"properties":{"cp":[121.489934,31.398896],"name":"宝山区","childNum":1}},{"id":"310114","geometry":{"type":"Polygon","coordinates":["@@A@A@@AC@BCME@@AABCDAHBBE@@BED@@CAABAFAACJCBFPC@BJCDCDDNAAEI@C@@EAAFEHA@CR@BDB@JCKYCBACGHCCCE@@CEB@A@CAADGA@CCAADGB@DB@ADC@@ECBBDC@BGG@CCIC@EAAOCG@OEUHK@IDGJCLCBEFFHABEAKDA@EAED@EAD@BED@FGAG@@BC@@AC@@DA@@CCBEA@DGAKFOB@CG@@BAA@CGCBAEA@CA@@DEA@FCFB@ABAAABAC@AAACFGEBCABCCABCCABCAB@@CC@ADGDEEC@EDCA@BA@BDA@ACEFECABC@@BB@BDC@AJIJCAADC@CGEB@@AB@BDF@JDD@DHBABD@B@@BCHE@@BC@@DCA@DC@@DDBADA@EDFBIPCFIIBCMAE@AJ@B@FAB@DAJDB@DDB@FD@@BCBBBB@@DABAB@DCBBBAHBB@FMCKB@HF@EHIACBE@BFCBBLAH@DD@@CD@D@BFNBCDGBAFTHBEBB@DB@@AJD@ANFABBBD@ABD@@ANDBDCD@BABA@ABLDCFDBF@ABC@ABDB@BFDADJDDCCDBDCDAAABBB@BC@ABA@ABC@@HA@C@@DJ@@DFB@BD@HB@AD@ABBDFA@HA@@CA@BDABOBMFAFB@ADBDAB\\LDAHBBADBHAPFJFAFBFFD@BJHRD@FHFNHDACCLADBH@DDFABHCB@BHJF@AJ@@FAFDB@AEFE@CBIHB@AC@@AA@DEHD@BD@ADB@@BBBB@AKD@@DBA@@@AD@DBBDBBDBD@@FDDBA@CDAHDBBHDADB@FA@BD@DCD@BFFCJD@DA@FBBDFADC@A@BFABEAABADKBAF@DEAAB@BA@AIEDA@ADCFB@AACE@BCA@BCB@BACCFCCABCH@DEDC@ACAFMBABBBAD@B@@EDI@EA@@CBCB@@AA@@IC@BAEC@AB@@CB@C@BEG@AB]I@@DABCAA@EA@@CJADB@CB@BEEGDAHMH@BCA@BAEAFEDC@AFC@ACABALQGC@ECCE@@GH@@CFAFEDBDKE@@CCADCAABA@@DEBCBB@CC@@EHB@CA@@EI@GMEMICFIBBBABAA@"],"encodeOffsets":[[124249,32046]]},"properties":{"cp":[121.250333,31.383524],"name":"嘉定区","childNum":1}},{"id":"310115","geometry":{"type":"MultiPolygon","coordinates":[["@@bM²WLCļÑNI^_È€sJQ¶±`e`Z¡LƒD‡CsEWOWs@GBI\\wsYg|QNUBģFq„AZHZB@@JHBAJFRA@BB@HABB@@J@HBDBLAJC@@BD@ABA@B@AD@FB@@BA@@BA@G@@FC@AB@DA@ABCAC@@DEA@DD@BDEF@FQJE@CAGJA@ABCAEDBDGHADWR_TYJI@G@SD@AA@@AA@IDGB@A@BQBmAA@CBOAGFELC@AAaDACS@C@@AIAABKA@BEBFDADDBCJC@@BC@@A@@ABJBBD@DDDDB@DAFCDBBGCA@BAA@CEC@@FCA@DCA@AA@@EE@@AC@CD@BBBF@DD@DAA@BBB@BDBAB@VFDADACADBBEDAAAHECC@AAC@CAA@ACA@ABBFCFFD@D@ABBFBABDA@BAHD@ADF@BDD@FBCBCA@BBBABDDH@CDH@B@BB@@FB@BB@B@FBADD@@AHB@DC@EAABKBEBGAAAC@AAADC@CHFD@@BBABJBDBB@DB@@BABAHD@FA@AFCA@BADDBEFA@BBEFADD@BBCDAACDCCABE@BCECC@@DA@CHE@@ACA@DA@@BA@@BE@ABOC@AA@CBMAAHCDAAAB@AGA@@CADEAAABCACNA@KECLC@E@@EA@A@@A@AC@@AAAA@A@C@BA@CDABEAAADCABAAA@DEH@CEADACAKDHN@LAFKNGJAF@D@DBFNLHLANEP@FBFJJJDdHDDLLNVDHAHEJWXAF@FJFHDtDXHhZNPFHBHALK\\AH@dCNCHCDMHoTUJMJEJCF@RRZ","@@PDNAvOFGBKCeEQGEI@IBMNafELAJ@J@H","@@HRHJNBX@XCRGfEFGBM@eYuGIgCIAK@KDMPIREVCXAR"]],"encodeOffsets":[[[124438,32149],[124808,31991],[124870,31965]]]},"properties":{"cp":[121.567706,31.245944],"name":"浦东新区","childNum":3}},{"id":"310116","geometry":{"type":"MultiPolygon","coordinates":[["@@DBBAGCBD","@@HADA@AGCKHB@BB","@@FACAAD","@@DB@EB@@CB@@GEQ@IEKAM@ATE@EHADF@GDCFFPD^BBED@@BD@@DPBB@@CDB@BLC@ADB@BF@@CF@@DB@BDCDA@@DCACBC@AB@HDBRTHGBCHBDB@AF@B@NACQ@@@AC@@CC@CIEE@CFCFHDBHABDN@BED@BDNA@HAF@FCBADDLD@DAAC@AB@@ANC@ANC@TDBL@DGJC^BDBDBJ@^F\\VHGPB@CD@BAF@DKDBBCA@BAC@FK@E@BD@@BNABCF@@AFB@AD@BADB@GA@@AF@BCFBDKB@@BDBB@BEDBBDF@@CFB@HD@@F@@@HA@BBA@BDC@BJADBBLB@AA@@ED@DIHA@BB@BDDBBCBA@@@BF@@CB@ABFBBCFB@BD@FCF@DBBAD@BAD@BABBBAHDJ@ABDDABDBHCBDJIBOFE@IDKJAFCBAJELAAEBCBKAA@GD@AIBEAIDOK@@EDEAABA@A@BB@@@B@B@AAD@@ADA@EJ@@CB@H@BLDBFA@@B@@GEB@EB@@CB@DETAAADA@GH@BHLAPA@ABBD@JU@ABBFCB@‚£«ugW›OCOCgB‡DaAE`@HCBBFCBAJA@AFDFAFFD@FDFCFBBA@BBAFBDA@CDAAA@STCBWLAAABBBCBAACB@AABBBIFAPCHCFBBCB@HA@CAABGPIBO@ICCEDMGAILADACCBCA@CECEAKCADCBADAAKAEC@HEBCAEDQBACEAAB@BGCYDEJCB@BBFN@B@@JDbHRJL@D@FA@@CCB@DABBDEFACSDA@AAA@DDBLFHAB@BABCAIDADABCEKCABC@CDABBBC@@B@BA@BBcO[@MGDCC@DK_KFMGBCFGADEA@AGCA@@DAD@AFB@BCB@DGOCCLKR]JADEAMMABBCA@CB@BABCAACB@CEAB@CAAGBDFGFHFGBBDFHF@BDB@ABBFDADFF@DHD@DFFADDGDDDADDABDA@DDCDFFBDEBFFDCDBCBDDEBBDB@@@CDCDI@GB@BBFAB]DAHCDDH@DDBHB@DHABDB@@FG@CABJBl@FEFCFBB@LB@J@@GPDA@DD@AD@D@@CCA@BCA@CB@A@@AF@BGFAADDB@A"]],"encodeOffsets":[[[124321,31442],[124337,31429],[124341,31419],[123933,31687]]]},"properties":{"cp":[121.330736,30.724697],"name":"金山区","childNum":4}},{"id":"310117","geometry":{"type":"Polygon","coordinates":["@@@DLB@BFTHAFB@DABHFELFBBAH@DIHB@GB@@CB@BEDAB@LAPB@DFBADD@@BBBN@@DRB@BADALHABlH@@\\ABAFQPOLDBDBDCJBBJFA@FCJC@@DCAABDDBDKHB@CDBDEBCEINHDABFB@DDDD@F@@ABCAA@EB@@CH@B@BCBABD@DLBBCB@R@ADD@BAJ@BBBB@BA@@NG@AFELC@AB@@CBA@KJAAA@CAC@CLD@ABBBGJDBBDCFBBDCFDADBBDCABB@@BA@HHDBABFFDCBBDCB@BABB@AFEBBBED@FEDDBED@BALB@CD@DEHBBGDBBCB@BFB@@LC@@FJA@AJB@@B@@FB@@HH@@BJ@CJDDADDBB@B@BCJD@DB@AB@FC@@FC@@D@FDA@X\\ILF@CAA@ABBJ@DEXFPBI_CM@CF@NFF@BBB@BAADBLFBJABHKB@@L@BHXCAGBAF@@BB@@BCFBDDBD@BB^ENNEFEAEHCC@DBB@BB@AH@BFCD@B@ABDB@@FA@BBAD@BBHBDAB@BAHBADNFHDABB@B@FGFBF@@AHBFC@CDC@CDA@EB@BCFCBCAAA@@AFAFIBC@ADEAAFGA@FGDBDC@@EABEB@BADBBA@AGE@AA@@BGAFONDBCHBFK@CBAHODICACDEC@CC@BCEAFEA@@CMABEIESCCHECEDBCAA@WAMAA@MBCAC@E@A@C@E@IAABCN@FDBAIGAGOSGAA[DAD@J@XIJ@PDDI@ODK@UD@BCAAGADSG@CAA@AABAAAA@@BECBC@IFCBC@CIG@A@AGDCABACCBAA@@@G@GCCB@AABC@ABC@ABCAE@EDC@@AEAADEABAA@@DE@@A@@ABADCAACA@@AGBCJC@@FB@@BMCBCAID@ACB@AAB@@G@@@EC@@GEA@DE@ACCAAFA@CA@AA@CLEAADE@@BB@@HCAABC@@BEA@BE@ADMB@AC@@A@FELD@ABB@ADCACLE@ABC@@DOAGH[U]EI@CACA]AIDCHK@CA@SMD@BMD@BA@@BBDCBC@CKBCDA@EBE@GMBACC@AFM@ACGBCAEGED@DFFDJD@@DD@@B@@DRMBA@E@@BCAGAADGHQSCA@GBAD@DADB@CB@DCACA@@CE@@DE@@ACA@BKD@ACA@DA@OA@CC@@AC@AF]AOCEECD@HCEGB@FSF@BBNFL@JFR@HA@@DA@@FA@@A"],"encodeOffsets":[[123933,31687]]},"properties":{"cp":[121.223543,31.03047],"name":"松江区","childNum":1}},{"id":"310118","geometry":{"type":"Polygon","coordinates":["@@EAEHA@A@BAGCMEBCGAABA@CBGAAAC@AB@AEB@@CABAA@C@ED@ABGA@@AAA@CDDFGFBFEMM]FAAC@CAACDE@AA@@AE@ABBHWDAGK@@@LAAGIBEAAKBCABA@AAE@MEE@@DDNJ`OAWECFI@AA@BBB@DKE[J@WCB@E@CD@@ED@@EBAA@@CICADA@A@CABCCCDII@@AG@@GA@@EA@@@IA@BIB@ED@@KA@AEA@ADCAAHGACFC@@DKAABC@AFCCEFC@AFAAEF@BAAABA@CDAACDEEBACAGGB@@AA@BACDAABCECCDAADGAACAHIAABAC@@EDEB@HBBBLIB@DA@@BAD@FKBEH@@MB@@AAAAAI@ABC@BCQ@A@ADKA@CACABADA@G@@DA@@FBBAD@BE@C@CC@CEABAGCJMDFFAACDCA@LGACCCBADB@CD@DI@EEBAIIACDCACAPKROBEBA@[G@AkGBBKBC@AQA@CM@AA@AC@BCEA@COAKBA@CBAFA@@DA@@HGACJG@ABEAFKGEBA@CEAGBEUKA@CQE@BCABCEBAHE@@BB@A@@DDB@ADB@DC@C@@BCCB@OC@HM@AHC@AHF@CHBF@BC@@DB@ADBB@BNB@BB@@FDB@DC@A@CRA@CFBBAFGAADDB@HA@@DB@@D@@ADBBEJDBM@ADg@ABFFABGBCNGBC@CACBAADAAEFACK[AAAJK@AC@GBEDG@ACOFOEAD@JQ@@FBdCDEL@FCD@H@JHXBPHABDEJ@BEDCACHCFAHA@@EG@QB@BBDE@@DE@AAE@@CG@ABADA@ABCAEFBLD@DHNJDD@HDHHHJFdDPCTD\\JnE€MPDvBJHADHBBD@BD@@EHBFCBEDB@AD@HREB@FHD@DHBBGD@H@ABDBL@@AB@@AD@@CF@AFFD@BBB@CB@@FHDADB@@DEAADJB@DCHEAABBB@BFBAFEFADJDABIAADFB@DAB@DDBABCB@BE@@DD@Kz@DD@@HD@BDE@ADA@A@AFFB@HBA@BAB@FC@@AIBDBDABD@NA@BBBBABBRA@@@dFFDDHEBBHDNFFABDBDADCB@@AB@BCFO@ABCHCD@BBC@@@FDPRF@FA@DB@@AHAACFCHA@DFAACD@BBDAAABAD@BBD@@CDALBFB@GCIBA@@FADHD@BCDBJIBID@ACA@@AD@BAFDFEBDB@ACB@@ADBFCD@FFHCBCD@@DA@DBBADDBADDBAADHFDEBB@BBDBABBBAA@DE@EFB@CB@@DFBABHD@DBB@AH@@DPALEHB@CFBDA@DB@@CD@AAEAEEACD@CAACGA@A@@AEBACCDALB@CB@@ABADBBADCACHCBGCADGACDC@@DECEJGBCCADCD@VSLBDBLHBB@DB@BBHEBCBA@AB@@AFC@ADADEBA@ADCBEBAHIDKFIBABA@CIE"],"encodeOffsets":[[124232,31906]]},"properties":{"cp":[121.113021,31.151209],"name":"青浦区","childNum":1}},{"id":"310120","geometry":{"type":"Polygon","coordinates":["@@LBBAJB@BD@T@BDbCBBD@FKHEPBDAB@nBRA@A@BHAJCB@@BB@@BTCH@J@ZI`SXQBCHGACFCDBBAB@HIDBF@NGDA@EFEACC@@CFB@CD@DBBAB@@CBAD@@EH@B@@AB@@AA@@EBCA@B@BAC@@AD@BIAKAC@G@IA@BA@GAAB@EQBIGA@IA@GYBYrƒĥDƒEŸU¡_‰[g¤A@EDAA@BIVC@AA@BOBKBAGG@@HCBBBSBCFA@@DA@@FFA@HA@@@EBCAAKG@A@@DI@@FCB@BC@BBA@A@@@A@@A@BABBBCF@FL@CPBJAFBJC@@HBBALADBFKBIFABEDIBCL@JEFAPKJHFBFADED@JADFD@AB@BBABBBB@DBH@CTHBBBADC@@VCL@PCJ‚TfD^JNJLJHBPDV@LBLHJBZDHCAEJYDB@BLHTFDBB@@AD@DEB@@AC@@EF@D@HGD@BAFB@AF@BCJD@ABABB@AB@DCBCDADB@HAB@BB@BAD@@DP@@B"],"encodeOffsets":[[124489,31743]]},"properties":{"cp":[121.458472,30.912345],"name":"奉贤区","childNum":1}},{"id":"310230","geometry":{"type":"MultiPolygon","coordinates":[["@@^ITIRCZAVEV@bWXCDAVEBERKD@\\U\\K\\GBCNCBJD@RE`MB@JCTDÔoĒmƂ‡ZñLcDgG_SY]O£kcIUABoH_H±jã‚YH›NODQH½pۚ‹`gBUAQImwf±œŧŚEBoH~z‚„h^rXbLpVbJjHP@LANE s`SjoLGJQKCV_JK","@@ODMFYnMLaXŃÈ{^yv[RYLMLAF@HHHHBœOJEL]FKPMDCjIÌknGXI`MdKhWPGJGNMT[DEBQFS@SC_GKECKC","@@UDmXOLQPCF@FDBDBN@`ENEJEXQTSBEACACEA","@@BBB@DBDCCAC@@ACB@B","@@CNO\\@DBBTB^ANCNE\\A\\IjMFIPa@IAOAK_uCAS@GEG@YFGH[PSRQZC^"]],"encodeOffsets":[[[124346,32532],[124702,32062],[124547,32200],[125176,32174],[124726,32110]]]},"properties":{"cp":[121.397516,31.626946],"name":"崇明县","childNum":5}}],"UTF8Encoding":true} -------------------------------------------------------------------------------- /test/data/map/data-tianjin.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"id":"120101","geometry":{"type":"Polygon","coordinates":["@@F@DMFIJGQG@COEQM@@OASBBhB`R@DA@CD@DCFCHBLD"],"encodeOffsets":[[120023,40073]]},"properties":{"cp":[117.195907,39.118327],"name":"和平区","childNum":1}},{"id":"120102","geometry":{"type":"Polygon","coordinates":["@@XFFIE@BGGA@KVBN_]CCCLg†MGE@CD@AGB@AEGMEACB@BA@BFWFACKA@DA@@DA@C@CCCDGIAKMBWLGFERWT]bADCNE@DDIDEFBHTHBD@DLMPJj@ARX@"],"encodeOffsets":[[120075,40099]]},"properties":{"cp":[117.226568,39.122125],"name":"河东区","childNum":1}},{"id":"120103","geometry":{"type":"Polygon","coordinates":["@@PSXSFQHEXK‚E@CMIFUQA@DC@CCA@CDE@CEE@FOc@@D{@ch]IIHAFE`AZTAPB@@RNPF@DPF"],"encodeOffsets":[[120036,40057]]},"properties":{"cp":[117.217536,39.101897],"name":"河西区","childNum":1}},{"id":"120104","geometry":{"type":"Polygon","coordinates":["@@@CAUC@@DCBQ@A_AqBOFaDEHEcKG@ED]ZY`ELEdkhHDRNCB@FD@BAFDDHD@JIDANFDECCZCBA\\B@Hd@JB"],"encodeOffsets":[[120008,40087]]},"properties":{"cp":[117.164143,39.120474],"name":"南开区","childNum":1}},{"id":"120105","geometry":{"type":"Polygon","coordinates":["@@FBBAJBFDJK\\NFEFBLKBBBATP`]QOLB@AHBBEJ@DDDE@QW@BQi@OIKN@CACQECG@CFCJCCCMCGAEDCFBT@DSTQN@BFDBDCJBJAHKAIFDDXDAB"],"encodeOffsets":[[119993,40130]]},"properties":{"cp":[117.201569,39.156632],"name":"河北区","childNum":1}},{"id":"120106","geometry":{"type":"Polygon","coordinates":["@@JELBBGAIDIACEC@ARMTSKAc@@G[AABYDDDCFMECBIJC@CPHZ@LHNDDPJBCDAZBFEJE"],"encodeOffsets":[[119980,40125]]},"properties":{"cp":[117.163301,39.175066],"name":"红桥区","childNum":1}},{"id":"120110","geometry":{"type":"Polygon","coordinates":["@@JCFE@CEG@GTCPHBF`@JFBCHJJKRCP@JGTIAQGIDAPAVH@GCEKEEBAAVEBDADPFBBCFBBHE@WHClQPCFBTARECK@QOCEAEK@KAAKAKEoRECIYK{\\Af@BMb@@WAGBC@GV@KYBUkB@@OD@AEUE@IQDAGSJEDFD@CIDAAKDE@KECOKGEE@MXMRCBGAOEMBGFADDN@FCHCBGAIGUKUEcB]JULINIZGD[AU@QDMDGFQR_NODiBcDBLHJDCDDF@@CB@@CLBBDXEAEB@@ADAFBHNBFA@BHC@@DHF…NKhDD^DM`UA@LHBAHF@EJWE@RCFCCI@AFGA@BKARP_^ZXZL\\JfHNHEdEAAFBBQCAFPHRGtMBEB@NB^Cb@lECFNFJB@D"],"encodeOffsets":[[120221,40183]]},"properties":{"cp":[117.313967,39.087764],"name":"东丽区","childNum":1}},{"id":"120111","geometry":{"type":"Polygon","coordinates":["@@CGECABC@@EDAQMGClgD]DM^c^YHCF@‚VrwJBBINBHAFAHBFCXFDGCCA@AC@AACBAAEFKA@KDCCJCJDFGF@DCBGDQJERFHGMCLEAAGAFGMMAWE@BHQLKIBAJECCCAAGQW[DAAjS@AIYXKGGƒT@NBFEBABOJBDMFADGG@BGH@@AACFKGCG@FMWMDABCBAACLCIGCAE@[P¥\\]N¯˜MNORU^Ž]XKF`_XIIAIkDDZF@@FMDJLmTSDaHgDBJE@@DOBDH[HFJCBCGCBIMKH[L@AAAADUBACECGHWKCHTHBHaJDLF@JNF@FNLAH\\FABPD@EF@@HELCHVF@GXBB@DJBI\\PB@BN@BHK@GBAJ\\F@AACLABBAB@DFHB@FFJCDL@BA@@DF@JEBKHB@CjHBENDH@HSFBDKEAFG\\H@DE@AF@HHBANH@BQ@CBGNFT@`LFABIN@ALDBCFRHFB`D`ANANCG[DK"],"encodeOffsets":[[119940,40092]]},"properties":{"cp":[117.012247,39.139446],"name":"西青区","childNum":1}},{"id":"120112","geometry":{"type":"Polygon","coordinates":["@@ZAZEVKXSPGVEnDHCJYJMVKNEPCdAZHRJJHHBDADG@ECMBCDCLCF@THHANQPWD@DBXRJ@HAJERSJAJBDCEOCAKYBQCA@GBCDSGAGBIHSNA@KCQMCF]IN‡aCuOSGU{zm_yENH@HDELBD@BG@AHH@CHEBCNIAAPABEFMAS@„HHWLJZ@BiTBB\\CRXBHDBDDIFABLJRKAGF@BXNNEHHBBBKFNDGHQEIFCRAHCDE@EHICIDDDLCB@ELBFABBD@BBDB@DDCHWEEDGAEBGBMAAJIAMP|@@Cd@EPF@DFF@DCB@DDD@@CRBEVNJ"],"encodeOffsets":[[120108,40016]]},"properties":{"cp":[117.382549,38.989577],"name":"津南区","childNum":1}},{"id":"120113","geometry":{"type":"Polygon","coordinates":["@@[MILECKA@BA@CABAWCCCIFEFYACBADICIIGM@KMDgDO@UCWIDECABKM@AJEB_KS@MEAH@DARG@BMGA@GBEF@@C[GEHFBCLEAGTG@MCAFgGA@@DGAALIFE@@CB@@ACKIDIGQJ@DHD@@GAANDPbB@BDEJ@BBAFBNBHDBCDBDHBEJFBBDCFANA@AFTFFARPBNLABARA@DD@BB@HFA@PXBBLDACRKEAJF@GPD@AN@BjHCGZFJUN@BA^F@FIAAFNDCF@B\\LONADtJTAFBDCPBDGPETBADNDFFDFCD@LHBBKJFALIA@DB@@BNFBGHBBEN@@DHD@FFBDAH@AHBBCLDBF@@HFBBGJ@BBAFfLLABCH@ADLFJENAHKLAFBDEH@AHBDJB@DD@AADEFCLBNCDMDER@BKGA@ADEZDBELHPQFFJICABACCDAKGJGLHRMVMMERKHH`WBFFCRFJHHIBOK_MC@QLCDIBAMA@COCGCDEkFa@]DMAA@AFsNQHOGBERDAABEFBFcMGeG[IQGGCmgABAAKLEAEF"],"encodeOffsets":[[120024,40134]]},"properties":{"cp":[117.13482,39.225555],"name":"北辰区","childNum":1}},{"id":"120114","geometry":{"type":"Polygon","coordinates":["@@FFABBRCHBFEDDNAHA@@`@@CHG@AT`D@AH@@PBBCJDBFABGB@@BBAB@BIFBBDJ@@FE@DHKD@JA@@FGCA@ADE@AZFDM\\JBCZCRKA@FGA@JHB@FBBXFBCFB@BB@CRJ@DJ@HCTF@ADB@AHEAIFKACH@CA@CLA@FBAFB@@DH@CFE@ADIEKA@FAABIB@BCG@@CC@BAOMCJGG[C@BABG\\AAAD@FL@@DJBADHB@BA@ABOCCDC@@BC@ADB@ADA@AFL@@A\\D@FFBBEB@CLB@ELB@@BAB@DBB@DEA@DD@AFCACDBHJDALF@AFFBBCPB@DB@ABBBBBD@@DDBFB@DHBCHDBLEJNMF@DKCIFCFQCBAA@@AEBAA@@EA@DOICDGD@BB@ALDA@BYLKA@BBGGA@AMHEABCC@GNLE@NC@@DAAAFEAAJKBBBF@CB@BF@AFH@@BN@ADZF@DD@@DF@DCFBEBF@@JB@EDCPA@@FI@@BF@@DDCCTH@C@TD@BB@G^FAGPECBGG@@BQAGDALG@AJA@AHC@ABC@@FEAAHB@@DB@BDF@AHHFA@DBABD@D@CBBBCBXH@DB@AFH@EHCACFCBCFA@CFDACL@BB@AFB@BCDBBA@BBBBCFBADE@B@@BCBBBD@ABE@ABAA@BLD@BHDBEGA@AD@CABEL@CJHBEHDBEJBBPDFCBEJDDBH@@FADHBMNIHFDEFFD@AJFADBBBAF@D@AHDBRDBD@RCBBJV@@BD@BDPBFEBBCDTHL@DAHBBCDBABTDCJJBGJNBAND@ADFBHE@DED@H@@@F`@BCBBBCB@DFZ@DMA@CFA@GMCADGAGBCNMAAIA@KXGCODOJMD@LJJC@C@KC@BCFAFDRDBAD@CD^F@DF@BFFA@FJB@DbEPEbElMTIZGAAFA@CJ@BE@@@FHA@EJA@CHBADBGPA@BG@AFBBVGHFL@BBABD@DKEC^QZS^QwVMAAB@CCI@@CB@H@JCBCFEDBCFF@D@H@FALIXMBIECM@ADE@OABEPA@CBCD@HEDIGEC@AC@KJ@DCH@@DFADEDAFBFALGBMFABKGAAA@CAALEJOFAFIFEB@JKDEJBDCICFI@IFOBCNECABGBQBCFCAAMKIHED@EKG@JDFOH@EIEDEFOC@BCEACAACAEI@AAHUXC@GD@AMDED@BEF@BBHAKADID@BGCIBEEEKGAFYCCF@BHBALQ@CFCNMDKAEDCFBBA@A@@CIAACBGG@CFEAKBGLMBIFKEBCG@ADKBeKBEAAI@AHEA@GE@CADKAABGG@CBEA@EGC@CM@AFGAAHME@AA@@CJBBKIEALGA@KDCCEEEMCBCSAOFCHOACDEASBsIBCPM[K@ADEMCBEJB@E]EABM@IVYEDHiIBMC@HOE@BILFDQCBAKWA@OEB@GAAC@@CQBABKBAMQOEBSEBEB@BMDEACEAFIGAACDCCAAGAMBEAAI@CF@AaACO@EBGHB@@GC@CRICE@CBAAAKBBD@B[EBIHAL@AGM@@AOAJ[IA@CAAHWM@AHJ@G^G@AF@DA@@FEBBFcJqAEDEC"],"encodeOffsets":[[119669,40094]]},"properties":{"cp":[117.057959,39.376925],"name":"武清区","childNum":1}},{"id":"120115","geometry":{"type":"Polygon","coordinates":["@@DAD@JCFDJGHBRMCCBGHBBCFBDCFB@EFGD@@BF@@DPALEDCECDEDABED@HCHJH@FDDEFDHENCLBDDDA@ERABEN@JEDDBACEJ@AINMRBJGAIDCZEHCNAFRTJHAHJHFD@@AEKBAFBRJGF@BPAFBHEDBFHBAFO@@NFH@BEFGHAD@BFBBJID@BFDBDEB@J@AGDCL@FBNIBBFJD@HKDCNDF@DAFGFCdE@A@AICBCJC@C@AGAEFC@@MIBAABC@CKA@CBANACAGC@ARBJG@GLGHCX@LENBNE@EDAFBHHD@DCDIIMLCBGN@@AIEBANEGKLEJDDAAGIKHKCIBECIECSF@GBKGCIDC@FKAAGCBOC@OB@MKGC@CHCAAEFUB@HDLPJDBCAIFGDAPDJGBC@EIKDGFAPDNHFF@LBBL@JARQZIDCBCAEIGK@IDEFGE@EHIFAFAP@FAFEBECCOFCBGABCKCBSEEK@ADIGO@AEMCEBBDqNAA@CHYMKiIAW@@CA@GA@DIMA@CGAAD_EEH@FIA@HIAAHUEDOHAFIOSKGSEcDAEI@@CBCOEC@CDCFEBKEFIMEGEA@@BGAAERFBDQCABADQDCCAHMJBDEMEADGAUCCC@CDA@CCCICGO@BDJG@CADGK@CCGFICCBKEEDGBCAAEKDAABGFE@ACABCAAeA@HM@GBYD@BE@@NABGB@CCAW@@ACAEF_BYECII@CGGBAAE@AFC@CFBNC@@HWDGVBBJ@BFBDDBFBADD@EPCFJF@FPGCE@ILH@FFCJGNLBBEDADARAHDBMFADEP@JEJJDCDIACFILA@EFEJEBIPKFBB@DBBHBALEBANKHEBEACBCFEB@CG@CDI@@LBDD@HFCJGFC@AD@DOBAFPBF@BCN@FDAJWNKJEBG@C@E@DECAEFADIDG@ADJ@DDA@BBUNx]RYT]RFDCLJBADDBGDBDHBFJJ@TBBHB@@DH@AFKBCB@HE@@BEA@D@@ADBHC@@AA@@DCB@DB@@FJ@@FD@@HH@E\\F@ADB@ARBBBFED@BD@@BCA@HD@AJE@@ACAAHDB@BH@AHCB@EAAADGB@BE@BBK@FLEBDDADA@BDNB@DJCBBIR@DBBDBFALDX@DHL@DJFA@BH@HHKJAB@DC@GFOHED@BCBAZE@ADE@AFGACEEDA@@AGAAVJ@IVB@@DB@@DHGJB@JpFBCFBEPPBBCNFBGHBPC@EHBFFRDjG"],"encodeOffsets":[[120072,40786]]},"properties":{"cp":[117.308094,39.716965],"name":"宝坻区","childNum":1}},{"id":"120116","geometry":{"type":"Polygon","coordinates":["@@BCDDF@@DRC@BJBRANAP@BCFAJ@@B@BTC@DB@JEAAB@DBB@CCB@@CC@JSF@BADAAADCHBH@HECEB@BCHBDBBCFDBAACBAD@BBPGJF@@ABDB@BD@ABBDDAFCBC@CB@CCAKNECG@EF@@EzQBiAC@Ey@BUI@±]GaQaý¥Y_YeK]EaDqPmHcD{DK˜QBMMaKEUC_BOASY_YAYD—XSIaaÓLYASKWcgKEwDaDqLX³OqIGFG@EBEACIGCFK]EE@@DFD@B@BG@BHCFC@@EEAIHEACBC@BFCBQCaDFKACEBECADE@SSKMIKHQKHEJ@[UGCoO@d[CFSMIAIE@AH[A@DOA@AQKOEEBARGNI@G@BSgE@AOACJSKMVC@IXF@hJAFmKCHB@PVVFAHHB@JC@CH@BABD@ABMFC@@BSB@BAAAHG@JL@BBBWABHHB@N@BKBOAEEESMA@EA@@CCE@FC@AEQ@@GCAA@AJC@BEK@AAABSGA@@FEA@BCBC@@EC@@DK@LHBD@HCDBFCBABB@F@@FB@@DFJ@HB@BLADK@HBDBCBG@@DH@@F@DCJIB@JK@AJFBCLBHH@DCBJFF@PATBHB@ABDTbB@DaCAAE@@CAACAOF@HADE@@BICAFBHEBhTBPDBJCFCªvEFeVTROJVT`O„€FH®_\\OF@DBJHKDBDABADCB¶ˆn`|yHVPTŽvbDMˆ^JDERNLDB@TMJGHAHBCTAD@HDBARLZDBFPCDIAGBUVOFGB@LCFBLCBDJC@CEIFHTCBJRF@FXPC@@lAAVLZU@@HADBH@Xa@ANe@[BL|J\\FBpQLFLBBB@LFLFBPD@RDLpMpGBPNREHE@@dVF@BJB@BD@@DFDLBDGHGDA^c\\@@cFDŠ@@jEBJZFLhrePFBEJGAENE@IVC@@RBLV@DPT@zJLHPFVDNECC@SACjQJBJCACIDMQhQD@tŽCD]LBHDBH@GLHNB@DQHBAFDHE@@DEBDFFAD@@BF@BBAB@BNFBEHCXDT@JGAGVEBE"],"encodeOffsets":[[120735,40262]]},"properties":{"cp":[117.654173,39.032846],"name":"滨海新区","childNum":1}},{"id":"120221","geometry":{"type":"Polygon","coordinates":["@@EKABEGACC@IMA@AOB@AAC@CIGAAEBAECCBDAAAAADAAEFCBDB@ACB@AAAABEBAD@AG@ADFAEB@A@GKSCCgG@AEJA@AFO@ECCQEEEOBGYG@B—qGBKXBFKCYJKOIKNEASCeA_ECSBGFENEF@HDZ@FCBE`TEFB@EFHFFEECBCFDFADBDEUWCOGBAIECLG@CEIFA@CF@CGBEGACRA@GMHKG@CAAG^KDCsC@gRNRJCBDIDIAiRBD@TDDMFUCOEKGyIS@COU@AK@QD@JUF@FMHBFIEAfOgqEKIYFA@i‰@EC@d[@]dCBGHCHKAEC@CC@@AIA@AUE@cF@FGMQAOoHeL[HSBEASDgRGD@XGFAADEAAOEBCACUFBBFALFDF@HUGOBCBHJBRSJIHO@QDILGIADIE_@AEOGSD@HFH@FEDIDELKD@RNDL`APGJIGQEEDAE_XGGQLNFUNQNKGIHLHCBDDABDBIJEEORFFAFDJAHC@CJLBDHJ@DJZF`AFEDB@BX@DB@DHABA@MF@@AZCHAN@@GfBBBADDB@BEFAHBBLCBFDBHAFCLFDAJDHEDDL@CHDBH@CI@AHPJDDD@DCB@DDDVDHBBCNFCFIAGNDBCDCRABDBCREAQ‚BFHB@AB@HFNFEJLFFADEDCD@PFAD@DJ@BFdCTFLHPTEJGBCPVFBGJB@GJB@EFG`FBCHB@DNBCJB@@HDB@@BXjJNLGZ@DBBrMACFANDBFP@JHBCL@FFATLDADHBDAPEAC@EBIFIJGNJJ@JBJJHJHFSZA@BND@@LVB@BJ@AFDBBDEDILjTABlEHHTBvWVAPDHCDFL@LHHB`MFANDjQ`G"],"encodeOffsets":[[120765,40524]]},"properties":{"cp":[117.82828,39.328886],"name":"宁河县","childNum":1}},{"id":"120223","geometry":{"type":"Polygon","coordinates":["@@bIAGSGDGXLHGFDBDVABCBB@B\\KLGJNDADHDAEI\\GCGPA@CF@AIhCbGTCnSIKNC@EE@CYlCBJJJ`W~W\\M^W€V]^_°—VIEGƒ_PUSPISQfUFE©uEDIDCAAOgSFAAGBEJD@AF@BC@GPEDBBB@DF@BBbD@CaACSBAA@AGBS@OEEAICDG@AGDKEABIL@@IJADI@C@EG@@CH@DACAGAL@@OA@@GEI@CA@@EE@A@BADAAEDC@GACOKB@BMEB@ESEAABECAWBAECBBCC@CIBCS@@IWDAHC@@FCA@DHB@JS@@DA@@H]BCTKfG@BHK@@FEAADJD@RJhNNI@@FQBBDCBQA@BBLMIBNFJADHHEBuK@IA@AKU@UDDH—KI@HAGAAC]@CDCA@MSAHPGBOEMEIA@EC@@DA@OB@ASB@BCB@TE@@BBBBDAHCBDFABFNGBBFKBBFC@BDB@FPC@BPCPMACEoBE@AAC@@DcB_D@ECB@A@BA@B@@DC@@CA@@IE@AAG@BDK@EBABQA@JE@@HC@ABA@@BB@ADOA@DIAACA@NxQB@FIBHXHABFKBFLIDLPDTF@DNC@CAGB@FA@BJDXmBAœ[@@ˆD@@NL@BHB@H\\BTD@HRB@JF@FL@FHDNDABJDCDTD@DTA@@LF@BB@XGBADE@@B@B@DJXJ@XEDFHAFHCBBDBDJBBHTCAIGBAAGBEA@EC@BCB@@BBAC@@AB@@CD@@DB@@DJ@DDF@DAF@@CLABBF@@AB@BBJ@@IBBDBB@ACJBJDR@@HD@@GfBAFXBCLH@GTPFHA"],"encodeOffsets":[[119687,40010]]},"properties":{"cp":[116.925304,38.935671],"name":"静海县","childNum":1}},{"id":"120225","geometry":{"type":"Polygon","coordinates":["@@@AECDAACDA@AACDE@CF@JMJEHB@BPBJKBEBED@@DB@DC@CFBBAD@@GDCCAFGD@BABBBADBDBDGAEJCBCCE@C^GACDCDBAE@BA@BAC@BABMF@EAFC@@C@@AH@AAD@C@DACA@AMEAC@GECJID@@BBABA@BDB@AB@@BBB@DBBDBFADBBHD@BGD@@ABGD@@EF@CCBAA@@GF@BL@@@EFABB@@B@ACJADHEBF@ABBJDBH@BBFCHAD@BDB@DIBIBCDBCDFB@ED@@AH@AAFCH@JBFEXBBB@DB@H@DADA@ABADGI@BID@DET@BGD@BCD@BBBCACAIMGICGCKB@FA@@EAB@BCA@DAA@MB@AEAEEEBG@SZOBDAJHHFCDBBABFD@@MB@ARZ@@GB@@IDFFAFABAAEDAHA@CE@@CCAFCAEDA@EA@@@CCCA@CCA@CCEAGBAAEACDCKK@CGFKBA@CAKHIICEGBEFOHE@ICKBAFEF@DI@OJIBIAABI@@DA@@CKCEGG@OIMAIBACIAC@EBCAQ@ABCAACCAEAQDE@EDE@EFB@A@ABBDB@BC@DDB@HEAGDGFCB@DCDADI@@BE@@BABC@EAA@@AAACBGAAB@BI@EADCE@ECGDBFEDCAIBE@ABE@CICDCACFEA@ABABIFCDCBEB@DABIQMAIA@@GC@AKB@@ACCCCGDEKGDCEEBGKBM\\IGIB@AGCBCC@BABCEAFE@@AOADAAEF@@BF@FHAEBA@KBA@ECBBBCBACEB@CC@ACFAFSL@BBDEDiRUC@@ADAFEBGHBNQBHFCCEDGIABICCADE@ADAAC@@AD@@CF@@EB@@MBBD@@AB@@BD@FBRWFQ@ENAACC@ICK@@EBGACACIGCILC@CFAIOG@CCEBCCK@CDBHI@A@CFCAAEC@IJAAAEG@CBEHAFG@ME@@EPABEGCAGFEAOB@AHEQIEAABFL@BC@GEGIGBSIEQMBGDWDEFBJIHE@IAOLBLI@DFABCCIFM@AFQB@FCBCCKAMDGFECCFECG@GIGDC@AFCBCFFDCDKFOB@CE@@AC@EH@FEACDEAADGAAHDDQNGAGFC@CAIDC@CBCFE@ADHDCDDD@DH@BDOVAFGFO@AAAGA@KBCGA@OHE@IAAHG@ODEAE@MLA@CEE@ADBFEDCA@CAAM@CDPJ@DGDA@@ECCE@CHIDGEA@@FDFBHFHSNAFBDDBNFBD@FEBO@E@EPKB@DNBNDCDCJ@DHFD@FCFDADEHEDE@CDBDHEFFJFLBDFAF@HAB@BGDBBJED@F@B@DGD@FLBHCBBBALTD@BD@@DB@@JF@AFHB@DB@@PCHB@@HBDABCABDEJBJCDE@AD@NAD@DBRABDBEHEDBDCHDHDADABBFA@FBFTCBAF@FDDCFBJAHD@BEF@BIFCLGFDDHBCBBB@BED@LN@LCBDADHDBHNHDHHDHAHHHA@AD@@CJBNCDEBCHAFFAJFBBFD@DFDBH@FCD@DAB@@FLHDFBFBB@JJDDBBAHAJFFGD@DA@ENBDBJAJDFJD@BCBDBHK@@BDBDDA@G@DDJHBBD@BBEH@FIJ@DCB@DF@H@B@FCBB@BA@@BDB@DDAAADAC@ACF@@DBA@ABB@BDBBBF@D@FEDABBCHDCDBBAP@BBEDJDJHHA@DDBBBEBEFC@CDIG@BCBCAACG@@DA@BFBB@BA@E@AD@BAB@FFFBCAAJDFAFBKHC@AAC@AD@DE@BJCDBBA@F@DDL@LBAD@DABCDFDDF@BFBJA@EDABDDBB@AADBFHDABBAHCFFJD@DBDAF@D@DCD@HDBBFDBDLADBBAF@NGJ@FCDCLABEDBJ@DCBIHABAD@NCD@JGFBN@NDF@BAJBJ@DBF@NDD@@EB@DCD@BDTALGC@D@ACDCBCEIEAACAECCDAF@JGBAAIFC"],"encodeOffsets":[[120398,41158]]},"properties":{"cp":[117.407449,40.045342],"name":"蓟县","childNum":1}}],"UTF8Encoding":true} -------------------------------------------------------------------------------- /test/geoLine6.html: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 53 |
54 |
55 | 56 | 197 | 198 | 199 | -------------------------------------------------------------------------------- /test/heatmap.html: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 36 |
37 | 108 | 109 | -------------------------------------------------------------------------------- /test/lib/caseFrame.css: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | .case-frame { 22 | position: static; 23 | padding: 0; 24 | margin: 0; 25 | } 26 | .case-frame .cases-list { 27 | padding-top: 15px; 28 | position: absolute; 29 | left: 0; 30 | top: 0; 31 | bottom: 0; 32 | width: 230px; 33 | overflow: auto; 34 | font-size: 13px; 35 | } 36 | .case-frame .cases-list ul { 37 | padding-left: 32px; 38 | margin-top: 130px; 39 | list-style-type: decimal; 40 | } 41 | .case-frame .info-panel { 42 | position: fixed; 43 | padding: 10px 20px; 44 | top: 0; 45 | left: 0; 46 | width: 195px; 47 | background: #fff; 48 | border-bottom: 1px solid #ccc; 49 | } 50 | .case-frame .info-panel .current { 51 | height: 24px; 52 | line-height: 24px; 53 | white-space: nowrap; 54 | text-decoration: underline; 55 | } 56 | .case-frame .info-panel .renderer-selector { 57 | height: 40px; 58 | line-height: 40px; 59 | } 60 | .case-frame .info-panel .dist-selector { 61 | } 62 | .case-frame .info-panel .list-filter { 63 | margin: 10px 0; 64 | } 65 | .case-frame .page-content { 66 | margin-left: 235px; 67 | height: 100%; 68 | padding: 0; 69 | position: relative; 70 | border-left: 1px solid #333; 71 | } 72 | .case-frame .page-content iframe { 73 | padding: 0; 74 | margin: 0; 75 | border-width: 0; 76 | overflow: visible; 77 | visibility: visible; 78 | position: absolute; 79 | left: 0; 80 | top: 0; 81 | width: 100%; 82 | height: 100%; 83 | } -------------------------------------------------------------------------------- /test/lib/caseFrame.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | /** 22 | * Dependencies: testHelper.js, jquery, caseFrame.css 23 | */ 24 | (function () { 25 | 26 | var testHelper = window.testHelper; 27 | var encodeHTML = testHelper.encodeHTML; 28 | 29 | var CSS_BASE = '.case-frame'; 30 | var SELECTOR_CASES_LIST_CONTAINER = CSS_BASE + ' .cases-list ul'; 31 | var SELECTOR_CASES_ITEM = 'li a'; 32 | var SELECTOR_CONTENT_IFRAME = CSS_BASE + ' .page-content iframe'; 33 | var SELECTOR_RENDERER = CSS_BASE + ' .renderer-selector input'; 34 | var SELECTOR_LISTER_FILTER = CSS_BASE + ' .list-filter'; 35 | var SELECTOR_CURRENT = CSS_BASE + ' .info-panel .current'; 36 | var SELECTOR_DIST = CSS_BASE + ' .dist-selector'; 37 | 38 | var HTML = [ 39 | '
', 40 | '
', 41 | ' ', 42 | '
', 43 | ' CANVAS ', 44 | ' SVG ', 45 | '
', 46 | '
', 47 | ' ', 54 | '
', 55 | ' ', 56 | '
', 57 | '
', 58 | ' ', 61 | '
', 62 | ].join(''); 63 | 64 | var globalOpt; 65 | var pagePaths; 66 | var baseURL; 67 | var listFilters; 68 | 69 | /** 70 | * @public 71 | */ 72 | var caseFrame = window.caseFrame = {}; 73 | 74 | /** 75 | * @public 76 | * @param {Object} opt 77 | * @param {HTMLElement} opt.dom 78 | * @param {Array.} opt.pagePaths Relative paths. 79 | * @param {string} [opt.baseURL='.'] 80 | * @param {string} [opt.disableRendererSelector] 81 | * @param {string} [opt.disableDistSelector] 82 | * @param {Array.', 154 | '' 155 | ]; 156 | for (var i = 0; i < listFilters.length; i++) { 157 | var name = encodeHTML(listFilters[i].name); 158 | html.push(''); 159 | } 160 | html.push(''); 161 | 162 | var filterContainer = $(SELECTOR_LISTER_FILTER); 163 | 164 | filterContainer[0].innerHTML = 'FILTER:  ' + html.join(''); 165 | 166 | var filterSelector = filterContainer.find('select'); 167 | 168 | filterSelector.off('change').on('change', function (e) { 169 | var selector = e.target; 170 | setState('listFilterName', selector.options[selector.selectedIndex].value); 171 | }); 172 | 173 | var currentFilterName = getState('listFilterName'); 174 | var options = filterSelector[0].options; 175 | for (var i = 0; i < options.length; i++) { 176 | if (options[i].value === currentFilterName) { 177 | filterSelector[0].selectedIndex = i; 178 | } 179 | } 180 | } 181 | 182 | // prop: renderer, dist, pagePath 183 | function getState(prop) { 184 | return stateGetters[prop](getCurrentPageURL()); 185 | } 186 | 187 | var stateGetters = { 188 | // 'canvas', 'svg' 189 | renderer: function (pageURL) { 190 | var matchResult = (pageURL || '').match(/[?&]__RENDERER__=(canvas|svg)(&|$)/); 191 | return matchResult && matchResult[1] || 'canvas'; 192 | }, 193 | // 'dist', 'webpack', 'webpackold' 194 | dist: function (pageURL) { 195 | var matchResult = (pageURL || '').match(/[?&]__ECDIST__=(webpack-req-ec|webpack-req-eclibec|webpackold-req-ec|webpackold-req-eclibec)(&|$)/); 196 | return matchResult && matchResult[1] || 'dist'; 197 | }, 198 | listFilterName: function (pageURL) { 199 | var matchResult = (pageURL || '').match(/[?&]__FILTER__=([a-zA-Z0-9_-]*)(&|$)/); 200 | return matchResult && matchResult[1] || null; 201 | }, 202 | // {index, pagePath} or null 203 | pagePathInfo: getStatePagePathInfo, 204 | pagePath: function (pageURL) { 205 | return getStatePagePathInfo(pageURL).pagePath; 206 | } 207 | }; 208 | 209 | function getStatePagePathInfo(pageURL) { 210 | var matchResult = (pageURL || '').match(/^[^?&]*/); 211 | var pagePath = matchResult && matchResult[0]; 212 | var index; 213 | if (pagePath) { 214 | for (var i = 0; i < pagePaths.length; i++) { 215 | if (pagePaths[i] === pagePath) { 216 | index = i; 217 | } 218 | } 219 | } 220 | return {index: index, pagePath: pagePath}; 221 | } 222 | 223 | function setState(prop, value) { 224 | var curr = { 225 | renderer: getState('renderer'), 226 | dist: getState('dist'), 227 | pagePath: getState('pagePath'), 228 | listFilterName: getState('listFilterName') 229 | }; 230 | curr[prop] = value; 231 | 232 | var newPageURL = makePageURL(curr); 233 | 234 | location.hash = '#' + encodeURIComponent(newPageURL); 235 | } 236 | 237 | function makePageURL(curr) { 238 | return curr.pagePath + '?' + [ 239 | '__RENDERER__=' + curr.renderer, 240 | '__ECDIST__=' + curr.dist, 241 | '__FILTER__=' + curr.listFilterName 242 | ].join('&'); 243 | } 244 | 245 | function updateView() { 246 | updateRendererSelector(); 247 | updateDistSelector(); 248 | updateListSelectedHint(); 249 | updateListFilter(); 250 | updateList(); 251 | updatePage(); 252 | updatePageHint('short'); 253 | } 254 | 255 | function getCurrentPageURL() { 256 | return decodeURIComponent( 257 | (location.hash || '').replace(/^#/, '') 258 | ); 259 | } 260 | 261 | function updateList() { 262 | var html = []; 263 | 264 | var filter; 265 | var listFilterName = getState('listFilterName'); 266 | if (listFilters && listFilterName) { 267 | for (var i = 0; i < listFilters.length; i++) { 268 | if (listFilters[i].name === listFilterName) { 269 | filter = listFilters[i]; 270 | break; 271 | } 272 | } 273 | } 274 | 275 | for (var i = 0; i < pagePaths.length; i++) { 276 | var path = pagePaths[i]; 277 | 278 | var whiteList = filter && filter.whiteList; 279 | if (whiteList) { 280 | var j = 0; 281 | for (; j < whiteList.length; j++) { 282 | if (path === whiteList[j]) { 283 | break; 284 | } 285 | } 286 | if (j >= whiteList.length) { 287 | continue; 288 | } 289 | } 290 | 291 | html.push('
  • ' + encodeHTML(path) + '
  • '); 292 | } 293 | 294 | var caseListContainer = $(SELECTOR_CASES_LIST_CONTAINER); 295 | 296 | caseListContainer[0].innerHTML = html.join(''); 297 | 298 | caseListContainer.off('click').on('click', SELECTOR_CASES_ITEM, function (e) { 299 | setState('pagePath', e.currentTarget.innerHTML); 300 | return false; 301 | }); 302 | } 303 | 304 | function updatePage() { 305 | var pageURL = getCurrentPageURL(); 306 | var pagePathInfo = getState('pagePathInfo'); 307 | 308 | $(SELECTOR_CASES_LIST_CONTAINER + ' li').each(function (index, el) { 309 | el.style.background = pagePathInfo.index === index ? 'rgb(170, 224, 245)' : 'none'; 310 | }); 311 | 312 | var src = pagePathInfo.pagePath ? baseURL + '/' + pageURL : 'about:blank'; 313 | var contentIframe = $(SELECTOR_CONTENT_IFRAME); 314 | contentIframe.attr('src', src); 315 | } 316 | 317 | // type: 'full' or 'short' 318 | function updatePageHint(type) { 319 | var pagePathInfo = getState('pagePathInfo'); 320 | 321 | var newValue = !pagePathInfo.pagePath 322 | ? '' 323 | : type === 'short' 324 | ? (pagePathInfo.index != null ? (pagePathInfo.index + 1) + '. ' : '') 325 | + (pagePathInfo.pagePath || '') 326 | : testHelper.dir() + '/' + pagePathInfo.pagePath; 327 | 328 | $(SELECTOR_CURRENT).val(newValue); 329 | } 330 | 331 | })(); -------------------------------------------------------------------------------- /test/lib/config.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | (function () { 22 | 23 | var baseUrl = window.AMD_BASE_URL || '../'; 24 | var sourceMap = window.AMD_ENABLE_SOURCE_MAP; 25 | // `true` by default for debugging. 26 | sourceMap == null && (sourceMap = true); 27 | 28 | // Set default renderer in dev mode from hash. 29 | var matchResult = location.href.match(/[?&]__RENDERER__=(canvas|svg)(&|$)/); 30 | if (matchResult) { 31 | window.__ECHARTS__DEFAULT__RENDERER__ = matchResult[1]; 32 | } 33 | 34 | // Set echarts source code. 35 | var matchResult = location.href.match(/[?&]__ECDIST__=(webpack-req-ec|webpack-req-eclibec|webpackold-req-ec|webpackold-req-eclibec)(&|$)/); 36 | var ecDistPath = 'dist/echarts'; 37 | if (matchResult) { 38 | ecDistPath = ({ 39 | 'webpack-req-ec': '../echarts-boilerplate/echarts-webpack/dist/webpack-req-ec', 40 | 'webpack-req-eclibec': '../echarts-boilerplate/echarts-webpack/dist/webpack-req-eclibec', 41 | 'webpackold-req-ec': '../echarts-boilerplate/echarts-webpackold/dist/webpackold-req-ec', 42 | 'webpackold-req-eclibec': '../echarts-boilerplate/echarts-webpackold/dist/webpackold-req-eclibec', 43 | })[matchResult[1]]; 44 | } 45 | 46 | if (typeof require !== 'undefined') { 47 | require.config({ 48 | baseUrl: baseUrl, 49 | paths: { 50 | 'echarts': ecDistPath, 51 | 'zrender': 'node_modules/zrender/dist/zrender', 52 | 'geoJson': '../geoData/geoJson', 53 | 'theme': 'theme', 54 | 'data': 'test/data', 55 | 'map': 'map', 56 | 'extension': 'dist/extension' 57 | } 58 | // urlArgs will prevent break point on init in debug tool. 59 | // urlArgs: '_v_=' + (+new Date()) 60 | }); 61 | } 62 | 63 | if (typeof requireES !== 'undefined') { 64 | requireES.config({ 65 | baseUrl: baseUrl, 66 | paths: { 67 | 'echarts': './', 68 | 'zrender': 'node_modules/zrender', 69 | 'geoJson': 'geoData/geoJson', 70 | 'theme': 'theme', 71 | 'data': 'test/data', 72 | 'map': 'map', 73 | 'extension': 'extension' 74 | }, 75 | // urlArgs: '_v_=' + (+new Date()), 76 | sourceMap: sourceMap 77 | }); 78 | } 79 | 80 | 81 | // Mount bundle version print. 82 | if (typeof require !== 'undefined') { 83 | var originalRequire = require; 84 | window.require = function (deps, cb) { 85 | var newCb = function () { 86 | if (deps && deps instanceof Array) { 87 | printBundleVersion(deps, [].slice.call(arguments)); 88 | } 89 | cb && cb.apply(this, arguments); 90 | }; 91 | return originalRequire.call(this, deps, newCb); 92 | }; 93 | } 94 | 95 | function printBundleVersion(bundleIds, bundles) { 96 | var content = []; 97 | for (var i = 0; i < bundleIds.length; i++) { 98 | var bundle = bundles[i]; 99 | var bundleVersion = bundle && bundle.bundleVersion; 100 | if (bundleVersion) { 101 | var date = new Date(+bundleVersion); 102 | // Check whether timestamp. 103 | if (!isNaN(+date)) { 104 | bundleVersion = '' 105 | + pad(date.getHours(), 2) + ':' 106 | + pad(date.getMinutes(), 2) + ':' 107 | + pad(date.getSeconds(), 2) + '.' + pad(date.getMilliseconds(), 3) 108 | + ''; 109 | } 110 | else { 111 | bundleVersion = encodeHTML(bundleVersion); 112 | } 113 | content.push(encodeHTML(bundleIds[i]) + '.js: ' + bundleVersion); 114 | } 115 | } 116 | 117 | var domId = 'ec-test-bundle-version'; 118 | var dom = document.getElementById(domId); 119 | if (!dom) { 120 | dom = document.createElement('div'); 121 | dom.setAttribute('id', domId); 122 | dom.style.cssText = [ 123 | 'background: rgb(52,56,64)', 124 | 'color: rgb(215,215,215)', 125 | 'position: fixed', 126 | 'right: 0', 127 | 'top: 0', 128 | 'font-size: 10px', 129 | 'padding: 1px 3px 1px 3px', 130 | 'border-bottom-left-radius: 3px' 131 | ].join(';'); 132 | document.body.appendChild(dom); 133 | } 134 | dom.innerHTML += content.join(''); 135 | } 136 | 137 | function pad(num, len) { 138 | return ('000000' + num).substr(-len, len); 139 | } 140 | 141 | function encodeHTML(source) { 142 | return String(source) 143 | .replace(/&/g, '&') 144 | .replace(//g, '>') 146 | .replace(/"/g, '"') 147 | .replace(/'/g, '''); 148 | } 149 | 150 | })(); -------------------------------------------------------------------------------- /test/lib/countup.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | countUp.js 4 | by @inorganik 5 | 6 | */ 7 | 8 | // target = id of html element or var of previously selected html element where counting occurs 9 | // startVal = the value you want to begin at 10 | // endVal = the value you want to arrive at 11 | // decimals = number of decimal places, default 0 12 | // duration = duration of animation in seconds, default 2 13 | // options = optional object of options (see below) 14 | 15 | var CountUp = function(target, startVal, endVal, decimals, duration, options) { 16 | 17 | var self = this; 18 | self.version = function () { return '1.9.3'; }; 19 | 20 | // default options 21 | self.options = { 22 | useEasing: true, // toggle easing 23 | useGrouping: true, // 1,000,000 vs 1000000 24 | separator: ',', // character to use as a separator 25 | decimal: '.', // character to use as a decimal 26 | easingFn: easeOutExpo, // optional custom easing function, default is Robert Penner's easeOutExpo 27 | formattingFn: formatNumber, // optional custom formatting function, default is formatNumber above 28 | prefix: '', // optional text before the result 29 | suffix: '', // optional text after the result 30 | numerals: [] // optionally pass an array of custom numerals for 0-9 31 | }; 32 | 33 | // extend default options with passed options object 34 | if (options && typeof options === 'object') { 35 | for (var key in self.options) { 36 | if (options.hasOwnProperty(key) && options[key] !== null) { 37 | self.options[key] = options[key]; 38 | } 39 | } 40 | } 41 | 42 | if (self.options.separator === '') { 43 | self.options.useGrouping = false; 44 | } 45 | else { 46 | // ensure the separator is a string (formatNumber assumes this) 47 | self.options.separator = '' + self.options.separator; 48 | } 49 | 50 | // make sure requestAnimationFrame and cancelAnimationFrame are defined 51 | // polyfill for browsers without native support 52 | // by Opera engineer Erik Möller 53 | var lastTime = 0; 54 | var vendors = ['webkit', 'moz', 'ms', 'o']; 55 | for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 56 | window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; 57 | window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; 58 | } 59 | if (!window.requestAnimationFrame) { 60 | window.requestAnimationFrame = function(callback, element) { 61 | var currTime = new Date().getTime(); 62 | var timeToCall = Math.max(0, 16 - (currTime - lastTime)); 63 | var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); 64 | lastTime = currTime + timeToCall; 65 | return id; 66 | }; 67 | } 68 | if (!window.cancelAnimationFrame) { 69 | window.cancelAnimationFrame = function(id) { 70 | clearTimeout(id); 71 | }; 72 | } 73 | 74 | function formatNumber(num) { 75 | var neg = (num < 0), 76 | x, x1, x2, x3, i, len; 77 | num = Math.abs(num).toFixed(self.decimals); 78 | num += ''; 79 | x = num.split('.'); 80 | x1 = x[0]; 81 | x2 = x.length > 1 ? self.options.decimal + x[1] : ''; 82 | if (self.options.useGrouping) { 83 | x3 = ''; 84 | for (i = 0, len = x1.length; i < len; ++i) { 85 | if (i !== 0 && ((i % 3) === 0)) { 86 | x3 = self.options.separator + x3; 87 | } 88 | x3 = x1[len - i - 1] + x3; 89 | } 90 | x1 = x3; 91 | } 92 | // optional numeral substitution 93 | if (self.options.numerals.length) { 94 | x1 = x1.replace(/[0-9]/g, function(w) { 95 | return self.options.numerals[+w]; 96 | }) 97 | x2 = x2.replace(/[0-9]/g, function(w) { 98 | return self.options.numerals[+w]; 99 | }) 100 | } 101 | return (neg ? '-' : '') + self.options.prefix + x1 + x2 + self.options.suffix; 102 | } 103 | // Robert Penner's easeOutExpo 104 | function easeOutExpo(t, b, c, d) { 105 | return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; 106 | } 107 | function ensureNumber(n) { 108 | return (typeof n === 'number' && !isNaN(n)); 109 | } 110 | 111 | self.initialize = function() { 112 | if (self.initialized) return true; 113 | 114 | self.error = ''; 115 | self.d = (typeof target === 'string') ? document.getElementById(target) : target; 116 | if (!self.d) { 117 | self.error = '[CountUp] target is null or undefined' 118 | return false; 119 | } 120 | self.startVal = Number(startVal); 121 | self.endVal = Number(endVal); 122 | // error checks 123 | if (ensureNumber(self.startVal) && ensureNumber(self.endVal)) { 124 | self.decimals = Math.max(0, decimals || 0); 125 | self.dec = Math.pow(10, self.decimals); 126 | self.duration = Number(duration) * 1000 || 2000; 127 | self.countDown = (self.startVal > self.endVal); 128 | self.frameVal = self.startVal; 129 | self.initialized = true; 130 | return true; 131 | } 132 | else { 133 | self.error = '[CountUp] startVal ('+startVal+') or endVal ('+endVal+') is not a number'; 134 | return false; 135 | } 136 | }; 137 | 138 | // Print value to target 139 | self.printValue = function(value) { 140 | var result = self.options.formattingFn(value); 141 | 142 | if (self.d.tagName === 'INPUT') { 143 | this.d.value = result; 144 | } 145 | else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') { 146 | this.d.textContent = result; 147 | } 148 | else { 149 | this.d.innerHTML = result; 150 | } 151 | }; 152 | 153 | self.count = function(timestamp) { 154 | 155 | if (!self.startTime) { self.startTime = timestamp; } 156 | 157 | self.timestamp = timestamp; 158 | var progress = timestamp - self.startTime; 159 | self.remaining = self.duration - progress; 160 | 161 | // to ease or not to ease 162 | if (self.options.useEasing) { 163 | if (self.countDown) { 164 | self.frameVal = self.startVal - self.options.easingFn(progress, 0, self.startVal - self.endVal, self.duration); 165 | } else { 166 | self.frameVal = self.options.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration); 167 | } 168 | } else { 169 | if (self.countDown) { 170 | self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration)); 171 | } else { 172 | self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration); 173 | } 174 | } 175 | 176 | // don't go past endVal since progress can exceed duration in the last frame 177 | if (self.countDown) { 178 | self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal; 179 | } else { 180 | self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal; 181 | } 182 | 183 | // decimal 184 | self.frameVal = Math.round(self.frameVal*self.dec)/self.dec; 185 | 186 | // format and print value 187 | self.printValue(self.frameVal); 188 | 189 | // whether to continue 190 | if (progress < self.duration) { 191 | self.rAF = requestAnimationFrame(self.count); 192 | } else { 193 | if (self.callback) self.callback(); 194 | } 195 | }; 196 | // start your animation 197 | self.start = function(callback) { 198 | if (!self.initialize()) return; 199 | self.callback = callback; 200 | self.rAF = requestAnimationFrame(self.count); 201 | }; 202 | // toggles pause/resume animation 203 | self.pauseResume = function() { 204 | if (!self.paused) { 205 | self.paused = true; 206 | cancelAnimationFrame(self.rAF); 207 | } else { 208 | self.paused = false; 209 | delete self.startTime; 210 | self.duration = self.remaining; 211 | self.startVal = self.frameVal; 212 | requestAnimationFrame(self.count); 213 | } 214 | }; 215 | // reset to startVal so animation can be run again 216 | self.reset = function() { 217 | self.paused = false; 218 | delete self.startTime; 219 | self.initialized = false; 220 | if (self.initialize()) { 221 | cancelAnimationFrame(self.rAF); 222 | self.printValue(self.startVal); 223 | } 224 | }; 225 | // pass a new endVal and start animation 226 | self.update = function (newEndVal) { 227 | if (!self.initialize()) return; 228 | newEndVal = Number(newEndVal); 229 | if (!ensureNumber(newEndVal)) { 230 | self.error = '[CountUp] update() - new endVal is not a number: '+newEndVal; 231 | return; 232 | } 233 | self.error = ''; 234 | if (newEndVal === self.frameVal) return; 235 | cancelAnimationFrame(self.rAF); 236 | self.paused = false; 237 | delete self.startTime; 238 | self.startVal = self.frameVal; 239 | self.endVal = newEndVal; 240 | self.countDown = (self.startVal > self.endVal); 241 | self.rAF = requestAnimationFrame(self.count); 242 | }; 243 | 244 | // format startVal on initialization 245 | if (self.initialize()) self.printValue(self.startVal); 246 | }; 247 | -------------------------------------------------------------------------------- /test/lib/draggable.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | /** 22 | * Simple draggable tool, just for demo or testing. 23 | * Use jquery. 24 | */ 25 | (function (global) { 26 | 27 | var BORDER_WIDTH = 4; 28 | var $ = global.jQuery; 29 | 30 | global.draggable = { 31 | 32 | /** 33 | * @param {HTMLElement} mainEl 34 | * @param {module:echarts/echarts~EChart} chart 35 | * @param {Object} [opt] {width: ..., height: ...} 36 | * @param {number} [opt.width] If not specified, use mainEl current width. 37 | * @param {number} [opt.height] If not specified, use mainEl current height. 38 | * @param {boolean} [opt.lockX=false] 39 | * @param {boolean} [opt.lockY=false] 40 | * @param {number} [opt.throttle=false] 41 | * @param {boolean} [opt.addPlaceholder=false] 42 | * @param {Function} [opt.onDrag] 43 | * @return {type} description 44 | */ 45 | init: function (mainEl, chart, opt) { 46 | opt = opt || {}; 47 | 48 | var onDrag = opt.onDrag || $.proxy(chart.resize, chart); 49 | 50 | var onDragThrottled = chart ? onDrag : function () {}; 51 | if (opt.throttle) { 52 | onDragThrottled = throttle(onDragThrottled, opt.throttle, true, false); 53 | } 54 | 55 | var mainEl = $(mainEl); 56 | var id = mainEl.attr('data-draggable-id'); 57 | 58 | if (opt.addPlaceholder) { 59 | var width = mainEl.outerWidth(); 60 | var height = mainEl.outerHeight(); 61 | $('
    ').css({ 62 | width: width, 63 | height: height, 64 | margin: 0, 65 | padding: 0, 66 | visibility: 'hidden' 67 | }).insertAfter(mainEl); 68 | } 69 | 70 | if (id == null) { 71 | id = +Math.random(); 72 | mainEl.attr('data-draggable-id', id); 73 | } 74 | else { 75 | $('.draggable-control[data-draggable-id=' + id + ']').remove(); 76 | } 77 | 78 | var controlEl = $( 79 | '
    DRAG
    ' 80 | ); 81 | 82 | controlEl.css({ 83 | 'position': 'absolute', 84 | 'border-radius': '30px', 85 | 'width': '60px', 86 | 'height': '60px', 87 | 'line-height': '60px', 88 | 'text-align': 'center', 89 | 'background': '#333', 90 | 'color': '#fff', 91 | 'cursor': 'pointer', 92 | 'font-size': '18px', 93 | 'box-shadow': '0 0 5px #333', 94 | '-webkit-user-select': 'none', 95 | 'user-select': 'none' 96 | }); 97 | 98 | var label = controlEl.find('.draggable-label'); 99 | 100 | label.css({ 101 | 'display': 'block', 102 | 'position': 'absolute', 103 | 'color': '#000', 104 | 'font-size': '12px', 105 | 'text-align': 'center', 106 | 'left': 0, 107 | 'top': '65px', 108 | 'width': '60px', 109 | 'line-height': 1 110 | }); 111 | 112 | mainEl.css({ 113 | 'position': 'absolute', 114 | 'left': mainEl[0].offsetLeft + 'px', 115 | 'top': mainEl[0].offsetTop + 'px', 116 | 'width': mainEl[0].offsetWidth + 'px', 117 | 'height': mainEl[0].offsetHeight + 'px', 118 | 'border-style': 'solid', 119 | 'border-color': '#ddd', 120 | 'border-width': BORDER_WIDTH + 'px', 121 | 'padding': 0, 122 | 'margin': 0 123 | }); 124 | 125 | mainEl.parent().append(controlEl); 126 | 127 | var controlSize = controlEl[0].offsetWidth; 128 | 129 | var boxSizing = mainEl.css('box-sizing'); 130 | 131 | var borderBoxBroder = boxSizing === 'border-box' ? 2 * BORDER_WIDTH : 0; 132 | var mainContentWidth = opt.width || (mainEl.width() + borderBoxBroder); 133 | var mainContentHeight = opt.height || (mainEl.height() + borderBoxBroder); 134 | 135 | var mainOffset = mainEl.offset(); 136 | resize( 137 | mainOffset.left + mainContentWidth + BORDER_WIDTH, 138 | mainOffset.top + mainContentHeight + BORDER_WIDTH, 139 | true 140 | ); 141 | 142 | var dragging = false; 143 | 144 | controlEl.on('mousedown', function () { 145 | dragging = true; 146 | }); 147 | 148 | $(document).on('mousemove', function (e) { 149 | if (dragging) { 150 | resize(e.pageX, e.pageY); 151 | } 152 | }); 153 | 154 | $(document).on('mouseup', function () { 155 | dragging = false; 156 | }); 157 | 158 | 159 | 160 | function resize(x, y, isInit) { 161 | var mainOffset = mainEl.offset(); 162 | var mainPosition = mainEl.position(); 163 | var mainContentWidth = x - mainOffset.left - BORDER_WIDTH; 164 | var mainContentHeight = y - mainOffset.top - BORDER_WIDTH; 165 | 166 | if (isInit || !opt.lockX) { 167 | controlEl.css( 168 | 'left', 169 | (mainPosition.left + mainContentWidth + BORDER_WIDTH - controlSize / 2) + 'px' 170 | ); 171 | mainEl.css( 172 | 'width', 173 | (mainContentWidth + borderBoxBroder) + 'px' 174 | ); 175 | } 176 | 177 | if (isInit || !opt.lockY) { 178 | controlEl.css( 179 | 'top', 180 | (mainPosition.top + mainContentHeight + BORDER_WIDTH - controlSize / 2) + 'px' 181 | ); 182 | mainEl.css( 183 | 'height', 184 | (mainContentHeight + borderBoxBroder) + 'px' 185 | ); 186 | } 187 | 188 | label.text(Math.round(mainContentWidth) + ' x ' + Math.round(mainContentHeight)); 189 | 190 | onDragThrottled(); 191 | } 192 | } 193 | }; 194 | 195 | function throttle(fn, delay, trailing, debounce) { 196 | 197 | var currCall = (new Date()).getTime(); 198 | var lastCall = 0; 199 | var lastExec = 0; 200 | var timer = null; 201 | var diff; 202 | var scope; 203 | var args; 204 | var isSingle = typeof fn === 'function'; 205 | delay = delay || 0; 206 | 207 | if (isSingle) { 208 | return createCallback(); 209 | } 210 | else { 211 | var ret = []; 212 | for (var i = 0; i < fn.length; i++) { 213 | ret[i] = createCallback(i); 214 | } 215 | return ret; 216 | } 217 | 218 | function createCallback(index) { 219 | 220 | function exec() { 221 | lastExec = (new Date()).getTime(); 222 | timer = null; 223 | (isSingle ? fn : fn[index]).apply(scope, args || []); 224 | } 225 | 226 | var cb = function () { 227 | currCall = (new Date()).getTime(); 228 | scope = this; 229 | args = arguments; 230 | diff = currCall - (debounce ? lastCall : lastExec) - delay; 231 | 232 | clearTimeout(timer); 233 | 234 | if (debounce) { 235 | if (trailing) { 236 | timer = setTimeout(exec, delay); 237 | } 238 | else if (diff >= 0) { 239 | exec(); 240 | } 241 | } 242 | else { 243 | if (diff >= 0) { 244 | exec(); 245 | } 246 | else if (trailing) { 247 | timer = setTimeout(exec, -diff); 248 | } 249 | } 250 | 251 | lastCall = currCall; 252 | }; 253 | 254 | /** 255 | * Clear throttle. 256 | * @public 257 | */ 258 | cb.clear = function () { 259 | if (timer) { 260 | clearTimeout(timer); 261 | timer = null; 262 | } 263 | }; 264 | 265 | return cb; 266 | } 267 | } 268 | 269 | })(window); -------------------------------------------------------------------------------- /test/lib/esl.js: -------------------------------------------------------------------------------- 1 | var define,require,esl;!function(n){function e(n,e){function r(n){0===n.indexOf(".")&&i.push(n)}var i=[];if("string"==typeof n?r(n):$(n,function(n){r(n)}),i.length>0)throw new Error("[REQUIRE_FATAL]Relative ID is not allowed in global require: "+i.join(", "));var o=C.waitSeconds;return o&&n instanceof Array&&(D&&clearTimeout(D),D=setTimeout(t,1e3*o)),_(n,e)}function t(){function n(a,u){if(!o[a]&&!l(a,N)){o[a]=1,l(a,L)||r[a]||(r[a]=1,e.push(a));var f=T[a];f?u&&(r[a]||(r[a]=1,e.push(a)),$(f.depMs,function(e){n(e.absId,e.hard)})):i[a]||(i[a]=1,t.push(a))}}var e=[],t=[],r={},i={},o={};for(var a in F)n(a,1);if(e.length||t.length)throw new Error("[MODULE_TIMEOUT]Hang( "+(e.join(", ")||"none")+" ) Miss( "+(t.join(", ")||"none")+" )")}function r(n){$(H,function(e){a(n,e.deps,e.factory)}),H.length=0,u(n)}function i(n,e,t){if(null==t&&(null==e?(t=n,n=null):(t=e,e=null,n instanceof Array&&(e=n,n=null))),null!=t){var r=window.opera;if(!n&&document.attachEvent&&(!r||"[object Opera]"!==r.toString())){var i=S();n=i&&i.getAttribute("data-require-id")}n?a(n,e,t):H[0]={deps:e,factory:t}}}function o(){var n=C.config[this.id];return n&&"object"==typeof n?n:{}}function a(n,e,t){T[n]||(T[n]={id:n,depsDec:e,deps:e||["require","exports","module"],factoryDeps:[],factory:t,exports:{},config:o,state:z,require:w(n),depMs:[],depMkv:{},depRs:[],depPMs:[]})}function u(n){var e=T[n];if(e&&!l(n,B)){var t=e.deps,r=e.factory,i=0;"function"==typeof r&&(i=Math.min(r.length,t.length),!e.depsDec&&r.toString().replace(/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/gm,"").replace(/require\(\s*(['"'])([^'"]+)\1\s*\)/g,function(n,e,r){t.push(r)}));var o=[];$(t,function(t,r){var a,u,f=I(t),c=q(f.mod,n);c&&!P[c]?(f.res&&(u={id:t,mod:c,res:f.res},F[c]=1,e.depPMs.push(c),e.depRs.push(u)),a=e.depMkv[c],a||(a={id:f.mod,absId:c,hard:i>r},e.depMs.push(a),e.depMkv[c]=a,o.push(c))):a={absId:c},i>r&&e.factoryDeps.push(u||a)}),e.state=B,s(n),m(o)}}function f(){for(var n in F)c(n),d(n)}function c(n){function e(n){if(!l(n,B))return!1;if(l(n,L)||t[n])return!0;t[n]=1;var r=T[n],i=!0;return $(r.depMs,function(n){return i=e(n.absId)}),i&&$(r.depRs,function(n){return i=!(!n.absId||!l(n.absId,N))}),i&&(r.state=L),i}var t={};e(n)}function s(e){function t(){if(!r&&i.state===L){r=1;var t=1,o=[];if($(i.factoryDeps,function(n){var e=n.absId;return P[e]||(d(e),l(e,N))?void o.push(e):(t=0,!1)}),t){try{var a=p(o,{require:i.require,exports:i.exports,module:i}),u=i.factory,f="function"==typeof u?u.apply(n,a):u;null!=f&&(i.exports=f),i.invokeFactory=null,delete F[e]}catch(c){if(r=0,/^\[MODULE_MISS\]"([^"]+)/.test(c.message)){var s=i.depMkv[RegExp.$1];return void(s&&(s.hard=1))}throw c}g(e)}}}var r,i=T[e];i.invokeFactory=t,$(i.depPMs,function(n){v(n,function(){$(i.depRs,function(t){t.absId||t.mod!==n||(t.absId=q(t.id,e),m([t.absId],f))})})})}function l(n,e){return T[n]&&T[n].state>=e}function d(n){var e=T[n];e&&e.invokeFactory&&e.invokeFactory()}function p(n,e){var t=[];return $(n,function(n,r){t[r]=e[n]||h(n)}),t}function v(n,e){if(l(n,N))return void e();var t=Q[n];t||(t=Q[n]=[]),t.push(e)}function g(n){var e=Q[n]||[],t=T[n];t.state=N;for(var r=e.length;r--;)e[r]();e.length=0,delete Q[n]}function h(n){return l(n,N)?T[n].exports:null}function m(e,t,r,i){function o(){if(!a){var r=1;$(e,function(n){return P[n]?void 0:r=!!l(n,N)}),r&&(a=1,"function"==typeof t&&t.apply(n,p(e,P)))}}if("string"==typeof e){if(d(e),!l(e,N))throw new Error('[MODULE_MISS]"'+e+'" is not exists!');return h(e)}i=i||{};var a=0;e instanceof Array&&(o(),a||($(e,function(n){P[n]||l(n,N)||(v(n,o),i[n]||(n.indexOf("!")>0?b:y)(n,r),u(n))}),f()))}function y(n){function e(){var e=t.readyState;if("undefined"==typeof e||/^(loaded|complete)$/.test(e)){t.onload=t.onreadystatechange=null,t=null,r(n);for(var i in F)u(i);f()}}if(!G[n]&&!T[n]){G[n]=1;var t=document.createElement("script");t.setAttribute("data-require-id",n),t.src=E(n+".js"),t.async=!0,t.readyState?t.onreadystatechange=e:t.onload=e,U(t)}}function b(n,e){function t(e){u.exports=e||!0,g(n)}function i(r){var i=e?T[e].require:_;r.load(a.res,i,t,o.call({id:n}))}if(!T[n]){var a=I(n),u={id:n,state:B};T[n]=u,t.fromText=function(n,e){F[n]=1,new Function(e)(),r(n)},i(h(a.mod))}}function M(n,e){var t=R(n,1,e);return t.sort(j),t}function k(){C.baseUrl=C.baseUrl.replace(/\/$/,"")+"/",J=M(C.paths),V=M(C.map,1),$(V,function(n){n.v=M(n.v)}),K=[],$(C.packages,function(n){var e=n;"string"==typeof n&&(e={name:n.split("/")[0],location:n,main:"main"}),e.location=e.location||e.name,e.main=(e.main||"main").replace(/\.js$/i,""),e.reg=O(e.name),K.push(e)}),K.sort(j),W=M(C.urlArgs,1),X=M(C.noRequests),$(X,function(n){var e=n.v,t={};n.v=t,e instanceof Array||(e=[e]),$(e,function(n){t[n]=1})})}function x(n,e,t){$(e,function(e){return e.reg.test(n)?(t(e.v,e.k,e),!1):void 0})}function E(n){var e=/(\.[a-z0-9]+)$/i,t=/(\?[^#]*)$/,r="",i=n,o="";t.test(n)&&(o=RegExp.$1,n=n.replace(t,"")),e.test(n)&&(r=RegExp.$1,i=n.replace(e,""));var a,u=i;return x(i,J,function(n,e){u=u.replace(e,n),a=1}),a||x(i,K,function(n,e,t){u=u.replace(t.name,t.location)}),/^([a-z]{2,10}:\/)?\//i.test(u)||(u=C.baseUrl+u),u+=r+o,x(i,W,function(n){u+=(u.indexOf("?")>0?"&":"?")+n}),u}function w(n){function e(e,r){if("string"==typeof e)return t[e]||(t[e]=m(q(e,n))),t[e];if(e instanceof Array){var i=[],o=[],a=[];$(e,function(e,t){var r=I(e),u=q(r.mod,n);o.push(u),F[u]=1,r.res?(i.push(u),a[t]=null):a[t]=u});var u={};$(o,function(n){var e;x(n,X,function(n){e=n}),e&&(e["*"]?u[n]=1:$(o,function(t){return e[t]?(u[n]=1,!1):void 0}))}),m(o,function(){$(a,function(t,r){null==t&&(a[r]=q(e[r],n))}),m(a,r,n)},n,u)}}var t={};return e.toUrl=function(e){return E(q(e,n))},e}function q(n,e){if(!n)return"";e=e||"";var t=I(n);if(!t)return n;var r=t.res,i=A(t.mod,e);if($(K,function(n){var e=n.name;return e===i?(i=e+"/"+n.main,!1):void 0}),x(e,V,function(n){x(i,n,function(n,e){i=i.replace(e,n)})}),r){var o=h(i);r=o.normalize?o.normalize(r,function(n){return q(n,e)}):q(r,e),i+="!"+r}return i}function A(n,e){if(0===n.indexOf(".")){var t=e.split("/"),r=n.split("/"),i=t.length-1,o=r.length,a=0,u=0;n:for(var f=0;o>f;f++)switch(r[f]){case"..":if(!(i>a))break n;a++,u++;break;case".":u++;break;default:break n}return t.length=i-a,r=r.slice(u),t.concat(r).join("/")}return n}function I(n){var e=n.split("!");return e[0]?{mod:e[0],res:e[1]}:null}function R(n,e,t){var r=[];for(var i in n)if(n.hasOwnProperty(i)){var o={k:i,v:n[i]};r.push(o),e&&(o.reg="*"===i&&t?/^/:O(i))}return r}function S(){if(Y)return Y;if(Z&&"interactive"===Z.readyState)return Z;for(var n=document.getElementsByTagName("script"),e=n.length;e--;){var t=n[e];if("interactive"===t.readyState)return Z=t,t}}function U(n){Y=n,ee?ne.insertBefore(n,ee):ne.appendChild(n),Y=null}function O(n){return new RegExp("^"+n+"(/|$)")}function $(n,e){if(n instanceof Array)for(var t=0,r=n.length;r>t&&e(n[t],t)!==!1;t++);}function j(n,e){var t=n.k||n.name,r=e.k||e.name;return"*"===r?-1:"*"===t?1:r.length-t.length}var D,T={},F={},z=1,B=2,L=3,N=4,P={require:e,exports:1,module:1},_=w(),C={baseUrl:"./",paths:{},config:{},map:{},packages:[],waitSeconds:0,noRequests:{},urlArgs:{}};e.version="1.8.8",e.loader="esl",e.toUrl=_.toUrl;var H=[];i.amd={};var Q={},G={};e.config=function(n){if(n){for(var e in C){var t=n[e],r=C[e];if(t)if("urlArgs"===e&&"string"==typeof t)C.urlArgs["*"]=t;else if(r instanceof Array)r.push.apply(r,t);else if("object"==typeof r)for(var i in t)r[i]=t[i];else C[e]=t}k()}},k();var J,K,V,W,X,Y,Z,ne=document.getElementsByTagName("head")[0],ee=document.getElementsByTagName("base")[0];ee&&(ne=ee.parentNode),define||(define=i,require||(require=e),esl=e)}(this); -------------------------------------------------------------------------------- /test/lib/facePrint.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | // Just for temporarily mobile debug. 22 | 23 | (function () { 24 | 25 | var infoDom; 26 | var msgs = []; 27 | 28 | var count = 0; 29 | 30 | /** 31 | * @param {string|Object|Array} msg 32 | */ 33 | window.facePrint = function (msg) { 34 | if (!infoDom) { 35 | infoDom = createInfoDom(); 36 | } 37 | 38 | if (isObject(msg)) { 39 | msg = window.facePrint.objToStr(msg); 40 | } 41 | 42 | msgs.push(encodeHTML(msg)); 43 | count++; 44 | 45 | if (msgs.length > 30) { 46 | msgs.shift(); 47 | } 48 | 49 | var str = ''; 50 | // Make some change in view, otherwise user may 51 | // be not aware that log is still printing. 52 | for (var i = 0; i < msgs.length; i++) { 53 | str += '' 54 | + (count - msgs.length + i) + '' + msgs[i]; 55 | } 56 | infoDom.innerHTML = str; 57 | }; 58 | 59 | window.facePrint.objToStr = function (obj) { 60 | var msgArr = []; 61 | for (var key in obj) { 62 | msgArr.push(key + '=' + obj[key]); 63 | } 64 | return msgArr.join(', '); 65 | }; 66 | 67 | function createInfoDom() { 68 | var dom = document.createElement('div'); 69 | 70 | dom.style.cssText = [ 71 | 'position: fixed', 72 | 'top: 0', 73 | 'width: 100%', 74 | 'min-height: 14px', 75 | 'line-height: 14px', 76 | 'z-index: 2147483647', 77 | 'color: #fff', 78 | 'font-size: 9px', 79 | 'background: #000', 80 | 'word-break:break-all', 81 | 'word-wrap:break-word' 82 | ].join(';') + ';'; 83 | 84 | document.body.appendChild(dom); 85 | 86 | return dom; 87 | } 88 | 89 | function encodeHTML(source) { 90 | return source == null 91 | ? '' 92 | : String(source) 93 | .replace(/&/g, '&') 94 | .replace(//g, '>') 96 | .replace(/"/g, '"') 97 | .replace(/'/g, '''); 98 | } 99 | 100 | function isObject(value) { 101 | // Avoid a V8 JIT bug in Chrome 19-20. 102 | // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. 103 | var type = typeof value; 104 | return type === 'function' || (!!value && type == 'object'); 105 | } 106 | 107 | })(); -------------------------------------------------------------------------------- /test/lib/frameInsight.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | (function (global) { 22 | 23 | var frameInsight = global.frameInsight = {}; 24 | 25 | var DURATION_CHART_DURATION = 3000; 26 | var DURATION_CHART_PADDING_V = 0.05; 27 | var DURATION_CHART_PADDING_TOP = 0.05; 28 | var DURATION_CHART_PADDING_BOTTOM = 0.05; 29 | var DURATION_CHART_NORMAL_FILL = 'green'; 30 | var DURATION_CHART_SLOW_FILL = 'red'; 31 | var SLOW_THRESHOLD = 50; 32 | 33 | var settings; 34 | var dpr = window && Math.max(window.devicePixelRatio || 1, 1) || 1; 35 | var durationChart = { 36 | ticks: [], 37 | tickTypes: [], 38 | tags: [] 39 | }; 40 | var original = { 41 | setTimeout: global.setTimeout, 42 | requestAnimationFrame: global.requestAnimationFrame, 43 | addEventListener: global.addEventListener 44 | }; 45 | 46 | var now = global.performance 47 | // performance.now has higer accuracy. 48 | ? performance.now.bind(performance) 49 | : function () { 50 | return +new Date(); 51 | }; 52 | 53 | instrumentBase(); 54 | 55 | /** 56 | * @public 57 | * @param {Object} echarts 58 | * @param {string} durationChartDom 59 | */ 60 | frameInsight.init = function (echarts, durationChartDom, dontInstrumentECharts) { 61 | settings = { 62 | echarts: echarts, 63 | durationChartDom: durationChartDom 64 | }; 65 | 66 | !dontInstrumentECharts && instrumentECharts(); 67 | initDurationChart(); 68 | startDurationChart(); 69 | }; 70 | 71 | function startDurationChart() { 72 | next(); 73 | 74 | function next() { 75 | renderDurationChart(); 76 | original.requestAnimationFrame.call(global, next); 77 | } 78 | } 79 | 80 | function instrumentBase() { 81 | doInstrumentRegistrar('setTimeout', 0); 82 | doInstrumentRegistrar('requestAnimationFrame', 0); 83 | doInstrumentRegistrar('addEventListenter', 1); 84 | } 85 | 86 | function instrumentECharts() { 87 | var echarts = settings.echarts; 88 | 89 | var dummyDom = document.createElement('div'); 90 | var dummyChart = echarts.init(dummyDom, null, {width: 10, height: 10}); 91 | var ECClz = dummyChart.constructor; 92 | dummyChart.dispose(); 93 | 94 | ECClz.prototype.setOption = doInstrumentHandler(ECClz.prototype.setOption, 'setOption'); 95 | } 96 | 97 | function doInstrumentRegistrar(name, handlerIndex) { 98 | global[name] = function () { 99 | var args = [].slice.call(arguments); 100 | args[handlerIndex] = doInstrumentHandler(args[handlerIndex], name); 101 | return original[name].apply(this, args); 102 | }; 103 | } 104 | 105 | function doInstrumentHandler(orginalHandler, tag) { 106 | return function () { 107 | var start = now(); 108 | var result = orginalHandler.apply(this, arguments); 109 | var end = now(); 110 | addTick(start, end, tag); 111 | return result; 112 | }; 113 | } 114 | 115 | function addTick(start, end, tag) { 116 | var ticks = durationChart.ticks; 117 | var tickTypes = durationChart.tickTypes; 118 | var tags = durationChart.tags; 119 | 120 | // Arbitrary number. 121 | if (end - start > 0.3) { 122 | 123 | // In case that setOption in event listener. 124 | var lastIndex = tickTypes.length - 1; 125 | if (tickTypes[lastIndex] === 0) { 126 | tickTypes[lastIndex] = end; 127 | tags[lastIndex] = tag; 128 | } 129 | else { 130 | ticks.push(start, end); 131 | // 0: start, 1: end 132 | tickTypes.push(0, 1); 133 | tag = tag; 134 | tags.push(tag, tag); 135 | } 136 | } 137 | 138 | if (!ticks.length) { 139 | return; 140 | } 141 | 142 | var newStart = end - DURATION_CHART_DURATION; 143 | var dropCount = 0; 144 | for (var i = 0; i < ticks.length; i++) { 145 | var tick = ticks[i]; 146 | if (tick < newStart) { 147 | dropCount++; 148 | } 149 | } 150 | if (dropCount > 0) { 151 | ticks.splice(0, dropCount); 152 | tickTypes.splice(0, dropCount); 153 | tags.splice(0, dropCount); 154 | } 155 | } 156 | 157 | function initDurationChart() { 158 | var dom = document.getElementById(settings.durationChartDom); 159 | var domStyle = dom.style; 160 | // domStyle.border = '2px solid #333'; 161 | domStyle.boxShadow = '0 0 3px #000'; 162 | domStyle.backgroundColor = '#eee'; 163 | domStyle.padding = '0'; 164 | domStyle.height = '60px'; 165 | domStyle.margin = '10px 20px'; 166 | 167 | var domWidth = getSize(dom, 0); 168 | var domHeight = getSize(dom, 1); 169 | 170 | durationChart.canvas = document.createElement('canvas'); 171 | dom.appendChild(durationChart.canvas); 172 | durationChart.canvas.style.width = domWidth + 'px'; 173 | durationChart.canvas.style.height = domHeight + 'px'; 174 | durationChart.width = durationChart.canvas.width = domWidth * dpr; 175 | durationChart.height = durationChart.canvas.height = domHeight * dpr; 176 | 177 | durationChart.ctx = durationChart.canvas.getContext('2d'); 178 | 179 | var paddingV = durationChart.width * DURATION_CHART_PADDING_V; 180 | var paddingTop = durationChart.height * DURATION_CHART_PADDING_TOP; 181 | var paddingBottom = durationChart.height * DURATION_CHART_PADDING_BOTTOM; 182 | durationChart.bodyLeft = paddingV; 183 | durationChart.bodyWidth = durationChart.width - 2 * paddingV; 184 | durationChart.bodyTop = paddingTop; 185 | durationChart.bodyHeight = durationChart.height - paddingTop - paddingBottom; 186 | 187 | durationChart.renderExtent = [durationChart.bodyLeft, durationChart.bodyLeft + durationChart.bodyWidth]; 188 | var extent = [0, DURATION_CHART_DURATION]; 189 | durationChart.slowThresholdLength = 190 | linearMap(SLOW_THRESHOLD, extent, durationChart.renderExtent) 191 | - linearMap(0, extent, durationChart.renderExtent); 192 | } 193 | 194 | function renderDurationChart() { 195 | // var renderStart = now(); 196 | 197 | var ticks = durationChart.ticks; 198 | var tickTypes = durationChart.tickTypes; 199 | var ctx = durationChart.ctx; 200 | var timeEnd = now(); 201 | var timeExtent = [timeEnd - DURATION_CHART_DURATION, timeEnd]; 202 | var slowThresholdLength = durationChart.slowThresholdLength; 203 | 204 | ctx.clearRect(0, 0, durationChart.width, durationChart.height); 205 | 206 | ctx.fillStyle = DURATION_CHART_NORMAL_FILL; 207 | 208 | var x; 209 | var slowRects = []; 210 | 211 | if (tickTypes[0] === 1) { 212 | x = durationChart.bodyLeft; 213 | } 214 | 215 | for (var i = 0; i < ticks.length; i++) { 216 | var tick = ticks[i]; 217 | var tickType = tickTypes[i]; 218 | 219 | var tickCoord = linearMap(tick, timeExtent, durationChart.renderExtent); 220 | if (tickType === 0) { 221 | x = tickCoord; 222 | } 223 | else if (tickType === 1) { 224 | var width = Math.max(tickCoord - x, 0.5); 225 | ctx.fillRect(x, durationChart.bodyTop, width, durationChart.bodyHeight); 226 | if (width > slowThresholdLength) { 227 | slowRects.push( 228 | x + slowThresholdLength, 229 | durationChart.bodyTop, 230 | width - slowThresholdLength, 231 | durationChart.bodyHeight 232 | ); 233 | } 234 | } 235 | } 236 | 237 | if (slowRects.length) { 238 | for (var i = 0; i < slowRects.length;) { 239 | var x = slowRects[i++]; 240 | var y = slowRects[i++]; 241 | var width = slowRects[i++]; 242 | var height = slowRects[i++]; 243 | var canvasGradient = ctx.createLinearGradient(x, y, x + width, y); 244 | canvasGradient.addColorStop(0, DURATION_CHART_NORMAL_FILL); 245 | canvasGradient.addColorStop(1, DURATION_CHART_SLOW_FILL); 246 | ctx.fillStyle = canvasGradient; 247 | ctx.fillRect(x, y, width, height); 248 | } 249 | } 250 | 251 | // var renderDuration = now() - renderStart; 252 | // if (renderDuration > 1) { 253 | // console.warn(renderDuration); 254 | // } 255 | } 256 | 257 | function linearMap(val, domain, range) { 258 | var subDomain = domain[1] - domain[0]; 259 | var subRange = range[1] - range[0]; 260 | 261 | if (val <= domain[0]) { 262 | return range[0]; 263 | } 264 | if (val >= domain[1]) { 265 | return range[1]; 266 | } 267 | 268 | return (val - domain[0]) / subDomain * subRange + range[0]; 269 | } 270 | 271 | function getSize(root, whIdx) { 272 | var wh = ['width', 'height'][whIdx]; 273 | var cwh = ['clientWidth', 'clientHeight'][whIdx]; 274 | var plt = ['paddingLeft', 'paddingTop'][whIdx]; 275 | var prb = ['paddingRight', 'paddingBottom'][whIdx]; 276 | 277 | // IE8 does not support getComputedStyle, but it use VML. 278 | var stl = document.defaultView.getComputedStyle(root); 279 | 280 | return ( 281 | (root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) 282 | - (parseInt10(stl[plt]) || 0) 283 | - (parseInt10(stl[prb]) || 0) 284 | ) | 0; 285 | } 286 | 287 | function parseInt10(val) { 288 | return parseInt(val, 10); 289 | } 290 | 291 | })(window); 292 | -------------------------------------------------------------------------------- /test/lib/perlin.js: -------------------------------------------------------------------------------- 1 | (function(global){ 2 | var module = global.noise = {}; 3 | 4 | function Grad(x, y, z) { 5 | this.x = x; this.y = y; this.z = z; 6 | } 7 | 8 | Grad.prototype.dot2 = function(x, y) { 9 | return this.x*x + this.y*y; 10 | }; 11 | 12 | Grad.prototype.dot3 = function(x, y, z) { 13 | return this.x*x + this.y*y + this.z*z; 14 | }; 15 | 16 | var grad3 = [new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), 17 | new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), 18 | new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)]; 19 | 20 | var p = [151,160,137,91,90,15, 21 | 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 22 | 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 23 | 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, 24 | 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 25 | 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, 26 | 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, 27 | 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 28 | 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, 29 | 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, 30 | 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, 31 | 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, 32 | 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; 33 | // To remove the need for index wrapping, double the permutation table length 34 | var perm = new Array(512); 35 | var gradP = new Array(512); 36 | 37 | // This isn't a very good seeding function, but it works ok. It supports 2^16 38 | // different seed values. Write something better if you need more seeds. 39 | module.seed = function(seed) { 40 | if(seed > 0 && seed < 1) { 41 | // Scale the seed out 42 | seed *= 65536; 43 | } 44 | 45 | seed = Math.floor(seed); 46 | if(seed < 256) { 47 | seed |= seed << 8; 48 | } 49 | 50 | for(var i = 0; i < 256; i++) { 51 | var v; 52 | if (i & 1) { 53 | v = p[i] ^ (seed & 255); 54 | } else { 55 | v = p[i] ^ ((seed>>8) & 255); 56 | } 57 | 58 | perm[i] = perm[i + 256] = v; 59 | gradP[i] = gradP[i + 256] = grad3[v % 12]; 60 | } 61 | }; 62 | 63 | module.seed(0); 64 | 65 | /* 66 | for(var i=0; i<256; i++) { 67 | perm[i] = perm[i + 256] = p[i]; 68 | gradP[i] = gradP[i + 256] = grad3[perm[i] % 12]; 69 | }*/ 70 | 71 | // Skewing and unskewing factors for 2, 3, and 4 dimensions 72 | var F2 = 0.5*(Math.sqrt(3)-1); 73 | var G2 = (3-Math.sqrt(3))/6; 74 | 75 | var F3 = 1/3; 76 | var G3 = 1/6; 77 | 78 | // 2D simplex noise 79 | module.simplex2 = function(xin, yin) { 80 | var n0, n1, n2; // Noise contributions from the three corners 81 | // Skew the input space to determine which simplex cell we're in 82 | var s = (xin+yin)*F2; // Hairy factor for 2D 83 | var i = Math.floor(xin+s); 84 | var j = Math.floor(yin+s); 85 | var t = (i+j)*G2; 86 | var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. 87 | var y0 = yin-j+t; 88 | // For the 2D case, the simplex shape is an equilateral triangle. 89 | // Determine which simplex we are in. 90 | var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords 91 | if(x0>y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1) 92 | i1=1; j1=0; 93 | } else { // upper triangle, YX order: (0,0)->(0,1)->(1,1) 94 | i1=0; j1=1; 95 | } 96 | // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and 97 | // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where 98 | // c = (3-sqrt(3))/6 99 | var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords 100 | var y1 = y0 - j1 + G2; 101 | var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords 102 | var y2 = y0 - 1 + 2 * G2; 103 | // Work out the hashed gradient indices of the three simplex corners 104 | i &= 255; 105 | j &= 255; 106 | var gi0 = gradP[i+perm[j]]; 107 | var gi1 = gradP[i+i1+perm[j+j1]]; 108 | var gi2 = gradP[i+1+perm[j+1]]; 109 | // Calculate the contribution from the three corners 110 | var t0 = 0.5 - x0*x0-y0*y0; 111 | if(t0<0) { 112 | n0 = 0; 113 | } else { 114 | t0 *= t0; 115 | n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient 116 | } 117 | var t1 = 0.5 - x1*x1-y1*y1; 118 | if(t1<0) { 119 | n1 = 0; 120 | } else { 121 | t1 *= t1; 122 | n1 = t1 * t1 * gi1.dot2(x1, y1); 123 | } 124 | var t2 = 0.5 - x2*x2-y2*y2; 125 | if(t2<0) { 126 | n2 = 0; 127 | } else { 128 | t2 *= t2; 129 | n2 = t2 * t2 * gi2.dot2(x2, y2); 130 | } 131 | // Add contributions from each corner to get the final noise value. 132 | // The result is scaled to return values in the interval [-1,1]. 133 | return 70 * (n0 + n1 + n2); 134 | }; 135 | 136 | // 3D simplex noise 137 | module.simplex3 = function(xin, yin, zin) { 138 | var n0, n1, n2, n3; // Noise contributions from the four corners 139 | 140 | // Skew the input space to determine which simplex cell we're in 141 | var s = (xin+yin+zin)*F3; // Hairy factor for 2D 142 | var i = Math.floor(xin+s); 143 | var j = Math.floor(yin+s); 144 | var k = Math.floor(zin+s); 145 | 146 | var t = (i+j+k)*G3; 147 | var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. 148 | var y0 = yin-j+t; 149 | var z0 = zin-k+t; 150 | 151 | // For the 3D case, the simplex shape is a slightly irregular tetrahedron. 152 | // Determine which simplex we are in. 153 | var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords 154 | var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords 155 | if(x0 >= y0) { 156 | if(y0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } 157 | else if(x0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } 158 | else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } 159 | } else { 160 | if(y0 < z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; } 161 | else if(x0 < z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; } 162 | else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; } 163 | } 164 | // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z), 165 | // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and 166 | // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where 167 | // c = 1/6. 168 | var x1 = x0 - i1 + G3; // Offsets for second corner 169 | var y1 = y0 - j1 + G3; 170 | var z1 = z0 - k1 + G3; 171 | 172 | var x2 = x0 - i2 + 2 * G3; // Offsets for third corner 173 | var y2 = y0 - j2 + 2 * G3; 174 | var z2 = z0 - k2 + 2 * G3; 175 | 176 | var x3 = x0 - 1 + 3 * G3; // Offsets for fourth corner 177 | var y3 = y0 - 1 + 3 * G3; 178 | var z3 = z0 - 1 + 3 * G3; 179 | 180 | // Work out the hashed gradient indices of the four simplex corners 181 | i &= 255; 182 | j &= 255; 183 | k &= 255; 184 | var gi0 = gradP[i+ perm[j+ perm[k ]]]; 185 | var gi1 = gradP[i+i1+perm[j+j1+perm[k+k1]]]; 186 | var gi2 = gradP[i+i2+perm[j+j2+perm[k+k2]]]; 187 | var gi3 = gradP[i+ 1+perm[j+ 1+perm[k+ 1]]]; 188 | 189 | // Calculate the contribution from the four corners 190 | var t0 = 0.6 - x0*x0 - y0*y0 - z0*z0; 191 | if(t0<0) { 192 | n0 = 0; 193 | } else { 194 | t0 *= t0; 195 | n0 = t0 * t0 * gi0.dot3(x0, y0, z0); // (x,y) of grad3 used for 2D gradient 196 | } 197 | var t1 = 0.6 - x1*x1 - y1*y1 - z1*z1; 198 | if(t1<0) { 199 | n1 = 0; 200 | } else { 201 | t1 *= t1; 202 | n1 = t1 * t1 * gi1.dot3(x1, y1, z1); 203 | } 204 | var t2 = 0.6 - x2*x2 - y2*y2 - z2*z2; 205 | if(t2<0) { 206 | n2 = 0; 207 | } else { 208 | t2 *= t2; 209 | n2 = t2 * t2 * gi2.dot3(x2, y2, z2); 210 | } 211 | var t3 = 0.6 - x3*x3 - y3*y3 - z3*z3; 212 | if(t3<0) { 213 | n3 = 0; 214 | } else { 215 | t3 *= t3; 216 | n3 = t3 * t3 * gi3.dot3(x3, y3, z3); 217 | } 218 | // Add contributions from each corner to get the final noise value. 219 | // The result is scaled to return values in the interval [-1,1]. 220 | return 32 * (n0 + n1 + n2 + n3); 221 | 222 | }; 223 | 224 | // ##### Perlin noise stuff 225 | 226 | function fade(t) { 227 | return t*t*t*(t*(t*6-15)+10); 228 | } 229 | 230 | function lerp(a, b, t) { 231 | return (1-t)*a + t*b; 232 | } 233 | 234 | // 2D Perlin Noise 235 | module.perlin2 = function(x, y) { 236 | // Find unit grid cell containing point 237 | var X = Math.floor(x), Y = Math.floor(y); 238 | // Get relative xy coordinates of point within that cell 239 | x = x - X; y = y - Y; 240 | // Wrap the integer cells at 255 (smaller integer period can be introduced here) 241 | X = X & 255; Y = Y & 255; 242 | 243 | // Calculate noise contributions from each of the four corners 244 | var n00 = gradP[X+perm[Y]].dot2(x, y); 245 | var n01 = gradP[X+perm[Y+1]].dot2(x, y-1); 246 | var n10 = gradP[X+1+perm[Y]].dot2(x-1, y); 247 | var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1); 248 | 249 | // Compute the fade curve value for x 250 | var u = fade(x); 251 | 252 | // Interpolate the four results 253 | return lerp( 254 | lerp(n00, n10, u), 255 | lerp(n01, n11, u), 256 | fade(y)); 257 | }; 258 | 259 | // 3D Perlin Noise 260 | module.perlin3 = function(x, y, z) { 261 | // Find unit grid cell containing point 262 | var X = Math.floor(x), Y = Math.floor(y), Z = Math.floor(z); 263 | // Get relative xyz coordinates of point within that cell 264 | x = x - X; y = y - Y; z = z - Z; 265 | // Wrap the integer cells at 255 (smaller integer period can be introduced here) 266 | X = X & 255; Y = Y & 255; Z = Z & 255; 267 | 268 | // Calculate noise contributions from each of the eight corners 269 | var n000 = gradP[X+ perm[Y+ perm[Z ]]].dot3(x, y, z); 270 | var n001 = gradP[X+ perm[Y+ perm[Z+1]]].dot3(x, y, z-1); 271 | var n010 = gradP[X+ perm[Y+1+perm[Z ]]].dot3(x, y-1, z); 272 | var n011 = gradP[X+ perm[Y+1+perm[Z+1]]].dot3(x, y-1, z-1); 273 | var n100 = gradP[X+1+perm[Y+ perm[Z ]]].dot3(x-1, y, z); 274 | var n101 = gradP[X+1+perm[Y+ perm[Z+1]]].dot3(x-1, y, z-1); 275 | var n110 = gradP[X+1+perm[Y+1+perm[Z ]]].dot3(x-1, y-1, z); 276 | var n111 = gradP[X+1+perm[Y+1+perm[Z+1]]].dot3(x-1, y-1, z-1); 277 | 278 | // Compute the fade curve value for x, y, z 279 | var u = fade(x); 280 | var v = fade(y); 281 | var w = fade(z); 282 | 283 | // Interpolate 284 | return lerp( 285 | lerp( 286 | lerp(n000, n100, u), 287 | lerp(n001, n101, u), w), 288 | lerp( 289 | lerp(n010, n110, u), 290 | lerp(n011, n111, u), w), 291 | v); 292 | }; 293 | 294 | })(this); -------------------------------------------------------------------------------- /test/lib/rearrange.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | var fs = require('fs'); 22 | var path = require('path'); 23 | 24 | var inputPath = path.resolve(__dirname, '../data/house-price-area.json'); 25 | var outputPath = path.resolve(__dirname, '../data/house-price-area2.json'); 26 | 27 | var xGridCount = 20; 28 | var yGridCount = 20; 29 | var dimX = 0; 30 | var dimY = 1; 31 | 32 | function process() { 33 | 34 | var data = readFile(inputPath); 35 | data = JSON.parse(data); 36 | 37 | if (!(data instanceof Array)) { 38 | throw new Error('Data should be array'); 39 | } 40 | 41 | var xMin = Infinity; 42 | var xMax = -Infinity; 43 | var yMin = Infinity; 44 | var yMax = -Infinity; 45 | 46 | data.forEach(function (point) { 47 | xMin = Math.min(point[dimX], xMin); 48 | xMax = Math.max(point[dimX], xMax); 49 | yMin = Math.min(point[dimY], yMin); 50 | yMax = Math.max(point[dimY], yMax); 51 | }); 52 | 53 | console.log('xMin', xMin, 'xMax', xMax, 'yMin', yMin, 'yMax', yMax); 54 | 55 | var cellWidth = (xMax - xMin) / xGridCount; 56 | var cellHeight = (yMax - yMin) / yGridCount; 57 | 58 | var grids = []; 59 | var gridsSize = []; 60 | 61 | data.forEach(function (point) { 62 | var gridXIndex = Math.floor((point[dimX] - xMin) / cellWidth); 63 | var gridYIndex = Math.floor((point[dimY] - yMin) / cellHeight); 64 | 65 | var line = grids[gridYIndex] || (grids[gridYIndex] = []); 66 | var cell = line[gridXIndex] || (line[gridXIndex] = []); 67 | 68 | cell.push(point); 69 | 70 | gridsSize[gridYIndex] = gridsSize[gridYIndex] || []; 71 | gridsSize[gridYIndex][gridXIndex] = gridsSize[gridYIndex][gridXIndex] || []; 72 | gridsSize[gridYIndex][gridXIndex] = cell.length; 73 | }); 74 | 75 | // Sort for render outline firstly. 76 | for (var i = 0; i < grids.length; i++) { 77 | var line = grids[i]; 78 | if (!line || !line.length) { 79 | continue; 80 | } 81 | 82 | for (var j = 0; j < line.length; j++) { 83 | var cell = line[j]; 84 | if (!cell || !cell.length) { 85 | continue; 86 | } 87 | 88 | cell.sort(function (a, b) { 89 | return b.length - a.length; 90 | }); 91 | } 92 | } 93 | 94 | var output = []; 95 | var hasMore; 96 | do { 97 | hasMore = false; 98 | 99 | for (var i = 0; i < grids.length; i++) { 100 | var lines = grids[i]; 101 | 102 | if (!lines || !lines.length) { 103 | continue; 104 | } 105 | for (var j = 0; j < lines.length; j++) { 106 | var cell = lines[j]; 107 | if (!cell || !cell.length) { 108 | continue; 109 | } 110 | var idx = Math.floor(Math.random() * cell.length); 111 | if (idx === cell.length) { 112 | idx--; 113 | } 114 | var point = cell[idx]; 115 | cell.splice(idx, 1); 116 | output.push(point); 117 | 118 | hasMore |= cell.length > 0; 119 | } 120 | } 121 | } while (hasMore); 122 | 123 | output = JSON.stringify(output); 124 | 125 | writeToFile(outputPath, output); 126 | 127 | console.log('Done.'); 128 | } 129 | 130 | function readFile(fullFilePath) { 131 | return fs.readFileSync(fullFilePath, {encoding: 'utf-8'}); 132 | } 133 | 134 | function writeToFile(outputPath, text) { 135 | fs.writeFileSync(outputPath, text, {encoding: 'utf-8'}); 136 | } 137 | 138 | 139 | 140 | process(); 141 | -------------------------------------------------------------------------------- /test/lib/reset.css: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | html, 22 | body, 23 | #main, 24 | body > .main { 25 | width: 100%; 26 | height: 100%; 27 | margin: 0; 28 | padding: 0; 29 | font-family: arial; 30 | } 31 | 32 | 33 | .test-title { 34 | padding: 20px; 35 | background: #0a6d01; 36 | /* background: rgb(182, 120, 7); */ 37 | color: #fff; 38 | font-weight: normal; 39 | text-align: center; 40 | font-size: 14px; 41 | } 42 | .test-title-inner { 43 | display: inline-block; 44 | *display: inline; 45 | zoom: 1; 46 | text-align: left; 47 | } 48 | .test-title strong { 49 | color: yellow; 50 | font-weight: 700; 51 | text-shadow: -1px 0 #000, 0 1px #000, 1px 0 #000, 0 -1px #000; 52 | padding-left: 2px; 53 | padding-right: 2px; 54 | } 55 | .test-buttons button { 56 | margin: 10px 5px; 57 | } 58 | .test-chart-block { 59 | position: relative; 60 | } 61 | .test-chart-block-has-right { 62 | overflow: hidden; 63 | } 64 | .test-chart-block-has-right .test-chart-block-right { 65 | position: absolute; 66 | right: 10px; 67 | background: #fff; 68 | z-index: 99; 69 | width: 300px; 70 | max-height: 99%; 71 | border-left: 1px solid #ddd; 72 | border-bottom: 1px solid #ddd; 73 | } 74 | .test-chart-block-has-right .test-chart-block-left { 75 | margin-right: 320px; 76 | } 77 | .test-info { 78 | padding-left: 10px; 79 | overflow: auto; 80 | } 81 | pre.test-print-object { 82 | font-size: 12px; 83 | font-family: Menlo, Monaco, 'Courier New', monospace; 84 | } 85 | .test-chart { 86 | height: 400px; 87 | } 88 | 89 | .test-data-table { 90 | position: relative; 91 | text-align: center; 92 | } 93 | .test-data-table table { 94 | display: inline-block; 95 | vertical-align: top; 96 | border: 1px solid #ccc; 97 | border-spacing: 0; 98 | margin: 30px 15px; 99 | } 100 | .test-data-table td { 101 | border: 1px solid #ccc; 102 | color: #777; 103 | padding: 3px 5px; 104 | font-size: 13px; 105 | } 106 | td.test-data-table-key { 107 | font-size: 12px; 108 | color: rgb(69, 162, 238) 109 | } 110 | 111 | .record-canvas .content-area { 112 | display: none; 113 | position: absolute; 114 | background: #fff; 115 | left: 10px; 116 | top: 20px; 117 | border: 2px solid #000; 118 | padding: 10px; 119 | z-index: 9999; 120 | box-shadow: 0 0 3px #000; 121 | } 122 | .record-canvas textarea { 123 | width: 300px; 124 | height: 500px; 125 | } 126 | -------------------------------------------------------------------------------- /test/node/scatter-gps.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | var echarts = require('../../dist/echarts'); 21 | // var v8 = require('v8'); 22 | // v8.setFlagsFromString('--max-old-space-size=4096'); 23 | 24 | var { createCanvas } = require('canvas'); 25 | var fs = require('fs'); 26 | var ProgressBar = require('progress'); 27 | 28 | echarts.setCanvasCreator(function () { 29 | return createCanvas(100, 100); 30 | }); 31 | 32 | var canvas = createCanvas(); 33 | canvas.width = 2048; 34 | canvas.height = 1024; 35 | 36 | var worldJson = JSON.parse(fs.readFileSync('../../map/json/world.json', 'utf-8')); 37 | echarts.registerMap('world', worldJson); 38 | 39 | var chart = echarts.init(canvas); 40 | chart.setOption({ 41 | backgroundColor: '#000', 42 | geo: { 43 | map: 'world', 44 | roam: true, 45 | label: { 46 | emphasis: { 47 | show: false 48 | } 49 | }, 50 | silent: true, 51 | itemStyle: { 52 | normal: { 53 | areaColor: '#323c48', 54 | borderColor: '#111' 55 | }, 56 | emphasis: { 57 | areaColor: '#2a333d' 58 | } 59 | } 60 | }, 61 | series: [{ 62 | name: '弱', 63 | type: 'scatter', 64 | progressive: 1e5, 65 | coordinateSystem: 'geo', 66 | symbolSize: 0.5, 67 | blendMode: 'lighter', 68 | large: true, 69 | itemStyle: { 70 | normal: { 71 | color: 'rgb(20, 15, 2)' 72 | } 73 | }, 74 | postEffect: { 75 | enable: true 76 | }, 77 | silent: true, 78 | dimensions: ['lng', 'lat'], 79 | data: new Float32Array() 80 | }] 81 | }); 82 | 83 | 84 | // var CHUNK_COUNT = 277; 85 | var CHUNK_COUNT = 229; 86 | // https://blog.openstreetmap.org/2012/04/01/bulk-gps-point-data/ 87 | function fetchData(idx) { 88 | if (idx >= CHUNK_COUNT) { 89 | setTimeout(function () { 90 | fs.writeFile('out.png', canvas.toBuffer()); 91 | chart.dispose(); 92 | }); 93 | return; 94 | } 95 | 96 | fs.readFile(`../../../echarts-gl/test/data/gps/gps_${idx}.bin`, function (err, buffer) { 97 | var arr = new Uint8Array(buffer.length); 98 | for (var i = 0; i < buffer.length; i++) { 99 | arr[i] = buffer[i]; 100 | } 101 | 102 | var rawData = new Int32Array(arr.buffer); 103 | var data = new Float32Array(rawData.length); 104 | for (var i = 0; i < rawData.length; i += 2) { 105 | data[i] = rawData[i+1] / 1e7; 106 | data[i+1] = rawData[i] / 1e7; 107 | } 108 | 109 | chart.appendData({ 110 | seriesIndex: 0, 111 | data: data 112 | }); 113 | 114 | fetchData(idx + 1); 115 | 116 | progress.tick(); 117 | }); 118 | } 119 | var progress = new ProgressBar('Generating [:bar] :percent :etas', { 120 | complete: '=', 121 | incomplete: ' ', 122 | width: 50, 123 | total: CHUNK_COUNT 124 | }); 125 | 126 | fetchData(0); --------------------------------------------------------------------------------