File

components/map/map.component.ts

Description

ArcGIS map with layers showing NSHM boundary, fault sections, and test sites.

Implements

OnInit

Metadata

Index

Properties
Methods

Methods

Private goTo
goTo(layer: ___esri.Layer)
Parameters :
Name Type Optional
layer ___esri.Layer No
Returns : void
ngOnInit
ngOnInit()
Returns : void
viewReady
viewReady(view: ___esri.MapView)
Parameters :
Name Type Optional
view ___esri.MapView No
Returns : void

Properties

Private destroyRef
Default value : inject(DestroyRef)
mapOptions
Default value : signal<ArcgisMapOptions>({})
service
Default value : inject(AppService)
Private view
Type : MapView | SceneView
import {
  ChangeDetectionStrategy,
  Component,
  DestroyRef,
  inject,
  OnInit,
  signal,
} from '@angular/core';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {MatButton, MatFabButton} from '@angular/material/button';
import {MatIcon} from '@angular/material/icon';
import {MatMenu, MatMenuTrigger} from '@angular/material/menu';
import MapView from '@arcgis/core/views/MapView';
import SceneView from '@arcgis/core/views/SceneView';
import {ArcgisMapOptions, ArcLayerId, NshmpMapArcgisComponent} from '@ghsc/nshmp-lib-ng/map';
import {from} from 'rxjs';

import {AppService} from '../../services/app.service';
import {LegendComponent} from '../legend/legend.component';

/**
 * ArcGIS map with layers showing NSHM boundary, fault sections, and test sites.
 */
@Component({
  changeDetection: ChangeDetectionStrategy.OnPush,
  host: {id: 'source-model-maps-map'},
  imports: [
    LegendComponent,
    NshmpMapArcgisComponent,
    MatIcon,
    MatMenu,
    MatMenuTrigger,
    MatFabButton,
    MatButton,
  ],
  selector: 'app-map',
  styleUrl: './map.component.scss',
  templateUrl: './map.component.html',
})
export class MapComponent implements OnInit {
  service = inject(AppService);
  private destroyRef = inject(DestroyRef);

  mapOptions = signal<ArcgisMapOptions>({});

  private view: MapView | SceneView;

  ngOnInit(): void {
    const {model} = this.service.formGroup.controls;

    model.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(model => {
      if (model !== null && this.service.treesUsageResponse()) {
        const title = this.service.treesUsageResponse().response.model.name;

        this.mapOptions.set({
          print: {
            layoutOptions: {
              titleText: title,
            },
          },
        });
      }
    });
  }

  viewReady(view: __esri.MapView): void {
    this.view = view;
    this.service.updateState({view});

    view.on('layerview-create', (viewEvent: __esri.ViewLayerviewCreateEvent) => {
      if (viewEvent.layer.id === ArcLayerId.NSHM.toString()) {
        this.goTo(viewEvent.layer);
      }
    });
  }

  private goTo(layer: __esri.Layer): void {
    if (this.view && layer) {
      from(layer.when())
        .pipe(takeUntilDestroyed(this.destroyRef))
        .subscribe(() => {
          from(this.view.goTo(layer.fullExtent))
            .pipe(takeUntilDestroyed(this.destroyRef))
            .subscribe();
        });
    }
  }
}
<nshmp-map-arcgis
  [map]="service.map"
  [mapOptions]="mapOptions()"
  (viewReady)="viewReady($event.view)"
>
  <div class="legend" slot="top-right">
    <button matFab [matMenuTriggerFor]="menu" #menuTrigger="matMenuTrigger">
      <mat-icon>vpn_key</mat-icon>
    </button>

    <mat-menu #menu="matMenu" xPosition="before" [hasBackdrop]="false">
      <div (click)="$event.stopPropagation()" class="model-maps-legend">
        <div class="padding-2">
          <button matButton="elevated" (click)="menuTrigger.closeMenu()" class="grid-col-12">
            Close
          </button>
        </div>

        <app-legend />
      </div>
    </mat-menu>
  </div>
</nshmp-map-arcgis>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""