UNPKG

1.93 kBPlain TextView Raw
1import {Injectable, NgZone} from '@angular/core';
2import {Observable} from 'rxjs/Observable';
3import {Observer} from 'rxjs/Observer';
4
5import {SebmGoogleMapKmlLayer} from './../../directives/google-map-kml-layer';
6import {GoogleMapsAPIWrapper} from './../google-maps-api-wrapper';
7import {KmlLayer, KmlLayerOptions} from './../google-maps-types';
8
9declare var google: any;
10
11/**
12 * Manages all KML Layers for a Google Map instance.
13 */
14@Injectable()
15export class KmlLayerManager {
16 private _layers: Map<SebmGoogleMapKmlLayer, Promise<KmlLayer>> =
17 new Map<SebmGoogleMapKmlLayer, Promise<KmlLayer>>();
18
19 constructor(private _wrapper: GoogleMapsAPIWrapper, private _zone: NgZone) {}
20
21 /**
22 * Adds a new KML Layer to the map.
23 */
24 addKmlLayer(layer: SebmGoogleMapKmlLayer) {
25 const newLayer = this._wrapper.getNativeMap().then(m => {
26 return new google.maps.KmlLayer(<KmlLayerOptions>{
27 clickable: layer.clickable,
28 map: m,
29 preserveViewport: layer.preserveViewport,
30 screenOverlays: layer.screenOverlays,
31 suppressInfoWindows: layer.suppressInfoWindows,
32 url: layer.url,
33 zIndex: layer.zIndex
34 });
35 });
36 this._layers.set(layer, newLayer);
37 }
38
39 setOptions(layer: SebmGoogleMapKmlLayer, options: KmlLayerOptions) {
40 this._layers.get(layer).then(l => l.setOptions(options));
41 }
42
43 deleteKmlLayer(layer: SebmGoogleMapKmlLayer) {
44 this._layers.get(layer).then(l => {
45 l.setMap(null);
46 this._layers.delete(layer);
47 });
48 }
49
50 /**
51 * Creates a Google Maps event listener for the given KmlLayer as an Observable
52 */
53 createEventObservable<T>(eventName: string, layer: SebmGoogleMapKmlLayer): Observable<T> {
54 return Observable.create((observer: Observer<T>) => {
55 this._layers.get(layer).then((m: KmlLayer) => {
56 m.addListener(eventName, (e: T) => this._zone.run(() => observer.next(e)));
57 });
58 });
59 }
60}