2012-06-12 3 views
0

Я пытаюсь написать скрипт на PHP, который будет принимать четырехъядерные карты Bing, а затем вернуть уровень масштабирования, координату x и координату y, чтобы я мог использовать свои собственные карты. Я основан мой код от C# пример кода, представленной Microsoft в качестве такого here:Как преобразовать четырехъядерные карты Bing в уровень масштабирования, координату x и координату y с помощью PHP?

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 Zoom: 18

Может ли кто-нибудь пролить свет на то, что я делаю неправильно? Я искал все вокруг и не могу найти какой-либо другой пример кода для изучения! Спасибо всем!

ответ

0

В моем коде есть ошибки, которые я должен был видеть.

$zoom = count($quadkey); 

Неверно и подсчитывает количество $ quadkeys, а не длину строки.

$zoom = strlen($quadkey); 

Кроме того, URL-адрес должен быть создан за пределами цикла for, чуть ниже него. Я разместил обновленный код ниже, если кто-то еще нуждается в скрипте PHP для преобразования четырехъядерных карт Bing в координаты.

$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

С Bing Ajax 7, QuadKey в не только пункта при условии, что также обеспечивает х, у и levelOfDetail, a.k.a Zoom.

Пока я не заметил это, я тоже думал о преобразовании на стороне сервера, но он доступен вам в javascript.

Bing карты поставляется с х, у, г, которые могут быть использованы для OSM веб-запросов непосредственно:

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) ; 
Смежные вопросы