簡體   English   中英

如何使用PHP將Bing映射四鍵轉換為縮放級別,x坐標和y坐標?

[英]How can I convert a Bing maps quadkey into zoom level, x-coordinate and y-coordinate using PHP?

我正在嘗試用PHP編寫一個腳本,該腳本將接受Bing地圖四鍵,然后返回縮放級別,x坐標和y坐標,以便可以使用自己的地圖。 我根據我的代碼關閉微軟提供這樣的C#示例代碼在這里

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";
}

我正在使用的示例四鍵和預期結果如下:

四鍵: 120202111102203112 X坐標: 134926 Y坐標: 86121縮放: 18

有人能闡明我做錯了什么嗎? 我一直在四處尋找,找不到其他示例代碼來檢查! 謝謝大家!

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

$zoom = count($quadkey);

是錯誤的,它計算$ quadkeys的數目,而不是字符串的長度。

$zoom = strlen($quadkey);

同樣,URL應該在for循環的外部,緊靠其下方生成。 如果其他任何人需要將Bing maps四鍵轉換為坐標的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";

使用Bing Ajax 7時,不僅提供了QuadKey,還提供了x,y和levelOfDetail,也就是Zoom。

在我發現這一點之前,我還考慮過服務器端轉換,但是您可以在javascript中使用它。

必應地圖隨附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) ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM