2011-01-04 3 views
2

У меня есть карта с кучей точек на ней, и я хочу масштабировать так, чтобы все точки были на экране. Код для этого довольно прост:Как увеличить GLatLngBounds (прямоугольник) на 10% в API Google Maps?

var bounds = new GLatLngBounds(); 

for (var n = 0; n < points.length; n++) { 
    bounds.extend(points[n].getLatLng()); 
} 

zoomLevel = map.getBoundsZoomLevel(bounds); 

Чтобы получить уровень масштабирования, вы должны пройти в объекте bounds. Чтобы создать объект bounds, вы либо даете ему две точки, как прямоугольник, либо передаете ему точку, и она увеличивается в размере (если необходимо), чтобы включить точку, которую я делаю выше.

Проблема в том, что точки отображаются прямо на краю экрана. Я бы хотел увеличить размер границ, скажем, на 10%. Я могу получить две точки из моего объекта bound, используя bounds.getNorthEast(); и bounds.getSouthWest();, но увеличить их на 10% от размера границ окажется непростым. Я попробовал toSpan() на границах, который дает вам LatLng, содержащий размер границ, а затем сделал 10% Lat и Lng и добавил его в мои координаты. Однако, похоже, это не сработало. Мой код для этой попытки был:

var pointNorthEast = bounds.getNorthEast(); 
var pointSouthWest = bounds.getSouthWest(); 

var latAdjustment = ((pointNorthEast.lat() - pointSouthWest.lat()) * increasePercentage)/2; 
var lngAdjustment = ((pointNorthEast.lng() - pointSouthWest.lng()) * increasePercentage)/2; 


var newPointNorthEast = new GLatLng(pointNorthEast.lat() + latAdjustment, pointNorthEast.lng() + lngAdjustment); 
var newPointSouthWest = new GLatLng(pointSouthWest.lat() - latAdjustment, pointSouthWest.lng() - lngAdjustment); 


bounds = new GLatLngBounds(); 

bounds.extend(newPointNorthEast); 
bounds.extend(newPointSouthWest); 

По моим расчетам, границы должны быть затем 10% больше. Я не уверен, что он представляет собой прямоугольник или хранит любые данные координат или нет, поэтому я не рискнул, добавив/вычитая половину увеличения с каждой стороны, чтобы поддерживать его в центре.

Однако, пытаясь использовать различные значения увеличения, такие как 1.1 или 1.5, похоже, не имеет значения.

Поэтому я либо поднял свою логику, свою математику, либо тот факт, что zoomLevel не является гладкой шкалой, мешает моим попыткам.

Я думаю, что мне, возможно, нужно было сделать zoomLevel -= 1 и покончить с этим, но я хотел посмотреть, есть ли у кого-нибудь идеи в первую очередь.

+0

любые обновления по этому вопросу? –

+1

Было 3 года назад, я даже не могу вспомнить, что у меня было на ужин вчера вечером ... – NibblyPig

+0

Вот что я подумал, но я спросил на всякий случай: P –

ответ

2

Проблема заключается в вашей математике, вот как нужно рассчитать корректировки:

var latAdjustment = ((pointNorthEast.lat() - pointSouthWest.lat()) * (increasePercentage - 1); 
var lngAdjustment = ((pointNorthEast.lng() - pointSouthWest.lng()) * (increasePercentage - 1); 
3

здесь обновляется код, используя текущую версию API (v3.0):

var increasePercentage = 1.10; //10% 
var pointSouthWest = mb.getSouthWest(); 
var latAdjustment = (pointNorthEast.lat() - pointSouthWest.lat()) * (increasePercentage - 1); 
var lngAdjustment = (pointNorthEast.lng() - pointSouthWest.lng()) * (increasePercentage - 1); 
var newPointNorthEast = new google.maps.LatLng(pointNorthEast.lat() + latAdjustment, pointNorthEast.lng() + lngAdjustment); 
var newPointSouthWest = new google.maps.LatLng(pointSouthWest.lat() - latAdjustment, pointSouthWest.lng() - lngAdjustment); 

bounds = new google.maps.LatLngBounds(); 
bounds.extend(newPointNorthEast); 
bounds.extend(newPointSouthWest); 
map.fitBounds(bounds); 
Смежные вопросы