[OpenLayers-Users] Static images, bounds and zoom
Florian Klumb
Florian.Klumb at rwth-aachen.de
Thu Dec 11 07:13:47 EST 2008
Hi,
Li, thanks very much for the patch, as far as I can judge it corrects an annoying aspect ratio issue. That's very helpful indeed!
Still, how do I now adjust the zoom level to allow users zoom in until the natural image resolution is reached? Could anyone please give me a hint?
Flo
> You can use below patch:
>
> Index: lib/OpenLayers/Layer/Image.js
> ===================================================================
> --- lib/OpenLayers/Layer/Image.js (revision 8489)
> +++ lib/OpenLayers/Layer/Image.js (working copy)
> @@ -47,13 +47,6 @@
> tile: null,
>
> /**
> - * Property: aspectRatio
> - * {Float} The ratio of height/width represented by a single
> pixel in
> the
> - * graphic
> - */
> - aspectRatio: null,
> -
> - /**
> * Constructor: OpenLayers.Layer.Image
> * Create a new image layer
> *
> @@ -69,9 +62,6 @@
> this.extent = extent;
> this.size = size;
> OpenLayers.Layer.prototype.initialize.apply(this, [name, options]);
> -
> - this.aspectRatio = (this.extent.getHeight() / this.size.h) /
> - (this.extent.getWidth() / this.size.w);
> },
>
> /**
> @@ -128,9 +118,9 @@
> * image will be stretched in one dimension only.
> */
> if( this.options.maxResolution == null ) {
> - this.options.maxResolution = this.aspectRatio *
> - this.extent.getWidth() /
> - this.size.w;
> + var wRes = this.extent.getWidth() / this.size.w;
> + var hRes = this.extent.getHeight() / this.size.h;
> + this.options.maxResolution = Math.min(wRes, hRes);
> }
> OpenLayers.Layer.prototype.setMap.apply(this, arguments);
> },
> @@ -155,8 +145,10 @@
> this.setTileSize();
>
> //determine new position (upper left corner of new bounds)
> - var ul = new OpenLayers.LonLat(this.extent.left,
> this.extent.top);
> - var ulPx = this.map.getLayerPxFromLonLat(ul);
> + var center = this.extent.getCenterLonLat();
> + var centerPx = this.map.getLayerPxFromLonLat(center);
> + var ulPx = new OpenLayers.Pixel(centerPx.x -
> (this.tileSize.w /
> 2),
> + centerPx.y - (this.tileSize.h / 2));
>
> if(firstRendering) {
> //create the new tile
> @@ -175,10 +167,23 @@
> * Set the tile size based on the map size.
> */
> setTileSize: function() {
> - var tileWidth = this.extent.getWidth() / this.map.getResolution();
> - var tileHeight = this.extent.getHeight() /
> this.map.getResolution();
> - this.tileSize = new OpenLayers.Size(tileWidth, tileHeight);
> + var w = this.extent.getWidth() / this.map.getResolution();
> + var h = this.extent.getHeight() / this.map.getResolution();
> +
> + this.tileSize = this.getLockedSize(w, h);
> },
> +
> + getLockedSize: function(w, h) {
> + var tileWidth = w;
> + var tileHeight = h;
> + if(this.size.h > this.size.w) {
> + tileHeight = Math.floor(this.size.h * (w / this.size.w));
> + } else {
> + tileWidth = Math.floor(this.size.w * (h / this.size.h));
> + }
> +
> + return new OpenLayers.Size(tileWidth, tileHeight);
> + },
>
> /**
> * APIMethod: setUrl
>
> If this is the right way for the image layer, I will open a ticket for
> this
> patch.
>
>
> > Hi,
> >
> > I'm using OpenLayers to develop a viewing application for medical images.
> > So far I'm just using static images, i.e. I'm using the Image layer,
> and I'm
> > a bit puzzled as to the interdependence of bounds, extent,
> resolution and
> > all this stuff. I simply want to fit an image which might be quite high-res
> > into the viewport for a start and then let the users zoom in until the
> > natural resolution of the image is reached. I played with all the parameters
> > but to be honest I still haven't quite gotten the gist, so even
> after hours
> > it seems as if I'm not a step further. A hint or short explanation
> as to how
> > to approach this would be greatly appreciated!
> >
> > My code is something like this:
> > var oMapWest = new OpenLayers.Map('viewportWest');
> > var graphic = new OpenLayers.Layer.Image(
> > 'City Lights',
> > 'images/political_world_map.jpg', // which is 8000x4000pxs
> > new OpenLayers.Bounds(-180, -90, 180, 90),
> > new OpenLayers.Size(700, 350),
> > {numZoomLevels:10}
> > );
> > oMapWest.addLayers([graphic]);
> > oMapWest.zoomToMaxExtent();
> >
> > Thanks!
> >
> > Flo
> >
> >
>
>
> --
> Li XinGang
> EMail: slinavlee at gmail.com
> Blog: avlee.cnblogs.com
> Site: www.mapboost.org.cn
> _______________________________________________
> Users mailing list
> Users at openlayers.org
> http://openlayers.org/mailman/listinfo/users
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Image.js.patch
Type: application/octet-stream
Size: 3038 bytes
Desc: not available
Url : http://lists.osgeo.org/pipermail/openlayers-users/attachments/20081211/a711fa13/Image.js.obj
More information about the Users
mailing list