Matej Mejak
Matej Mejak

Reputation: 69

Angular google maps (AGM) autocomplete

I'm using angular google maps (AGM) to find addresses. Now I would like that when a person choose and address it fills the inputs. Where can I find the single address element names like street, str. number, postal code, etc. to bound the data to the input field?

Upvotes: 3

Views: 16153

Answers (2)

Flavio Marques
Flavio Marques

Reputation: 79

try this:

<ion-searchbar #searchbar [hidden]="!isSearchbarOpened" [showCancelButton]="true" (search)="onSearch($event)"
  (ionCancel)="isSearchbarOpened = false" (ionBlur)="isSearchbarOpened = false" autocorrect="off" autocapitalize="off"
  spellcheck="off" placeholder="Buscar por endereço">
</ion-searchbar>



@ViewChild('searchbar', { read: ElementRef }) public searchbarElement: ElementRef;



...



// place_changed and geocoding 
this.mapsAPILoader.load().then(() => {

  const searchInput = this.searchbarElement.nativeElement.querySelector('.searchbar-input');

  const autocomplete = new google.maps.places.Autocomplete(searchInput, {
    // types: ['address']
  });

  autocomplete.addListener('place_changed', () => {
    this.ngZone.run(() => {
      const place: google.maps.places.PlaceResult == autocomplete.getPlace();

      if (place.geometry === undefined || place.geometry === null) {
        console.log('place.geometry undefined');
        return;
      }

      this.zoom = 15;
      this.getAddress(place);
      this.isSearchbarOpened = false;
    });
  });
});

I'm using the ion-searchbar from ionic 4.

getAddress(place: Object) {
    this.formatted_address = place['formatted_address'];
    const location = place['geometry']['location'];
    // this.lat = location.lat();
    // this.lng = location.lng();
    console.log(place);

    this.lat = location.lat();
    this.lng = location.lng();

    console.log('formatted_address:', this.formatted_address);
    console.log('Address Object', place);
    this.geocode();

}


geocode() {
  this.placesService.newPlace.lat = this.lat;
  this.placesService.newPlace.lng = this.lng;

  const geocoder = new google.maps.Geocoder();

  const latlng = new google.maps.LatLng(this.lat, this.lng);

  geocoder.geocode({ 'location': latlng }, (results, status) => {
  if (status === google.maps.GeocoderStatus.OK) {

    if (results[0]) {
      // console.log('Location: ' + results[0].formatted_address);
      let houseNumber = '';
      let streetName = '';
      let neighborhood = '';
      let cityName = '';
      let stateName = '';
      let countryName = '';
      let shortAddress = '';
      let zipCode = '';

      // console.log(results[0].address_components.length);
      console.log(results[0].address_components);

      if (results[0].address_components.length === 3) {

        if (results[0].address_components[0].long_name !== null) {
          cityName = results[0].address_components[0].long_name;
        }

        if (results[0].address_components[1].short_name) {
          stateName = results[0].address_components[1].short_name;
        }

        if (results[0].address_components[2].short_name !== null) {
          countryName = results[0].address_components[2].short_name;
        }
      }

      if (results[0].address_components.length === 4) {

        if (results[0].address_components[0].long_name !== null) {
          streetName = results[0].address_components[0].long_name;
        }

        if (results[0].address_components[1].long_name !== null) {
          cityName = results[0].address_components[1].long_name;
        }

        if (results[0].address_components[2].short_name) {
          stateName = results[0].address_components[2].short_name;
        }

        if (results[0].address_components[3].short_name !== null) {
          countryName = results[0].address_components[3].short_name;
        }
      }

      if (results[0].address_components.length === 5) {

        if (results[0].address_components[0].long_name !== null) {
          streetName = results[0].address_components[0].long_name;
        }

        if (results[0].address_components[1].long_name !== null) {
          cityName = results[0].address_components[1].long_name;
        }

        if (results[0].address_components[2].short_name !== null) {
          stateName = results[0].address_components[2].short_name;
        }

        if (results[0].address_components[3].short_name !== null) {
          countryName = results[0].address_components[3].short_name;
        }

        if (results[0].address_components[4].short_name !== null) {
          zipCode = results[0].address_components[4].short_name;
        }

      }

      if (results[0].address_components.length === 6) {

        if (results[0].address_components[0].long_name !== null) {
          houseNumber = results[0].address_components[0].long_name;
        }

        if (results[0].address_components[1].long_name !== null) {
          streetName = results[0].address_components[1].long_name;
        }

        if (results[0].address_components[2].long_name !== null) {
          cityName = results[0].address_components[2].long_name;
        }

        if (results[0].address_components[3].short_name) {
          stateName = results[0].address_components[3].short_name;
        }

        if (results[0].address_components[4].short_name !== null) {
          countryName = results[0].address_components[4].short_name;
        }
      }

      if (results[0].address_components.length === 7) {

        if (results[0].address_components[0].long_name !== null) {
          houseNumber = results[0].address_components[0].long_name;
        }

        if (results[0].address_components[1].long_name !== null) {
          streetName = results[0].address_components[1].long_name;
        }

        if (results[0].address_components[2].long_name !== null) {
          neighborhood = results[0].address_components[2].long_name;
        }

        if (results[0].address_components[3].long_name !== null) {
          cityName = results[0].address_components[3].long_name;
        }

        if (results[0].address_components[4].short_name) {
          stateName = results[0].address_components[4].short_name;
        }

        if (results[0].address_components[5].short_name !== null) {
          countryName = results[0].address_components[5].short_name;
        }
      }




      if (cityName !== '') {
        shortAddress = cityName;
      }
      if (cityName !== '' && stateName !== '') {
        shortAddress += '-' + stateName;
      }
      if (shortAddress !== '' && countryName !== '') {
        shortAddress += ', ' + countryName;
      }
      if (cityName === '' && stateName === '' && countryName === '') {
        shortAddress = '???';
      }

      // console.log('shortAddress:', shortAddress);


      // Set addresses
      this.shortAddress = shortAddress;
      this.fullAddress = results[0].formatted_address;

      const newPlace = {
        lat: this.lat,
        lng: this.lng,
        shortAddress: this.shortAddress,
        fullAddress: this.fullAddress
      };

      this.events.publish('location:changed', newPlace);
    }
  }
});

Upvotes: 0

Bettaibi Nidhal
Bettaibi Nidhal

Reputation: 215

We can find some details using google maps api, follow the steps.

step 1: Import MapsAPILoader to your component.

import { MapsAPILoader } from '@agm/core';
@ViewChild('search') searchElementRef: ElementRef;

step 2: Implement findAdress() method and call it in your ngAfterViewInit() method.

findAdress(){
 this.mapsAPILoader.load().then(() => {
      let autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement);
      autocomplete.addListener("place_changed", () => {
        this.ngZone.run(() => {
          // some details
          let place: google.maps.places.PlaceResult = autocomplete.getPlace();
          this.address = place.formatted_address;
          this.web_site = place.website;
          this.name = place.name;
          this.zip_code = place.address_components[place.address_components.length - 1].long_name;
          //set latitude, longitude and zoom
          this.latitude = place.geometry.location.lat();
          this.longitude = place.geometry.location.lng();
          this.zoom = 12;
        });
      });
    });
}

step 3: Make some changes in your html file.

  <input #search autocorrect="off" autocapitalize="off" spellcheck="off" type="text" class="form-control">

step 4: don't forget to add places library in your AgmCoreModule configuration.

    import { AgmCoreModule } from '@agm/core';


   imports: [
      AgmCoreModule.forRoot({
          apiKey: 'your_key',
          libraries: ["places"]
        })
]

Upvotes: 8

Related Questions