Angular-google-maps: GoogleMapsAPIWrapper์™€ ํ•จ๊ป˜ Geocoder ์‚ฌ์šฉ

์— ๋งŒ๋“  2016๋…„ 10์›” 01์ผ  ยท  42์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: SebastianM/angular-google-maps

๋ฌธ์ œ #139์—์„œ getMap() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด google.maps ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ํ•จ์ˆ˜๋Š” GoogleMapsAPIWrapper์˜ getNativeMap() ํ•จ์ˆ˜๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์ž‘๋™ํ•˜๊ฒŒ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฝ์—ˆ์ง€๋งŒ GoogleMapsAPIWrapper ๋ฐ Geocoder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๋‚˜ ์˜ˆ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

import { Component, OnInit } from '@angular/core';
import { LocationService } from '../../core/location.service';
import { GoogleMapsAPIWrapper } from 'angular2-google-maps/core';

declare var google: any;

@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./test.component.css']
})
export class TestComponent implements OnInit {

  constructor(private wrapper: GoogleMapsAPIWrapper) {
    this.wrapper.getNativeMap().then((m) => {
      console.log("test");
    });

  }

  ngOnInit() {
    // var address = "1045 mission street san francisco";

    // var geocoder = new google.maps.Geocoder();

    // var result = "";

    // geocoder.geocode({ 'address': address }, (results, status) => {
    //   var latitude = results[0].geometry.location.lat();
    //   var longitude = results[0].geometry.location.lng();
    //   console.log("lat: " + latitude + ", long: " + longitude);
    // });
  }
}

์ง€๊ธˆ์€ console.log์—์„œ "test"๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ m ๋ณ€์ˆ˜๋Š” google.maps์™€ ๋™์ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด m.Geocoder()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ GoogleMapsAPIWrapper๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Angular 2 ์ง€์นจ์—์„œ๋Š” core.module์— ์„œ๋น„์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— core.module์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "sebm-google-map"์€ ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•˜๋ฏ€๋กœ AgmCoreModule์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜จ ๊ฒƒ ๊ฐ™์ง€๋งŒ GoogleMapsAPIWrapper๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

import {
    ModuleWithProviders, NgModule,
    Optional, SkipSelf
} from '@angular/core';

import { AgmCoreModule, GoogleMapsAPIWrapper } from 'angular2-google-maps/core';


import { FirebaseService, FirebaseServiceConfig } from './firebase.service';
import { LocationService } from './location.service';


@NgModule({
    imports: [AgmCoreModule.forRoot({apiKey: "blahblahapikey"}),],
    declarations: [],
    exports: [AgmCoreModule],
    providers: [FirebaseService, LocationService, GoogleMapsAPIWrapper]
})
export class CoreModule {

    constructor( @Optional() @SkipSelf() parentModule: CoreModule) {
        if (parentModule) {
            throw new Error(
                'CoreModule is already loaded. Import it in the AppModule only');
        }
    }

    static forRoot(config: FirebaseServiceConfig): ModuleWithProviders {
        return {
            ngModule: CoreModule,
            providers: [
                { provide: FirebaseServiceConfig, useValue: config }
            ]
        };
    }
}

PrimeNG์—์„œ GMap์„ ํ†ตํ•ด ์ž‘๋™ํ•˜๋„๋ก google.maps.Geocoder()๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋•Œ๋•Œ๋กœ google์ด ์ •์˜๋˜์ง€ ์•Š์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€์‹  Sebastian์˜ Google ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฑด ์–ด๋•Œ์š” -

import { Injectable, NgZone } from '@angular/core';
import { GoogleMapsAPIWrapper } from 'angular2-google-maps/core';
import { MapsAPILoader } from 'angular2-google-maps/core';
import { Observable, Observer } from 'rxjs';

declare var google: any;

@Injectable()
export class GMapsService extends GoogleMapsAPIWrapper{ 
    constructor(private __loader: MapsAPILoader, private __zone: NgZone) {
        super(__loader, __zone);
    }

    getLatLan(address: string) {
        console.log('Getting Address - ', address);
        let geocoder = new google.maps.Geocoder();
        return Observable.create(observer => {
            geocoder.geocode( { 'address': address}, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    observer.next(results[0].geometry.location);
                    observer.complete();
                } else {
                    console.log('Error - ', results, ' & Status - ', status);
                    observer.next({});
                    observer.complete();
                }
            });
        })
    }
}

๋ชจ๋“  42 ๋Œ“๊ธ€

Geocoder()๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ getNativeMap()์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

MapsAPILoader ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

this.mapsAPILoader.load().then(() => {
    console.log('google script loaded');
    var geocoder = new google.maps.Geocoder();
});

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ ์ง€๋„๋ฅผ ์–ป์œผ๋ ค๋ฉด TestComponent๋ฅผ Google ์ง€๋„ ๊ตฌ์„ฑ์š”์†Œ ๋‚ด๋ถ€์— ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<sebm-google-map [latitude]="lat" [longitude]="lng">
    <app-test></app-test>
</sebm-google-map>

TestComponent ๋‚ด๋ถ€์˜ GoogleMapsAPIWrapper ์ธ์Šคํ„ด์Šค๊ฐ€ SebmGoogleMap ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MapsAPILoader ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ์— ๋Œ€ํ•ด @gnujeremie thx. ์ˆ˜์ž…ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”? AgmCoreModule๊ณผ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ค์…จ๋‚˜์š”?

์•„๋‹ˆ์š”, AgmCoreModule์€ Google ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ๋ชจ๋“ˆ์—์„œ๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
๋‚ด ์„œ๋น„์Šค์—์„œ import { MapsAPILoader } from 'angular2-google-maps/core'; ์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๊ฑด ์–ด๋•Œ์š” -

import { Injectable, NgZone } from '@angular/core';
import { GoogleMapsAPIWrapper } from 'angular2-google-maps/core';
import { MapsAPILoader } from 'angular2-google-maps/core';
import { Observable, Observer } from 'rxjs';

declare var google: any;

@Injectable()
export class GMapsService extends GoogleMapsAPIWrapper{ 
    constructor(private __loader: MapsAPILoader, private __zone: NgZone) {
        super(__loader, __zone);
    }

    getLatLan(address: string) {
        console.log('Getting Address - ', address);
        let geocoder = new google.maps.Geocoder();
        return Observable.create(observer => {
            geocoder.geocode( { 'address': address}, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    observer.next(results[0].geometry.location);
                    observer.complete();
                } else {
                    console.log('Error - ', results, ' & Status - ', status);
                    observer.next({});
                    observer.complete();
                }
            });
        })
    }
}

@vintesh ๊ฐ€ ์ œ์‹œํ•œ ์†”๋ฃจ์…˜ ์™ธ์—๋„ NgZone ๋‚ด๋ถ€์˜ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ง€๋„๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

clickSearchAddress() {
        this._mapsService.getLatLan(this.model.address)
            .subscribe(
            result => {
                // needs to run inside zone to update the map
                this._zone.run(() => {
                    this.model.lat = result.lat();
                    this.model.lng = result.lng();
                });
            },
            error => console.log(error),
            () => console.log('Geocoding completed!')
            );
    }

์ง€์˜ค์ฝ”๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋‚ด ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

import { MapsAPILoader } from 'angular2-google-maps/core';
constructor(public mapsApiLoader: MapsAPILoader) {
    this.mapsApiLoader.load().then(() => {
      console.log('google script loaded');
      this.geocoder = new google.maps.Geocoder();
      console.log(this.geocoder);
    });

๋‘ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Cannot find name 'google'.
๊ทธ๋ฆฌ๊ณ 
rollup failed: 'MapsAPILoader' is not exported by node_modules/angular2-google-maps/core/index.js (imported by src/services/location.ts). For help fixing this error see https://github.com/rollup/rollup/wiki/Troubleshooting#name-is-not-exported-by-module

@slooker ์ƒ์„ฑ์ž ์„ ์–ธ ์ „์— declare var google: any; ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@gnujeremie ์ด๋Š” Google์˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ MapsAPILoader๊ฐ€ angular2-google-maps์—์„œ ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

@slooker ๋‚˜๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๊ณ  "node_modules/angular2-google-maps/core/index.js"๊ฐ€ MapsAPILoader๋ฅผ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— MapsAPILoader ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด "node_modules/angular2-google-maps/core/index.js" ํŒŒ์ผ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

var core_module_2 = require('./core.umd'); exports.MapsAPILoader = core_module_2.MapsAPILoader;

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ๋„ ํšจ๊ณผ๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ž‘์—… ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋‚ด ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋งˆ์ปค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์ขŒํ‘œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. GeoCoder๋Š” ์ƒ์„ฑ์ž์— ์ •์˜๋˜์–ด ์žˆ์ง€๋งŒ nginit ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

VinTesh, ๋‚˜์—ดํ•œ ์„œ๋น„์Šค์— Google์ด ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ‘œ์‹œ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ์„ค์ •ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”

๋™์ผํ•œ Google ์ •์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ œ์•ˆ?

"@agm/core"๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: "^1.0.0-beta.0"

๊ฐ์‚ฌ ํ•ด์š”

getCurrentPositionSuccessCallBack(position: Position) {
    const latitude = position.coords.latitude;
    const longitude = position.coords.longitude;

    const latLng: LatLngLiteral = {
      lat: latitude,
      lng: longitude
    };

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

    geoCoder.geocode({ "location": latLng }, (results, status) => {

๋‚ด ์ฝ”๋“œ์ด๊ณ  ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

fit('onGeoLocate should set the right location', () => {

    spyOn(navigator.geolocation, 'getCurrentPosition').and.callFake(function () {
      const position = { coords: { latitude: 32, longitude: -96 } };
      arguments[0](position);
    });
    component.onGeoLocate();

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์‹คํŒจํ•œ๋‹ค

 Failed: google is not defined

๋„์™€์ฃผ์„ธ์š”?

์•ˆ๋…•ํ•˜์„ธ์š” "google undefined" ์นœ๊ตฌ๋“ค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋™๋ฃŒ @gnujeremie์˜ ํŒ์„ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (Angular 2.2.3).

import { Injectable } from '@angular/core';
import { MapsAPILoader } from 'angular2-google-maps/core';
import { Observable } from 'rxjs/Observable';

declare var google: any;

@Injectable()
export class MapsService {
    constructor(private __loader: MapsAPILoader) {

    }

    getGeocoding(address: string) {
        return Observable.create(observer => {
            try {
                //at this point the variable google may be still undefined (google maps scripts still loading)
                //so load all the scripts, then...
                this.__loader.load().then(() => {
                    let geocoder = new google.maps.Geocoder();
                    geocoder.geocode({ address }, (results, status) => {

                        if (status === google.maps.GeocoderStatus.OK) {
                            const place = results[0].geometry.location;
                            observer.next(place);
                            observer.complete();
                        } else {
                            console.error('Error - ', results, ' & Status - ', status);
                            if (status === google.maps.GeocoderStatus.ZERO_RESULTS) {
                                observer.error('Address not found!');
                            }else {
                                observer.error(status);
                            }

                            observer.complete();
                        }
                    });
                });
            } catch (error) {
                observer.error('error getGeocoding' + error);
                observer.complete();
            }

        });
    }
}

Fabio, ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๊ณ  ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ƒ˜ํ”Œ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@DoubleExposure ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž(๋น„๊ณต๊ฐœ MS: MapsService) {
}

์ฝ”๋“œ์—์„œ ์ด๊ฒƒ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

this.ms.getGeocoding( '10 10th Street NE, Atlanta, GA 30309' ).subscribe(function (x) {
console.log(x.toString());
});

@FabioBentoLuiz @gnujeremie ์•ˆ๋…•ํ•˜์„ธ์š”, ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ–ˆ๊ณ  ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ์‹คํŒจํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์„ ์ œ์™ธํ•˜๊ณ . ngOnInit์—์„œ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ์‚ฌ์šฉ ์‹œ๋„

import { Component, OnInit } from '@angular/core';
import { Location } from '@angular/common';
import { Router, ActivatedRoute, ParamMap} from '@angular/router';

import 'rxjs/add/operator/switchMap';
import { Observable } from 'rxjs/Observable';

import { Place } from './../place';
import { PlaceService } from './../place.service';
import { MapsService } from './map.service';
import { AlertService } from './../AlertComponent/alert.service';


@Component({
  selector: 'app-detailview',
  templateUrl: './detail.component.html',
  styleUrls: ['./detail.component.css'], 
})


export class DetailComponent implements OnInit {

    place: Place;  
    lat: number = 51.678418;
    lng: number = 7.809007;

    ngOnInit() {
        let selectedId = this.route.paramMap.subscribe(
                (params: ParamMap)  =>  this.place = this.placeService.getPlaceById(+params.get('id'))
            );
        this.maps.getGeocoding('')
            .subscribe(
            result => console.log(result),
            error => console.log(error),
            () => console.log('Geocoding completed!')
            );
    }

    constructor(private placeService: PlaceService,
                private route       : ActivatedRoute,
                private location    : Location,
                private alert       : AlertService,
                private maps        : MapsService) {
    }

    clickSearchAddress() {
        let address = this.place.name + " " + this.place.address + " " + this.place.city + " " + this.place.postalCode;
        this.maps.getGeocoding(address)
            .subscribe(
            result => {
                    this.lat = result.lat();
                    this.lng = result.lng();
            },
            error => console.log(error),
            () => console.log('Geocoding completed!')
            );
    }

    back(){
        this.location.back();
    }

์•ˆ๋…•ํ•˜์„ธ์š” @Canadadry๋‹˜ ,
์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ์–ด๋–ป๊ฒŒ ์‹คํŒจํ•ฉ๋‹ˆ๊นŒ? MapsAPILoader๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ง€๋„๋Š” ์ฃผ์†Œ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋ฒ„ํŠผ์— clickSearchAddress() ๋ฅผ ๋งคํ•‘ํ–ˆ๊ณ  ๋‘ ๋ฒˆ์งธ ํด๋ฆญ์—์„œ๋งŒ ์ง€๋„๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํด๋ฆญ์—๋Š” ๋กœ๊ทธ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์˜ค์ฝ”๋”ฉ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
์ด์ƒํ•œ ์ ์€ ngOnInit์˜ route.paramMap clickSearchAddress() ํ˜ธ์ถœ์„ ๋„ฃ์—ˆ๊ณ  ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์—์„œ ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Google ์ง€๋„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํด๋ฆญ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ธฐ๋‹ค๋ฆฌ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‘ ๊ฐœ์˜ ํด๋ฆญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋œ MapsService๋Š” ๊ท€ํ•˜๊ฐ€ ์ œ๊ณตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์— ์„ค๋ช…๋œ ๋Œ€๋กœ NgZone ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”.

import { NgZone } from '@angular/core';

์ƒ์„ฑ์ž์— ์ถ”๊ฐ€

constructor(private _zone: NgZone){
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

this.maps.getGeocoding(address)
            .subscribe(
            result => {
                    this._zone.run(() => {
                    this.lat = result.lat();
                    this.lng = result.lng();
            });

            },
            error => console.log(error),
            () => console.log('Geocoding completed!')
            );

๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”

@vintesh , @FabioBentoLuiz ๋ฐ @neilpennell์˜ ๋‹ต๋ณ€์„ ๊ฒฐํ•ฉํ•œ agm์œผ๋กœ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

google-maps.service.ts:

import { Injectable, NgZone } from '@angular/core';
import { GoogleMapsAPIWrapper } from '@agm/core';
import { MapsAPILoader } from '@agm/core';
import { Observable, Observer } from 'rxjs';

declare var google: any;

@Injectable()
export class GMapsService extends GoogleMapsAPIWrapper{ 
    constructor(private __loader: MapsAPILoader, private __zone: NgZone) {
        super(__loader, __zone);
    }

    getLatLan(address: string) {
        console.log('Getting Address - ', address);
        let geocoder = new google.maps.Geocoder();
        return Observable.create(observer => {
            geocoder.geocode( { 'address': address}, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    observer.next(results[0].geometry.location);
                    observer.complete();                    
                } else {
                    console.log('Error - ', results, ' & Status - ', status);
                    observer.next({});
                    observer.complete();
                }
            });
        })
    }
}

shop.component.ts:

import { Component, NgZone } from '@angular/core';
import { GMapsService } from '../services/google-maps.service'

@Component({  
  templateUrl: 'shops.component.html',
  styleUrls: ['shops.component.css']
})

export class ShopsComponent {  
  constructor(private gMapsService: GMapsService, private __zone: NgZone ){}
  lat:number
  lng:number

  getAddress() {
    this.gMapsService.getLatLan('Andorra')
      .subscribe(
        result => {
            this.__zone.run(() => {
                this.lat = result.lat();
                this.lng = result.lng();
            })
        },
        error => console.log(error),
        () => console.log('Geocoding completed!')
      );
  }
}

shop.component.html:

<agm-map [latitude]="lat" [longitude]="lng"></agm-map>

shop.component.css:

agm-map {
    height: 300px;
}

๊ณ ๋งˆ์›Œ ์–˜๋“ค์•„!

@taneljoeaar Google์ด ์ •์˜๋˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
MappingService.getLatLan์—์„œ

์ €๋Š” ์ฃผ๋กœ ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.

์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@beachjf ๋Š” @FabioBentoLuiz ์†”๋ฃจ์…˜์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์—ฌ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. Google ์ง€๋„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„์ง ๋กœ๋“œ ์ค‘์ผ ๋•Œ ๋ณ€์ˆ˜ " google"์ด ์—ฌ์ „ํžˆ ์ •์˜๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋ ฅํ•˜๋‹ค
'@agm/core'์—์„œ { GoogleMapsAPIWrapper } ๊ฐ€์ ธ์˜ค๊ธฐ;
๋Œ€์‹ ์—
'angular2-google-maps/core'์—์„œ { GoogleMapsAPIWrapper } ๊ฐ€์ ธ์˜ค๊ธฐ;
์ตœ์‹  ๊ฐ๋„

@taneljoeaar ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ํŒŒ์ผ์—์„œ import { } from 'googlemaps'; ๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
googlemaps ์œ ํ˜•์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ( npm install --save @types/googlemaps )

๊ธ€์Ž„, ๊ทธ๊ฒƒ์ด ์˜ค๋ž˜๋œ ์งˆ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋„์‹œ, ์ฃผ ๋ฐ ๊ตญ๊ฐ€์˜ ์ด๋ฆ„๊ณผ ์œ ํ˜•์ด ์žˆ๋Š” ์œ„์น˜ ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž ์ขŒํ‘œ์—์„œ ์ด๋Ÿฌํ•œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ๋‚˜๋Š” ๋งˆ์ง€๋ง‰ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๊ฒƒ์„ ์ผ์Šต๋‹ˆ๋‹ค.

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

...

constructor(private mapsAPILoader: MapsAPILoader) {
    // Get this 'res' from some source, like ionic native geolocation
    // Or, for test, create some object like:
    let res = {
        coords: {
            latitude: 40.826514,
            longitude: -73.914628
        }
    }
    this.codeLatLng(res.coords);
  }

...

codeLatLng(coords) {
    this.mapsAPILoader.load().then(() => {
        console.log('google script loaded');
        let latlng = new google.maps.LatLng({lat: coords.latitude, lng: coords.longitude});
        let geocoder = new google.maps.Geocoder();
        let location = {
          country: null,
          state: null,
          city: null
        };
        geocoder.geocode({
          'latLng': latlng
        }, (results, status) => {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[1]) {
              for (let i = 0; i < results[0].address_components.length; i++) {
                for (let b = 0; b < results[0].address_components[i].types.length; b++) {
                  if (results[0].address_components[i].types[b] == "country") {
                    location.country = !location.country ? results[0].address_components[i] : location.country;
                  } else if (results[0].address_components[i].types[b] == "administrative_area_level_1") {
                    location.state = !location.state ? results[0].address_components[i] : location.state;
                  } else if (results[0].address_components[i].types[b] == "administrative_area_level_2") {
                    location.city = !location.city ? results[0].address_components[i] : location.city;
                  }
                  if (location.city && location.state && location.country) {
                    break;
                  }
                }
              }

              console.log(location);
            } else {
              console.log("Results not available");
            }
          }
          else {
            console.log("Geocoder failed due to: ", status);
          }
        });
      }
    );
  }

์ขŒํ‘œ ๊ฐ’์„ ์–ป์œผ๋ ค๋ฉด ์ด์˜จ ๊ธฐ๋ณธ ์œ„์น˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋“œ๋Š” Angular 2+ ๋ฐ Ionic ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

๋ณด์—ฌ์ฃผ์‹  ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์˜ค๋ฅ˜: StaticInjectorError [MapsAPILoader]:
StaticInjectorError [MapsAPILoader]:
NullInjectorError: MapsAPILoader์— ๋Œ€ํ•œ ๊ณต๊ธ‰์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!
_NullInjector.get์—์„œ(core.js: 923)
resolveToken์—์„œ(core.js: 1211)
tryResolveToken์—์„œ(core.js: 1153)
StaticInjector.get์—์„œ(core.js: 1024)
resolveToken์—์„œ(core.js: 1211)
tryResolveToken์—์„œ(core.js: 1153)
StaticInjector.get์—์„œ(core.js: 1024)
resolveNgModuleDep(core.js: 10586)
_createClass์—์„œ(core.js: 10625)
_createProviderInstance $ 1์—์„œ (core.js: 10597)

์ฐธ๊ณ : ์ €๋Š” Angular 5๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์—๊ฒŒ ์†์„ ๋‚ด๋ฐ€์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ronaldrenteria ๋ฐฐ์น˜ํ•˜์…จ๋‚˜์š”?

AgmCoreModule.forRoot({
      apiKey: '<YOUR-GOOGLE-API-KEY>'
    })

app.modules.ts์˜ "๊ฐ€์ ธ์˜ค๊ธฐ"์— ๋Œ€ํ•ด?
LazyLoading์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์ด ์˜ค๋ฅ˜๋Š” ์ผ๋ถ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ๊ฑฐ๋‚˜ lib๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
Angular Maps - ์‹œ์ž‘ํ•˜๊ธฐ ํŽ˜์ด์ง€์—์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์ €๋Š” ์ด๋ฏธ ์ง€๋„์™€ ๋งˆ์ปค๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์ง€๋งŒ ์ œ๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ผ๋ถ€ ๋ฐฉํ–ฅ์„ ์œ„๋„์™€ ๊ฒฝ๋„๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ž์ฒด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  LazyLoading์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ app.modules.ts์— ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ home.component.ts๋ผ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๊ณ  ์—ฌ๊ธฐ์—๋Š” home.module.ts๋ผ๋Š” ์ž์ฒด ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

MapsAPILoader๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ด๋ฏธ ์ง€๋„์™€ ๋งˆ์ปค๋ฅผ ํ‘œ์‹œํ–ˆ์ง€๋งŒ(์˜ˆ: ๊ฒฝ๋„์™€ ์œ„๋„๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ) ์ด์ œ DB์—์„œ ์ฃผ์†Œ๋ฅผ ์ฝ๊ณ  ๊ฒฝ๋„ ์œ„๋„๋ฅผ ์–ป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

maps.service.ts

import { Injectable, NgZone } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

// Manejo de Mapas
import { GoogleMapsAPIWrapper, MapsAPILoader } from '@agm/core';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';

declare var google: any;

@Injectable()
export class MapsService extends GoogleMapsAPIWrapper {
  constructor(private __loader: MapsAPILoader, private __zone: NgZone) {
    super(__loader, __zone);
  }

  getLatLan(address: string) {
    console.log('Getting Address - ', address);
    let geocoder = new google.maps.Geocoder();
    return Observable.create(observer => {
      geocoder.geocode({ address: address }, function(results, status) {
        if (status === google.maps.GeocoderStatus.OK) {
          observer.next(results[0].geometry.location);
          observer.complete();
        } else {
          console.log('Error - ', results, ' & Status - ', status);
          observer.next({});
          observer.complete();
        }
      });
    });
  }
}

home.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { homeRouting } from './home.routing';
import { SmartadminModule} from '../shared/smartadmin.module';
import { HomeComponent} from './home.component';
// 614iT
import { config_church } from './../shared/churchpro.config';
// Indispensable para manejar los mapas.
import { AgmCoreModule, MapsAPILoader } from '@agm/core';
@NgModule({
  imports: [
    CommonModule,
    homeRouting,
    SmartadminModule,
    AgmCoreModule.forRoot({
      apiKey: config_church.GOOGLE_API_KEY
    })
  ],
  declarations: [HomeComponent]
})
export class HomeModule {}

home.component.ts

import { Component, OnInit, NgZone } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';
// Mapas 
import { MapsService } from '../shared/services/maps.service';
@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: []
})
export class HomeComponent implements OnInit {
  title: string = 'My first AGM project';
  lat: number = 4.6517056;
  lng: number = -74.1028404;
  zoom: number = 13;
  Glat: number;
  Glng: number;

  constructor(private _mapsService: MapsService, private __zone: NgZone) {}

  ngOnInit() {}

  getAddress() {
    this._mapsService.getLatLan('Andorra').subscribe(result => {
        this.__zone.run(() => {
          this.Glat = result.lat();
          this.Glng = result.lng();
        });
      }, error => console.log(error), () => console.log('Geocoding completed!'));
  }
}

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„

๋ˆ„๊ตฐ๊ฐ€ ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

AGM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ด ์ฝ”๋“œ๋ฅผ ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€์ฒ˜๋Ÿผ ํฌํ•จํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด apps.module์˜ ๋กœ์ปฌ src ํด๋”์—์„œ agmCoreModule์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

import { AgmCoreModule } from '../agmLocalModule/core.module';

AgmCoreModule.forRoot({
API ํ‚ค: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}),

ngFor ๋ฃจํ”„์—์„œ ์ƒ์„ฑ๋œ ๋งˆ์ปค๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

```

[์œ„๋„]="ubicacion.posicion.latitud"
[๊ฒฝ๋„]="ubicacion.posicion.longitud"
[markerClickable]="์ฐธ"
>

```

์˜ค๋ฅ˜ ์˜ค๋ฅ˜: ์žกํžˆ์ง€ ์•Š์Œ(์•ฝ์† ์ค‘): ReferenceError: Google์ด ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
ReferenceError: Google์ด ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
MarkerManager.webpackJsonp.102.MarkerManager.addMarker์—์„œ (marker-manager.ts:82)
AgmMarker.webpackJsonp.291.AgmMarker.ngOnChanges(marker.ts:169)

๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์•„์ด๋””์–ด

'google is undefined' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด:

agm-map ์š”์†Œ์˜ ์ด ์ด๋ฒคํŠธ 'mapReady'๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
" https://angular-maps.com/api-docs/agm-core/components/AgmMap.html#mapReady "

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ์˜ˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ง€์˜ค์ฝ”๋”ฉ ์„œ๋น„์Šค https://stackblitz.com/edit/angular-google-maps-demo-geocoding ์˜ ์‹ค์ œ ์˜ˆ.

mapsAPILoader.load()๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. AGM๊ณผ ๊ฐ๋„๋„ ์ฒ˜์Œ์ด๊ฑฐ๋“ ์š”. ํ•˜์ง€๋งŒ ์ €๋Š” place_id๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ latlng ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@supruniuk thz GOD

Observable ๊ฒฐ๊ณผ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@xanscale ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์œ ํ˜• ๊ฒ€์‚ฌ์— ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
๋‚ด๋ณด๋‚ด๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค ์œ„์น˜ {
์œ„๋„: ์ˆซ์ž;
๊ธธ์ด: ์ˆซ์ž;
}

@supruniuk ๊ฒฐ๊ณผ ๋ฐ ์ƒํƒœ์™€ ๊ฐ™์€ Google ๊ฐœ์ฒด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰