import { Component, OnInit, NgZone } from '@angular/core';
import { latLng, tileLayer, marker, Layer, icon, Map, latLngBounds, LatLng, LatLngBounds, point } from 'leaflet';
import { Plant } from 'src/app/models/plant';
import { PlantsService } from 'src/app/services/plants.service';
@Component({
selector: 'app-maps',
templateUrl: './maps.component.html',
styleUrls: ['./maps.component.scss']
})
export class MapsComponent implements OnInit {
listData: Plant[];
markers: Layer[] = [];
points: LatLng[] = [];
plantId: number;
icon = icon({
iconSize: [25, 41],
iconAnchor: [13, 41],
iconUrl: 'marker-icon.png',
//shadowUrl: 'marker-shadow.png'
});
constructor(private plantsService: PlantsService, private zone: NgZone) {
}
// Open Street Map definitions
LAYER_OSM = tileLayer(
'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
{ maxZoom: 18,
attribution: '© OpenStreetMap contributors'
});
// Values to bind to Leaflet Directive
options = {
layers: [ this.LAYER_OSM ],
zoom: 8,
center: latLng([13.661714, -89.251530])
};
ngOnInit() {
this.plantsService.getPlants().subscribe(res => {
this.listData = res;
});
this.addMarkers();
}
addMarkers() {
for (const plant of this.listData) {
const name = plant.name;
const lat = plant.latitude;
const long = plant.longitude;
const newMarker = marker(
[lat, long],
{icon: this.icon})
.bindPopup('' + plant.name + '
Fecha de Instalación: ' + plant.installDate)
.on('click', () => {
this.zone.run(() => {
this.sendPlantId(plant.id);
});
});
this.points.push(latLng([lat, long]));
this.markers.push(newMarker);
}
}
sendPlantId(id: number) {
this.plantId = id;
}
onMapReady(map: Map) {
setTimeout(() => {
map.invalidateSize();
}, 0);
const bounds = latLngBounds(this.points);
map.fitBounds(bounds, {
padding: point(24, 24),
maxZoom: 10.5,
animate: true
});
}
}