maps.component.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { Component, OnInit, NgZone } from '@angular/core';
  2. import { latLng, tileLayer, marker, Layer, icon, Map, latLngBounds, LatLng, LatLngBounds, point } from 'leaflet';
  3. import { Plant } from 'src/app/models/plant';
  4. import { PlantsService } from 'src/app/services/plants.service';
  5. @Component({
  6. selector: 'app-maps',
  7. templateUrl: './maps.component.html',
  8. styleUrls: ['./maps.component.scss']
  9. })
  10. export class MapsComponent implements OnInit {
  11. listData: Plant[];
  12. markers: Layer[] = [];
  13. points: LatLng[] = [];
  14. plantId: number;
  15. icon = icon({
  16. iconSize: [25, 41],
  17. iconAnchor: [13, 41],
  18. iconUrl: 'marker-icon.png',
  19. //shadowUrl: 'marker-shadow.png'
  20. });
  21. constructor(private plantsService: PlantsService, private zone: NgZone) {
  22. }
  23. // Open Street Map definitions
  24. LAYER_OSM = tileLayer(
  25. 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
  26. { maxZoom: 18,
  27. attribution: '© OpenStreetMap contributors'
  28. });
  29. // Values to bind to Leaflet Directive
  30. options = {
  31. layers: [ this.LAYER_OSM ],
  32. zoom: 8,
  33. center: latLng([13.661714, -89.251530])
  34. };
  35. ngOnInit() {
  36. this.plantsService.getPlants().subscribe(res => {
  37. this.listData = res;
  38. });
  39. this.addMarkers();
  40. }
  41. addMarkers() {
  42. for (const plant of this.listData) {
  43. const name = plant.name;
  44. const lat = plant.latitude;
  45. const long = plant.longitude;
  46. const newMarker = marker(
  47. [lat, long],
  48. {icon: this.icon})
  49. .bindPopup('<b>' + plant.name + '</b><br>Fecha de Instalación: ' + plant.installDate)
  50. .on('click', () => {
  51. this.zone.run(() => {
  52. this.sendPlantId(plant.id);
  53. });
  54. });
  55. this.points.push(latLng([lat, long]));
  56. this.markers.push(newMarker);
  57. }
  58. }
  59. sendPlantId(id: number) {
  60. this.plantId = id;
  61. }
  62. onMapReady(map: Map) {
  63. setTimeout(() => {
  64. map.invalidateSize();
  65. }, 0);
  66. const bounds = latLngBounds(this.points);
  67. map.fitBounds(bounds, {
  68. padding: point(24, 24),
  69. maxZoom: 10.5,
  70. animate: true
  71. });
  72. }
  73. }