diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc
index 26430e0b36..971291cfca 100644
--- a/src/objectliterals.jsdoc
+++ b/src/objectliterals.jsdoc
@@ -668,6 +668,15 @@
* @todo stability experimental
*/
+/**
+ * @typedef {Object} olx.source.FormatVectorOptions
+ * @property {Array.
|undefined} attributions Attributions.
+ * @property {ol.Extent|undefined} extent Extent.
+ * @property {ol.format.Feature} format Format.
+ * @property {string|undefined} logo Logo.
+ * @property {ol.proj.ProjectionLike} projection Projection.
+ */
+
/**
* @typedef {Object} olx.source.GeoJSONOptions
* @property {Array.|undefined} attributions Attributions.
diff --git a/src/ol/source/formatvectorsource.js b/src/ol/source/formatvectorsource.js
new file mode 100644
index 0000000000..418e098f8a
--- /dev/null
+++ b/src/ol/source/formatvectorsource.js
@@ -0,0 +1,138 @@
+// 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.BrowserFeature');
+goog.require('ol.format.FormatType');
+goog.require('ol.proj');
+goog.require('ol.source.State');
+goog.require('ol.source.Vector');
+goog.require('ol.xml');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.source.Vector}
+ * @param {olx.source.FormatVectorOptions} options Options.
+ * @todo stability experimental
+ */
+ol.source.FormatVector = function(options) {
+
+ goog.base(this, {
+ attributions: options.attributions,
+ extent: options.extent,
+ logo: options.logo,
+ projection: options.projection
+ });
+
+ /**
+ * @protected
+ * @type {ol.format.Feature}
+ */
+ this.format = options.format;
+
+ /**
+ * @protected
+ * @type {function(Event)}
+ */
+ this.handleXhrIo = goog.bind(this.handleXhrIo_, this);
+
+};
+goog.inherits(ol.source.FormatVector, ol.source.Vector);
+
+
+/**
+ * @param {Event} event Event.
+ * @private
+ */
+ol.source.FormatVector.prototype.handleXhrIo_ = function(event) {
+ var xhrIo = event.target;
+ goog.asserts.assertInstanceof(xhrIo, 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.BrowserFeature.HAS_ARRAY_BUFFER) {
+ source = xhrIo.getResponse();
+ goog.asserts.assertInstanceof(source, 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.load(xhrIo.getResponseText());
+ }
+ } else {
+ goog.asserts.fail();
+ }
+ if (goog.isDefAndNotNull(source)) {
+ this.readFeatures(source);
+ } else {
+ this.setState(ol.source.State.ERROR);
+ goog.asserts.fail();
+ }
+ } else {
+ this.setState(ol.source.State.ERROR);
+ }
+ goog.dispose(xhrIo);
+};
+
+
+/**
+ * @param {goog.Uri|string} url URL.
+ */
+ol.source.FormatVector.prototype.loadFeatures = function(url) {
+ 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.BrowserFeature.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, this.handleXhrIo);
+ xhrIo.send(url);
+};
+
+
+/**
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ */
+ol.source.FormatVector.prototype.readFeatures = function(source) {
+ var format = this.format;
+ var features = format.readFeatures(source);
+ var featureProjection = format.readProjection(source);
+ var projection = this.getProjection();
+ if (!goog.isNull(projection)) {
+ if (!ol.proj.equivalent(featureProjection, projection)) {
+ var transform = ol.proj.getTransform(featureProjection, projection);
+ var i, ii;
+ for (i = 0, ii = features.length; i < ii; ++i) {
+ var feature = features[i];
+ var geometry = feature.getGeometry();
+ if (!goog.isNull(geometry)) {
+ geometry.transform(transform);
+ }
+ }
+ }
+ }
+ this.addFeaturesInternal(features);
+ this.setState(ol.source.State.READY);
+};
diff --git a/src/ol/source/staticvectorsource.js b/src/ol/source/staticvectorsource.js
index ace4886d3b..6070bc8afa 100644
--- a/src/ol/source/staticvectorsource.js
+++ b/src/ol/source/staticvectorsource.js
@@ -1,168 +1,60 @@
-// FIXME consider delaying feature reading so projection can be provided by
-// consumer (e.g. the view)
-
goog.provide('ol.source.StaticVector');
-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.BrowserFeature');
-goog.require('ol.format.FormatType');
-goog.require('ol.proj');
+goog.require('ol.source.FormatVector');
goog.require('ol.source.State');
-goog.require('ol.source.Vector');
-goog.require('ol.xml');
/**
* @constructor
- * @extends {ol.source.Vector}
+ * @extends {ol.source.FormatVector}
* @fires {@link ol.source.VectorEvent} ol.source.VectorEvent
- * @param {olx.source.StaticVectorOptions=} opt_options Options.
+ * @param {olx.source.StaticVectorOptions} options Options.
* @todo stability experimental
*/
-ol.source.StaticVector = function(opt_options) {
-
- var options = goog.isDef(opt_options) ? opt_options : {};
+ol.source.StaticVector = function(options) {
goog.base(this, {
attributions: options.attributions,
extent: options.extent,
+ format: options.format,
logo: options.logo,
projection: options.projection
});
- /**
- * @type {ol.format.Feature}
- * @protected
- */
- this.format = options.format;
+ if (goog.isDef(options.arrayBuffer)) {
+ this.readFeatures(options.arrayBuffer);
+ }
if (goog.isDef(options.doc)) {
- this.readFeatures_(options.doc);
+ this.readFeatures(options.doc);
}
if (goog.isDef(options.node)) {
- this.readFeatures_(options.node);
+ this.readFeatures(options.node);
}
if (goog.isDef(options.object)) {
- this.readFeatures_(options.object);
+ this.readFeatures(options.object);
}
if (goog.isDef(options.text)) {
- this.readFeatures_(options.text);
- }
-
- if (goog.isDef(options.arrayBuffer)) {
- this.readFeatures_(options.arrayBuffer);
+ this.readFeatures(options.text);
}
if (goog.isDef(options.url) || goog.isDef(options.urls)) {
this.setState(ol.source.State.LOADING);
-
- var type = this.format.getType();
- var responseType;
- if (type == ol.format.FormatType.BINARY &&
- ol.BrowserFeature.HAS_ARRAY_BUFFER) {
- responseType = goog.net.XhrIo.ResponseType.ARRAY_BUFFER;
- } else {
- responseType = goog.net.XhrIo.ResponseType.TEXT;
- }
- var xhrIo;
if (goog.isDef(options.url)) {
- xhrIo = new goog.net.XhrIo();
- xhrIo.setResponseType(responseType);
- goog.events.listen(xhrIo, goog.net.EventType.COMPLETE,
- goog.bind(this.handleXhrIo_, this));
- xhrIo.send(options.url);
+ this.loadFeatures(options.url);
}
if (goog.isDef(options.urls)) {
var urls = options.urls;
var i, ii;
for (i = 0, ii = urls.length; i < ii; ++i) {
- xhrIo = new goog.net.XhrIo();
- xhrIo.setResponseType(responseType);
- goog.events.listen(xhrIo, goog.net.EventType.COMPLETE,
- goog.bind(this.handleXhrIo_, this));
- xhrIo.send(urls[i]);
+ this.loadFeatures(urls[i]);
}
}
}
};
-goog.inherits(ol.source.StaticVector, ol.source.Vector);
-
-
-/**
- * @param {Event} event Event.
- * @private
- */
-ol.source.StaticVector.prototype.handleXhrIo_ = function(event) {
- var xhrIo = event.target;
- goog.asserts.assertInstanceof(xhrIo, 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.BrowserFeature.HAS_ARRAY_BUFFER) {
- source = xhrIo.getResponse();
- goog.asserts.assertInstanceof(source, 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.load(xhrIo.getResponseText());
- }
- } else {
- goog.asserts.fail();
- }
- goog.dispose(xhrIo);
- if (goog.isDefAndNotNull(source)) {
- this.readFeatures_(source);
- } else {
- this.setState(ol.source.State.ERROR);
- goog.asserts.fail();
- }
- } else {
- this.setState(ol.source.State.ERROR);
- }
-};
-
-
-/**
- * @param {ArrayBuffer|Document|Node|Object|string} source Source.
- * @private
- */
-ol.source.StaticVector.prototype.readFeatures_ = function(source) {
- var format = this.format;
- var features = format.readFeatures(source);
- var featureProjection = format.readProjection(source);
- var projection = this.getProjection();
- if (!goog.isNull(projection)) {
- if (!ol.proj.equivalent(featureProjection, projection)) {
- var transform = ol.proj.getTransform(featureProjection, projection);
- var i, ii;
- for (i = 0, ii = features.length; i < ii; ++i) {
- var feature = features[i];
- var geometry = feature.getGeometry();
- if (!goog.isNull(geometry)) {
- geometry.transform(transform);
- }
- }
- }
- }
- this.addFeaturesInternal(features);
- this.setState(ol.source.State.READY);
-};
+goog.inherits(ol.source.StaticVector, ol.source.FormatVector);