![](/img/trans.png)
[英]how to divide list of points into lists based on each point's X-coordinate or Y-coordinate?
[英]How can I convert a Bing maps quadkey into zoom level, x-coordinate and y-coordinate using PHP?
我正在嘗試用PHP編寫一個腳本,該腳本將接受Bing地圖四鍵,然后返回縮放級別,x坐標和y坐標,以便可以使用自己的地圖。 我根據我的代碼關閉微軟提供這樣的C#示例代碼在這里 :
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
有人能闡明我做錯了什么嗎? 我一直在四處尋找,找不到其他示例代碼來檢查! 謝謝大家!
我的代碼中有我應該看到的錯誤。
$zoom = count($quadkey);
是錯誤的,它計算$ quadkeys的數目,而不是字符串的長度。
$zoom = strlen($quadkey);
同樣,URL應該在for循環的外部,緊靠其下方生成。 如果其他任何人需要將Bing maps四鍵轉換為坐標的PHP腳本,則將更新后的代碼放在下面。
$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";
使用Bing Ajax 7時,不僅提供了QuadKey,還提供了x,y和levelOfDetail,也就是Zoom。
在我發現這一點之前,我還考慮過服務器端轉換,但是您可以在javascript中使用它。
必應地圖隨附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) ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.