128 lines
3.9 KiB
JavaScript
128 lines
3.9 KiB
JavaScript
// FIXME consider delaying feature reading so projection can be provided by
|
|
// consumer (e.g. the view)
|
|
|
|
goog.provide('ol.source.FormatVector');
|
|
|
|
goog.require('goog.asserts');
|
|
goog.require('goog.dispose');
|
|
goog.require('goog.events');
|
|
goog.require('goog.net.EventType');
|
|
goog.require('goog.net.XhrIo');
|
|
goog.require('goog.net.XhrIo.ResponseType');
|
|
goog.require('goog.userAgent');
|
|
goog.require('ol.format.FormatType');
|
|
goog.require('ol.has');
|
|
goog.require('ol.source.State');
|
|
goog.require('ol.source.Vector');
|
|
goog.require('ol.xml');
|
|
|
|
|
|
|
|
/**
|
|
* @classdesc
|
|
* Abstract base class; normally only used for creating subclasses and not
|
|
* instantiated in apps.
|
|
* Base class for vector sources in one of the supported formats.
|
|
*
|
|
* @constructor
|
|
* @extends {ol.source.Vector}
|
|
* @param {olx.source.FormatVectorOptions} options Options.
|
|
*/
|
|
ol.source.FormatVector = function(options) {
|
|
|
|
goog.base(this, {
|
|
attributions: options.attributions,
|
|
logo: options.logo,
|
|
projection: options.projection
|
|
});
|
|
|
|
/**
|
|
* @protected
|
|
* @type {ol.format.Feature}
|
|
*/
|
|
this.format = options.format;
|
|
|
|
};
|
|
goog.inherits(ol.source.FormatVector, ol.source.Vector);
|
|
|
|
|
|
/**
|
|
* @param {goog.Uri|string} url URL.
|
|
* @param {function(this: T, Array.<ol.Feature>)} success Success Callback.
|
|
* @param {function(this: T)} error Error callback.
|
|
* @param {T} thisArg Value to use as `this` when executing `success` or
|
|
* `error`.
|
|
* @template T
|
|
*/
|
|
ol.source.FormatVector.prototype.loadFeaturesFromURL =
|
|
function(url, success, error, thisArg) {
|
|
var xhrIo = new goog.net.XhrIo();
|
|
var type = this.format.getType();
|
|
var responseType;
|
|
// FIXME maybe use ResponseType.DOCUMENT?
|
|
if (type == ol.format.FormatType.BINARY &&
|
|
ol.has.ARRAY_BUFFER) {
|
|
responseType = goog.net.XhrIo.ResponseType.ARRAY_BUFFER;
|
|
} else {
|
|
responseType = goog.net.XhrIo.ResponseType.TEXT;
|
|
}
|
|
xhrIo.setResponseType(responseType);
|
|
goog.events.listen(xhrIo, goog.net.EventType.COMPLETE,
|
|
/**
|
|
* @param {Event} event Event.
|
|
* @private
|
|
* @this {ol.source.FormatVector}
|
|
*/
|
|
function(event) {
|
|
var xhrIo = event.target;
|
|
goog.asserts.assertInstanceof(xhrIo, goog.net.XhrIo,
|
|
'event.target/xhrIo is an instance of goog.net.XhrIo');
|
|
if (xhrIo.isSuccess()) {
|
|
var type = this.format.getType();
|
|
/** @type {ArrayBuffer|Document|Node|Object|string|undefined} */
|
|
var source;
|
|
if (type == ol.format.FormatType.BINARY &&
|
|
ol.has.ARRAY_BUFFER) {
|
|
source = xhrIo.getResponse();
|
|
goog.asserts.assertInstanceof(source, ArrayBuffer,
|
|
'source is an instance of ArrayBuffer');
|
|
} else if (type == ol.format.FormatType.JSON) {
|
|
source = xhrIo.getResponseText();
|
|
} else if (type == ol.format.FormatType.TEXT) {
|
|
source = xhrIo.getResponseText();
|
|
} else if (type == ol.format.FormatType.XML) {
|
|
if (!goog.userAgent.IE) {
|
|
source = xhrIo.getResponseXml();
|
|
}
|
|
if (!goog.isDefAndNotNull(source)) {
|
|
source = ol.xml.parse(xhrIo.getResponseText());
|
|
}
|
|
} else {
|
|
goog.asserts.fail('unexpected format type');
|
|
}
|
|
if (goog.isDefAndNotNull(source)) {
|
|
success.call(thisArg, this.readFeatures(source));
|
|
} else {
|
|
this.setState(ol.source.State.ERROR);
|
|
goog.asserts.fail('undefined or null source');
|
|
}
|
|
} else {
|
|
error.call(thisArg);
|
|
}
|
|
goog.dispose(xhrIo);
|
|
}, false, this);
|
|
xhrIo.send(url);
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
|
|
* @return {Array.<ol.Feature>} Features.
|
|
* @api
|
|
*/
|
|
ol.source.FormatVector.prototype.readFeatures = function(source) {
|
|
var format = this.format;
|
|
var projection = this.getProjection();
|
|
return format.readFeatures(source, {featureProjection: projection});
|
|
};
|