簡體   English   中英

Google地球插件API - 如何獲取當前地圖比例?

[英]Google Earth Plugin API - How can I get the current map scale?

我有一個托管Google Earth Plugin實例的應用程序,我有興趣獲取當前的地圖比例並在我的應用程序中使用它。

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

有沒有辦法做到這一點?

如果沒有,我如何使用當前視圖計算當前比例?

我使用以下函數從Google地球插件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;
}

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

在這一點上,詢問屏幕上某一點的當前比例更有意義。 沒有直接的API,但您總是可以找到屏幕上任意兩點的lat / lng坐標,然后找到它們之間的距離。

GEView.hitTest可能是最簡單的方法。 您可以指定命中測試應以像素為單位的位置,或者指定插件大小的一小部分,偏離其DOM容器的邊緣。 例如,如果你想要靠近視圖中間的km /像素,你可以:取出插件的寬度和高度,將它們除以2,然后在每個方向上偏移10個像素,做最熱門的查詢,找到返回坐標之間的距離,然后最后除以10.你實際上如何偏移這些像素再次達到你想要測量刻度的位置(並注意如果你的命中測試錯過了地球,你會得到一個空的返回值)。

警告 :這是一個非常快速拋出的代碼(使用此線程的距離計算)。 請在使用之前徹底測試,但它應該如下所示:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM