2012-03-14 58 views
2

我有一個託管Google地球插件實例的應用程序,我很想獲取地圖的當前比例並將其用於我的應用程序。Google地球插件API - 如何獲取當前地圖比例?

我知道我可以使用GEOptions並設置縮放圖例可見性,但我想在我的應用程序中使用實際的縮放值,並且我找不到它的API。

有沒有辦法做到這一點?

如果不是,我怎樣才能計算當前的規模,使用也許當前視圖?

回答

3

由於Google地球是3D地球儀,透視圖顯然不是保留距離(甚至距離之間的比率)的投影,因此比例圖例本身非常模糊。當直視下來並且非常接近地球表面時,這並不是一個問題,但是一旦視圖傾斜,靠近攝像機的土地將具有與地平線上的土地完全不同的比例。

在這一點上,詢問屏幕上某個點的當前比例更有意義。這裏沒有直接的API,但你總是可以找到屏幕上任意兩點的緯度/經度座標,然後找到它們之間的距離。

GEView.hitTest可能是最簡單的方法。您可以指定點擊測試應該以像素爲單位進行還是作爲插件大小的一部分,從其DOM容器的邊緣偏移。例如,如果你需要在視圖中間附近的km /像素,你可以:取插件的寬度和高度,將它們除以2,然後在每個方向上偏移10個像素,執行hittest查詢,找到之間的距離,然後最後除以10.如何實際抵消這些像素,再次,直到你想要衡量的規模(並注意如果你的命中測試錯過了地球,你會得到一個空回報值)。

警告:這是一個非常迅速拋在一起的代碼位(使用從this thread計算的距離)。請在使用前的任何地方進行全面的測試,但它應該是這個樣子:

function getSomethingResemblingScale() { 
    var earthDiv = document.getElementById('map3d'); 
    var hw = earthDiv.offsetWidth/2; 
    var hh = earthDiv.offsetHeight/2; 
    var view = ge.getView(); 
    var hitTest1 = view.hitTest(hw - 5, ge.UNITS_PIXELS, hh, ge.UNITS_PIXELS, ge.HIT_TEST_TERRAIN); 
    var hitTest2 = view.hitTest(hw + 5, ge.UNITS_PIXELS, hh, ge.UNITS_PIXELS, ge.HIT_TEST_TERRAIN); 
    var dist = calcDistance(hitTest1.getLatitude(), hitTest1.getLongitude(), hitTest2.getLatitude(), hitTest2.getLongitude()); 
    console.log('scale: ' + (dist/10) + ' km/pixel'); 
} 

function calcDistance(lat1, lon1, lat2, lon2) { 
    var R = 6371; // Radius of the earth in km 
    var dLat = (lat2-lat1) * (Math.PI/180); 
    var dLon = (lon2-lon1) * (Math.PI/180); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(lat1*(Math.PI/180)) * Math.cos(lat2*(Math.PI/180)) * 
      Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; 
    return d; 
} 
5

我用下面的函數從谷歌地球插件API得到近似規模。這是根據攝像機的高度來計算的。地球的傾斜,平移等不會影響返回的值。這是一個簡單的功能,如果您只需要對攝像機和地面之間的實際地圖比例尺進行大致的瞭解即可。即使照相機向地平線傾斜,這仍將使用計算,就好像相機正在向下看。

當攝像機傾斜時,沒有可以計算的單一比例尺,因爲比例尺在可見地圖上的任何給定點處發生變化。距離上的兩個點在屏幕上的每個像素的距離與在相機附近的兩個點之間的距離不同。比例圖例實際上也是近似值,因爲距離僅在可見地圖的特定部分上準確。

function getScale() { 
    var camera = ge.getView().copyAsCamera(ge.ALTITUDE_RELATIVE_TO_GROUND), 
     eyeAlt, 
     scale; 
    eyeAlt = camera.getAltitude(); 

    scale = Math.round(eyeAlt * 10.5); 
    return scale; 
} 
+0

你能解釋一下10.5從哪裏來? – luke 2013-03-08 16:04:56

+0

10.5是我發現提供了一個粗略的翻譯之間的眼睛高度和地圖比例的多位值。在將各種GE視圖與支持精確比例尺的2D地圖上的地圖比例進行比較之後,選擇了該數字。這決不會提供準確的比例。我們使用它作爲每次地圖視圖更改時計算MIL-STD-2525符號系統的「足夠好」的比例。此計算避免了像素到距離計算的陷阱,這些計算可能會在不同的屏幕分辨率下發生急劇變化。無論地圖如何平鋪,旋轉等,它都可以工作。 – Eric 2014-10-02 21:24:55

相關問題