Есть ли способ установить уровень масштабирования статических карт Google в зависимости от наличия изображений? - PullRequest
4 голосов
/ 15 июля 2011

Я использую статические карты в своей рабочей среде для клиентов. Мне нравится уровень масштабирования 17 (0 для всей земли, 21 для ближайшего возможного увеличения), но в зависимости от того, откуда находится изображение, Google может не иметь изображений, доступных при уровне масштабирования 17. Способ , чтобы сказать API Карт, чтобы динамически выбирать максимально возможное увеличение, скажем, 17? Я не видел способа сделать это, но я ценю любые предложения.

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

Насколько я знаю, статические карты должны иметь масштаб, установленный в строке запроса URL, что-то вроде

&zoom=17 или &z=17

Если вы используете нестатическую карту, вы можете легко найти и / или установить максимальное увеличение:

V2: http://googlegeodevelopers.blogspot.com/2009/06/how-low-can-you-go-introducing.html

v3: http://code.google.com/apis/maps/documentation/javascript/services.html#MaxZoom

Учитывая, что вы используете static, я думаю, у вас есть два варианта:

  1. не устанавливайте масштабирование по URL-запросу и позволяйте Google Maps определять «лучший» уровень масштабирования.
  2. установите масштаб 17 или что-то еще менее увеличенное (14 или 15), а затем разрешите пользователю увеличивать масштаб по ссылке, которая обновляет карту с другой строкой URL. (Вы должны сделать это с помощью JavaScript)

EDIT

Вот один из способов реализации js для увеличения. (Мне было интересно и взломано это вместе. Я уверен, что есть лучший / более элегантный способ)

HTML

<img src="http://maps.googleapis.com/maps/api/staticmap?center=55.516192,-87.39624&size=400x400&maptype=satellite&sensor=false&zoom=12" />

<input type="submit" id="in" value="Zoom in" />
<input type="submit" id="out" value="Zoom out" />

Убедитесь, что уровень масштабирования находится в конце строки запроса.

JS

$('#in').click(function(){
    var map = $('img').attr('src');
    var zoomPat = /(.+)(zoom=)([\d]*)/;
    var zoomLevel = map.match(zoomPat);
    var zoomLevelNum = Number(zoomLevel[3]); 

    if(zoomLevelNum == 21){
       alert('Maximum level reached');
    } 
    else{    
    var newZoom = zoomLevel[1] + zoomLevel[2] + (zoomLevelNum + 1);
    $('img').attr('src', newZoom);           
    } 

});

$('#out').click(function(){
    var map = $('img').attr('src');
    var zoomPat = /(.+)(zoom=)([\d]*)/;
    var zoomLevel = map.match(zoomPat);
    var zoomLevelNum = Number(zoomLevel[3]); 

    if(zoomLevelNum == 0){
       alert('Minimum level reached');
    } 
    else{    
    var newZoom = zoomLevel[1] + zoomLevel[2] + (zoomLevelNum - 1);
    $('img').attr('src', newZoom);           
    } 

});

http://jsfiddle.net/jasongennaro/FFTKG/2/

2 голосов
/ 01 сентября 2017

Сначала я хочу СПАСИБО Джейсону Дженнаро за удивительную идею с его альтернативой JS! К сожалению, эта идея предполагает, что на каждой карте установлен уровень масштабирования. Если, как и в моем случае, я позволил Google (sic) самому регулировать размер карты, я придумал модификацию / дополнение к коду Джейсона. Если вы хотите использовать его идею, но хотите, чтобы карты имели правильный размер около 2 местоположений, используя широту / длину каждого местоположения, используя приведенный ниже код для вычисления расстояния, вы можете оценить уровень масштабирования, чтобы добавить к строке. Эти расстояния несколько оценены с помощью большого количества испытаний. Я установил и протестировал этот код. Работает отлично. Наслаждайтесь.

function tom_distance2($lat1, $lng1, $lat2, $lng2, $miles = true)
{
  $pi80 = M_PI / 180;
  $lat1 *= $pi80;
  $lng1 *= $pi80;
  $lat2 *= $pi80;
  $lng2 *= $pi80;

  $r = 6372.797; // mean radius of Earth in km
  $dlat = $lat2 - $lat1;
  $dlng = $lng2 - $lng1;
  $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
  $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
  $km = $r * $c;
  $di9 = round(($km * 0.621371192));
  if ($di9 >= "5000") {$tom98 = "1"; // zoom level
  } else if ($di9 >= "4000") {$tom98 = "2";
  } else if ($di9 >= "1500") {$tom98 = "3";
  } else if ($di9 >= "800") {$tom98 = "4";
  } else if ($di9 >= "400") {$tom98 = "5";
  } else if ($di9 >= "180") {$tom98 = "6";
  } else if ($di9 >= "100") {$tom98 = "7";
  } else if ($di9 >= "0") {$tom98 = "10";
  } else {$tom98 = "8";} // just in case :)
  return $tom98;
}

Вызовите эту функцию с помощью ...

$td2 = "&amp;zoom=" . tom_distance2($tlat1, $tlong1, $tlat2, $tlong2, 1);

p.s. Добавьте $ td2 в конец вашей исходной строки карты. Простите имена переменных. Иногда они имеют смысл :) Это PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...