[OpenLayers-Users] new user questions

Paul Spencer pagameba at gmail.com
Tue Oct 7 07:44:11 EDT 2008


Hi Greg,

I think you are missing some some basic concepts.  When you specify  
the maxExtent, this is the geographic extent of the map, not the size  
of the image in pixels.  Please bear with me as I explain what it is  
that OpenLayers does and then I will try to answer your questions more  
directly, but I think some context might help.

In the default tiled mode, OpenLayers creates small images (256x256)  
referred to as tiles and orients those tiles in the user interface to  
represent part of the geographic extent the user is viewing.  The  
specific layer type(s) that you use translate the image and its  
geographic extent into an appropriate request for the type of layer.   
This results in a number of partial maps that are visually stitched  
together to create a (hopefully) seamless view of the map.

OpenLayers needs a couple of things to be able to make the necessary  
calculations.  First, it needs to know what the maximum geographic  
extent of your data is, the projection/units of the map, and the  
resolutions (in map units per pixel) that you want to display your map  
at.  By default, OpenLayers assumes that your map projection is EPSG: 
4326 [1] with units of decimal degrees and a maximum extent of -180,  
-90, 180, 90 (the whole world in latitude and longitude).  The default  
maximum resolution is designed to fit the whole world into one 256x256  
tile and the value is 360/256 = 1.40625.  The default number of zoom  
levels is 16, and OpenLayers (again by default) divides the default  
maximum resolution (1.40625) progressively by 2 to calculate the  
resolution at each of those zoom levels.

When you create a new map based on these default parameters, it should  
start at the maximum resolution and decide that it needs only 1 tile  
to represent your maximum extent at that resolution.  As you zoom in  
(either programmatically or interactively), OpenLayers determines the  
appropriate resolution from the ones that it has calculated and  
figures out how many tiles it would need to represent the current  
geographic extent that the user is looking at on the screen (plus a  
small offscreen buffer) at that resolution.  It then creates (or  
reuses) the right number of tile images and the specific layer type  
(MapServer in this case) takes the parameters for the tile (pixel size  
and geographic size) and makes a request to MapServer to generate the  
correct map image.

On to your specific questions.

1) OpenLayers assumes by default that the map is in the EPSG:4326  
projection with maximum extent -180,-90,180,90 and units of decimal  
degrees.  Setting a maximum extent of 0, 0, 300000, 700000 is not  
valid in this projection and things will not work as you expect.  If  
that is actually the geographic extent of your data, then you also  
need to set the appropriate projection and units.  If that is the  
maximum size in pixels that you want the map to be, then you probably  
need to calculate a minResolution value.

OpenLayers assumes a vertical axis that is positive-up.  If you want  
to change this, you need to override the calculateGridLayout method.   
Note that MapServer also assumes positive-up I think so I'm not sure  
how this would help you.

For 2), you only need one layer - when you zoom in and out, OpenLayers  
sends requests at the appropriate resolution.  You need to determine  
what the maximum (or minimum) resolution is for your application and  
pass numZoomLevels: 5 (OpenLayers defaults to 16).

For 3), those are mapserver cgi specific parameters, review the  
mapserver documentation for CGI mode (http://mapserver.gis.umn.edu/docs/reference/cgi 
).  As explained above, OpenLayers will by default use 256x256 images  
for tiles and calculate the appropriate geographic extent for each of  
those images from the resolution of the current view.

If you just want to display an image, you can also use the Image layer  
class and not bother with MapServer.  Perhaps if you explained a bit  
more about your use case it would help us help you further?

Cheers

Paul

[1] http://en.wikipedia.org/wiki/European_Petroleum_Survey_Group

On 4-Oct-08, at 2:48 PM, Greg Donald wrote:

> I've been learning the Openlayers API for several days now and have
> some questions I can't seem to find answers for in the mailing list
> archives.
>
>
> 1) How can I construct bounds that only have positive numbers?  When I
> try this bit of code I still get negative numbers in my tile requests:
>
> maxExtent: new OpenLayers.Bounds( 0, 0, 300000, 7000000 )
>
> Is it possible to make a grid that works top-down, left to right, 0 up
> to whatever, both horizontally and vertically?
>
> 0 1 2 3
> 1
> 2
> 3
>
>
> 2) I want to create 5 different depths of data display.  Do I need to
> construct 5 individual layers or is one layer sufficient since I plan
> to request tiles based on coordinates?  I don't see any sort of
> "layer" variable arriving in my tile request variables.
>
> layer = new OpenLayers.Layer.MapServer( "Level 1", "/image/", {},  
> {} );
>
> http://dev.openlayers.org/releases/OpenLayers-2.6/doc/apidocs/files/OpenLayers/Layer/MapServer-js.html
>
> I've read the above URL, but where can I find api documentation for
> the last two constructor parameters?  Is this possibly where I would
> define the "layer" I'm requesting as far the tile requests?
>
>
> 3) Where can I find documenation for these tile request variables?
>
> {"imgy"=>"128", "map_imagetype"=>"png", "imgext"=>"-1680 1000 -1320
> 1360", "mode"=>"map", "imgxy"=>"256 256", "map_size"=>"256 256",
> "mapext"=>"-1680 1000 -1320 1360", "imgx"=>"128"}
>
> Looking at the "imgext" request variable, is -1680,1000 the bottom
> left and -1320,1360 the top right?  How does this corelate to a
> 256x256 tile size?
>
> What's the difference between "imgext" and "mapext"?  They always seem
> to be the same.
>
> Why isn't map_size "300000 7000000" like I defined it above?
>
>
> Here's my code so far:
>
> <script type="text/javascript">
> var lon = 0;
> var lat = 0;
> var zoom = 1;
> var map, layer;
> function init()
> {
>  var options = {
>    numZoomLevels: 1,
>    maxExtent: new OpenLayers.Bounds( 0, 0, 300000, 7000000 ),
>  };
>  map = new OpenLayers.Map( 'map', options );
>
>  layer = new OpenLayers.Layer.MapServer( "Level 1", "/image/", {} );
>  map.addLayer( layer );
>
>  map.setCenter( new OpenLayers.LonLat( lon, lat ), zoom );
>  map.removeControl( map.controls[ 1 ] );
>  map.addControl( new OpenLayers.Control.LayerSwitcher()    );
>  map.addControl( new OpenLayers.Control.PanZoomBar()       );
>  map.addControl( new OpenLayers.Control.MousePosition()    );
>  map.addControl( new OpenLayers.Control.OverviewMap()      );
>  map.addControl( new OpenLayers.Control.KeyboardDefaults() );
> }
> </script>
> <div id="map"></div>
>
>
>
> Thanks,
>
>
> -- 
> Greg Donald
> http://destiney.com/
> _______________________________________________
> Users mailing list
> Users at openlayers.org
> http://openlayers.org/mailman/listinfo/users




More information about the Users mailing list