0

我正在尝试用 PHP 编写一个脚本,该脚本将接受 Bing 地图四键,然后返回缩放级别、x 坐标和 y 坐标,以便我可以使用自己的地图。我的代码基于 Microsoft 在此处提供的 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

任何人都可以阐明我做错了什么吗?我一直在四处寻找,找不到任何其他示例代码来检查!谢谢大家!

4

2 回答 2

0

在 Bing Ajax 7 中,QuadKey 不仅提供了唯一的项目,还提供了 x、y 和 levelOfDetail,即 Zoom。

在我发现这一点之前,我也考虑过服务器端转换,但它可以在 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) ;
于 2014-03-19T08:14:18.067 回答
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";
于 2012-06-13T01:52:34.250 回答