forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			52 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			52 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import FeatureSource from "./FeatureSource"; | ||
|  | import {UIEventSource} from "../UIEventSource"; | ||
|  | import * as $ from "jquery"; | ||
|  | import {Layer} from "leaflet"; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Fetches a geojson file somewhere and passes it along | ||
|  |  */ | ||
|  | export default class GeoJsonSource implements FeatureSource { | ||
|  |     features: UIEventSource<{ feature: any; freshness: Date }[]>; | ||
|  | 
 | ||
|  |     constructor(layerId: string, url: string, onFail: ((errorMsg: any) => void) = undefined) { | ||
|  |         if (onFail === undefined) { | ||
|  |             onFail = errorMsg => { | ||
|  |                 console.warn(`Could not load geojson layer from`, url, "due to", errorMsg) | ||
|  |             } | ||
|  |         } | ||
|  |         this.features = new UIEventSource<{ feature: any; freshness: Date }[]>(undefined) | ||
|  |         const eventSource = this.features; | ||
|  |         $.getJSON(url, function (json, status) { | ||
|  |             if (status !== "success") { | ||
|  |                 console.log("Fetching geojson failed failed") | ||
|  |                 onFail(status); | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (json.elements === [] && json.remarks.indexOf("runtime error") > 0) { | ||
|  |                 console.log("Timeout or other runtime error"); | ||
|  |                 onFail("Runtime error (timeout)") | ||
|  |                 return; | ||
|  |             } | ||
|  |             const time = new Date(); | ||
|  |             const features: { feature: any, freshness: Date } [] = [] | ||
|  |             let i = 0; | ||
|  |             for (const feature of json.features) { | ||
|  |                 if (feature.properties.id === undefined) { | ||
|  |                     feature.properties.id = url + "/" + i; | ||
|  |                     feature.id = url + "/" + i; | ||
|  |                     i++; | ||
|  |                 } | ||
|  |                 feature._matching_layer_id = layerId; | ||
|  |                 features.push({feature: feature, freshness: time}) | ||
|  |             } | ||
|  |             console.log("Loaded features are", features) | ||
|  |             eventSource.setData(features) | ||
|  | 
 | ||
|  |         }).fail(onFail) | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  | } |