New vector rendering for better performance and less renderer specific limitations. r=elemoine (closes #1675, closes #1656, closes #1631, closes #1431, closes #1709)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@7930 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -106,6 +106,13 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
* {Array(<OpenLayers.Feature.Vector>)}
|
||||
*/
|
||||
selectedFeatures: null,
|
||||
|
||||
/**
|
||||
* Property: unrenderedFeatures
|
||||
* {Object} hash of features, keyed by feature.id, that the renderer
|
||||
* failed to draw
|
||||
*/
|
||||
unrenderedFeatures: null,
|
||||
|
||||
/**
|
||||
* APIProperty: reportError
|
||||
@@ -213,6 +220,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
|
||||
this.features = [];
|
||||
this.selectedFeatures = [];
|
||||
this.unrenderedFeatures = {};
|
||||
|
||||
// Allow for custom layer behavior
|
||||
if(this.strategies){
|
||||
@@ -247,6 +255,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
this.destroyFeatures();
|
||||
this.features = null;
|
||||
this.selectedFeatures = null;
|
||||
this.unrenderedFeatures = null;
|
||||
if (this.renderer) {
|
||||
this.renderer.destroy();
|
||||
}
|
||||
@@ -359,6 +368,8 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
*/
|
||||
moveTo: function(bounds, zoomChanged, dragging) {
|
||||
OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
|
||||
|
||||
var coordSysUnchanged = true;
|
||||
|
||||
if (!dragging) {
|
||||
this.renderer.root.style.visibility = "hidden";
|
||||
@@ -366,7 +377,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
this.div.style.left = -parseInt(this.map.layerContainerDiv.style.left) + "px";
|
||||
this.div.style.top = -parseInt(this.map.layerContainerDiv.style.top) + "px";
|
||||
var extent = this.map.getExtent();
|
||||
this.renderer.setExtent(extent);
|
||||
coordSysUnchanged = this.renderer.setExtent(extent, zoomChanged);
|
||||
|
||||
this.renderer.root.style.visibility = "visible";
|
||||
|
||||
@@ -376,17 +387,33 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) {
|
||||
this.div.scrollLeft = this.div.scrollLeft;
|
||||
}
|
||||
|
||||
if(!zoomChanged && coordSysUnchanged) {
|
||||
var unrenderedFeatures = {};
|
||||
for(var i in this.unrenderedFeatures) {
|
||||
var feature = this.unrenderedFeatures[i];
|
||||
if(!this.drawFeature(feature)) {
|
||||
unrenderedFeatures[i] = feature;
|
||||
}
|
||||
}
|
||||
this.unrenderedFeatures = unrenderedFeatures;
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.drawn || zoomChanged) {
|
||||
if (!this.drawn || zoomChanged || !coordSysUnchanged) {
|
||||
this.unrenderedFeatures = {};
|
||||
this.drawn = true;
|
||||
var feature;
|
||||
for(var i=0, len=this.features.length; i<len; i++) {
|
||||
if (i != (this.features.length - 1)) {
|
||||
this.renderer.locked = true;
|
||||
} else {
|
||||
this.renderer.locked = false;
|
||||
}
|
||||
this.drawFeature(this.features[i]);
|
||||
feature = this.features[i];
|
||||
if (!this.drawFeature(feature)) {
|
||||
this.unrenderedFeatures[feature.id] = feature;
|
||||
};
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -438,7 +465,9 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
}
|
||||
|
||||
if (this.drawn) {
|
||||
this.drawFeature(feature);
|
||||
if(!this.drawFeature(feature)) {
|
||||
this.unrenderedFeatures[feature.id] = feature;
|
||||
}
|
||||
}
|
||||
|
||||
if (notify) {
|
||||
@@ -488,6 +517,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
}
|
||||
|
||||
var feature = features[i];
|
||||
delete this.unrenderedFeatures[feature.id];
|
||||
|
||||
if (notify) {
|
||||
this.events.triggerEvent("beforefeatureremoved", {
|
||||
@@ -553,6 +583,10 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
* Parameters:
|
||||
* feature - {<OpenLayers.Feature.Vector>}
|
||||
* style - {Object} Symbolizer hash or {String} renderIntent
|
||||
*
|
||||
* Returns:
|
||||
* {Boolean} true if the renderer was able to draw the feature, false
|
||||
* otherwise
|
||||
*/
|
||||
drawFeature: function(feature, style) {
|
||||
if (typeof style != "object") {
|
||||
@@ -564,7 +598,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
}
|
||||
}
|
||||
|
||||
this.renderer.drawFeature(feature, style);
|
||||
return this.renderer.drawFeature(feature, style);
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user