Angular-google-maps: ์ด ํŽ˜์ด์ง€์— Google Maps API๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ฉฐ์น  ์ดํ›„๋กœ ๊ฝค ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‚ด @NgModule์ž…๋‹ˆ๋‹ค .

import { NgModule } from '@angular/core';
import { AgmCoreModule } from 'angular2-google-maps/core/index';

// Global vars
import appGlobals = require('./../globals');

@NgModule({
    imports:      [ AgmCoreModule.forRoot({
                        apiKey: appGlobals.googleMapsApiKey
                    }) ],
})

export class JobSearchModule {}

๋‚ด HTML์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<div class="col-md-12 google-maps-container">
        <sebm-google-map [latitude]="mapLat"
                         [longitude]="mapLng"
                         [mapDraggable]="false"
                         [zoom]="zoom"
                         [zoomControl]="false"
                         [streetViewControl]="false"
                         (mapClick)="mapClicked($event)">
            <sebm-google-map-marker [latitude]="mapLat"
                                    [longitude]="mapLng">

            </sebm-google-map-marker>
        </sebm-google-map>
    </div>

๋‹ค์Œ์€ ๋‚ด HTML ํ—ค๋“œ ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์˜ ์Šคํฌ๋ฆฐ์ƒท์ž…๋‹ˆ๋‹ค.

screen shot 2016-10-02 at 13 36 15

๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ API๋ฅผ ๋‘ ๋ฒˆ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด์œ ์™€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

MapsAPILoader

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

@escarabin ๋‚˜๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋„.

๋ฃจํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ์—์„œ ๋งต์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.

@NgModule({
    declarations: [
        ...
    ],
    imports: [
        ...,
        AgmCoreModule.forRoot({
            apiKey: 'some key here'
        })
    ],

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ชจ๋“ˆ์— ์†ํ•˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋งต์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

@NgModule({
    declarations: [
        SomeComponentThatHasMapsInItsHtml,
        .....
    ],
    imports: [
        AgmCoreModule,
        ...
    ],

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

@escarabin ๋ฌธ์ œ๋Š” ์•ฑ์˜ ํ•˜์œ„ ๋ชจ๋“ˆ์—์„œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ฑ์˜ ๋ฃจํŠธ ๋ชจ๋“ˆ ๋‚ด์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์—ด์–ด๋ณด์„ธ์š”. ๊ณ ๋งˆ์›Œ!

์•ˆ๋…•ํ•˜์„ธ์š” @SebastianM! ์กฐ์–ธ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • job-search-module.ts ๋ผ๋Š” ํ•˜์œ„ ๋ชจ๋“ˆ์—์„œ angular2-google-maps ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋ชจ๋“ˆ์ด ํฌํ•จ๋œ shared.module.ts ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด ๋ฃจํŠธ ๋ชจ๋“ˆ์€ app.module.ts ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋‚ด app.module.ts ์—์„œ AgmCoreModule์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ sebm-google-map ๊ฐ€ ๋‚ด job-search-module.ts ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ง€๋„๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
shared.module.ts ๋˜๋Š” job-search.module.ts ์—์„œ AgmCoreModule ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ _"์ด ํŽ˜์ด์ง€์— Google Maps API๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค."_๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ถ”์‹ : ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋‚˜? :( ๋‚˜๋Š” ์ง€๊ธˆ ๊ทธ๊ฒƒ์— ์•„์ฃผ ๋ถ™์–ด์žˆ๋‹ค.

@escarabin ๋‚˜๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋„.

๋ฃจํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ์—์„œ ๋งต์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.

@NgModule({
    declarations: [
        ...
    ],
    imports: [
        ...,
        AgmCoreModule.forRoot({
            apiKey: 'some key here'
        })
    ],

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ชจ๋“ˆ์— ์†ํ•˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋งต์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

@NgModule({
    declarations: [
        SomeComponentThatHasMapsInItsHtml,
        .....
    ],
    imports: [
        AgmCoreModule,
        ...
    ],

์ด๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ์— ๋“ฑ๋กํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(Google ํ•ญ๋ชฉ์ด ํ‚ค๋กœ ์ดˆ๊ธฐํ™”๋˜๋„๋ก).

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์†ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ <seb-maps-smth-smth> ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ AgmCoreModule์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ์„ ํƒ๊ธฐ๊ฐ€ seb-maps-smth-smth ์ธ ์ด ๋ชจ๋“ˆ์—์„œ ๋‚ด๋ณด๋‚ธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@EddyP23 ์˜ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค... [email protected] ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ •๋ง ์ด์ƒํ•ด์š”.

๋ฌธ์ œ๋Š” ์˜ค๋ฅ˜ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€์— ์™„์ „ํžˆ ์ž„์˜์˜ ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๋˜ํ•œ <seb-maps-smth-smth> ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฌธ์„œ์—์„œ๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. <sebm-google-map> ๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

@escarabin ๋„ค, 0.15.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

smth smth๋Š” seb-maps-{placeholder} ์„ ํƒ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚ด HTML์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<sebm-google-map #sebmGoogleMap
        [latitude]="myVar1"
        [longitude]="myVar2"
        (idle)='onIdle()'
        [zoom]='mapZoomLevel'
        [streetViewControl]='false'
        >
            <sebm-google-map-marker #marker
                [latitude]="myVar3"
                [longitude]="myVar4"
                ></sebm-google-map-marker>
    </sebm-google-map>

์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ์˜ค๋ฅ˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์„ค์ •์ด ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

"์ด ํŽ˜์ด์ง€์— Google Maps API๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋‚ด HTML์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<sebm-google-map #sebmGoogleMap
                         [latitude]="mapLat"
                         [longitude]="mapLng"
                         [mapDraggable]="false"
                         [zoom]="zoom"
                         [zoomControl]="false"
                         [streetViewControl]="false"
                         (mapClick)="mapClicked($event)">
            <sebm-google-map-marker [latitude]="mapLat"
                                    [longitude]="mapLng">

            </sebm-google-map-marker>
</sebm-google-map>

๋‹ค์Œ์€ ๋‚ด ์ž์‹ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

import { NgModule } from '@angular/core';
import { jobSearchRouting } from './job-search.routes';
import { SharedModule }   from './../shared/shared.module';
import { AgmCoreModule } from 'angular2-google-maps/core/index';

// Components
import { SearchComponent } from './components/search.component';

@NgModule({
    declarations: [ SearchComponent ],
    imports:      [ jobSearchRouting,
                    AgmCoreModule,
                    SharedModule ]
})

export class JobSearchModule {}

๊ทธ๋ฆฌ๊ณ  ๋‚ด app.module.ts @NgModule :

@NgModule({
    declarations: [ AppComponent,
                    HomeComponent,
                    HeaderComponent,
                    FooterComponent,
                    PostComponent,
                    ClubComponent,
                    CandidateSignUpComponent,
                    PostPreviewComponent,
                    SignInComponent,
                    ProfileSubHeaderComponent,
                    RecruiterPromoComponent,
                    NotificationsComponent ],
    imports:      [ RouterModule,
                    HttpModule,
                    SharedModule,
                    BrowserModule,
                    AgmCoreModule.forRoot({
                        apiKey: appGlobals.googleMapsApiKey
                    }),
                    MetaModule.forRoot(metaConfig),
                    routing ],
    providers:    [ NotificationsService,
                    MetaService ],
    bootstrap:    [ AppComponent ],
})

ํ .. ์ด์ƒํ•˜๋„ค์š”. Google ์ง€๋„๋ฅผ ์ด์ „ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ์–ด๋””์—๋„ ์—†์Šต๋‹ˆ๊นŒ(์˜ˆ: index.html )? ์ด ๊ฐ™์€:

<script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
    </script>

๋˜ํ•œ AgmCoreModule ์˜ ๋ชจ๋“  ์‚ฌ์šฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์‹ค์ˆ˜๋กœ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋‘ ๋ฒˆ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ app.module์— AgmCoreModule.forRoot({...})๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ  ์—ฌ๋Ÿฌ Google API ํ˜ธ์ถœ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
์—ฌ์ „ํžˆ ๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์˜ app.module์— AgmCoreModule.forRoot({...})๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ Google API ํ˜ธ์ถœ๋„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋„์›€์ด ๋œ๋‹ค๋ฉด ์ฃผ์„ ์ฒ˜๋ฆฌ๋ณด๋‹ค ์ด์ „ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์–ด๋–ค ์ด์œ ๋กœ ํ…œํ”Œ๋ฆฟ์— ์ฃผ์„์„ ๋‹ฌ์•„๋„ ์ œ๊ฑฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@EddyP23 , skd ์ž๋™ ์™„์„ฑ ๋ฐ agm ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ธ๋ฑ์Šค๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์—