ThinkGeo.com    |     Documentation    |     Premium Support

How to improve quality of map generated by generic handler?

Hi,


I use ashx-file to generate my map. As a background I use WorldMapKitLayer. I draw images with high quality (it looks like default settings):


canvas.DrawingQuality = DrawingQuality.HighQuality;

canvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;


Then I save bitmap into OutputStream with 100% quality:


ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();

EncoderParameters param = new EncoderParameters(1);

param.Param[0] = new EncoderParameter(Encoder.Quality, 100L);

bitmap.Save(context.Response.OutputStream, info[1], param);


Hovewer, quality of map is a little fuzzy. How can I improve quality of image? Which setting should I apply?


Thanks,


Igor


 


 


 


 


 



Igor,


I tried to recreate your scenario but failed. In my sample, the quality of the image looks good, please  set the context.Response.ContentType to “image/png” or “image/jpg” etc., this might solve the problem.


We get the clear image in the way below, maybe you can have a try:



public void ProcessRequest(HttpContext context)
{
    Bitmap bitmap = new Bitmap("e:\\test.png");
    ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
    EncoderParameters param = new EncoderParameters(1);
    param.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
    
    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, info[4], param);
    byte[] bytes = stream.ToArray();
    context.Response.BinaryWrite(bytes);
    context.Response.Flush();
}

By the way, where's your bitmap from? It might be fuzzy already at the first time.


If the problem still exists, please provide a sample to help recreate it.


Thanks,


Edgar



Thank you for your reply, Edgar! I use practically the same code as you and ContentType="image/jpeg". 



I have absolutelly clear background image on our aspx-page (main map). I use WorldMapKitWmsWebOverlay as a background for this map. However, my images generated by ashx-page (handler) are a little fuzzy. I use WorldMapKitLayer as the first layer. The ocean labels, for example 'Nort Atlantic Ocean', is clear on my main page, but a little fuzzy on images generated by ahsx-file. 



Is the map quality of WorldMapKitWmsWebOverlay and WorldMapKitLayer the same? Maybe several layers combined in one overlay could be cause of this fuzziness? 



I am not sure whish sample can I send. It is just WorldMapKitLayer as backround map + several layers. Below is some code I used to draw image 



worldImageLayer = new WorldMapKitLayer("...", "..."); 

worldImageLayer.Name = "WorldMap"; 

worldImageLayer.ClearCache(); 

.... 

LayerOverlay staticOverlay = new LayerOverlay("StaticOverlay"); 

staticOverlay.IsBaseOverlay = true; 

staticOverlay.Layers.Add(worldImageLayer); 

staticOverlay.Layers.Add(featuredPropertiesLayer); 

staticOverlay.Layers.Add(rawProspectLayer); 

staticOverlay.Layers.Add(explorationLayer); 

... 

Map Map1 = new Map("WorldMap", imageWidth, imageHeight); 

Map1.MapUnit = GeographyUnit.DecimalDegree; 

Map1.CustomOverlays.Add(staticOverlay); 

Map1.CurrentExtent = currentExtent; 



GeoImage image = GdiPlusGeoCanvas.CreateGeoImage(imageWidth, imageHeight); 

GdiPlusGeoCanvas canvas = new GdiPlusGeoCanvas(); 

canvas.BeginDrawing(image, Map1.CurrentExtent, GeographyUnit.DecimalDegree); 

canvas.DrawingQuality = DrawingQuality.HighQuality; 

canvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 

canvas.Clear(new GeoSolidBrush(GeoColor.StandardColors.White)); 



foreach (Layer layer in staticOverlay.Layers) 



layer.Open(); 

layer.Draw(canvas, new Collection<simplecandidate></simplecandidate>()); 

layer.Close(); 





canvas.DrawScreenImageWithoutScaling(logo, imageWidth - logo.Width / 2, logo.Height / 2, DrawingLevel.LevelOne, 0, 0, 0); 



canvas.EndDrawing(); 



MemoryStream stream = GdiPlusGeoCanvas.ConvertGeoImageToMemoryStream(image); 

rv = new Bitmap(stream);



One more question: what is exact extent for WorldMapKitLayer? 



I have to use currentExtent = new RectangleShape(-179, 89, 179, -89); because worldImageLayer.GetBoundingBox() throws an error. When I used currentExtent = new RectangleShape(-180, 90, 180, -90); it draws broken images (see below). 



Which image width, height and extent should I use for better quality? 



Thanks, 

Igor



 



Igor,


The map quality of WorldMapKitLayer and WorldMapKitWmsOverlay are the same, the reason you get the fuzzy image is that the extent does not match the scale, and our wms server can only return the images which belong to specified zoom level. e.g. under extent (-180,90,180,-90), map width = 256, then it belongs to zoom level 01, if the map width is between 256 and 512, the current canvas's zoom level is between zoom level 01 and 02, so the images from the wms server will be stretched and become fuzzy. As a result you just need to change one line in the code: 
Map1.CurrentExtent = ExtentHelper.SnapToZoomLevel(currentExtent, GeographyUnit.DecimalDegree, imageWidth, imageHeight, Map1.ZoomLevelSet);
 then the image won't be fuzzy any more.


For your second question, the extent of worldMapKitLayer is (-180,90,180,-90), the reason that you got the broken image is just like I said above: the map wdith and the extent must have some kind of relevance.


Thanks,


Edgar



Thank you Edgar! It's getting clear for me and the image is getting clear also. 



I used size 640x320. Now, after applying SnapToZoomLevel function I got a sharp image, but I got also white margins... and there is some issue with logo (see image below). It looks like that I cannot have at the same time 3 things: image width 640px, full extent map without margins, and non-stretched image. I should sacrifice something. 

 










 



Igor, 
  
 You’re welcome, if you want to get the clear image of the whole world by WorldMapKitLayer and without margins, the image width should be 256 * Math.Pow(2, n), (n = 0,1,2….19), and the height should be width/2.  
  
 Hope it helps, 
  
 Edgar