Angular-google-maps: FitBounds, когда нет маркера + масштаб по умолчанию?

Созданный на 25 сент. 2018  ·  22Комментарии  ·  Источник: SebastianM/angular-google-maps

всем привет

Новый auto fitBounds великолепен, но кажется, что можно сделать два улучшения:

  • когда на карте нет маркеров, fitBounds приземляется посреди Тихого океана. Может вообще ничего не должно делать?
  • когда существует только 1 маркер, масштаб fitBounds будет максимальным, можно ли настроить fitBounds.maxZoom, который сработает только для одного маркера?

Обход возможен, но довольно грязный

Спасибо

important stale

Самый полезный комментарий

Мне кажется, это работает достаточно хорошо.

<agm-map [latitude]="locations[0].lat()" [longitude]="locations[0].lng()" [fitBounds]="locations.length > 1" [zoom]="14">
    <ng-template ngFor [ngForOf]="locations" let-location>
        <agm-marker [latitude]="location.lat()" [longitude]="location.lng()" [agmFitBounds]="true"></agm-marker>
    </ng-template>
</agm-map>

Все 22 Комментарий

Это влияет и на меня. Я установил координаты центра, используя latitude и longitude на карте agm, но когда fitBounds включен, он не центрируется по этим координатам (хотя маркера нет), вместо этого показан океан, как описано в @jscti.

+1 по предложению @jscti => когда на карте нет маркеров, fitBounds приземляется посреди Тихого океана. Может вообще ничего не должно делать?

Есть ли у кого-нибудь идеи, как можно добиться «ничего не делать», если на карте нет маркеров?

Также огромные поздравления (A ++) и спасибо за библиотеку, это потрясающе!

@jscti, не обходите », пожалуйста?

@ironstine

Когда маркера нет, я деактивирую fitBounds и принудительно увеличиваю широту / долготу / масштаб:

this.fitBounds = false;
setTimeout(() => {
    this.latitude = this.DEFAULT_LATITUDE;
    this.longitude = this.DEFAULT_LONGITUDE;
    this.zoom = this.DEFAULT_ZOOM_VAL;
});

Если есть один маркер, я принудительно увеличиваю масштаб до определенного значения

Мне кажется, это работает достаточно хорошо.

<agm-map [latitude]="locations[0].lat()" [longitude]="locations[0].lng()" [fitBounds]="locations.length > 1" [zoom]="14">
    <ng-template ngFor [ngForOf]="locations" let-location>
        <agm-marker [latitude]="location.lat()" [longitude]="location.lng()" [agmFitBounds]="true"></agm-marker>
    </ng-template>
</agm-map>

Привет

У меня другая проблема: мое приложение берет у пользователя широту и долгое время, чтобы центрировать карту в начале. Затем, когда он начинает составлять поля, многие адреса геолокализируются и затем отмечаются на карте. Но это не работает с fitbound по следующим причинам:
1) если я не определяю fitbounds, карта правильно центрируется в местоположении пользователя; когда пользователь компилирует поля, маркеры добавляются, но карта не вписывается в границы;
2) если я определяю fitbounds как true, карта будет центрирована в центре Тихого океана; когда пользователь компилирует поля, маркеры добавляются, но карта уменьшается.

Любая помощь? это мой настоящий код

HTML:

<agm-map #agmMap [style.height.px]="utilsService.calculateMapHeight()" [zoom]="13" [streetViewControl]="false" [fitBounds]="true" [latitude]="genericConstants.lat" [longitude]="genericConstants.lng">
    <agm-marker *ngFor="let l of departuresMarkersList" [latitude]="l.lat" [longitude]="l.lng" [title]="l.name" [label]="l.name" [agmFitBounds]="true"></agm-marker>
    <agm-marker *ngFor="let l of destinationsMarkersList" [latitude]="l.lat" [longitude]="l.lng" [title]="l.name" [label]="l.name" [agmFitBounds]="true"></agm-marker>
    <agm-marker *ngIf="cardMarker !== undefined" [latitude]="cardMarker.lat" [longitude]="cardMarker.lng" [title]="cardMarker.name" [label]="cardMarker.name" [agmFitBounds]="true"></agm-marker>
</agm-map>

Ц:

this.utilsService.geoLocalize(fullAddress).then((landmark: Landmark) => {

    const serviceLandmark = new ServiceLandmark(null, type, landmark.lat, landmark.lng, null, null, fullAddress);
    if (type === 'departures') {

          if (this.reopenIndex === -1) {
            this.departuresMarkersList.push(serviceLandmark);
          } else {
            this.departuresMarkersList[this.reopenIndex] = serviceLandmark;
          }

    } else if (type === 'destinations') {

          if (this.reopenIndex === -1) {
            this.destinationsMarkersList.push(serviceLandmark);
          } else {
            this.destinationsMarkersList[this.reopenIndex] = serviceLandmark;
          }

    } else {
          this.cardMarker = serviceLandmark;
    }
}

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.

Легкий способ решения проблем.

  1. Итак, если на нем вообще ничего нет, где будет центрироваться карта?
  2. Это непросто, так как нам нужно управлять переключением с размещения области просмотра карты по центру на размещение по границам.

Привет, извините, я думаю, что мой последний комментарий прозвучал немного резковато.

Я считаю, что сейчас в этой теме есть три проблемы:

1. fitBounds активен, отметок нет

Проблема: для fitBounds установлено значение true, но маркеры не добавлены. Это приводит к тому, что карта центрируется в центре океана.

Я бы пошел с предложением OP: если маркер не существует (и fitBounds активен), карта не должна быть центрирована (например, ничего не делать в дополнение к поведению карт Google по умолчанию).

2. fitBounds активен, маркер один, зум максимальный

Проблема: если для параметра fitBounds установлено значение true и только один маркер, карта будет увеличена до максимального уровня.

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

3. fitBounds активен, маркеры добавляются после первоначального центрирования, карта уменьшается.

Проблема: когда fitBounds активен без начальных маркеров, карта центрируется по океану. Если после этого будут добавлены маркеры, карта будет только уменьшена, чтобы отобразить все маркеры.

Я не совсем уверен, что правильно понял это и что с этим делать. Можно ли было бы «просто выполнить действие fitBounds» после уменьшения масштаба, чтобы показать все маркеры? Это приведет к уменьшению масштаба карты для отображения всех маркеров и повторному увеличению для отображения _только_ маркеров.

Так держать!

Хорошо, что в первом случае означает «Ничего не делать»? Что это будет показывать?
Во втором случае понятно, как он должен выглядеть, но реализовать его сложно. Кроме того, нечасто использовать fitBounds только с одним элементом.

1- Карта не должна автоматически центрироваться, а просто оставаться на указанной широте / долготе.

«Кроме того, нечасто использовать fitBounds только с одним элементом».
=> Да, но когда маркеры поступают с сервера, вы не знаете, нужно ли вам отображать 0,1, n

Проблема в том, что вы не указываете заданную широту / долготу, когда есть fitBounds.

Кроме того, как будет вести себя maxZoom, когда есть несколько точек, и они расположены ближе друг к другу, чем позволяет maxZoom

Проблема в том, что вы не указываете заданную широту / долготу, когда есть fitBounds.

Почему нет ? Просто fitBounds это игнорирует. Но когда маркеров нет, возможно, be fitBounds должен автоматически отключаться и использовать lon / lat.
Это обходной путь, который я сделал вручную

Кроме того, как будет вести себя maxZoom, когда есть несколько точек, и они расположены ближе друг к другу, чем позволяет maxZoom

Мы говорили только о «единственном случае маркера. Я понимаю, что оба варианта не идеальны:

  • новое свойство "maxZoom", которое следует использовать только для 1 маркера, но если пользователи используют его для большего количества маркеров ... это их желание / проблема, и маркеры могут исчезнуть с карты
  • новый "maxZoomForSingleMarker", который будет использоваться, только когда есть 1 маркер

Мой обходной путь для всех этих случаев, когда НЕ использовать fitbound для всех этих конкретных случаев, и это довольно уродливо, когда вы смотрите на код, поэтому, возможно, Futboud мог бы хорошо справиться со всем этим изнутри, но, возможно, это просто какое-то "хорошее наличие "

проблема с maxZoom или maxZoomForSingleMarker заключается в том, что для fitBounds мы используем функцию Bounds.extend , которая строит LatLngBounds на основе количества точек LatLng. Эта функция не принимает уровень масштабирования, и переключиться с центра / масштабирования на границы и назад не очень просто.

Что касается предоставления центральной широты / долготы и fitBounds, это проблематично, потому что, например, она изменится, если центральная широта изменится, даже если fitBounds активны. В настоящее время мы не рекомендуем это делать.

Каково поведение карт Google по умолчанию, когда оно отображается без включения fitBounds? Я думаю, что это то, чего мы желаем, когда нет маркеров (и fitBounds верен). Это означало бы: просто игнорируйте fitBounds, если нет маркеров.

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

В гугле нет fitBounds, это все AGM.

Ммм ... я мог бы попробовать

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.

onMapReady (событие) {
this.mapReady = событие;
}

константные границы: LatLngBounds = new google.maps.LatLngBounds ();
for (const pol of this.polyLinePoints) {
bounds.extend (новый google.maps.LatLng (pol.lat, pol.lng));
}
this.mapReady.fitBounds (границы);

Я хотел поделиться обходным путем для проблемы 1 (центрирование карты в центре Тихого океана, когда fitBounds истинно и нет маркеров).

Ответ brianpkelley решает проблему в некотором смысле: карта ничего не делает (без панорамирования, без масштабирования), когда вы получаете новый пустой массив маркеров.

Однако, если вы хотите полностью сбросить карту в таком случае, вы можете сделать это следующим образом:

<ng-container *ngIf="markers.length > 0; else noMarkersTemplate">
    <agm-map [fitBounds]="true">
        <!-- Your markers here... -->
    </agm-map>
</ng-container>

<ng-template #noMarkersTemplate>
    <agm-map [latitude]="25" [longitude]="-81" [zoom]="4"></agm-map>
</ng-template>

Это центрирует карту в точке с широтой = 25, долготой = -81 и устанавливает масштаб на 4.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги