Я обнаружил, что ngx-mapboxgl не очень хорошо задокументировано. Я пытаюсь создать слой, который будет содержать набор маркеров, и я хочу иметь возможность включать и выключать этот слой. Я могу показать маркер, и я хочу, чтобы он был на определенном слое. Но я получаю сообщение об ошибке во время выполнения, в котором говорится, что он не может найти источник для маркеров, хотя я определил его так же, как пример, который я нашел в Интернете. Документация для mgl-layer оставляет желать лучшего, даже не объясняя, как использовать source, sourceLayer и layout. Вот мой HTML:
<mat-card >
<mat-card-content >
<mgl-map
[style]="mapStyle"
[zoom]="_zoom"
[center]="_center"
(load)="loadMap($event)"
(zoomEnd)="onZoom($event)"
>
<mgl-control
mglScale
unit="imperial"
position="top-right">
</mgl-control>
<mgl-layer
id="markerLayer"
type="symbol"
visibility="none"
source="markers"
>
</mgl-layer>
<mgl-marker
[lngLat]="markerPos"
layer="markerLayer"
visibility="none">
</mgl-marker>
</mgl-map>
<div class="map-overlay">
<button mat-button (click)="layerControl()"><mat-icon>layers</mat-icon> </button>
</div>
</mat-card-content>
</mat-card>
А вот машинопись, которая определяет маркеры:
import { Component, OnInit, Input, Output, EventEmitter, OnChanges } from '@angular/core';
import { Subscription } from 'rxjs';
import { AppSettings } from '../../shared/app-settings'
import { AppSettingsService } from '../../services/app-settings.service';
import { MatDialog, MatDialogConfig } from "@angular/material";
import { LayerControlDialogComponent } from '../../dialogs/layer-control- dialog/layer-control-dialog.component';
import { LngLat, Map } from 'mapbox-gl';
import { map } from 'rxjs/operators';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss']
})
export class HomeComponent implements OnInit, OnChanges {
private className: string;
appSettings: AppSettings;
appSettingsSub: Subscription;
map: Map;
mapStyle: string;
_zoom: number;
_center: LngLat;
markerPos: LngLat;
markers = {
'visibility': 'none'
};
//refs
_mapRef: Map;
@Output()
centerChange: EventEmitter<LngLat> = new EventEmitter;
@Input()
set zoom(z: number) {
console.log('in zoom event');
this._zoom = z;
if(this.index === 0) {
this.zoomChange.emit(this._zoom);
}
}
@Output()
zoomChange : EventEmitter<number> = new EventEmitter;
@Input()
index: number;
constructor(public appSettingsService: AppSettingsService,
public layerControlDialogComponent: MatDialog) { }
ngOnInit() {
this.className = this.constructor.toString().match(/\w+/g)[1];
this._zoom = 6;
this.appSettingsSub = this.appSettingsService.behaviorSubject.asObservable().subscribe(value => {
this.appSettings = value;
if ( this.appSettings.norCalMapCenter == true ) {
this._center = new LngLat( -121.31209, 37.449904 );
}
else {
this._center = new LngLat( -116.363804, 33.749757 );
}
if (this.appSettings.theme === 'tracs-dark-theme') {
this.mapStyle = 'mapbox://styles/mapbox/dark-v9';
}
else {
this.mapStyle = 'mapbox://styles/mapbox/outdoors-v9';
}
this.markerPos = new LngLat( -121.0, 37.5);
});
}
ngOnChanges(changes) {
if (!changes) {
return;
}
}
loadMap( map: Map) {
this._mapRef = map;
this._center = map.getCenter();
}
onZoom(e) {
this._zoom = Math.round(this._mapRef.getZoom());
console.log('zoom event zoom:', this._zoom);
};
layerControl() {
const dialogConfig = new MatDialogConfig();
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
const dialogRef = this.layerControlDialogComponent.open(LayerControlDialogComponent, dialogConfig);
dialogRef.afterClosed().subscribe(
data => {
console.log('Dialog output: ', data.controls.acMgrName.touched )
});
}
}
А вот скриншот ошибки, которую я получаю:
Кто-нибудь занимался этим раньше?
Спасибо ....