diff --git a/cramp-web/src/main/java/org/eduze/fyp/web/controllers/AnalyticsController.java b/cramp-web/src/main/java/org/eduze/fyp/web/controllers/AnalyticsController.java index 5d1f9e5a..7026b452 100644 --- a/cramp-web/src/main/java/org/eduze/fyp/web/controllers/AnalyticsController.java +++ b/cramp-web/src/main/java/org/eduze/fyp/web/controllers/AnalyticsController.java @@ -190,13 +190,15 @@ public Response getRealTimeMap(@PathParam("cameraGroupId") int cameraGroupId) { } @GET - @Path("/timeBoundMap/{from}/{to}") - public Response getTimeboundMap(@PathParam("from") long from, @PathParam("to") long to) { + @Path("/timeBoundMap/{cameraGroupId}/{from}/{to}") + public Response getTimeBoundMap(@PathParam("cameraGroupId") int cameraGroupId, + @PathParam("from") long from, + @PathParam("to") long to) { try { Date fromD = new Date(from); Date toD = new Date(to); - return Response.ok(analyticsService.getTimeBoundMovements(fromD, toD, false)).build(); + return Response.ok(analyticsService.getTimeBoundMovements(cameraGroupId, fromD, toD, false)).build(); } catch (Exception e) { logger.error("Error occurred when obtaining real time map. {}", e); return Response.status(500).build(); @@ -204,13 +206,14 @@ public Response getTimeboundMap(@PathParam("from") long from, @PathParam("to") l } @GET - @Path("/timeBoundMap/{from}/{to}/trackSegmented") - public Response getTimeboundMapWithSegments(@PathParam("from") long from, @PathParam("to") long to) { + @Path("/timeBoundMap/{cameraGroupId}/{from}/{to}/trackSegmented") + public Response getTimeBoundMapWithSegments(@PathParam("cameraGroupId") int cameraGroupId, + @PathParam("from") long from, + @PathParam("to") long to) { try { Date fromD = new Date(from); Date toD = new Date(to); - - return Response.ok(analyticsService.getTimeBoundMovements(fromD, toD, true)).build(); + return Response.ok(analyticsService.getTimeBoundMovements(cameraGroupId, fromD, toD, true)).build(); } catch (Exception e) { logger.error("Error occurred when obtaining real time map. {}", e); return Response.status(500).build(); diff --git a/cramp-web/src/main/java/org/eduze/fyp/web/services/AnalyticsService.java b/cramp-web/src/main/java/org/eduze/fyp/web/services/AnalyticsService.java index b12a2c3d..443ba18a 100644 --- a/cramp-web/src/main/java/org/eduze/fyp/web/services/AnalyticsService.java +++ b/cramp-web/src/main/java/org/eduze/fyp/web/services/AnalyticsService.java @@ -60,31 +60,20 @@ public class AnalyticsService implements ProcessedMapListener { public AnalyticsService() { } - public List> getTimeBoundMovements(Date start, Date end, boolean useSegmentIndex) { - List candidates = personDAO.list(start, end); + public List> getTimeBoundMovements(int cameraGroupId, Date start, Date end, boolean useSegmentIndex) { + CameraGroup cameraGroup = cameraConfigDAO.findCameraGroupById(cameraGroupId); + List zones = cameraGroup.getZones(); + List people = personDAO.listByInstantZone(zones, start, end); + Map> trackedCandidates = new HashMap<>(); - for (Person p : candidates) { - // List target = null; - // if(!trackedCandidates.containsKey(p.getPreviousUuid())){ - // target = new ArrayList<>(); - // } - // else{ - // target = trackedCandidates.remove(p.getPreviousUuid()); - // } - // target.add(p); - // - // trackedCandidates.put(p.getUuid(),target); - int _id = p.getId(); - String id = String.valueOf(_id); - // if (useSegmentIndex) - // id += "_" + p.getTrackSegmentIndex(); - if (!trackedCandidates.containsKey(id)) { - trackedCandidates.put(id, new ArrayList<>()); - } - trackedCandidates.get(id).add(p); - } - return new ArrayList>(trackedCandidates.values()); + people.forEach(person -> { + String id = String.valueOf(person.getPersonId()); + List tracks = trackedCandidates.computeIfAbsent(id, key -> new ArrayList<>()); + tracks.add(person); + }); + + return new ArrayList<>(trackedCandidates.values()); } public List getRealtimePhotosAll() { diff --git a/ngapp/src/app/app-routing.module.ts b/ngapp/src/app/app-routing.module.ts index 03f25e75..38d8359c 100644 --- a/ngapp/src/app/app-routing.module.ts +++ b/ngapp/src/app/app-routing.module.ts @@ -4,9 +4,11 @@ import {DashboardComponent} from './dashboard/dashboard.component'; import {ZonesComponent} from './zones/zones.component'; import {ConfigComponent} from './settings/config/config.component'; import {HeatmapsComponent} from './heatmaps/heatmaps.component'; +import {TimeBoundMapComponent} from './time-bound-map/time-bound-map.component'; const routes: Routes = [ {path: 'dashboard', component: DashboardComponent}, + {path: 'time-line', component: TimeBoundMapComponent}, {path: 'zones', component: ZonesComponent}, {path: 'heat-map', component: HeatmapsComponent}, {path: 'settings', component: ConfigComponent}, diff --git a/ngapp/src/app/app.component.ts b/ngapp/src/app/app.component.ts index afb6312e..f503d097 100644 --- a/ngapp/src/app/app.component.ts +++ b/ngapp/src/app/app.component.ts @@ -33,6 +33,11 @@ export class AppComponent { name: 'Dashboard', icon: 'tachometer' }, + { + route: '/time-line', + name: 'Time Line', + icon: 'tachometer' + }, { route: '/zones', name: 'Zones', diff --git a/ngapp/src/app/app.module.ts b/ngapp/src/app/app.module.ts index 70c7fcb4..cb527e53 100644 --- a/ngapp/src/app/app.module.ts +++ b/ngapp/src/app/app.module.ts @@ -46,6 +46,7 @@ import {SuccessMessageComponent} from './helpers/success-message/success-message import {ZoneUiComponent} from './settings/zones-config/zone-ui/zone-ui.component'; import {ZoneComponent} from "./zones/zone/zone.component"; import {HeatmapComponent} from "./heatmaps/heatmap/heatmap.component"; +import {TimeLineComponent} from "./time-bound-map/time-line/time-line.component"; @NgModule({ @@ -61,10 +62,12 @@ import {HeatmapComponent} from "./heatmaps/heatmap/heatmap.component"; ZonesComponent, ZoneComponent, ZoneInfoComponent, + /* Timelines */ RealtimeMapComponent, RealtimeInfoComponent, - PersonStopPointsComponent, TimeBoundMapComponent, + TimeLineComponent, + PersonStopPointsComponent, ReIdComponent, TimelineComponent, TimeVelocityDistributionComponent, diff --git a/ngapp/src/app/realtime-info/realtime-info.component.ts b/ngapp/src/app/realtime-info/realtime-info.component.ts index d552486e..51cdb440 100644 --- a/ngapp/src/app/realtime-info/realtime-info.component.ts +++ b/ngapp/src/app/realtime-info/realtime-info.component.ts @@ -1,7 +1,6 @@ import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {PersonImage} from '../resources/person-image'; import {AnalyticsService} from '../services/analytics.service'; -import {ConfigService} from '../services/config.service'; @Component({ selector: 'app-realtime-info', @@ -25,12 +24,10 @@ export class RealtimeInfoComponent implements OnInit { @Input() reIDOnClick = false; - @Output() personClicked: EventEmitter = new EventEmitter(); - - constructor(private analyticsService: AnalyticsService, private configService: ConfigService) { + constructor(private analyticsService: AnalyticsService) { } ngOnInit() { diff --git a/ngapp/src/app/resources/global-map.ts b/ngapp/src/app/resources/global-map.ts index a1f38a85..2190d0ca 100644 --- a/ngapp/src/app/resources/global-map.ts +++ b/ngapp/src/app/resources/global-map.ts @@ -34,8 +34,8 @@ export class GlobalMap { img.src = image; } - public static fromJSON(image: string) { - return new GlobalMap('data:image/png;base64,' + image); + public static fromJSON(image: string, type: string = 'png') { + return new GlobalMap(`data:image/${type};base64,${image}`); } public toJSON() { diff --git a/ngapp/src/app/resources/person-snapshot.ts b/ngapp/src/app/resources/person-snapshot.ts index c14a9ade..29b2650a 100644 --- a/ngapp/src/app/resources/person-snapshot.ts +++ b/ngapp/src/app/resources/person-snapshot.ts @@ -17,20 +17,47 @@ * IN THE SOFTWARE. */ +import {Zone} from "./zone"; +import {GlobalMap} from "./global-map"; + export class PersonSnapshot { id: number; timestamp: number; x: number; y: number; - instanceZone: number; - persistantZone: number; - pastPersistantZone: number; + instanceZone: Zone; + persistantZone: Zone; + pastPersistantZone: Zone; standProbability: number; sitProbability: number; headDirectionX: number; headDirectionY: number; colour: string; standSitColour: string; + image: GlobalMap; + + constructor(id: number, timestamp: number, x: number, y: number, instanceZone: Zone, persistantZone: Zone, + pastPersistantZone: Zone, standProbability: number, sitProbability: number, headDirectionX: number, + headDirectionY: number, image: GlobalMap) { + this.id = id; + this.timestamp = timestamp; + this.x = x; + this.y = y; + this.instanceZone = instanceZone; + this.persistantZone = persistantZone; + this.pastPersistantZone = pastPersistantZone; + this.standProbability = standProbability; + this.sitProbability = sitProbability; + this.headDirectionX = headDirectionX; + this.headDirectionY = headDirectionY; + this.image = image; + } + + public static fromJSON(obj: any): PersonSnapshot { + return new PersonSnapshot(obj.id, obj.timestamp, obj.x, obj.y, Zone.fromJSON(obj.instanceZone), + Zone.fromJSON(obj.persistantZone), Zone.fromJSON(obj.pastPersistantZone), obj.standProbability, obj.sitProbability, + obj.headDirectionX, obj.headDirectionY, GlobalMap.fromJSON(obj.image, "jpg")); + } } diff --git a/ngapp/src/app/resources/zone.ts b/ngapp/src/app/resources/zone.ts index 5301a9f6..3e72d53b 100644 --- a/ngapp/src/app/resources/zone.ts +++ b/ngapp/src/app/resources/zone.ts @@ -43,6 +43,10 @@ export class Zone { } public static fromJSON(obj: any): Zone { + if (!obj) { + return null; + } + return new Zone(obj.id, obj.zoneName, obj.xCoordinates, obj.yCoordinates, obj.zoneLimit, CameraGroup.fromJSON(obj.cameraGroup)); } diff --git a/ngapp/src/app/services/analytics.service.ts b/ngapp/src/app/services/analytics.service.ts index e7360200..fd20c148 100644 --- a/ngapp/src/app/services/analytics.service.ts +++ b/ngapp/src/app/services/analytics.service.ts @@ -111,24 +111,28 @@ export class AnalyticsService { }; img.src = base64; obj['image'] = base64; - }); - } return status; }) .catch(AnalyticsService.handleError); } - getTimeboundMap(from: number, to: number, useTrackSegments: boolean): Promise { - let url = this.baseUrl + 'timeBoundMap/' + from + '/' + to; - if (useTrackSegments) { - url += '/trackSegmented'; - } + getTimeboundMap(cameraGroupId: number, from: number, to: number): Promise { + const url = `${this.baseUrl}timeBoundMap/${cameraGroupId}/${from}/${to}`; return this.http.get(url) .toPromise() .then(response => { - return response as PersonSnapshot[][]; + const people = response as PersonSnapshot[][]; + const results: PersonSnapshot[][] = []; + for (const person of people) { + const snaps = []; + for (const snap of person) { + snaps.push(PersonSnapshot.fromJSON(snap)); + } + results.push(snaps); + } + return results; }) .catch(AnalyticsService.handleError); } @@ -137,7 +141,7 @@ export class AnalyticsService { return this.http.get(`${this.baseUrl}zoneStatistics/${cameraGroupId}/${from}/${to}`) .toPromise() .then(response => { - console.debug(response); + console.log(response); return response as ZoneStatistic[]; }) .catch(AnalyticsService.handleError); @@ -145,7 +149,7 @@ export class AnalyticsService { private static getZoneColour(index: number): string { - //return "rgb(" + Math.round(((index / 256 / 256) * 80) % 256).toString() + "," + Math.round(((index / 256) * 80) % 256).toString() + "," + Math.round((index * 80) % 256).toString() + ")"; + // return "rgb(" + Math.round(((index / 256 / 256) * 80) % 256).toString() + "," + Math.round(((index / 256) * 80) % 256).toString() + "," + Math.round((index * 80) % 256).toString() + ")"; const colours = ['#c0392b', '#f1c40f', '#16a085', '#2980b9', '#34495e', '#9b59b5', '#2cee91', '#171796', '#fec3fc', '#8e44ad']; return colours[index % colours.length]; } @@ -170,7 +174,7 @@ export class AnalyticsService { result.timelineZones = results; if (results.length > 0) { result.person = results[0].person; - result.label = results[0].person.ids[0].toString(); + result.label = results[0].person.id.toString(); } diff --git a/ngapp/src/app/time-bound-map/time-bound-map.component.css b/ngapp/src/app/time-bound-map/time-bound-map.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ngapp/src/app/time-bound-map/time-bound-map.component.html b/ngapp/src/app/time-bound-map/time-bound-map.component.html index f48497cc..62147ca2 100644 --- a/ngapp/src/app/time-bound-map/time-bound-map.component.html +++ b/ngapp/src/app/time-bound-map/time-bound-map.component.html @@ -1,89 +1,18 @@ -
-
-
-
-

- Timeline -

-
- {{personSnapshots.length}} people -
-
-
-
-
- - -
-
- - -
-
- -
-
- -
- -

From {{ from | date:'medium' }} to {{ to | date:'medium' }}

-
- -
-
- - - - + -
+
+
+
+
-
- - Track Details - - - - -
diff --git a/ngapp/src/app/time-bound-map/time-bound-map.component.spec.ts b/ngapp/src/app/time-bound-map/time-bound-map.component.spec.ts deleted file mode 100644 index 95c0c67b..00000000 --- a/ngapp/src/app/time-bound-map/time-bound-map.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TimeBoundMapComponent } from './time-bound-map.component'; - -describe('TimeBoundMapComponent', () => { - let component: TimeBoundMapComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ TimeBoundMapComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TimeBoundMapComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ngapp/src/app/time-bound-map/time-bound-map.component.ts b/ngapp/src/app/time-bound-map/time-bound-map.component.ts index d141791e..d29505ef 100644 --- a/ngapp/src/app/time-bound-map/time-bound-map.component.ts +++ b/ngapp/src/app/time-bound-map/time-bound-map.component.ts @@ -1,182 +1,24 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {PersonSnapshot} from '../resources/person-snapshot'; -import {GlobalMap} from '../resources/global-map'; -import {AnalyticsService} from '../services/analytics.service'; +import {Component, OnInit} from '@angular/core'; import {ConfigService} from '../services/config.service'; -import {PersonImage} from '../resources/person-image'; +import {CameraGroup} from "../resources/camera-group"; @Component({ selector: 'app-time-bound-map', - templateUrl: './time-bound-map.component.html', - styleUrls: ['./time-bound-map.component.css'] + templateUrl: './time-bound-map.component.html' }) export class TimeBoundMapComponent implements OnInit { - private _startTime: Date; - private _endTime: Date; + cameraGroups: CameraGroup[]; + active: CameraGroup; - private _secondRange: number[] = [0, 60]; - private personSnapshots: PersonSnapshot[][] = [[]]; - globalMap: GlobalMap; - - private _selectedTrackIndex = -1; - private _selectedSegmentIndex = -1; - - constructor(private analyticsService: AnalyticsService, private configService: ConfigService) { - this.endTime = new Date(); - this.startTime = new Date(); - this.startTime.setDate(this.startTime.getDate() - 7); - } - - get selectedSegmentIndex(): number { - return this._selectedSegmentIndex; - } - - set selectedSegmentIndex(value: number) { - this._selectedSegmentIndex = value; - } - - get useTrackSegments(): boolean { - return this._useTrackSegments; - } - - set useTrackSegments(value: boolean) { - this._useTrackSegments = value; - this.refresh(); - } - - get selectedTrackIndex(): number { - return this._selectedTrackIndex; - } - - - private _useTrackSegments = false; - - - set selectedTrackIndex(value: number) { - this._selectedTrackIndex = value; - } - - get secondRange(): number[] { - return this._secondRange; - } - - set secondRange(value: number[]) { - this._secondRange = value; - this.refresh(); - } - - get startTime(): Date { - return this._startTime; - } - - @Input() - set startTime(value: Date) { - this._startTime = value; - this.refresh(); - } - - get endTime(): Date { - return this._endTime; - } - - @Input() - set endTime(value: Date) { - this._endTime = value; - this.refresh(); - } - - private getColour(index: number): string { - return 'rgb(' + Math.round(((index / 256 / 256) * 40) % 256).toString() + ',' + Math.round(((index / 256) * 40) % 256).toString() - + ',' + Math.round((index * 40) % 256).toString() + ')'; - } - - private getStandSitColour(person: PersonSnapshot): string { - const standCol = Math.round(person.standProbability * 255); - const sitCol = Math.round(person.sitProbability * 255); - - return 'rgb(' + standCol.toString() + ', ' + sitCol.toString() + ',255 )'; - } - - private get from(): number { - if (this.startTime == null || this.secondRange[0] == null) { - return null; - } - return this.startTime.getTime() + this.secondRange[0] * 1000; - } - - private get to(): number { - if (this.endTime == null || this.secondRange[1] == null) { - return null; - } - return this.endTime.getTime() + this.secondRange[1] * 1000; - } - - private backgroundClicked(): void { - this.selectedTrackIndex = -1; - } - - private isSelected(p: PersonSnapshot): boolean { - if (p.ids.length === 0) { - return false; - } - - if (!this.useTrackSegments) { - return p.ids[0] === this.selectedTrackIndex; - } else { - return p.ids[0] === this.selectedTrackIndex && p.trackSegmentIndex == this.selectedSegmentIndex; - } - } - - private trackClicked(track: PersonSnapshot[]): void { - if (track[0].ids.length > 0) { - this.selectedTrackIndex = track[0].ids[0]; - this.selectedSegmentIndex = track[0].trackSegmentIndex; - } - console.log('Track clicked' + track[0].ids[0].toString()); - console.log(track); - } - - private refresh(): void { - - if (this.startTime == null) { - return; - } - - if (this.endTime == null) { - return; - } - - this.analyticsService.getTimeboundMap(this.from, this.to, this.useTrackSegments) - .then(ps => { - this.personSnapshots = ps; - ps.forEach((item) => { - item.reverse(); - item[0]['colour'] = this.getColour(item[0].ids[0]); - item[0]['standSitColour'] = this.getStandSitColour(item[0]); - }); - // console.log(this.personSnapshots); - // this.drawOnCanvas(personSnapshots); - }) - .catch(reason => console.log(reason)); - - } - - personClicked(person: PersonImage): void { - if (person.ids.length > 0) { - this.selectedTrackIndex = person.ids[0]; - this.selectedSegmentIndex = person.trackSegmentIndex; - console.log('Track Segment Index: ' + person.trackSegmentIndex); - } - console.log('Person clicked' + person.ids[0].toString()); + constructor(private configService: ConfigService) { } ngOnInit() { - this.configService.getMap().then((globalMap) => { - this.globalMap = globalMap; - console.log(this.globalMap); - }); - this.refresh(); + this.configService.getCameraGroups() + .then(groups => { + this.cameraGroups = groups; + this.active = groups[0]; + }); } - } diff --git a/ngapp/src/app/time-bound-map/time-line/time-line.component.html b/ngapp/src/app/time-bound-map/time-line/time-line.component.html new file mode 100644 index 00000000..fe0cc25d --- /dev/null +++ b/ngapp/src/app/time-bound-map/time-line/time-line.component.html @@ -0,0 +1,93 @@ +
+
+

+ {{cameraGroup.name}} +

+
+ {{personSnapshots.length}} people +
+
+
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+ +

From {{ from | date:'medium' }} to {{ to | date:'medium' }}

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+ +
+
+

{{snap.timestamp|date:'medium'}}

+
+
+ + + + + + + + + +
diff --git a/ngapp/src/app/time-bound-map/time-line/time-line.component.ts b/ngapp/src/app/time-bound-map/time-line/time-line.component.ts new file mode 100644 index 00000000..9042c6c3 --- /dev/null +++ b/ngapp/src/app/time-bound-map/time-line/time-line.component.ts @@ -0,0 +1,149 @@ +import {Component, Input, OnInit} from '@angular/core'; +import {PersonSnapshot} from '../../resources/person-snapshot'; +import {AnalyticsService} from '../../services/analytics.service'; +import {CameraGroup} from '../../resources/camera-group'; +import {PersonImage} from '../../resources/person-image'; + +@Component({ + selector: 'app-time-line', + templateUrl: './time-line.component.html' +}) +export class TimeLineComponent implements OnInit { + + private _startTime: Date; + private _endTime: Date; + private _secondRange: number[] = [0, 60]; + private personSnapshots: PersonSnapshot[][] = []; + + private _cameraGroup: CameraGroup; + private _selectedTrackIndex = -1; + selectedTrack: PersonSnapshot[]; + + constructor(private analyticsService: AnalyticsService) { + this.endTime = new Date(); + this.startTime = new Date(); + this.startTime.setDate(this.startTime.getDate() - 7); + } + + ngOnInit() { + this.refresh(); + } + + get selectedTrackIndex(): number { + return this._selectedTrackIndex; + } + + set selectedTrackIndex(value: number) { + this._selectedTrackIndex = value; + } + + get secondRange(): number[] { + return this._secondRange; + } + + set secondRange(value: number[]) { + this._secondRange = value; + this.refresh(); + } + + get startTime(): Date { + return this._startTime; + } + + set startTime(value: Date) { + this._startTime = value; + this.refresh(); + } + + get endTime(): Date { + return this._endTime; + } + + set endTime(value: Date) { + this._endTime = value; + this.refresh(); + } + + private getColour(index: number): string { + return 'rgb(' + Math.round(((index / 256 / 256) * 40) % 256).toString() + ',' + Math.round(((index / 256) * 40) % 256).toString() + + ',' + Math.round((index * 40) % 256).toString() + ')'; + } + + private getStandSitColour(person: PersonSnapshot): string { + const standCol = Math.round(person.standProbability * 255); + const sitCol = Math.round(person.sitProbability * 255); + + return 'rgb(' + standCol.toString() + ', ' + sitCol.toString() + ',255 )'; + } + + private get from(): number { + if (this.startTime == null || this.secondRange[0] == null) { + return null; + } + return this.startTime.getTime() + this.secondRange[0] * 1000; + } + + private get to(): number { + if (this.endTime == null || this.secondRange[1] == null) { + return null; + } + return this.endTime.getTime() + this.secondRange[1] * 1000; + } + + private backgroundClicked(): void { + this.selectedTrackIndex = -1; + this.selectedTrack = null; + } + + private isSelected(p: PersonSnapshot): boolean { + if (p.id === 0) { + return false; + } + + return p.id === this.selectedTrackIndex; + } + + private trackClicked(snapshots: PersonSnapshot[]): void { + this.selectedTrackIndex = snapshots[0].id; + console.log('Track clicked', snapshots[0].id); + this.selectedTrack = snapshots; + } + + private refresh(): void { + if (!this.cameraGroup) { + console.log('No camera groups set'); + return; + } + + this.analyticsService.getTimeboundMap(this.cameraGroup.id, this.from, this.to) + .then(ps => { + this.personSnapshots = ps; + console.log('Snaps', ps[0]); + ps.forEach((item) => { + item.reverse(); + item[0]['colour'] = this.getColour(item[0].id); + item[0]['standSitColour'] = this.getStandSitColour(item[0]); + }); + // console.log(this.personSnapshots); + // this.drawOnCanvas(personSnapshots); + }) + .catch(reason => console.log(reason)); + + } + + personClicked(person: PersonImage): void { + this.selectedTrackIndex = person.id; + console.log('Track Segment Index: ', person.trackSegmentIndex); + console.log('Person clicked', person.id); + } + + get cameraGroup(): CameraGroup { + return this._cameraGroup; + } + + @Input() + set cameraGroup(value: CameraGroup) { + this._cameraGroup = value; + this.refresh(); + } +}