抓取Mapbar地图切片的一个算法
2012-12-02 03:06
225 查看
抓取Mapbar地图切片的一个算法
发表于 2011/03/26这个算法去年的时候就写了,自己就是抓着玩,也算是验证了这个算法的可行性,今天特向大家分享一下,主要是根据Mapbarapi里的绘图算法写出来的,实在没什么技术含量。
有想玩的同学可以试试,不过因此引起的后果本人概不负责,请慎重啊!
算法使用PHP写的,将下面代码保存为一个PHP文件后在终端运行: $ php -f filename.php一下就可以了。
代码如下:
/** * 抓取mapbar切片的算法 by CrossYou at 2011/01/22 * * @version 1.0.0 * @link http://crossyou.cn/ */ $mapbarImgRoot = './mapbar/'; //每层地图切片的文件夹名称 $levelFolder = array('W','0','1','2','3','4','5','6','7','8','9','10','11','12','13','16'); //每层地图切片所跨的经度数 $cutImgLonRange=array(90,40,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01,0.005,0.002,0.001); //每层地图切片所跨的维度数 $cutImgLatRange=array(90*0.8,40*0.8,20*0.8,10*0.8,5*0.8,2*0.8,0.8,0.5*0.8,0.2*0.8,0.1*0.8,0.05*0.8,0.02*0.8,0.01*0.8,0.005*0.8,0.002*0.8,0.001*0.8); $blockSize=array(10,10,10,10,10,10,10,10,10,10,50,50,50,50,50,50); for($zoomLevel=0;$zoomLevel<16;$zoomLevel++){ $clipXNum=ceil(360/$cutImgLonRange[$zoomLevel]); $clipYNum=ceil(90/$cutImgLatRange[$zoomLevel]); $clipLonRange = $cutImgLonRange[$zoomLevel]; $clipLatRange = $cutImgLatRange[$zoomLevel]; $clipXGap = -180-$clipLonRange/2; //从缩放级别5开始,只抓取中国范围内的地图,因为此级别以后的,非国内的都是背景图,抓了无意义。 if($zoomLevel>3){ //--------中国范围的地图 $west = 73; $east = 136; $north = 54; $south = 3; $chinaLonRange = 63;//中国经度跨度 $chinaLatRange = 51;//中国维度跨度 $chinaClipXNum = ceil($chinaLonRange/$clipLonRange); $chinaClipYNum = ceil($chinaLatRange/$clipLatRange); for($i=0;$i<$chinaClipXNum;$i++){ $lon = $west+$clipLonRange*$i; for($j=0;$j<$chinaClipYNum;$j++){ $lat = $south+$clipLatRange*$j; $clipXNo = floor($lon/$cutImgLonRange[$zoomLevel]); $clipYNo = floor($lat/$cutImgLatRange[$zoomLevel]); $clipXNo=($clipXNo)%$clipXNum; if($clipXNo>=$clipXNum/2)$clipXNo-=$clipXNum; if($clipXNo<-$clipXNum/2)$clipXNo+=$clipXNum; echo "\n新的切片... => \n"; echo '经纬度:'.$lon.' , '.$lat."\n"; echo "-------------------------------\n"; echo '切片序号:'.$clipXNo.' , '.$clipYNo."\n"; echo "-------------------------------\n"; //切片分文件夹存放位置 $folderXNo = (int)floor($clipXNo/$blockSize[$zoomLevel]); //切片分文件夹存放位置 $folderYNo = (int)floor($clipYNo/$blockSize[$zoomLevel]); if($folderXNo<0){ $folderXNo+=1; } if($folderYNo<0){ $folderYNo+=1; } $fileXNo =($clipXNo)-$folderXNo*$blockSize[$zoomLevel]; $fileYNo =($clipYNo)-$folderYNo*$blockSize[$zoomLevel]; $imgPre = 'http://img.mapbar.com/maplite/mapbank/mapbar/'; $imgDir = $levelFolder[$zoomLevel].'/'.$folderXNo.'_'.$folderYNo.'/'; $imgName = $fileXNo.'_'.$fileYNo.'.png'; $imgUrl = $imgPre.$imgDir.$imgName; $localImgDir = $mapbarImgRoot.$imgDir; $localImgName = $localImgDir.$imgName; if (!is_file($localImgName)){ createdir($localImgDir); if(copy($imgUrl,$localImgName)){ echo '图片:=> '.$imgDir.$imgName." 成功下载到本地\n\n"; } } } } }else{ for($i= -$clipXNum/2;$i<=$clipXNum/2;$i++){ $lon = $clipLonRange*$i; if($i<0)$lon+=$clipLonRange/2; if($i==0)continue; if($i>0)$lon-=$clipLonRange/2; for($j=-$clipYNum;$j<=$clipYNum;$j++){ $lat = $clipLatRange*$j; if($j<0)$lat+=$clipLatRange/2; if($j==0)continue; if($j>0)$lat-=$clipLatRange/2; $clipXNo = floor($lon/$cutImgLonRange[$zoomLevel]); $clipYNo = floor($lat/$cutImgLatRange[$zoomLevel]); $clipXNo=($clipXNo)%$clipXNum; if($clipXNo>=$clipXNum/2)$clipXNo-=$clipXNum; if($clipXNo<-$clipXNum/2)$clipXNo+=$clipXNum; echo "\n新的切片... => \n"; echo '经纬度:'.$lon.' , '.$lat."\n"; echo "-------------------------------\n"; echo '切片序号:'.$clipXNo.' , '.$clipYNo."\n"; echo "-------------------------------\n"; //切片分文件夹存放位置 $folderXNo = (int)floor($clipXNo/$blockSize[$zoomLevel]); //切片分文件夹存放位置 $folderYNo = (int)floor($clipYNo/$blockSize[$zoomLevel]); if($folderXNo<0){ $folderXNo+=1; } if($folderYNo<0){ $folderYNo+=1; } $fileXNo =($clipXNo)-$folderXNo*$blockSize[$zoomLevel]; $fileYNo =($clipYNo)-$folderYNo*$blockSize[$zoomLevel]; $imgPre = 'http://img.mapbar.com/maplite/mapbank/mapbar/'; $imgDir = $levelFolder[$zoomLevel].'/'.$folderXNo.'_'.$folderYNo.'/'; $imgName = $fileXNo.'_'.$fileYNo.'.png'; $imgUrl = $imgPre.$imgDir.$imgName; $localImgDir = $mapbarImgRoot.$imgDir; $localImgName = $localImgDir.$imgName; if (!is_file($localImgName)){ createdir($localImgDir); if(copy($imgUrl,$localImgName)){ echo '图片:=> '.$imgDir.$imgName." 成功下载到本地\n\n"; } } } } } } /** * 创建多级目录 摘自网络 * 如有好的建议,请到 http://crossyou.cn/给我留言 谢谢! * * @since 1.0.5 * @param string $dir */ function createdir($dir){ $array_dir=explode("/",$dir);//把多级目录分别放到数组中 $depth = count($array_dir); $path = ''; for($i=0;$i<$depth;$i++){ $path .= $array_dir[$i]."/"; if(!is_dir($path)){ mkdir($path); } } }
《全文完》
相关文章推荐
- Mapbar地图切片的抓取和拼接算法
- Mapbar地图切片的抓取和拼接算法
- Mapbar地图切片的抓取和拼接算法
- Arcgis怎么区分加载的是矢量还是切片地图?哪位大神有切片地图网址给我一个,谢谢。。。
- 刚想到一个计算地图计算距离的算法,自我感觉是最牛的算法,没有之一
- Google map EPSG:900913 地图分块算法、切片算法个人解析。一看就明白哈
- 刚想到一个计算地图计算距离的算法,自我感觉是最牛的算法,没有之一
- (数据结构)图的应用,一个简单的学校地图.包含的内容:图的最短路径算法 和 图的深度优先遍历算法
- 地图网站MapBar地理位置标记ID转换为经纬度的Javascript解密算法
- Google Map 在地图中央随即生成一个坐标点(GLatLng)
- 【算法题】求一个数列中的逆序对个数
- Mapbar 地图 API 实例
- (最长连续回文串---一个更容易想到的算法)Longest Palindromic Substring
- 结合Flex Builder和Flash CS4制作一个中国地图的应用(转)
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法
- 设计一个算法判断一个字符串是否是回文
- 爬虫 抓取数据后 显示到前台页面,jsoup包,ajax,设置一个返回ResponseResult结果集
- 一个简单的多机器人编队算法实现--PID
- [算法]计算一个数的开方
- [小算法] 使用递归将一个整数逆序放入一数组中