尝试将此 C# 数学移植到 PHP:int 掩码 = 1 << (i - 1);


Trying to port this C# math to PHP: int mask = 1 << (i - 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;
}
?>

谁能帮忙?我需要这个,因为我正在尝试在传单中使用 Bing 地图,但我找到的所有插件都没有使用示例。顺便说一下,我对 C# 一无所知。

你有几个问题。首先,您似乎重命名了 PHP 函数中的变量,而没有重命名代码中的引用。 将原始变量名称放回原处:

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

其次,if ((tileX & mask) != 0)的逻辑可以直接转换为 PHP。 这是一个二进制 AND(& ),而不是逻辑 AND (&& ),它们是完全不同的东西:

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

通过这些更改,两个代码返回相同的结果:

  • C#: http://ideone.com/hHXEEj
  • PHP: http://ideone.com/oOydCg