import { Component, NgZone, ElementRef, Input, OnChanges, AfterViewInit } from "@angular/core";
import { Portlet } from "../../portlet/portlet";
import { BaseAmChart } from "./baseAmChart";
import * as am4core from "@amcharts/amcharts4/core";
import * as am4maps from "@amcharts/amcharts4/maps";
import am4geodata_worldHigh from "@amcharts/amcharts4-geodata/worldHigh";
import am4themes_dataviz from "@amcharts/amcharts4/themes/dataviz";
export enum WeatherCast {
Sunny,
SunnyRainly,
Cloudy,
Rainy,
SlightlyRainy,
Downpour,
Thunder,
Snowy
}
export interface IWeatherDataItem {
lat: number;
lng: number;
weatherCast: WeatherCast;
text: string;
}
@Component({
selector: "rd-amchart-weather",
template: `
`
})
export class AmChartWeather extends BaseAmChart implements OnChanges, AfterViewInit {
constructor(zone: NgZone, public element: ElementRef, portlet: Portlet) {
super(zone, element, portlet);
}
@Input("rd-data") data: Array = [];
chart: am4maps.MapChart;
imageSeries;
ngAfterViewInit() {
this.zone.runOutsideAngular(() => {
am4core.useTheme(am4themes_dataviz);
this.chart = am4core.create(this.container, am4maps.MapChart);
this.chart.geodata = am4geodata_worldHigh;
this.chart.projection = new am4maps.projections.Miller();
this.chart.zoomControl = new am4maps.ZoomControl();
this.chart.homeGeoPoint = { longitude: 39, latitude: 34 };
this.chart.homeZoomLevel = 6;
let polygonSeries = this.chart.series.push(new am4maps.MapPolygonSeries());
polygonSeries.useGeodata = true;
this.imageSeries = this.chart.series.push(new am4maps.MapImageSeries());
let imageTemplate = this.imageSeries.mapImages.template;
imageTemplate.propertyFields.longitude = "longitude";
imageTemplate.propertyFields.latitude = "latitude";
imageTemplate.nonScaling = true;
let image = imageTemplate.createChild(am4core.Image);
image.propertyFields.href = "imageURL";
image.width = 50;
image.height = 50;
image.horizontalCenter = "middle";
image.verticalCenter = "middle";
let label = imageTemplate.createChild(am4core.Label);
label.text = "{label}";
label.horizontalCenter = "middle";
label.verticalCenter = "top";
label.dy = 20;
this.setData();
});
}
ngOnChanges(changes) {
if (!this.chart) return;
if (changes.data) this.setData();
}
setData() {
let avgLat: number = 0;
let avgLng: number = 0;
for (let item of this.data) {
avgLat += item.lat;
avgLng += item.lng;
this.imageSeries.data.push({
"latitude": item.lat,
"longitude": item.lng,
"imageURL": this.getWeatherCastIcon(item.weatherCast),
"width": 32,
"height": 32,
"label": item.text
});
}
avgLat /= this.data.length;
avgLng /= this.data.length;
this.chart.homeGeoPoint = { longitude: avgLng, latitude: avgLat };
}
getWeatherCastIcon(cast) {
switch (cast) {
case WeatherCast.Sunny: return 'assets/img/weather/sunny.svg';
case WeatherCast.SunnyRainly: return 'assets/img/weather/sunnyRainy.svg';
case WeatherCast.Cloudy: return 'assets/img/weather/cloudy.svg';
case WeatherCast.Rainy: return 'assets/img/weather/rainy.svg';
case WeatherCast.SlightlyRainy: return 'assets/img/weather/slightlyRainy.svg';
case WeatherCast.Downpour: return 'assets/img/weather/downpour.svg';
case WeatherCast.Thunder: return 'assets/img/weather/thunder.svg';
case WeatherCast.Snowy: return 'assets/img/weather/snowy.svg';
}
}
}