AW: [mapserver-users] "Low-resolution" raster image problem when usingOpenlayers

kensei3000 kensei3000 at yahoo.com
Thu Jun 30 22:19:04 EDT 2011


Hi Arnd,


I checked the source code for OpenLayers.Layer.MapServer and OpenLayers.Layer.WMS and confirmed the DEFAULT_PARAMS you indicated.

I tried calling MapServer using the DEFAULT_PARAMS for OpenLayers.Layers.MapServer in this url:

http://remotehost/cgi-bin/mapserv?map=/opt/maps/sandbox/mapserver_openlayers_if/sample.map&mode=map&map_imagetype=png


And indeed an 8-bit image was rendered. 

I read from the documentation that MapServer can act like a WMS server, which is why OpenLayers.Layers.WMS works with MapServer also.

I believe you have succinctly explained the cause of the image rendering discrepancy.

Problem appears to be solved.

Thanks for all your help. :)

Ken


________________________________
From: Arnd Wippermann <arnd.wippermann at web.de>
To: 'kensei3000' <kensei3000 at yahoo.com>
Cc: mapserver-users at lists.osgeo.org
Sent: Friday, July 1, 2011 6:41 AM
Subject: AW: [mapserver-users] "Low-resolution" raster image problem when usingOpenlayers


You can request tiles from MapServer by a MapServer 
cgi request or by a WMS request.
 
OpenLayers uses this
 
    DEFAULT_PARAMS: 
{
        mode: 
"map",
        map_imagetype: "png" // a 
8bit png if not otherwise declared in the mapfile
    
},

for OpenLayers.Layer.MapServer
 
    DEFAULT_PARAMS: { service: 
"WMS",
                      
version: 
"1.1.1",
                      
request: 
"GetMap",
                      
styles: 
"",
                      
exceptions: 
"application/vnd.ogc.se_inimage",
                      
format: 
"image/jpeg"
                     
},

for OpenLayers.Layer.WMS
 
if you 
not specify a imageformat, then the OpenLayers.Layer.MapServer requests a png 
and the WMS requests a jpg (if not set 
transparent=true).
 
Arnd


________________________________
 Von: kensei3000 [mailto:kensei3000 at yahoo.com] 
Gesendet: Donnerstag, 30. Juni 2011 04:58
An: Arnd 
Wippermann
Cc: mapserver-users at lists.osgeo.org
Betreff: Re: 
AW: [mapserver-users] "Low-resolution" raster image problem when 
usingOpenlayers


Hi Arnd,

I see. I used the same 'mapserv' url in both OpenLayers.Layer.WMS and 
.MapServer code. The requests were sent to the same remote server. So the 
difference must be in the requests. Is it possible that OpenLayers.Layer.WMS 
generated a different output url string from the one generated by 
OpenLayers.Layer.MapServer?

Ken


________________________________
 From: Arnd Wippermann 
<arnd.wippermann at web.de>
To: 'kensei3000' 
<kensei3000 at yahoo.com>
Cc: mapserver-users at lists.osgeo.org
Sent: Thursday, June 30, 2011 1:15 
AM
Subject: AW: 
[mapserver-users] "Low-resolution" raster image problem when 
usingOpenlayers


Hi 
Ken,
 
Quote : 
"Interestingly, if I use the 'mapserv' executable directly in the browser 
instead of using OpenLayers API, the image also renders correctly."
 
There could be no 
difference (OpenLayers.Layer.WMS or .MapServer), because with OpenLayers you 
only create an url for an image tag (<img src="url">). The response have 
to be the same as from the browser directly.
 
The difference could only 
be a result from different requests or the same request to different 
servers.
 
Arnd
 

________________________________
 
Von: kensei3000 
[mailto:kensei3000 at yahoo.com] 
Gesendet: Mittwoch, 29. Juni 2011 
09:56
An: Arnd Wippermann
Cc: users at openlayers.org
Betreff: Re: AW: [mapserver-users] 
"Low-resolution" raster image problem when 
usingOpenlayers


Hi 
Arnd,

I 
checked the images properties of the tile images using ImageMagick.

tile_topleft_remote.png 
has image type "Palette" (8-bit)
tile_topleft_local.png 
has image type "TrueColor" (32-bit)

The 
results I got seem to correlate with your findings.
Indeed, 
it appears that the image rendering between my local pc and the server are 
different.

The map 
files are exactly same since I sync them in both computers.   
  


The 
MapServer versions, however, are different. Here's what I got:

LOCAL:
MapServer version 6.0.0 
OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=CAIRO 
SUPPORTS=FREETYPE SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER 
SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER 
SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS 
INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

REMOTE:
MapServer version 5.6.1 
OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=SWF OUTPUT=SVG 
SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=ICONV SUPPORTS=FRIBIDI 
SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT 
SUPPORTS=WCS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS INPUT=EPPL7 
INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

The MapServer executable 
in the remote server is an older version (5.6.1) than the one in my pc (6.0.0). 
I edited the map files and images in my local pc, then synced them to the 
server, so there may be an incompatibility. I checked the Mapserver Migration 
Guide (http://mapserver.org/de/MIGRATION_GUIDE.html) and my guess was that the 
default OUTPUTFORMAT specifications of both versions could be 
different. I did not specify an explicit OUTPUTFORMAT 
in my map file.

I created another test. 
This time I explicitly defined the OUTPUTFORMAT with the following lines added 
to the map file in the remote server:

 OUTPUTFORMAT

    NAME jpeg
    DRIVER "AGG/JPEG"
    MIMETYPE "image/jpeg"
    IMAGEMODE RGB
    EXTENSION "jpg"
  END
The result was that the output image 
generated by the remote server rendered in TrueColor, similar to the output 
image in my local pc. Problem appears to be fixed.

My guess 
right now is that the  IMAGEMODE parameter above was somehow set to PC256 
(i.e. 8-bit color palette) by default.

Interestingly, if I use the 'mapserv' 
executable directly in the browser instead of using OpenLayers API, the image 
also renders correctly.
EXAMPLE: 
http://remotehost/cgi-bin/mapserv?map=/opt/maps/sandbox/mapserver_openlayers_if/sample.map&mode=map


Above 'sample.map' did not 
have the OUTPUTFORMAT object explicitly defined. 

In another test I ran 
using the original 'sample.map' (i.e. no OUTPUTFORMAT object), I edited the 
OpenLayers code in the remote server:

//sample.html

FROM:
    17   
         layer = new OpenLayers.Layer.MapServer("World 
Map", 

TO:
    17          
 layer = new OpenLayers.Layer.WMS("World Map", 


I used the generic 'WMS' 
layer instead of the 'MapServer' layer. And the result was that the output image 
rendered correctly. I am not yet sure why. 

I might 
need to run additional tests to confirm my findings.

Thanks 
for your help in pointing out the discrepancies in the images and in MapServer. 
:)

Ken
  


________________________________
 From: Arnd Wippermann 
<arnd.wippermann at web.de>
To: 'kensei3000' 
<kensei3000 at yahoo.com>
Cc: users at openlayers.org
Sent: Wednesday, June 29, 2011 2:28 
AM
Subject: AW: 
[mapserver-users] "Low-resolution" raster image problem when 
usingOpenlayers


use some image viewer to get information of your 
images.
 
tile_topleft_remote.pngis a 8bit image (256 color image), where only 45 
colors used.
 
tile_topleft_local.png is a 24bit image (16,7 Mill. 
colors), where 13274 colors used.
 
The requests ask for map_imagetype=png. So it 
seems, that your mapfiles are different, because the response of the servers 
delivers a different image for the same imagetype. Or do you 
use different MapServer versions?
 
The problem has to 
be an issue with MapServer and not with 
OpenLayers.
 
Arnd
 

________________________________
 
Von: kensei3000 
[mailto:kensei3000 at yahoo.com] 
Gesendet: Dienstag, 28. Juni 2011 
04:32
An: Arnd Wippermann
Cc: users at openlayers.org
Betreff: Re: AW: [mapserver-users] 
"Low-resolution" raster image problem when usingOpenlayers


Hi 
Arnd,

Thanks 
a lot for the tip. I copied the image url of the top-left most tile for both 
local pc and remote server tests.
Here is 
what I got:

Local:
http://localhost/cgi-bin/mapserv?map=%2Fopt%2Fmaps%2Fsandbox%2Fmapserver_openlayers_if%2Fsample.map&layers=sample_raster&mode=map&map_imagetype=png&mapext=-90+0+0+90&imgext=-90+0+0+90&map_size=256+256&imgx=128&imgy=128&imgxy=256+256

Remote:
http://remotehost/cgi-bin/mapserv?map=%2Fopt%2Fmaps%2Fsandbox%2Fmapserver_openlayers_if%2Fsample.map&layers=sample_raster&mode=map&map_imagetype=png&mapext=-180+-90+0+90&imgext=-180+-90+0+90&map_size=256+256&imgx=128&imgy=128&imgxy=256+256

The only significant 
difference of the two urls appear to be the 'mapext' and 'imgext' parameters. 
When I checked the resulting images after inputting the urls in the browser, I 
noticed that the tile images had different sizes and positions. I believe this 
was due to the said parameters. I tried changing the 'mapext' and 'imagext' 
parameters of the server test url to match that of the local test url, and 
indeed the size and position of the remote server tile image changed. However, I 
am still unable to figure out what causes the color distortion or "downsampling" 
of the image in the remote server.

For further reference, 
I've attached the tile images I got using the above urls.

Here is the openlayers 
code I used. It is the same for both local and remote server tests except for 
the host in line 18. 

//sample.html

     1<html 
xmlns="http://www.w3.org/1999/xhtml">
     2 <head>
     3   <style 
type="text/css">
     4       #map 
{
     5          
 width: 1024px;
     6          
 height: 768px;
     7          
 border: 1px solid black;
     8       }
     9   </style>
    10   <script 
src="http://openlayers.org/dev/lib/OpenLayers.js"></script>
    11   <script 
type="text/javascript">
    12      
 <!--
    13       var map, 
layer;
    14
    15       function 
init(){
    16          
 map = new OpenLayers.Map( 'map' );
    17          
 layer = new OpenLayers.Layer.MapServer("World Map", 
    18          
         "http://localhost/cgi-bin/mapserv",
    19          
         {map: 
'/opt/maps/sandbox/mapserver_openlayers_if/sample.map', layers: 
'sample_raster'});
    20          
 map.addLayer(layer);
    21          
 map.zoomToMaxExtent();
    22       }
    23       // 
-->
    24   </script>
    25 </head>
    26 <body 
onload="init()">
    27   <div 
id="map"></div>
    28 </body>
    29</html>


And below is the common 
.map file I created with the help of the Quantum GIS Mapserver Export 
tool.
The raster image has an 
associated World file (.wld) for georeferencing.

     1# Map file created from QGIS project 
file /var/maps/sandbox/mapserver_openlayers_if/sample.qgs
     2# Edit this file to customize for your 
map interface
     3# (Created with PyQgis MapServer 
Export plugin)
     4MAP
     5 NAME "QGIS-MAP"
     6 # Map image size
     7 SIZE 8180 4930
     8 UNITS meters
     9
    10 EXTENT -86.515507 -50.290979 
88.076495 48.225271
    11 PROJECTION
    12   'proj=longlat'
    13   'ellps=WGS84'
    14  
 'towgs84=0,0,0,0,0,0,0'
    15   'no_defs'
    16 END
    17
    18 # Background color for the map 
canvas -- change as desired
    19 IMAGECOLOR 255 255 255
    20 IMAGEQUALITY 95
    21 IMAGETYPE jpeg
    22
    23 # Legend
    24 LEGEND
    25     IMAGECOLOR 255 255 
255
    26   STATUS ON
    27   KEYSIZE 18 12
    28   LABEL
    29     TYPE BITMAP
    30     SIZE MEDIUM
    31     COLOR 0 0 89
    32   END
    33 END
    34
    35 # Web interface definition. Only 
the template parameter
    36 # is required to display a map. 
See MapServer documentation
    37 WEB
    38   # Set IMAGEPATH to the 
path where MapServer should
    39   # write its output.
    40   IMAGEPATH '/tmp/'
    41
    42   # Set IMAGEURL to the url 
that points to IMAGEPATH
    43   # as defined in your web 
server configuration
    44   IMAGEURL '/tmp/'
    45
    46   #Scale range at which web 
interface will operate
    47   # Template and 
header/footer settings
    48   # Only the template 
parameter is required to display a map. See MapServer documentation
    49   TEMPLATE 
'fooOnlyForWMSGetFeatureInfo'
    50 END
    51
    52 LAYER
    53   NAME 
'sample_raster'
    54   TYPE RASTER
    55   DUMP true
    56   TEMPLATE 
fooOnlyForWMSGetFeatureInfo
    57 EXTENT -86.515507 -50.290979 
88.076495 48.225271
    58   DATA 
'sec_field.jpg'
    59   STATUS DEFAULT
    60   TRANSPARENCY 100
    61   PROJECTION
    62   'proj=longlat'
    63   'ellps=WGS84'
    64  
 'towgs84=0,0,0,0,0,0,0'
    65   'no_defs'
    66   END
    67 END
    68
    69END


Hope you could provide 
further assistance.

Ken



________________________________
 From: Arnd Wippermann 
<arnd.wippermann at web.de>
To: 'kensei3000' 
<kensei3000 at yahoo.com>
Cc: users at openlayers.org
Sent: Tuesday, June 28, 2011 1:53 
AM
Subject: AW: 
[mapserver-users] "Low-resolution" raster image problem when 
usingOpenlayers


hi,
 
if you do a right click on a tile to get the context menu, you 
should be able to copy the url (if the tiles of your server is the most top of 
the visible layers). Compare the different urls. If you load them in your 
browser you should get a response for a single tile from your 
server.
 
Perhaps that gives you an idea, what goes 
wrong.
 
Arnd


________________________________
 Von: mapserver-users-bounces at lists.osgeo.org 
[mailto:mapserver-users-bounces at lists.osgeo.org] Im Auftrag von kensei3000
Gesendet: Montag, 27. Juni 2011 05:37
An: mapserver-users at lists.osgeo.org
Betreff: [mapserver-users] 
"Low-resolution" raster image problem when usingOpenlayers


Hi!

I am trying to use MapServer as a WMS layer in Openlayers. I setup the 
MapServer in our server machine, using my own PC as the test client. I created a 
simple .map file in our server that contains one raster image. Using the 
mapserver tool 'mapserv' in a URL string, I was able to load the output map with 
full resolution correctly in a browser (Google Chrome). However, when I tried to 
load the map using a simple Openlayers script (HMTL) which I created on our 
server (accessible via browser), the map image appeared to have a much 
lower-resolution (i.e. 256-colors only) and was pixelized. Also, I could see 
white lines representing the tile edges of the map. 

I did another test. This time, I installed MapServer in my own PC. I 
created a .map file similar to the one I used in our server, with the same 
raster image. I created a similar Openlayers script (HTML) in my own PC, but 
this time it would call the MapServer from my own PC. I loaded the script using 
a browser and the image displayed correctly with full resolution. 

Does anyone have an idea what the problem could be?

I would appreciate any help in this matter.

Thanks in advance! :) 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapserver-users/attachments/20110630/55056ebe/attachment-0001.html


More information about the mapserver-users mailing list