forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			46 lines
		
	
	
		
			No EOL
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			No EOL
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /// Given a feature source, calculates a list of OSM-contributors who mapped the latest versions
 | |
| import {UIEventSource} from "./UIEventSource";
 | |
| import FeaturePipeline from "./FeatureSource/FeaturePipeline";
 | |
| import Loc from "../Models/Loc";
 | |
| import {BBox} from "./BBox";
 | |
| 
 | |
| export default class ContributorCount {
 | |
| 
 | |
|     public readonly Contributors: UIEventSource<Map<string, number>> = new UIEventSource<Map<string, number>>(new Map<string, number>());
 | |
|     private readonly state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource<BBox>, locationControl: UIEventSource<Loc> };
 | |
|     private lastUpdate: Date = undefined;
 | |
| 
 | |
|     constructor(state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource<BBox>, locationControl: UIEventSource<Loc> }) {
 | |
|         this.state = state;
 | |
|         const self = this;
 | |
|         state.currentBounds.map(bbox => {
 | |
|             self.update(bbox)
 | |
|         })
 | |
|         state.featurePipeline.runningQuery.addCallbackAndRun(
 | |
|             _ => self.update(state.currentBounds.data)
 | |
|         )
 | |
| 
 | |
|     }
 | |
| 
 | |
|     private update(bbox: BBox) {
 | |
|         if (bbox === undefined) {
 | |
|             return;
 | |
|         }
 | |
|         const now = new Date();
 | |
|         if (this.lastUpdate !== undefined && ((now.getTime() - this.lastUpdate.getTime()) < 1000 * 60)) {
 | |
|             return;
 | |
|         }
 | |
|         this.lastUpdate = now;
 | |
|         const featuresList = this.state.featurePipeline.GetAllFeaturesWithin(bbox)
 | |
|         const hist = new Map<string, number>();
 | |
|         for (const list of featuresList) {
 | |
|             for (const feature of list) {
 | |
|                 const contributor = feature.properties["_last_edit:contributor"]
 | |
|                 const count = hist.get(contributor) ?? 0;
 | |
|                 hist.set(contributor, count + 1)
 | |
|             }
 | |
|         }
 | |
|         this.Contributors.setData(hist)
 | |
|     }
 | |
| 
 | |
| } |