[OpenLayers-Users] why no overlay on Virtual Earth basemaps?
Ernie Buford
ebuford at uvm.edu
Wed Jun 20 06:49:37 PDT 2012
I only received one response to my question, and it was from someone who
came up with their own patch. I have not yet tried it myself. Would
love to hear from the dev team or expert programmers about this fix. My
original post is below, followed by the response.
On 5/17/2012 12:20 PM, Ernie Buford wrote:
> 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 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.
>
> 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 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.
>
> Again, I make no guarantees about the validity of this change, and
> would like to have someone on the OpenLayers development team review it.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/openlayers-users/attachments/20120620/c39aa188/attachment.html>
More information about the Users
mailing list