尝试将此 C# 数学移植到 PHP:int 掩码 = 1 << (i - 1);
本文关键字:掩码 int PHP | 更新日期: 2023-09-27 17:55:13
我正在尝试将这个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