[OpenLayers-Dev] Displaying outside maps for OSM based maps

Martin Saturka martin.saturka at sourcefabric.org
Wed Mar 16 07:24:56 EDT 2011


Hi,
the OSM map class deals wrong with situations where the wrapDateLine,
displayOutsideMaxExtent properties are set to true. It tries to load
the tiles, but with nonsense URLs, i.e. outside the OSM spec range.
The correct thing (that we use) should be

OpenLayers.Layer.OSMMod = OpenLayers.Class(OpenLayers.Layer.OSM, {
    name: "OpenStreetMap",
    attribution: "Data CC-By-SA by <a href='http://openstreetmap.org/'
target='_blank'>OpenStreetMap</a>",
    sphericalMercator: true,
    url: 'http://tile.openstreetmap.org/${z}/${x}/${y}.png',
    getURL: function (bounds) {
        var res = this.map.getResolution();
        var x = Math.round((bounds.left - this.maxExtent.left)
            / (res * this.tileSize.w));
        var y = Math.round((this.maxExtent.top - bounds.top)
            / (res * this.tileSize.h));
        var z = this.map.getZoom() + this.zoomOffset;

        var z_mod = Math.pow(2, z);
        while (x < 0) {
            x += z_mod;
        }
        while (y < 0) {
            y += z_mod;
        }
        while (x >= z_mod) {
            x -= z_mod;
        }
        while (y >= z_mod) {
            y -= z_mod;
        }

        var url = this.url;
        var s = '' + x + y + z;
        if (url instanceof Array)
        {
            url = this.selectUrl(s, url);
        }

        var path = OpenLayers.String.format(url, {'x': x, 'y': y, 'z': z});

        return path;
    },
     CLASS_NAME: "OpenLayers.Layer.OSM"
});

I've noticed that the ways for handling tile URLs change at the dev OL
version, but still without the corrections above.

M.

-- 
Martin Saturka
Software Engineer, Sourcefabric
www.sourcefabric.org


More information about the Dev mailing list