一步步DIY: OSM-Web服务器(七) 利用 Google WebService 批量下载遥感瓦片数据

   前面六篇,是集中精力写的,其实,整个流程顺利走过来,花了笔者两个月的时间哦!因为无聊的网速、不给力的硬盘,以及停电,几乎到了恨不得砸机器的地步啦!~~ 走到现在,我们有了B/S C/S两种架构的地图服务,可是,总觉得还缺了什么——对了,只有矢量怎么行?!我们还要卫星图片!

    谈到卫星图片,最有名的是 Google Earth。可是,Google Earth 的缓存很不好利用。那么 google map 呢?我们用 fire-fox 的 firebug 看看,google map 的瓦片地址是神马样子的!

哦,原来是

http://mt2.google.cn/vt/lyrs=s@116&hl=zh-CN&gl=cn&src=app&x=0&y=3&z=2&s=Gal

虽然不知道很多东西的具体含义,但是,我们看到 x, y, z,还是很熟悉啊!

有了这个,就可以根据需求下载瓦片啦!我们可以自己实现一个Web Service,按照需求下载瓦片按照 Z,X,Y的顺序来存储,这样,随着用户的浏览,一块块遥感图片就存在自己的服务器上了。

还仿照 第六篇的做法,按照C/S结构设计的下载器比较简单。下面的代码是下载瓦片的片段(Qt4)

  1.   QString strTargetPath = QCoreApplication::applicationDirPath()+"/tiles";  
  2.   mkdir(strTargetPath.toAscii().data());  
  3.   strTargetPath += QString("/%1").arg(nLevel);  
  4.   mkdir(strTargetPath.toAscii().data());  
  5.   strTargetPath += QString("/%1").arg(nX);  
  6.   mkdir(strTargetPath.toAscii().data());  
  7.   strTargetPath += QString("/%1.png").arg(nY);  
  8.   QString strVal = m_strServerURL;  
  9.   QString strTail;  
  10.   strVal += "/osm_tiles2/";             strTail += "/";  
  11.     strVal += QString::number(nLevel,10); strTail +=  QString::number(nLevel,10);  
  12.     strVal += '/';                        strTail += "/";  
  13.     strVal += QString::number(nX,10);     strTail +=  QString::number(nX,10);  
  14.     strVal += '/';                        strTail += "/";  
  15.     strVal += QString::number(nY,10);     strTail +=  QString::number(nY,10);  
  16.     strVal += ".png";                     strTail += ".png";  
  17.   
  18.   strVal = QString("http://mt2.google.cn/vt/lyrs=s@116&hl=zh-CN&gl=cn&src=app&x=%1&y=%2&z=%3&s=Gal")  
  19.             .arg(nX).arg(nY).arg(nLevel);  
  20.     bool res = true;  
  21.     if (this->m_bconnected==true)  
  22.     {  
  23.         QByteArray array_out;  
  24.     if (image.load(strTargetPath)==false)  
  25.     {  
  26.         QByteArray array_outImage;  
  27.                 res =m_download_manager.download(strVal,array_outImage);  
  28.                 if (res==true)  
  29.         {  
  30.             res = image.loadFromData(array_outImage);  
  31.             if (res == true)  
  32.                 image.save(strTargetPath);  
  33.         }  
  34.         }  
  35.         if (res==false)  
  36.             image = QImage(256,256,QImage::Format_ARGB32);  
  37.     }  
  38.     else  
  39.         image = QImage(256,256,QImage::Format_ARGB32);  
  40. ......   
如果需要批量下载,则需要搞清楚各层瓦片的编号。按照摩卡托投影的分划,上一层每个瓦片在下一层分为4个,其坐标分别是

x*2, y*2

x*2+1,y*2

x*2,y*2+1

x*2+1,y*2+1

以此类推,迭代一下即可。

经过改造后,我们的C/S客户端也能显示并缓存卫星地图啦!

如果切换到OSM,会发现,他们是几乎配准好了的!二者的误差可能是卫星的正摄影像有高程补差?后面慢慢看。

-------------------------------------------------

其实,写到这里,经过了七篇,我们也只是把OSM 服务器的皮毛给走顺溜了。还有很多很多问题,没有涉及与考虑。很多时候觉得自己花这么多精力于这个东东,根本不是公司的业务范围,真是很二的事情了。不过,正因为没有压力,才好玩啊!不要把自己的兴趣当成工作,那样你会失去她--by N个师兄


阅读更多

没有更多推荐了,返回首页