Google Maps v3 — Как центрировать, используя адрес при инициализации?

#javascript #google-maps-api-3

#javascript #google-maps-api-3

Вопрос:

Используя Google Maps API v3, есть ли способ установить центр карты при инициализации? У меня есть обходной путь с использованием этого кода:

 var geocoder;
  var map;
  function initialize() {
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    codeAddress('germany');
  }

  function codeAddress(address) {
    geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        map.setCenter(results[0].geometry.location);
        var marker = new google.maps.Marker({
            map: map,
            position: results[0].geometry.location
        });
      }
    });
  }
  

Единственная проблема заключается в том, что при инициализации он центрирует его на «latlng» на долю секунды. Я не могу понять, как установить центр в «myOptions». Я думал, что мог бы вернуть «результаты [0].geometry.location» из функции codeAddress и передать его в myOptions, но это не работает.

Спасибо за любую помощь.

Обновление Поскольку я не могу полностью удалить «center», мне интересно, есть ли способ передать адрес в параметры.

Из Google API:

Чтобы инициализировать карту, мы сначала создаем объект Map options, содержащий переменные инициализации карты. Этот объект не создается; вместо этого он создается как объектный литерал. Для каждой карты требуется два параметра: центрировать и масштабировать.

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

1. Еще один хороший пример использования geocoder в Gist: gist.github.com/mahedi2014/a71e1bbcbd69d4a9d491b0f289894d2d

Ответ №1:

Ну, простым решением может быть инициализация карты в вашей функции codeAddress:

 var geocoder, map;

function codeAddress(address) {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode({
        'address': address
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var myOptions = {
                zoom: 8,
                center: results[0].geometry.location,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            }
            map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

            var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });
        }
    });
}
  

Это должно решить проблему.

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

1. Я продолжал пытаться включить функцию геокодирования в функцию инициализации… но на самом деле это работает наоборот. Спасибо!

2. Я знаю, что это есть в документах, но что случилось с initMap? Как мне отказаться от этого сейчас?

Ответ №2:

Это удивительный ответ, который действительно помог мне продвинуться очень далеко. Единственная проблема сейчас заключается в том, что setCenter это больше недопустимо в JavaScript API. Вот мой пример использования fitBounds функций ES6 arrow для доступа к this ссылке на угловой компонент Google map и, наконец, реализации ngOnChanges для прослушивания изменений в текстовом поле адреса и соответствующего повторного отображения карты.

     ngOnChanges(changes: SimpleChanges) {
        const newFormattedAddress = changes['formattedAddress']?.currentValue;
        if (!newFormattedAddress) {
            return;
        }

        // if we received an update to the formattedAddress from the search box
        const geocoder = new google.maps.Geocoder();
        geocoder.geocode(
            {
                address: newFormattedAddress
            },
            (results: GeocoderResult[], status: GeocoderStatus) => {
                if (status === GeocoderStatus.OK amp;amp; results.length > 0) {
                    const firstResult = results[0].geometry;
                    const bounds = new google.maps.LatLngBounds();

                    if (firstResult.viewport) {
                        // Only geocodes have viewport.
                        bounds.union(firstResult.viewport);
                    } else {
                        bounds.extend(firstResult.location);
                    }

                    this.map.fitBounds(bounds);
                }
            }
        );
    }
  

Внешние ссылки и оценка fitBounds кода: https://kevinkreuzer.medium.com/how-to-implement-an-address-search-with-angular-and-google-maps-32a2df09f8e9

kevinkreuzer.medium.com - Функция автозаполнения адреса Google с использованием Angular