Google Maps API: расчет центра/масштаба полилинии

У меня есть наложение, которое динамически генерируется из пользовательских данных, поэтому мне нужно знать, как найти центр этого наложения.

В настоящее время я просто использую первые координаты из наложения, но на самом деле это не центр наложения. Поэтому, когда я загружаю карту, она не центрируется на оверлее.

Есть ли у кого-нибудь хороший способ центрирования карты на оверлее путем вычисления центра, а не его жесткого кодирования?

var latlng = new google.maps.LatLng(38.269239, -122.276010);
    var myOptions = {
        zoom: 15,//Calculate this somehow?
        center: latlng,// Calculate value from array of coordinates?
        mapTypeId: google.maps.MapTypeId.HYBRID
    };

person Nic Hubbard    schedule 23.07.2010    source источник


Ответы (2)


Если у вас есть список координат, вы можете просмотреть их и добавить в LatLngBounds. Вот пример для V3 API, но концепция V2 аналогична:

var bounds = new google.maps.LatLngBounds();
for (var i = 0; i < coordinates.length; i++) {
  bounds.extend(coordinates[i]);
}

После этого вы можете получить центр с помощью:

bounds.getCenter();

Или, альтернативно, вы можете вызвать map.fitBounds() напрямую, что центрирует карту вокруг центра границ и настраивает масштаб, чтобы все границы точно вписывались в окно просмотра.

map.fitBounds(bounds);
person tux21b    schedule 23.07.2010
comment
Можно ли использовать этот же метод для расчета увеличения? - person Nic Hubbard; 23.07.2010
comment
Просто используйте любое положение и уровень масштабирования, которые вы хотите, во время инициализации, а затем вызовите map.fitBounds(bounds);, как описано. Если вы хотите установить максимальный уровень масштабирования, вам необходимо временно зарегистрировать zoomChangeBoundsListener. Скажите, нужен ли вам пример и для этого. - person tux21b; 23.07.2010
comment
это работало нормально в V2 API. в V3 LatLngBounds должны получить эти 2 переменные в следующем порядке: SW и NE, как мы узнаем, что есть что? - person Andres SK; 21.09.2011

На основе @tux21b,

      var bounds = new google.maps.LatLngBounds();
      polyline.getPath().forEach(function(e){//can't do polyline.getPath()[i] because it's a MVCArray
          bounds.extend(e);
      })         
      _map.fitBounds(bounds);
person Anderson    schedule 21.08.2013