Download the Baidu Map tile method

Source: Internet
Author: User

Continued on the "web version of Baidu map load offline tile", this article on the download tile simple procedures.

Baidu Map Tile download is actually very easy, get download link and then batch download on the line. However, because of the need to follow the rules to store, it is best to write a program to download these links. Otherwise you have to use someone else has done the program to download, many of these are required to charge, or have a watermark or something.


In fact, it is not difficult to get all the tiles directly inside the map window, just follow the code in the script. But the script is compressed and confusing, it is difficult to read.


This article directly paste out the good code, and then you can call to download.

Function downloadbaidutiles () {var earthradius = 6370996.81;var mcband = [  12890594.86, 8362377.87, 5591021, 3481989.83,        &NBSP;1678043.12,&NBSP;0&NBSP;];VAR&NBSP;LLBAND&NBSP;=&NBSP;[&NBSP;75,&NBSP;60,&NBSP;45,&NBSP;30,&NBSP;15,  0 ];var MC2LL = [        [  1.410526172116255e-8, 0.00000898305509648872,-1.9939833816331, 200.9824383106796,-187.2403703815547,  91.6087516669843,-23.38765649603339, 2.57121317296198,-0.03801003308653, 17337981.2 ],         [ -7.435856389565537e-9, 0.000008983055097726239,- 0.78625201886289, 96.32687599759846,-1.85204757529826, -59.36935905485877,47.40033549296737, - 16.50741931063887,2.28786674699375, 10260144.86 ],        [  -3.030883460898826e-8, 0.00000898305509983578,0.30071316287616, 59.74293618442277,7.357984074871, - 25.38371002664745,13.45380521110908, -3.29883767235584,0.32710905363475, 6856817.37 ],         [ -1.981981304930552e-8,  0.000008983055099779535,0.03278182852591, 40.31678527705744,0.65659298677277, - 4.44255534477492,0.85341911805263, 0.12923347998204,-0.04625736007561, 4482777.06 ],         [ 3.09191371068437e-9,  0.000008983055096812155,0.00006995724062, 23.10934304144901,-0.00023663490511, -0.6321817810242,- 0.00663494467273, 0.03430082397953,-0.00466043876332, 2555164.4 ],         [ 2.890871144776878e-9, 0.000008983055095805407,-3.068298e-8,  7.47137025468032,-0.00000353937994, -0.02145144861037,-0.00001234426596, 0.00010322952773,- 0.00000323890364, 826088.5 ] ];var&nbsp ll2mc = [        [ -0.0015702102444,  111320.7020616939,1704480524535203, -10338987376042340,26112667856603880, - 35149669176653700,26595700718403920, -10725012454188240,1800819912950474, 82.5 ],         [ 0.0008277824516172526, 111320.7020463578,647795574.6671607,  -4082003173.641316,10774905663.51142, -15171875531.51559,12053065338.62167, - 5124939663.577472,913311935.9512032, 67.5 ],        [  0.00337398766765, 111320.7020202162,4481351.045890365, -23393751.19931662,79682215.47186455, - 115964993.2797253,97236711.15602145, -43661946.33752821,8477230.501135234, 52.5 ],         [ 0.00220636496208, 111320.7020209128,51751.86112841131,  3796837.749470245,992013.7397791013, -1221952.21711287,1340652.697009075, -620943.6990984312,144416.9293806241, 37.5 ],         [ -0.0003441963504368392, 111320.7020576856,278.2353980772752,  2485758.690035394,6070.750963243378, 54821.18345352118,9540.606633304236, - 2710.55326746645,1405.483844121726, 22.5 ],        [ - 0.0003218135878613132, 111320.7020701615,0.00369383431289, 823725.6402795718,0.46104986909093,  2351.343141331292,1.58060784298199, 8.77738589078284,0.37238884252424, 7.45 ] ];function  point (Lng, lat) {    this.lng = lng;    this.lat  = lat;} function convertor  (POINT,&NBSP;LL2MC)  {    if  (!point | | &NBSP;!LL2MC)  {        return    }  The conversion of    //  longitude is simple and a simple linear conversion is possible.  &nbsP;  // 0, 1 of the number of levels is such a -0.0015702102444, 111320.7020616939    var x  = ll2mc[0] + ll2mc[1] * math.abs (POINT.LNG);    //  A linear relationship is calculated first, where 9 is the order of magnitude: 67.5,a is valued at approximately one single digit     var a = math.abs (Point.lat) The conversion of  / ll2mc[9];    //  dimension is relatively complex,y=b+ca+da^2+ea^3+fa^4+ga^5+ha^6     //  where A is a linear conversion of a dimension, and the final value is a six-square polynomial, the values of 2, 3, 4, 5, 6, 7, 8 are approximately such:    //  278.2353980772752, 2485758.690035394,    // 6070.750963243378,  54821.18345352118,    // 9540.606633304236, -2710.55326746645,     // 1405.483844121726,    //  This means that the dimension will become a large number, much too big to be hard to say      var y = ll2mc[2] + ll2mc[3] * a + ll2mc[4] * a  * a + ll2mc[5] * a    * a * a + ll2mc[6] * a * a *  A * a + ll2mc[7] * a    * a * a * a  * a + ll2mc[8] * a * a * a * a     * a * a;    //  the entire calculation is based on the absolute value, and the sign bit ends up on the line     x  *=  (point.lng < 0 ? -1 : 1);     y *=   (point.lat < 0 ? -1 : 1);    //  produces a new point coordinate. It's not the same.     return new point (x, y)}function lnglattomercator (T)  { &NBSP;&NBSP;&NBSP;&NBSP;RETURN&NBSP;CONVERTLL2MC (T);} Function getloop (Value, min, max)  {    while  (value >  max)  {        value -= max - min    }    while  (Value < min)  {        value += max - min     }    return value}function convertLL2MC  (point)  {     var point1;    var ll2mc;    point.lng  = getloop (point.lng, -180, 180);//  standardized to intra-range     point.lat =  getrange (point.lat, -74, 74);//  standardized to intra-range     point1 = new  point (Point.lng, point.lat);    //  Find Llband Dimension dictionary, dictionary from large to small sort, find then stop      for  (var i = 0; i < llband.length; i++)  {         if  (Point1.lat >= llband[i])  {             ll2mc = ll2mc[i];             break;        }    }     //  if not found, turn to find. Found is stopped.     if  (!LL2MC)  {        for  (var  i = llband.length - 1; i >= 0; i--)  {             if  (Point1.lat <= -llband[i])  { ll2mc = ll2mc[i];break;            }         }    }    var  Newpoint = convertor (POINT,&NBSP;LL2MC);    var point = new  Point (NewPoint.lng.toFixed (2),  newpoint.lat.tofixed (2));     return point;} Function findalltiles (Map, callback) {    var maptype =  Map.getmaptype ();//  map type     var zoomLevel = map.zoomLevel;//  magnification     var center = map.mercatorCenter;//  Center coordinates      This.mapcenterpoint = center;    var cv = maptype.getzoomunits ( Zoomlevel);// zoomlevel related index, =2^ (18-zoomlevel)     var unitSize =  Maptype.getzoomfactor (Zoomlevel);//  a factor, =cv*256    var longitudeunits =  math.ceil (center.lng / unitsize);// center.lng is a very large number     var  Latitudeunits = math.ceil (center.lat / unitsize);     var tilesize  = maptype.gettilesize ();     var cp = [ longitudeunits,  latitudeUnits,  (center.Lng - longitudeunits * unitsize)  / unitSize * tileSize,              (center.lat - latitudeunits *  UnitSize)  / unitsize * tilesize ];    var width0 =  cp[0] - math.ceil ((map.width / 2 - cp[2])  / tilesize);     var height0 = cp[1] - math.ceil ((map.height / 2 - &NBSP;CP[3]  / tilesize);    var width = cp[0] +  Math.ceil ((map.width / 2 + cp[2])  / tilesize);    var  c0 = 0;    if  (maptype === bmap_perspective_map &&  map.getzoom ()  == 15)  {        c0 = 1     }    var height = cp[1] + math.ceil ((map.height / 2 + cp[3 ])  / tilesize)  + c0;    var xydata = [];     for  (var i = width0; i < width; i++)  {         for  (var j = height0; j < height;  j++)  {            xydata.push ([ i,  j ])         }    }     var zoom = map.getzoom ();     //var win = window.open () ;    for  (var i = 0, len = xydata.length; i  < len; i++)  {        showtile ([ xydata[i][0],  xydata[i][1],&nbSp;zoom ], callback)     }        } Function showtile (xyz, callback) {    console.log (xyz[2]+ "/" +xyz[0]+ "/" +xyz[1] "); &NBSP;&NBSP;&NBSP;&NBSP;IF (!! Callback) {        callback (Xyz, gettilesurl ({x:xyz[0],y:xyz[1]}, &NBSP;XYZ[2]);    }}var j = [  "http://online0.map.bdimg.com/tile/",              "http://online1.map.bdimg.com/tile/",              "http://online2.map.bdimg.com/tile/",              "http://online3.map.bdimg.com/tile/",              "http://online4.map.bdimg.com/tile/"  ];            function gettilesurl (XY,&NBSP;Z)  {        var x = xy.x;         var y = xy.y;         var udt =  "20150518";        var style  =  "PL";        // if  (this.map.highResolutionEnabled ())  {        //style =  "PH"          // }        var cm = j[math.abs ( x + y)  % j.length] +  "qt=tile&x="                  +  (x +  ""). Replace (/-/gi,  "M")   +  "&y="                  +  (y +&nbsp, ""). Replace (/-/gi,  "M")  +  "&z="  + z +  "&styles="  + style                 +  "& udt= " + udt;        //  This place abandoned the above calculation results, directly using the local image          //cM =  "maptile/"  + z +  "/"  +  x +  "/"  + y +  ". jpg";         Return cm.replace (/-(\d+)/gi,  "m$1")     }    return  function (map, callback) {findalltiles (map, callback);};}

Then introduce this JS file, and then write a button, constantly moving the window, add a new download connection bar.

<script type= "Text/javascript" src= "js/findtiles.js" ></script><input type= "button" value= "Findtiles "Onclick=" Findtiles (); "    ><script>function findtiles () {var findalltiles = Downloadbaidutiles (); Findalltiles (map, addurls);}    function Addurls (xyz, url) {var div = document.getElementById ("list");    var anchor = document.createelement ("a");    Anchor.href = URL;    anchor.innerhtml = xyz[2]+ "/" +xyz[0]+ "/" +xyz[1 ";    Div.appendchild (anchor);    var br = document.createelement ("BR"); Div.appendchild (BR);} </script>



This method has a good advantage, you can zoom the map at any time, and then click the button, so you can constantly get new tile address. However, the code is not optimized, the mobile map may produce duplicate tiles, and then download the program has not been written. Finally, we can arrange the location of the files according to XYZ.


Download the Baidu Map tile method

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.