масштабирование ng-map по умолчанию слишком увеличено при использовании с zoom-to-include-markers =»true»

#javascript #angularjs #google-maps #angularjs-directive #ng-map

#javascript #angularjs #google-карты #angularjs-директива #ng-map

Вопрос:

Я пытаюсь использовать карты, и я сталкиваюсь с этим случаем, когда у меня есть только один маркер, а zoom-to-include-markers =»true», в результате карта слишком увеличена, независимо от того, как я устанавливаю атрибут масштабирования, результат выглядит следующим образом : введите описание изображения здесь

хотя я бы хотел, чтобы первый рендеринг выглядел примерно так :

введите описание изображения здесь

вот мой код :

 <ng-map
        ng-if="items"
        zoom="5"
        map-type-id="ROADMAP"
        pan-control="false"
        street-view-control="true"
        street-view-control-options="{position: 'RIGHT_BOTTOM'}"
        map-type-control="false"
        zoom-control="true"
        zoom-control-options="{style:'BIG', position: 'RIGHT_BOTTOM'}"
        scale-control="true"
        default-style="true"
        zoom-to-include-markers="true"
        class="map">

    <marker on-click="" data-ng-repeat="item in items" position="{{[item.latitude, item.longitude]}}">
    </marker>

</ng-map>
  

Я попытался настроить zoom атрибут, но он не повлиял на результат карты.

Обновить:

изменение масштаба с помощью функции setZoom () в js делает это, есть ли способ рассчитать подходящее масштабирование в соответствии со значениями, которые имеет карта?

Спасибо

Ответ №1:

Для случая одного маркера вы можете указать maxZoom и minZoom свойства для ограничения уровня масштабирования карты, который будет отображаться на карте.

Пример

В примере показано, как установить maxZoom maximum-zoom атрибут map директивы via:

 angular.module('mapApp', ['ngMap'])

  .controller('mapCntrl', function (NgMap, $scope) {
    $scope.items = [
      //{ id: 1, name: 'Oslo', latitude: 59.923043, longitude: 10.752839 },
      { id: 2, name: 'Stockholm', latitude: 59.339025, longitude: 18.065818 },
      //{ id: 3, name: 'Copenhagen', latitude: 55.675507, longitude: 12.574227 },
      //{ id: 4, name: 'Berlin', latitude: 52.521248, longitude: 13.399038 },
      //{ id: 5, name: 'Paris', latitude: 48.856127, longitude: 2.346525 }
    ];

    NgMap.getMap().then(function (map) {
      $scope.map = map;
    });

  });  
 <script src="https://code.angularjs.org/1.4.8/angular.js"></script>
	<script src="https://maps.googleapis.com/maps/api/js"></script>
	<script src="https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/scripts/ng-map.js"></script>
<div ng-app="mapApp" ng-controller="mapCntrl">

		<ng-map maximum-zoom="14" ng-if="items" zoom="5" map-type-id="ROADMAP" pan-control="false" street-view-control="true" street-view-control-options="{position: 'RIGHT_BOTTOM'}"
			map-type-control="false" zoom-control="true" zoom-control-options="{style:'BIG', position: 'RIGHT_BOTTOM'}" scale-control="true"
			default-style="true" zoom-to-include-markers="true"  class="map">

			<marker on-click="" data-ng-repeat="item in items" position="{{[item.latitude, item.longitude]}}">
			</marker>

		</ng-map>

</div>  

Обновить

Другим вариантом было бы заставить map установить уровень масштабирования, как только карта будет готова. Дело в том, что zoom-to-include-markers="true" задает область просмотра, которая, в свою очередь, устанавливает максимальное масштабирование в случае одного маркера. Это причина zoom="5" , по которой игнорируется.

В следующем примере показано, как установить уровень масштабирования с помощью zoom-to-include-markers="true" :

 NgMap.getMap().then(function (map) {
  map.setZoom(12);
});
  

ДЕМОНСТРАЦИЯ

 angular.module('mapApp', ['ngMap'])

  .controller('mapCntrl', function (NgMap, $scope) {
    $scope.items = [
      //{ id: 1, name: 'Oslo', latitude: 59.923043, longitude: 10.752839 },
      //{ id: 2, name: 'Stockholm', latitude: 59.339025, longitude: 18.065818 },
      //{ id: 3, name: 'Copenhagen', latitude: 55.675507, longitude: 12.574227 },
      //{ id: 4, name: 'Berlin', latitude: 52.521248, longitude: 13.399038 },
      { id: 5, name: 'Paris', latitude: 48.856127, longitude: 2.346525 }
    ];

    $scope.maxZoomForSinglePOI = 17;

    NgMap.getMap().then(function (map) {
      if(map.getZoom() > $scope.maxZoomForSinglePOI){
         map.setZoom($scope.maxZoomForSinglePOI);
      }
    });

  });  
 <script src="https://code.angularjs.org/1.4.8/angular.js"></script>
	<script src="https://maps.googleapis.com/maps/api/js"></script>
	<script src="https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/scripts/ng-map.js"></script>
<div ng-app="mapApp" ng-controller="mapCntrl">

		<ng-map ng-if="items" zoom="5" map-type-id="ROADMAP" pan-control="false" street-view-control="true" street-view-control-options="{position: 'RIGHT_BOTTOM'}"
			map-type-control="false" zoom-control="true" zoom-control-options="{style:'BIG', position: 'RIGHT_BOTTOM'}" scale-control="true"
			default-style="true" zoom-to-include-markers="true"  class="map">

			<marker on-click="" data-ng-repeat="item in items" position="{{[item.latitude, item.longitude]}}">
			</marker>

		</ng-map>

	</div>  

Комментарии:

1. это правильно, но максимальный масштаб не позволит пользователю масштабировать карту самостоятельно, что не является тем поведением, которое я ищу, как упоминалось в вопросе, это первый рендеринг окна, который я собираюсь исправить, но без добавления ограничений для пользователя.

2. хорошо, теперь мы синхронизированы @Вадим Гремячев, вернемся к моему вопросу о том, как рассчитать это масштабирование, которое я могу установить с помощью js? что оно не будет слишком увеличено?

3. @sisimh, что означает, что эта фраза точно не будет слишком увеличена ? Как я уже упоминал, для одного poi масштабирование будет установлено на максимальный уровень . Итак, в этом случае вы могли бы ввести let’ say max allowed zoom level , как показано в обновленном ответе (см. Вторую демонстрацию)

4. Я имею в виду, что он увеличен до уровня, когда карта пуста и ничего не показывает, как упоминалось ранее, что максимально допустимый уровень масштабирования не позволит пользователю масштабировать, и у меня есть динамические местоположения, я не могу сказать, какое максимальное масштабирование.

5. @sisimh, во втором примере (в разделе обновления) показан другой способ настройки уровня масштабирования