這篇文章主要為大家展示了“TE如何計算地圖的縮放級別”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“TE如何計算地圖的縮放級別”這篇文章吧。
創(chuàng)新互聯是專業(yè)的洛寧網站建設公司,洛寧接單;提供網站建設、成都網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行洛寧網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!
在二維地圖中,地圖是分級別顯示的,每個級別顯示的地圖要素并不完全相同,在TE的三維地圖中,地形數據也是分級別顯示的,但是,TE的API中并沒有提供當前視野是顯示到哪一個級別,只提供SGWorld.Terrain.Levels,獲取三維地形總共有多少級,可能是因為在三維的視野中,不同的地方可能顯示的地圖級別不一樣。
二維地圖的分級切片示例:
不過,在TE中提供了一個現成的工具,是用來計算TE中加載的矢量圖層,設置最優(yōu)的塊寬度,矢量按照此設置,能在TE中達到最優(yōu)的性能效果。
此功能是一個網頁,嵌入到TE中,通過分析其中的代碼,可以作為模糊的計算TE當前的縮放級別,下邊根據其中代碼進行簡要分析:
function init()
{
//在初始化中定位的塊寬度值,可以作為級別的指示,不過,下邊定義的編號順序要反過來,級別越高的塊寬度越小
realNumLevels = SGWorld.Terrain.Levels;
addLevel(22, "40075 " + SGLang.i18n("Text7"));
addLevel(21, "20037 " + SGLang.i18n("Text7"));
addLevel(20, "10018 " + SGLang.i18n("Text7"));
addLevel(19, "5009 " + SGLang.i18n("Text7"));
addLevel(18, "2504 " + SGLang.i18n("Text9"));
addLevel(17, "1252 " + SGLang.i18n("Text7"));
addLevel(16, "626 " + SGLang.i18n("Text10"));
addLevel(15, "313 " + SGLang.i18n("Text11"));
addLevel(14, "156 " + SGLang.i18n("Text7"));
addLevel(13, "78 " + SGLang.i18n("Text12"));
addLevel(12, "39 " + SGLang.i18n("Text13"));
addLevel(11, "19 " + SGLang.i18n("Text7"));
addLevel(10, "9783 " + SGLang.i18n("Text14"));
addLevel(9, "4891 " + SGLang.i18n("Text15"));
addLevel(8, "2445 " + SGLang.i18n("Text8"));
addLevel(7, "1222 " + SGLang.i18n("Text16"));
addLevel(6, "611 " + SGLang.i18n("Text17"));
addLevel(5, "305 " + SGLang.i18n("Text8"));
addLevel(4, "152 " + SGLang.i18n("Text18"));
addLevel(3, "76 " + SGLang.i18n("Text19"));
addLevel(2, "38 " + SGLang.i18n("Text8"));
addLevel(1, "19 " + SGLang.i18n("Text8"));
}
function getBestViewPoint() {
//獲得當前屏幕中心的空間坐標,當然視野不能夠指向天空
var worldPointMid = SGWorld.Window.CenterPixelToWorld();
if (worldPointMid.Type == 32) {
alert(SGLang.i18n("Text20"));
return null;
}
return worldPointMid.Position;
}
//根據位置,計算級別,這是里邊的關鍵函數,包含下邊的函數
function getPreferredLevel(viewPoint)
{
//計算當前視野的位置和屏幕中心點位置的距離
var DistCameraToTerrain = SGWorld.Navigate.GetPosition().DistanceTo(viewPoint);
//半程的真正寬度
var HalfRealWidth = DistCameraToTerrain * Math.tan((53.0 / 2.0) * Math.PI / 180.0);
var NumBlocksInViewWidth = 4;
//將塊寬度轉換為等級
var IdealBlockSize = HalfRealWidth * 2.0 / NumBlocksInViewWidth;
var blockLevel = BlockWidthToLevel(IdealBlockSize);
var LayerType = -1;
if (document.all["layertype"][0].checked)
LayerType = 0; // "points";
if (document.all["layertype"][1].checked)
LayerType = 1; //"lines";
if (document.all["layertype"][2].checked)
LayerType = 2; //"polygons";
if (LayerType == -1)
{
alert(SGLang.i18n("Text21"));
return -1;
}
else if (LayerType != 0)
blockLevel += 1;
blockLevel = Math.min(blockLevel, fakeNumLevels - 1);
return blockLevel;
}
//將塊寬度轉換為等級
function BlockWidthToLevel(blockWidth)
{
var numOfBlocksInLevel = blockWidth / bestLevelWidth;
var deltaFromBestLevel = Math.log(numOfBlocksInLevel) / Math.log(2.0);
var L1 = bestLevelWidth * Math.pow(2, Math.floor(deltaFromBestLevel));
var L2 = bestLevelWidth * Math.pow(2, Math.floor(deltaFromBestLevel + 0.5));
if (Math.abs(L1 - blockWidth) <= Math.abs(L2 - blockWidth))
deltaFromBestLevel = Math.floor(deltaFromBestLevel);
else
deltaFromBestLevel = Math.ceil(deltaFromBestLevel);
var blockLevel = Math.floor(fakeNumLevels - 1.0 - deltaFromBestLevel);
blockLevel = Math.max(0, Math.min(fakeNumLevels - 1, blockLevel));
return blockLevel;
}
地圖縮放級別的計算結果,可以幫助在地圖不同縮放的情況下,顯示不同地物或者其他信息。
以上是“TE如何計算地圖的縮放級別”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道!