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

私のコードには、私が見るべきだった間違いがあります。

$zoom = count($quadkey);

間違っており、文字列の長さではなく、$quadkeysの数をカウントします。

$zoom = strlen($quadkey);

また、URLは、forループの外側、そのすぐ下に生成する必要があります。Bingマップのクワッドキーを座標に変換するための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";
于 2012-06-13T01:52:34.250 に答える
0

Bing Ajax 7では、QuadKeyが提供される唯一のアイテムではなく、x、y、およびlevelOfDetail、別名Zoomも提供します。

これを見つけるまで、私もサーバー側の変換について考えましたが、javascriptで利用できます。

Bingマップにはx、y、zが付属しており、OSMWebリクエストに直接使用できます。

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 に答える