2012-06-12 60 views
0

我想在PHP中編寫一個腳本,它將接受Bing地圖quadkey,然後返回縮放級別,x座標和y座標,以便我可以使用我自己的地圖。我根據我的代碼關閉微軟提供這樣here的C#示例代碼:如何將Bing地圖quadkey轉換爲使用PHP的縮放級別,x座標和y座標?

public static void QuadKeyToTileXY(string quadKey, out int tileX, out int tileY, out int levelOfDetail) 
{ 
    tileX = tileY = 0; 
    levelOfDetail = quadKey.Length; 
    for (int i = levelOfDetail; i > 0; i--) 
    { 
     int mask = 1 << (i - 1); 
     switch (quadKey[levelOfDetail - i]) 
     { 
      case '0': 
       break; 

      case '1': 
       tileX |= mask; 
       break; 

      case '2': 
       tileY |= mask; 
       break; 

      case '3': 
       tileX |= mask; 
       tileY |= mask; 
       break; 

      default: 
       throw new ArgumentException("Invalid QuadKey digit sequence."); 
     } 
    } 
} 

這是使用未運行PHP我的娛樂休閒爲我所期望的:

$quadkey = intval($_GET["quadkey"]); 

$zoom = count($quadkey); 

for ($i = $zoom; $i > 0; $i--) 
{ 
    $mask = 1 << ($i - 1); 

    $quadkey_array = str_split($quadkey); 

    switch ($quadkey_array[$zoom - $i]) 
    { 
     case 0: 
      break; 

     case 1: 
      $x |= $mask; 
      break; 

     case 2: 
      $y |= $mask; 
      break; 

     case 3: 
      $x |= $mask; 
      $y |= $mask; 
      break; 

     default: 
      echo "Error"; 
    } 


    echo "/" . $zoom . "/" . $x . "/" . $y . ".png"; 
} 

的例子quadkey我使用和預期結果如下:

Quadkey:120202111102203112 的X座標:134926 的Y座標:86121 變焦:18

任何人都能夠闡明我做錯了什麼嗎?我一直在尋找周圍,無法找到任何其他示例代碼來檢查!謝謝大家!

回答

0

我的代碼中有錯誤,我應該看到。

$zoom = count($quadkey); 

錯誤並計算$ quadkey的數量,而不是字符串的長度。

$zoom = strlen($quadkey); 

此外,該網址應該在for循環之外,正下方生成。如果其他人需要用於將Bing地圖quadkey轉換爲座標的PHP腳本,則我已將更新後的代碼放在下面。

$quadkey = intval($_GET["quadkey"]); 

$zoom = strlen($quadkey); 

for ($i = $zoom; $i > 0; $i--) 
{ 
    $mask = 1 << ($i - 1); 

    $quadkey_array = str_split($quadkey); 

    switch ($quadkey_array[$zoom - $i]) 
    { 
     case 0: 
      break; 

     case 1: 
      $x |= $mask; 
      break; 

     case 2: 
      $y |= $mask; 
      break; 

     case 3: 
      $x |= $mask; 
      $y |= $mask; 
      break; 

     default: 
      echo "Error"; 
    } 
} 

echo "/" . $zoom . "/" . $x . "/" . $y . ".png"; 
0

隨着冰的Ajax 7設置在不是唯一的項目QuadKey,還提供X,Y,和levelOfDetail,a.k.a縮放。

直到我發現這一點,我也想到了服務器端轉換,但它在JavaScript中可用。

Bing地圖自帶的x,y和z可用於OSM Web請求直接:

var map = new Microsoft.Maps.Map(<snip>) 
function useZXY(tile) { 
    return "http://tile.openstreetmap.org/" + 

      tile.levelOfDetail + "/" + 
      tile.x + "/" + 
      tile.y +".png"; 

} 

var omsTS = new Microsoft.Maps.TileSource({ uriConstructor: useZXY }); 

var omsTL = new Microsoft.Maps.TileLayer({ mercator: omsTS, opacity: 0.5 }); 
map.entities.push(omsTL) ; 
相關問題