Показывать маркеры мултипл на карте от Cloud Firestore - PullRequest
0 голосов
/ 08 апреля 2019

Я настраиваю новое угловое приложение и хочу показать маркеры на моей существующей карте mapbox.Связь с firebase уже установлена, но с моим текущим кодом я не вижу никаких маркеров.

Консоль показывает мне: this.markers.subscribe не является функцией

map.component.ts

import { Component, OnInit } from '@angular/core';
import * as mapboxgl from 'mapbox-gl';
import { Map, GeolocateControl, LngLat, LngLatBounds } from "mapbox-gl"
import { MapService } from '../../services/map.service';
import { GeoJson, FeatureCollection } from '../../models/map';

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

export class MapComponent implements OnInit {

  // default settings
  map: mapboxgl.Map;
  style = 'mapbox://styles/mapbox/light-v9';
  lat = 50.530;
  lng = 8.5;
  message = 'Hello Message';

  // data
  markers: any;
  source: any;

  constructor(private mapService: MapService) { }

  ngOnInit() {
    this.markers = this.mapService.getMarkers()
    this.initializeMap()
  }

  private initializeMap() {
    // locate the visitor
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(position => {
        this.lat = position.coords.latitude
        this.lng = position.coords.longitude
        this.map.flyTo({
          center: [this.lng, this.lat]
        })
      })
    }
    this.buildMap()
  }

  buildMap() {
    this.map = new mapboxgl.Map({
      container: 'map',
      zoom: 13,
      style: this.style,
      center: [this.lng, this.lat],
    })

    this.map.addControl(new mapboxgl.NavigationControl());

    let geolocateControl = new GeolocateControl({
      positionOptions: { enableHighAccuracy: true },
      watchPosition: false
    })

    this.map.on('load', (e) => {
      // register the source
      this.map.addSource('firebase', {
        type: 'geojson',
        data: {
          type: 'FeatureCollection',
          features: []
        }
      })

      this.source = this.map.getSource('firebase')

      this.markers.subscribe(markers => {
        let data = new FeatureCollection(markers)
        this.source.setData(data)
      })

      this.map.addLayer({
        id: 'firebase',
        source: 'firebase',
        type: 'symbol',
        layout: {
          'text-field': '{message}',
          'text-size': 24,
          'text-transform': 'uppercase',
          'icon-image': 'rocket-15',
          'text-offset': [0, 1.5]
        },
        paint: {
          'text-color': '#f16624',
          'text-halo-color': '#fff',
          'text-halo-width': 2
        }
      })

      geolocateControl.on('geolocate', (event) => {
        this.flyTo(new GeoJson([event.coordinates.lng, event.coordinates.lat], { message: 'You' }))
        this.populatePickupLocation([event.coordinates.lng, event.coordinates.lat])
      })

    }) 
  }


  flyTo(data: GeoJson) {
    this.map.flyTo({
      center: data.geometry.coordinates,
      zoom: 13
    })
  }
}

map.service.ts

import { Injectable } from '@angular/core';
import { AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument } from '@angular/fire/firestore';
import { environment } from '../../environments/environment';

import { Observable } from 'rxjs/Observable';
import { GeoJson } from '../models/map';

import * as mapboxgl from 'mapbox-gl';
import { Map, Marker, LngLat }  from "mapbox-gl";

@Injectable()
export class MapService {
  map: Map

  constructor(public db: AngularFirestore) {
    mapboxgl.accessToken = environment.mapbox.accessToken,
    this.markers = this.db.collection('markers').valueChanges();
  }

  getMarkers(): Observable<any> {
    return this.db.collection('/markers')
  }

  createMarker(data:GeoJson) {
    return this.db.collection('/markers')
    .push[(data)]
  }

}

Структура в моей базе данных:

-markers
--id
---coordinates
----lat
----lng
---type

Я не могу объяснить, где проблема.Кто-нибудь еще?

...