您的位置:首页 > 编程语言 > Go语言

google离线切片加载要点

2016-07-17 16:46 405 查看
google离线切片下载工具:全能电子地图下载器1.95   ,网上可以找到破解工具

 

google地图采用Web墨卡托投影,其世界坐标范围为【 -20037508, -20037508,20037508, 20037508.34
】,离线地图加载方式与天地图等切片加载方法及流程完全相同,只是个别参数需要调整,

1、google切片的行列号与天地图的行列号是反着的, google的col  为天地图的row 

2、切片原点为 【-20037508.3427892,20037508.3427892】 

3、谷歌切片为平面投影切片,其 resolution 分辨率为 距离分辨率(单位m),即图片上每个像素代表的实际距离,可以通过简单方法来计算

    假想第0级切片为一张256*256的世界地图,其面积为( 20037508+[b] 20037508[/b])*( 20037508+[b] 20037508[/b]),

    所以每个像素代表的距离就是 (20037508+ 20037508)/256  = 156543.0339

    则每一级切片的距离分辨率为: 156543.0339 / pow(2,level);

 

有了这些基本参数,后面的的坐标和行列号的转换和其他切片是一样一样的

 

4、通过坐标找行列号

  public  function getTileRowColByCoord(pt:Point, rowCol:Object, resolution:Number):void

  {

   var qRow:Number = Math.abs(pt.y - m_tilePoint.y) / (tileSize * resolution);

   var qCol:Number = Math.abs(pt.x - m_tilePoint.x) / (tileSize * resolution);

   

   //向下舍入

   rowCol.row = Math.floor(qRow);

   rowCol.col = Math.floor(qCol);   

  }

 

5、通过行列号找坐标

  //通过行列获取地理坐标

  public function getCoordByRowCol(row:int, col:int,level:Number):Point

  {

   var pt:Point = new Point();

   m_curResolution = getResolution(level);

   var y:Number = Math.abs(m_tilePoint.y - row * (tileSize * m_curResolution));

   var x:Number = Math.abs(col * (tileSize * m_curResolution ) + m_tilePoint.x); 

   pt.x = x;

   pt.y = y;

   return pt;

  }

到此基本就搞定了,只是有点不爽的是用的都是web墨卡托投影坐标,坐标值不是咱们印象中的WGS-84的经度、纬度值,但也有标准的方法来转换

  /**

   wgs84转为墨卡托坐标(经纬度转墨卡托)

   

   lon :    w84经度

   lat :    w84纬度

   */

  public function forwardMercator(lon,lat):Array {

   lon = parseFloat(lon);

   lat = parseFloat(lat);

   var x = lon * 20037508.34 / 180;

   var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);

   y = y * 20037508.34 / 180;       

   return [x,y];

  };

  

  /**

   将墨卡托坐标转为wgs84(墨卡托转经纬度)

  

   x :    墨卡托经度

   y :    墨卡托纬度

   */

  public  function inverseMercator(x, y):Array {

   var lon = (x / 20037508.34) * 180;

   var lat = (y / 20037508.34) * 180;

   lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

   return [lon, lat];

  };

推荐几个技术链接参考:

  
WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理http://blog.sina.com.cn/s/blog_5d25ac4e0102v6kb.html

  Google投影说明:http://blog.csdn.net/mygisforum/article/details/8162751

   当然还有:http://blog.csdn.net/chaiqi/article/details/8025973

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息