Как я могу увеличить GLatLngBounds (прямоугольник) на 10% в API карт Google? - PullRequest
2 голосов
/ 04 января 2011

У меня есть карта с кучей точек на ней, и я хочу увеличить масштаб так, чтобы все точки помещались на экране.Код для этого довольно прост:

var bounds = new GLatLngBounds();

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

zoomLevel = map.getBoundsZoomLevel(bounds);

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

Проблемаявляется то, что точки появляются прямо на краю экрана.Я хотел бы увеличить размер границ, скажем, на 10%.Я могу получить две точки из моего объекта границ, используя 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 и покончить с этим, но я хотел посмотреть, есть ли у кого-нибудь сначала какие-нибудь идеи.

Ответы [ 2 ]

3 голосов
/ 16 июня 2014

вот обновленный код с использованием текущей версии 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);
2 голосов
/ 13 января 2011

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

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