# all files / ol/ featureloader.js

84.38% Statements 27/32
76.19% Branches 16/21
83.33% Functions 5/6
84.38% Lines 27/32

    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
    981×

    1×
    1×
    1×

    1×
    22×

    22×
    22×

    22×
    6×

    22×

    22×
    19×

    19×
    19×

    13×
    6×

    6×
    6×

    19×
    19×

    3×

    22×

    22×

    1×
    3×

    3×

     goog.provide('ol.featureloader');

    goog.require('ol');
    goog.require('ol.format.FormatType');
    goog.require('ol.xml');

    /**
     * @param {string|ol.FeatureUrlFunction} url Feature URL service.
     * @param {ol.format.Feature} format Feature format.
     * @param {function(this:ol.VectorTile, Array.<ol.Feature>, ol.proj.Projection, ol.Extent)|function(this:ol.source.Vector, Array.<ol.Feature>)} success
     *     Function called with the loaded features and optionally with the data
     *     projection. Called with the vector tile or source as `this`.
     * @param {function(this:ol.VectorTile)|function(this:ol.source.Vector)} failure
     *     Function called when loading failed. Called with the vector tile or
     *     source as `this`.
     * @return {ol.FeatureLoader} The feature loader.
     */
    ol.featureloader.loadFeaturesXhr = function(url, format, success, failure) {
      return (
        /**
         * @param {ol.Extent} extent Extent.
         * @param {number} resolution Resolution.
         * @param {ol.proj.Projection} projection Projection.
         * @this {ol.source.Vector|ol.VectorTile}
         */
        function(extent, resolution, projection) {
          var xhr = new XMLHttpRequest();
          xhr.open('GET',
              typeof url === 'function' ? url(extent, resolution, projection) : url,
              true);
          if (format.getType() == ol.format.FormatType.ARRAY_BUFFER) {
            xhr.responseType = 'arraybuffer';
          }
          /**
           * @param {Event} event Event.
           * @private
           */
          xhr.onload = function(event) {
            // status will be 0 for file:// urls
            if (!xhr.status || xhr.status >= 200 && xhr.status < 300) {
              var type = format.getType();
              /** @type {Document|Node|Object|string|undefined} */
              var source;
              if (type == ol.format.FormatType.JSON ||
                    type == ol.format.FormatType.TEXT) {
                source = xhr.responseText;
              } else Iif (type == ol.format.FormatType.XML) {
                source = xhr.responseXML;
                if (!source) {
                  source = ol.xml.parse(xhr.responseText);
                }
              } else Eif (type == ol.format.FormatType.ARRAY_BUFFER) {
                source = /** @type {ArrayBuffer} */ (xhr.response);
              }
              Eif (source) {
                success.call(this, format.readFeatures(source,
                    {featureProjection: projection}),
                format.readProjection(source), format.getLastExtent());
              } else {
                failure.call(this);
              }
            } else {
              failure.call(this);
            }
          }.bind(this);
          /**
           * @private
           */
          xhr.onerror = function() {
            failure.call(this);
          }.bind(this);
          xhr.send();
        });
    };

    /**
     * Create an XHR feature loader for a `url` and `format`. The feature loader
     * loads features (with XHR), parses the features, and adds them to the
     * vector source.
     * @param {string|ol.FeatureUrlFunction} url Feature URL service.
     * @param {ol.format.Feature} format Feature format.
     * @return {ol.FeatureLoader} The feature loader.
     * @api
     */
    ol.featureloader.xhr = function(url, format) {
      return ol.featureloader.loadFeaturesXhr(url, format,
          /**
           * @param {Array.<ol.Feature>} features The loaded features.
           * @param {ol.proj.Projection} dataProjection Data projection.
           * @this {ol.source.Vector}
           */
          function(features, dataProjection) {
            this.addFeatures(features);
          }, /* FIXME handle error */ ol.nullFunction);
    };