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)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |