如何使用 PHP 将 Bing 地图四键转换为缩放级别、x 坐标和 y 坐标?
Posted
技术标签:
【中文标题】如何使用 PHP 将 Bing 地图四键转换为缩放级别、x 坐标和 y 坐标?【英文标题】:How can I convert a Bing maps quadkey into zoom level, x-coordinate and y-coordinate using PHP? 【发布时间】:2012-06-12 08:42:51 【问题描述】:我正在尝试用 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坐标:134926
Y坐标:86121
放大:18
任何人都能够阐明我做错了什么吗?我一直在四处寻找,找不到任何其他示例代码来检查!谢谢大家!
【问题讨论】:
【参考方案1】:我的代码中有我应该看到的错误。
$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";
【讨论】:
【参考方案2】:Bing Ajax 7 不仅提供了 QuadKey,它还提供了 x、y 和 levelOfDetail,也就是 Zoom。
在我发现这一点之前,我也考虑过服务器端转换,但你可以在 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) ;
【讨论】:
以上是关于如何使用 PHP 将 Bing 地图四键转换为缩放级别、x 坐标和 y 坐标?的主要内容,如果未能解决你的问题,请参考以下文章