Mapbar的基本演算法

來源:互聯網
上載者:User

mapbar的地圖,在地標標註上是有優勢的

Mapbar基本演算法

因為我當初是用在PHP下的,所以用了php表示演算法,基本差不多,應該看得懂:

基礎網址:"http://img.mapbar.com/maplite/mapbank/baidu/"

每層地圖切片存放在檔案夾名稱:

$levelstr=array("W","0","1","2","3","4","5","6","7","8","9","10","11","12","15");

即第0層地圖切片放在"http://img.mapbar.com/maplite/mapbank/baidu/W/" 下

每層地圖切片所跨的經度數(緯度跨度需要*0.8這個係數):

$clipnum=array(90,40,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01,0.005,0.002);

如第1層的每切片跨經度是90度,跨緯度是90*0.8=72度。即如經度-180~180,共360度,東西半球各需要180/90=2塊切片,mapbar的每切片像素為300x300,所以完整地圖長度像素應是300*4=1200像素。緯度是-90~90,共180度,南北半球各需要90/72=1.25,需要取大於此數的最小整數即2,所以南北半球加起來仍需要4塊,而不是180/72=2.5取整後的3塊。從中間0度赤道向兩邊平鋪的,因此上下兩塊各有3/4塊地區留有空白。

哈哈,有點缺乏耐心啦,將就著結合一小段程式來理解吧

//每層的最大橫向像素數(除以2得到是縱向最大像素)

function MaxPixel($zoom){

        return 256*pow(2,$zoom+2);

}

//經度換算

function PixelToLng($x,$zoom){

        $c= MaxPixel($zoom);

        return ($x - $c / 2) / ($c / 360);

}

function LngToPixel($lng,$zoom){

        $c= MaxPixel($zoom);

        return (int)($c / 2 + $lng * $c / 360 + 0.5);

}

//緯度換算

function PixelToLat($y,$zoom){

        $c= MaxPixel($zoom);

        $g = ($y - $c / 2) / (-$c / (2 * M_PI));

        return (2 * Atan(Exp($g)) - M_PI / 2) / (M_PI / 180);

}

function LatToPixel($lat,$zoom){

        $c= MaxPixel($zoom);

        $f = Sin($lat * (M_PI / 180));

        return (int)($c / 2 + 0.5 * Log((1 + $f) / (1 - $f)) * -$c / (2 * M_PI) + 0.5);

}

$blocksize=array(10,10,10,10,10,10,10,10,10,10,50,50,50,50,50);

//$para['ClipXNo']是橫向切片序號,注意這個序號不是從0開始的

//橫向切片序號運算公式,已知經度是$para['x1']計算所在切片序號:$para['ClipXNo']=floor($para['x1']/$clipnum[$level]);

//縱向切片序號運算公司,已知緯度是$para['y1']計算所在切片序號:$para['ClipYNo']=floor($para['y1']/($clipnum[$level]*0.8));

//所以倒如第一層第一塊切片(經緯度分別為-180,90所在的切片)的序號是

$para['ClipXNo']=floor(-180/90)=-2;$para['ClipYNo']=floor(90/72)=2;

$para['FolderXNo']=(int)floor($para['ClipXNo']/$blocksize[$level]);//切片分檔案夾存放位置

$para['FolderYNo']=(int)floor($para['ClipYNo']/$blocksize[$level]);

if($para['FolderXNo']<0){

        $para['FolderXNo']++;

}

if($para['FolderYNo']<0){

        $para['FolderYNo']++;

}

//計算檔案序號

$para['FileXNo']=$para['ClipXNo']-$para['FolderXNo']*$blocksize[$level];

$para['FileYNo']=$para['ClipYNo']-$para['FolderYNo']*$blocksize[$level];

//計算出完整切片位置

$para['url']=

"http://img.mapbar.com/maplite/mapbank/baidu/"

.$levelstr[$level]."/".$para['FolderXNo']."_".$para['FolderYNo'].

"/".$para['FileXNo']."_".$para['FileYNo'].".png";

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.