[OpenLayers-Users] why no overlay on Virtual Earth basemaps?
Joel Williamson
joel.williamson at gladiator-innovations.com
Tue Jun 19 15:46:48 PDT 2012
Ernie Buford <ebuford at ...> writes:
>
> Having fun getting started with OpenLayers, but I've hit a curious snag....
>
> I have a set of map tiles created using Arc2Earth, and they overlay
> nicely on Google, Yahoo, and OSM basemap data.... but no luck with
> Bing/Virtual Earth. Is this not currently possible, or (more likely) am
> I missing some critical detail?
>
> I have modified several OL examples (e.g.,
> OL_spherical-mercator-example.html and some from the 2.10 Beginner's
> Guide) by adding an XYZ layer like this:
>
> // create slope overlay layer
> var slope = new OpenLayers.Layer.XYZ(
> "VT Slope",
> "http://myserver/slope/${z}/${x}/${y}.png",
> {
> 'opacity': 0.6, visibility: false,
> 'isBaseLayer': false,'wrapDateLine': true
> }
> );
>
> At times I've added the 'sphericalMercator: true' option, but it does
> not seem to matter.
>
> I've added this exact chunk of code to several working examples. The
> slope layer shows up over any of the aforementioned basemaps except Bing
> (which I've tried accessing via OpenLayers.Layer.VirtualEarth as well as
> directly with the newer OpenLayers.Layer.Bing).
>
> Why won't this work with the Bing/VE basemap?
>
> Should I be using a different method for using this type of tile cache
> as an overlay in OL?
>
> Ernie
>
Ernie,
I had the exact problem that you described - my XYZ overlay layer displays
splendidly with a Google or OSM base layer, but nothing shows when using Bing
or VirtualEarth. I have a suspicion as to the cause of the problem, and have
tried a patch that seems to correct it, but I am not an expert in the
OpenLayers code, and cannot guarantee that my theory & fix are truly valid.
But here's what I have found.
I ran my test case in Internet Explorer, and used its "F12 developer tools" to
look at the tile requests being sent from the browser to the XYZ tile server.
The important difference that I saw when using Bing instead of the other base
layers was that the Z/zoom component of the request to the server was off by
one with Bing relative to the other base layers. So I might see a tile
request with a "Z" component of 9 for Google or OSM, and after switching to
Bing, that "Z" component became an 8, despite the fact that my map extents had
not changed.
Bing/VirtualEarth layers differ from many of the other base layers in how they
designate the zoom level. The other layers start with zoom level 0, while
Bing starts with zoom level 1. I poked around in the OpenLayers library code,
and found that map layers can have a "zoomOffset" data member which I believe
accounts for this difference - for Google & OSM, the zoomOffset is set to 0,
while for Bing it is set to 1.
After some experimentation, I found a patch that corrected the problem for me
(disclaimer: by no means does this mean it is an appropriate fix!). In the
OpenLayers.Layer.XYZ class, there is a function called 'getXYZ', and it
includes this statement which calculates the "Z" value:
var z = this.serverResolutions != null ? OpenLayers.Util.indexOf
(this.serverResolutions, res) : this.map.getZoom() + this.zoomOffset;
Note that "this.zoomOffset" represents the zoomOffset value of the overlay XYZ
layer which is not displaying for us. For my layer, it is set to zero, which
matches the Google/OSM base layers, but doesn't match the Bing value. I
replaced that line with this code:
var zOff;
if (this.map.baseLayer.zoomOffset) {
zOff = this.map.baseLayer.zoomOffset;
} else {
zOff = this.zoomOffset;
}
var z = this.serverResolutions != null ? OpenLayers.Util.indexOf
(this.serverResolutions, res) : this.map.getZoom() + zOff;
The replacement code checks the zoomOffset value of the base map layer (if it
exists) and uses it if it's present; otherwise, it uses the zoomOffset of the
overlay layer. With this code in place, I find that my overlay layer now
displays properly for all my base map layers, and I get the same Z component
regardless of which base layer I am using.
Again, I make no guarantees about the validity of this change, and would like
to have someone on the OpenLayers development team review it.
Joel
More information about the Users
mailing list