Cross-dateline rendering fixed for SVG and added for VML renderer.
This commit is contained in:
@@ -122,6 +122,11 @@ OpenLayers.Renderer = OpenLayers.Class({
|
|||||||
* Parameters:
|
* Parameters:
|
||||||
* extent - {<OpenLayers.Bounds>}
|
* extent - {<OpenLayers.Bounds>}
|
||||||
* resolutionChanged - {Boolean}
|
* resolutionChanged - {Boolean}
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* {Boolean} true to notify the layer that the new extent does not exceed
|
||||||
|
* the coordinate range, and the features will not need to be redrawn.
|
||||||
|
* False otherwise.
|
||||||
*/
|
*/
|
||||||
setExtent: function(extent, resolutionChanged) {
|
setExtent: function(extent, resolutionChanged) {
|
||||||
this.extent = extent.clone();
|
this.extent = extent.clone();
|
||||||
@@ -131,6 +136,7 @@ OpenLayers.Renderer = OpenLayers.Class({
|
|||||||
if (resolutionChanged) {
|
if (resolutionChanged) {
|
||||||
this.resolution = null;
|
this.resolution = null;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -459,6 +459,41 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method: setExtent
|
||||||
|
* Set the visible part of the layer.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* extent - {<OpenLayers.Bounds>}
|
||||||
|
* resolutionChanged - {Boolean}
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* {Boolean} true to notify the layer that the new extent does not exceed
|
||||||
|
* the coordinate range, and the features will not need to be redrawn.
|
||||||
|
* False otherwise.
|
||||||
|
*/
|
||||||
|
setExtent: function(extent, resolutionChanged) {
|
||||||
|
var coordSysUnchanged = OpenLayers.Renderer.prototype.setExtent.apply(this, arguments);
|
||||||
|
var resolution = this.getResolution();
|
||||||
|
if (this.map.baseLayer && this.map.baseLayer.wrapDateLine) {
|
||||||
|
coordSysUnchanged = this.featureDx === 0;
|
||||||
|
var rightOfDateLine,
|
||||||
|
world = this.map.getMaxExtent();
|
||||||
|
if (world.right > extent.left && world.right < extent.right) {
|
||||||
|
rightOfDateLine = true;
|
||||||
|
} else if (world.left > extent.left && world.left < extent.right) {
|
||||||
|
rightOfDateLine = false;
|
||||||
|
}
|
||||||
|
if (rightOfDateLine !== this.rightOfDateLine || resolutionChanged) {
|
||||||
|
coordSysUnchanged = false;
|
||||||
|
this.xOffset = rightOfDateLine === true ?
|
||||||
|
world.getWidth() / resolution : 0;
|
||||||
|
}
|
||||||
|
this.rightOfDateLine = rightOfDateLine;
|
||||||
|
}
|
||||||
|
return coordSysUnchanged;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method: getNodeType
|
* Method: getNodeType
|
||||||
* This function is in charge of asking the specific renderer which type
|
* This function is in charge of asking the specific renderer which type
|
||||||
|
|||||||
@@ -114,44 +114,30 @@ OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
* False otherwise.
|
* False otherwise.
|
||||||
*/
|
*/
|
||||||
setExtent: function(extent, resolutionChanged) {
|
setExtent: function(extent, resolutionChanged) {
|
||||||
OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,
|
var coordSysUnchanged = OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, arguments);
|
||||||
arguments);
|
|
||||||
|
|
||||||
var resolution = this.getResolution(),
|
var resolution = this.getResolution(),
|
||||||
left = -extent.left / resolution,
|
left = -extent.left / resolution,
|
||||||
rightLL = -extent.right,
|
|
||||||
top = extent.top / resolution;
|
top = extent.top / resolution;
|
||||||
|
|
||||||
// If the resolution has changed, start over changing the corner, because
|
// If the resolution has changed, start over changing the corner, because
|
||||||
// the features will redraw.
|
// the features will redraw.
|
||||||
if (resolutionChanged) {
|
if (resolutionChanged) {
|
||||||
this.left = left;
|
this.left = left;
|
||||||
this.rightLL = rightLL;
|
|
||||||
this.top = top;
|
this.top = top;
|
||||||
// Set the viewbox
|
// Set the viewbox
|
||||||
var extentString = "0 0 " + this.size.w + " " + this.size.h;
|
var extentString = "0 0 " + this.size.w + " " + this.size.h;
|
||||||
|
|
||||||
this.rendererRoot.setAttributeNS(null, "viewBox", extentString);
|
this.rendererRoot.setAttributeNS(null, "viewBox", extentString);
|
||||||
this.translate(0, 0);
|
this.translate(this.xOffset, 0);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
if (this.map.baseLayer && this.map.baseLayer.wrapDateLine) {
|
inRange = this.translate(left - this.left + this.xOffset, top - this.top);
|
||||||
var oldLeft = this.left * resolution,
|
|
||||||
newLeft = left * resolution,
|
|
||||||
worldBounds = this.map.getMaxExtent(),
|
|
||||||
worldWidth = worldBounds.getWidth(),
|
|
||||||
oldCenterX = (oldLeft + this.rightLL) / 2,
|
|
||||||
newCenterX = (newLeft + rightLL) / 2,
|
|
||||||
worldsAway = Math.round((oldCenterX - newCenterX) / worldWidth);
|
|
||||||
left += worldsAway * worldWidth / resolution;
|
|
||||||
console.log(extent.toString());
|
|
||||||
}
|
|
||||||
var inRange = this.translate(left - this.left, top - this.top);
|
|
||||||
if (!inRange) {
|
if (!inRange) {
|
||||||
// recenter the coordinate system
|
// recenter the coordinate system
|
||||||
this.setExtent(extent, true);
|
this.setExtent(extent, true);
|
||||||
}
|
}
|
||||||
return inRange;
|
return coordSysUnchanged && inRange;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -921,7 +907,7 @@ OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
var id = this.container.id + "-" + graphicName;
|
var id = this.container.id + "-" + graphicName;
|
||||||
|
|
||||||
// check if symbol already exists in the defs
|
// check if symbol already exists in the defs
|
||||||
var existing = document.getElementById(id)
|
var existing = document.getElementById(id);
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
return existing;
|
return existing;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,8 +90,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
* the coordinate range, and the features will not need to be redrawn.
|
* the coordinate range, and the features will not need to be redrawn.
|
||||||
*/
|
*/
|
||||||
setExtent: function(extent, resolutionChanged) {
|
setExtent: function(extent, resolutionChanged) {
|
||||||
OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,
|
var coordSysUnchanged = OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, arguments);
|
||||||
arguments);
|
|
||||||
var resolution = this.getResolution();
|
var resolution = this.getResolution();
|
||||||
|
|
||||||
var left = (extent.left/resolution) | 0;
|
var left = (extent.left/resolution) | 0;
|
||||||
@@ -106,7 +105,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var org = left + " " + top;
|
var org = (left - this.xOffset) + " " + top;
|
||||||
this.root.coordorigin = org;
|
this.root.coordorigin = org;
|
||||||
var roots = [this.root, this.vectorRoot, this.textRoot];
|
var roots = [this.root, this.vectorRoot, this.textRoot];
|
||||||
var root;
|
var root;
|
||||||
@@ -121,7 +120,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
// matches the display Y axis of the map
|
// matches the display Y axis of the map
|
||||||
this.root.style.flip = "y";
|
this.root.style.flip = "y";
|
||||||
|
|
||||||
return true;
|
return coordSysUnchanged;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@@ -226,7 +225,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
var yOffset = (style.graphicYOffset != undefined) ?
|
var yOffset = (style.graphicYOffset != undefined) ?
|
||||||
style.graphicYOffset : -(0.5 * height);
|
style.graphicYOffset : -(0.5 * height);
|
||||||
|
|
||||||
node.style.left = (((geometry.x/resolution - this.offset.x)+xOffset) | 0) + "px";
|
node.style.left = ((((geometry.x - this.featureDx)/resolution - this.offset.x)+xOffset) | 0) + "px";
|
||||||
node.style.top = (((geometry.y/resolution - this.offset.y)-(yOffset+height)) | 0) + "px";
|
node.style.top = (((geometry.y/resolution - this.offset.y)-(yOffset+height)) | 0) + "px";
|
||||||
node.style.width = width + "px";
|
node.style.width = width + "px";
|
||||||
node.style.height = height + "px";
|
node.style.height = height + "px";
|
||||||
@@ -483,9 +482,9 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
var resolution = this.getResolution();
|
var resolution = this.getResolution();
|
||||||
|
|
||||||
var scaledBox =
|
var scaledBox =
|
||||||
new OpenLayers.Bounds((bbox.left/resolution - this.offset.x) | 0,
|
new OpenLayers.Bounds(((bbox.left - this.featureDx)/resolution - this.offset.x) | 0,
|
||||||
(bbox.bottom/resolution - this.offset.y) | 0,
|
(bbox.bottom/resolution - this.offset.y) | 0,
|
||||||
(bbox.right/resolution - this.offset.x) | 0,
|
((bbox.right - this.featureDx)/resolution - this.offset.x) | 0,
|
||||||
(bbox.top/resolution - this.offset.y) | 0);
|
(bbox.top/resolution - this.offset.y) | 0);
|
||||||
|
|
||||||
// Set the internal coordinate system to draw the path
|
// Set the internal coordinate system to draw the path
|
||||||
@@ -652,7 +651,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
if(!isNaN(geometry.x)&& !isNaN(geometry.y)) {
|
if(!isNaN(geometry.x)&& !isNaN(geometry.y)) {
|
||||||
var resolution = this.getResolution();
|
var resolution = this.getResolution();
|
||||||
|
|
||||||
node.style.left = (((geometry.x /resolution - this.offset.x) | 0) - radius) + "px";
|
node.style.left = ((((geometry.x - this.featureDx) /resolution - this.offset.x) | 0) - radius) + "px";
|
||||||
node.style.top = (((geometry.y /resolution - this.offset.y) | 0) - radius) + "px";
|
node.style.top = (((geometry.y /resolution - this.offset.y) | 0) - radius) + "px";
|
||||||
|
|
||||||
var diameter = radius * 2;
|
var diameter = radius * 2;
|
||||||
@@ -718,7 +717,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
var comp, x, y;
|
var comp, x, y;
|
||||||
for (var i = 0; i < numComponents; i++) {
|
for (var i = 0; i < numComponents; i++) {
|
||||||
comp = geometry.components[i];
|
comp = geometry.components[i];
|
||||||
x = (comp.x/resolution - this.offset.x) | 0;
|
x = ((comp.x - this.featureDx)/resolution - this.offset.x) | 0;
|
||||||
y = (comp.y/resolution - this.offset.y) | 0;
|
y = (comp.y/resolution - this.offset.y) | 0;
|
||||||
parts[i] = " " + x + "," + y + " l ";
|
parts[i] = " " + x + "," + y + " l ";
|
||||||
}
|
}
|
||||||
@@ -754,7 +753,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
second = null;
|
second = null;
|
||||||
for (i=0, ii=points.length; i<ii; i++) {
|
for (i=0, ii=points.length; i<ii; i++) {
|
||||||
comp = points[i];
|
comp = points[i];
|
||||||
x = (comp.x / resolution - this.offset.x) | 0;
|
x = ((comp.x - this.featureDx) / resolution - this.offset.x) | 0;
|
||||||
y = (comp.y / resolution - this.offset.y) | 0;
|
y = (comp.y / resolution - this.offset.y) | 0;
|
||||||
pathComp = " " + x + "," + y;
|
pathComp = " " + x + "," + y;
|
||||||
path.push(pathComp);
|
path.push(pathComp);
|
||||||
@@ -801,7 +800,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
drawRectangle: function(node, geometry) {
|
drawRectangle: function(node, geometry) {
|
||||||
var resolution = this.getResolution();
|
var resolution = this.getResolution();
|
||||||
|
|
||||||
node.style.left = ((geometry.x/resolution - this.offset.x) | 0) + "px";
|
node.style.left = (((geometry.x - this.featureDx)/resolution - this.offset.x) | 0) + "px";
|
||||||
node.style.top = ((geometry.y/resolution - this.offset.y) | 0) + "px";
|
node.style.top = ((geometry.y/resolution - this.offset.y) | 0) + "px";
|
||||||
node.style.width = ((geometry.width/resolution) | 0) + "px";
|
node.style.width = ((geometry.width/resolution) | 0) + "px";
|
||||||
node.style.height = ((geometry.height/resolution) | 0) + "px";
|
node.style.height = ((geometry.height/resolution) | 0) + "px";
|
||||||
@@ -823,7 +822,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
var textbox = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_textbox", "olv:textbox");
|
var textbox = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_textbox", "olv:textbox");
|
||||||
|
|
||||||
var resolution = this.getResolution();
|
var resolution = this.getResolution();
|
||||||
label.style.left = ((location.x/resolution - this.offset.x) | 0) + "px";
|
label.style.left = (((location.x - this.featureDx)/resolution - this.offset.x) | 0) + "px";
|
||||||
label.style.top = ((location.y/resolution - this.offset.y) | 0) + "px";
|
label.style.top = ((location.y/resolution - this.offset.y) | 0) + "px";
|
||||||
label.style.flip = "y";
|
label.style.flip = "y";
|
||||||
|
|
||||||
@@ -900,7 +899,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
|||||||
var comp, x, y;
|
var comp, x, y;
|
||||||
for (var i=0, len=geometry.components.length; i<len; i++) {
|
for (var i=0, len=geometry.components.length; i<len; i++) {
|
||||||
comp = geometry.components[i];
|
comp = geometry.components[i];
|
||||||
x = (comp.x / resolution - this.offset.x) | 0;
|
x = ((comp.x - this.featureDx) / resolution - this.offset.x) | 0;
|
||||||
y = (comp.y / resolution - this.offset.y) | 0;
|
y = (comp.y / resolution - this.offset.y) | 0;
|
||||||
if ((i%3)==0 && (i/3)==0) {
|
if ((i%3)==0 && (i/3)==0) {
|
||||||
path.push("m");
|
path.push("m");
|
||||||
|
|||||||
Reference in New Issue
Block a user