我正在尝试用PHP编写一个接受Bing贴图四核的脚本,然后返回缩放级别,x坐标和y坐标,以便我可以使用自己的地图。我将我的代码基于Microsoft提供的C#示例代码here:
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-coord:134926
Y-coord:86121
缩放:18
是否有人能够阐明我做错了什么?我一直在四处寻找,找不到任何其他示例代码来检查!谢谢大家!
答案 0 :(得分: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";
答案 1 :(得分:0)
使用Bing Ajax 7,QuadKey不是唯一提供的项目,它还提供x,y和levelOfDetail,a.k.a缩放。
在我发现这一点之前,我也考虑过服务器端转换,但是你可以在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) ;