all files / src/layers/ LayerBaseVectorGeoJson.ts

86.11% Statements 31/36
77.78% Branches 14/18
62.5% Functions 5/8
84.85% Lines 28/33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129                                                                                                        18×                                               10×                                                    
/**
 * Created by gavorhes on 11/2/2015.
 */
 
import {LayerBaseVector, LayerBaseVectorOptions} from './LayerBaseVector';
import provide from '../util/provide';
import ol = require('custom-ol');
import $ = require('jquery');
import {MapMoveCls} from "../olHelpers/mapMoveCls";
import * as proj from '../olHelpers/projections';
import {proj3857} from "../olHelpers/projections";
 
let nm = provide('layers');
 
export interface crsTransform {
    dataProjection?: ol.proj.Projection;
    featureProjection?: ol.proj.Projection;
}
 
 
export interface LayerBaseVectorGeoJsonOptions extends LayerBaseVectorOptions {
    transform?: crsTransform;
    mapMoveObj?: MapMoveCls;
}
 
/**
 * The Vector GeoJson Layer
 * @augments LayerBaseVector
 */
export class LayerBaseVectorGeoJson extends LayerBaseVector {
    _geoJsonFormat: ol.format.GeoJSON;
    _transform: crsTransform;
 
    /**
     * @param {string|null} url - resource url, set to '' to make blank layer
     * @param {object} options - config
     * @param {string} [options.id] - layer id
     * @param {string} [options.name=Unnamed Layer] - layer name
     * @param {number} [options.opacity=1] - opacity
     * @param {boolean} [options.visible=true] - default visible
     * @param {number} [options.minZoom=undefined] - min zoom level, 0 - 28
     * @param {number} [options.maxZoom=undefined] - max zoom level, 0 - 28
     * @param {object} [options.params={}] the get parameters to include to retrieve the layer
     * @param {number} [options.zIndex=0] the z index for the layer
     * @param {function} [options.loadCallback] function to call on load, context this is the layer object
     * @param {boolean} [options.legendCollapse=false] if the legend item should be initially collapsed
     * @param {boolean} [options.legendCheckbox=true] if the legend item should have a checkbox for visibility
     * @param {boolean} [options.legendContent] additional content to add to the legend
     *
     * @param {boolean} [options.autoLoad=false] if the layer should auto load if not visible
     * @param {object} [options.style=undefined] the layer style, use openlayers default style if not defined
     * @param {boolean} [options.onDemand=false] if the layer should be loaded by extent on map move
     * @param {number} [options.onDemandDelay=300] delay before the map move callback should be called
     *
     * @param {object} [options.transform={}] SR transform, set as false for no transform
     * @param {string} options.transform.dataProjection=EPSG:4326 the _data CRS
     * @param {string} options.transform.featureProjection=EPSG:3857 the feature/map CRS
     * @param {mapMoveMakeGetParams} [options.mapMoveMakeGetParams=function(lyr, extent, zoomLevel){}] function to create additional map move params
     * @param {MapMoveCls} [options.mapMoveObj=mapMove] alternate map move object for use with multi map pages
     */
    constructor(url?: string, Eoptions: LayerBaseVectorGeoJsonOptions = {}) {
        url = typeof url == 'string' ? url : '';
        super(url, options);
 
        this._geoJsonFormat = new ol.format.GeoJSON();
 
        this._transform = options.transform || {};
        this._transform.dataProjection = this._transform.dataProjection || proj.proj4326;
        this._transform.featureProjection = this._transform.featureProjection || proj3857;
 
        Eif (this.autoLoad || this.visible) {
            this._load();
        }
    }
 
    /**
     * add feature collection
     * @param {object} featureCollection - as geojson object
     */
    addFeatures(featureCollection: any) {
        this.source.addFeatures(
            this._geoJsonFormat.readFeatures(featureCollection,
                {dataProjection: this._transform.dataProjection,
                    featureProjection: this._transform.featureProjection}
                )
        );
    }
 
 
    /**
     * trigger load features
     * @protected
     * @returns {boolean} if already loaded
     */
    _load() {
 
        if (super._load()) {
            return true;
        }
 
        $.get(this._url,
            this._params,
            (d) => {
                this.addFeatures(d);
                this.loadCallback(this);
            }, 'json').fail(
            function () {
                this._loaded = false;
            }
        );
 
        return false;
    }
 
    /**
     * callback function on map move
     * @param {object} d the json response
     * @override
     */
    mapMoveCallback(d) {
        super.mapMoveCallback(d);
        this._source.addFeatures(this._geoJsonFormat.readFeatures(d,
            {featureProjection: this._transform.featureProjection, dataProjection: this._transform.dataProjection}));
    }
}
 
nm.LayerBaseVectorGeoJson = LayerBaseVectorGeoJson;
export default LayerBaseVectorGeoJson;