1

私はこのC#数学(私は推測しますか?)をPHPに移植しようとしてint mask = 1 << (i - 1); います:関数の完全なC#コードは次のとおりです:

/// <summary>
/// Converts tile XY coordinates into a QuadKey at a specified level of detail.
/// </summary>
/// <param name="tileX">Tile X coordinate.</param>
/// <param name="tileY">Tile Y coordinate.</param>
/// <param name="levelOfDetail">Level of detail, from 1 (lowest detail)
/// to 23 (highest detail).</param>
/// <returns>A string containing the QuadKey.</returns>
public static string TileXYToQuadKey(int tileX, int tileY, int levelOfDetail)
{
    StringBuilder quadKey = new StringBuilder();
    for (int i = levelOfDetail; i > 0; i--)
    {
        char digit = '0';
        int mask = 1 << (i - 1);
        if ((tileX & mask) != 0)
        {
            digit++;
        }
        if ((tileY & mask) != 0)
        {
            digit++;
            digit++;
        }
        quadKey.Append(digit);
    }
    return quadKey.ToString();
}

そして、これが私が最終的に得たPHPコードです:

<?php
/*
* PHP class for converting Mercator X, Y and Z
* coordinates to Bing Maps Quad tree key
* Ported from C# code from MSDN
* http://msdn.microsoft.com/en-us/library/bb259689.aspx
*
* Usage:
* mercatorQuadkey(z, x, y)
* Example:
* mercatorQuadkey(15, 5240, 12661)
*/
function mercatorQuadkey($z, $x, $y){
    for ($i = $levelOfDetail; $i > 0; $i--)
    {
        $digit = '0';
        $mask = 1 << ($i - 1);
        if ($tileX !== 0 && $mask !== 0)
        {
            $digit++;
        }
        if ($tileY !== 0 && $mask !== 0)
        {
            $digit++;
            $digit++;
        }
        $quadkey = $quadkey.$digit;
    }
    return $quadkey;
}
?>

誰か助けてもらえますか?LeafletでBingMapsを使用しようとしているので、これが必要ですが、見つけたすべてのプラグインには使用例がありません。ちなみに、C#については何も知りません。

4

1 に答える 1

0

いくつか問題があります。まず、コード内の参照の名前を変更せずに、PHP関数の変数の名前を変更したようです。元の変数名を元に戻します。

function mercatorQuadkey($tileX, $tileY, $levelOfDetail){

次に、のロジックif ((tileX & mask) != 0)はPHPに直接変換できます。&これは、論理積()ではなく、バイナリAND( )で&&あり、完全に異なるものです。

    if (($tileX & $mask) !== 0)
    {
        $digit++;
    }
    if (($tileY & $mask) !== 0)
    {
        $digit++;
        $digit++;
    }

これらの変更により、両方のコードが同じ結果を返します。

于 2013-01-21T15:17:15.833 に答える