Сама легенда о масштабе довольно неоднозначна, поскольку Google Планета Земля представляет собой глобус в 3D, и перспектива, очевидно, не является проекцией, сохраняющей расстояния (или даже отношения между расстояниями). Это не проблема, если смотреть прямо вниз и довольно близко к поверхности земли, но как только угол обзора изменится, земля ближе к камере будет иметь совсем другой масштаб, чем земля на горизонте.
В этот момент имеет смысл спросить о текущем масштабе в определенной точке экрана. Для этого нет прямого API, но вы всегда можете найти координаты широты / долготы для любых двух точек на экране, а затем найти расстояние между ними.
GEView.hitTest , вероятно, самый простой способ сделать это. Вы можете указать, где должен выполняться тест на попадание в пикселях или в виде доли от размера плагина, смещенного от краев его контейнера DOM. Так, например, если вы хотите получить км / пиксель около середины вида, вы можете: взять ширину и высоту плагина, разделить их на два, затем сместить в каждом направлении на 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;
}