ThinkGeo.com    |     Documentation    |     Premium Support

Transparency on WMS tiles

Hi,

I would like to know if it is possible to tell MapSuite that for a given WmsRasterLayer the white should be transparent ?


I'm loading WMS tiles which are all white with some black lines on it, so I'm forced to use the global layer transparency but this leads to background being whitened and black lines being not so visible.


Thanks.



Hello Gautier, 
  
 Thanks for your post, like you said, our layer transparent is only working on whole layer not just white color, we don’t have that function for now. 
  
 You can vote this enhancement to helpdesk.thinkgeo.com/EnhancementTracker. This captures the enhancement request and provides visibility to the customer letting them know that the enhancement is on a list somewhere and that popularity of the enhancement helps set the priority of when the enhancement would be added to the product. This option doesn’t carry any cost for you.  
  
 Or if you need this function immediately, your account rep can contact you for a professional services.  
  
 Regards,  
  
 Gary

Done ! 
  
 Thank you.

Hello Gautier, 
  
 You are welcome, don’t hesitate let us know your questions. 
  
 Regards, 
  
 Gary

I was wondering if it is possible to make all images loaded from the WMS server pass through a fonction which could modify them (add watermark, transparency and so on…) ? 
  
 Thanks for your help. 


Hello Gautier,


Yes, you can check:


wiki.thinkgeo.com/wiki/Map_S...ment_Guide

and find the paragraph of "Changing the Watermark to Your Own Image ". And also you can find out other settings too.


Or if you want to make the watermark in desktop edition, you can refer this sample:


wiki.thinkgeo.com/wiki/Map_S...ment_Layer


I hope this can help you.


Regards,


Gary



Sorry I looked at your links very carefuly but didn’t find anything matching with what I would like to do. 
  
 In fact I need an event like the one that allows to change the web request : 
 ((WmsRasterSource)IGNWmsRasterLayer.ImageSource).SendingWebRequest 
  
 But for the images, so I pass the loaded image to my eventhandler and modify this image on the fly before it is cached and send to the client browser. 
  
 Thank you.

Hello Gautier, 
  
 Sorry I made mistake for your question, I think you need add your own watermark on the tile. 
  
 As far as I know, we don’t have that kind of exist function, the only way I can think about is override the WmsRasterLayer DrawCore method and edit the tile or image before you drawing it on the canvas. 
  
 Also I will ask more guys and doing some more research on this and check if there is some other solution. 
  
 Please feel free to let us know your queries. 
  
 Regards, 
  
 Gary

Thank you, any news on this or sample code ?

 


Hi Gautier,
At first glance, we have the same idea that we should take advantage of “SentWebRequest” event, and change the HttpWebResponse . But seems that it runs into complex, we just can get the stream from HttpWebResponse, but unable to do the changes. So please try the code below, and pay more attention to the “Todo” comments:


   public partial class LoadAWmsOverlay : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.Transparent);
                Map1.CurrentExtent = new RectangleShape(-131.22, 55.05, -54.03, 16.91);
                Map1.MapUnit = GeographyUnit.DecimalDegree;

                CustomWmsRasterSource imageSource = new CustomWmsRasterSource(new Uri("wmssamples.thinkgeo.com/WmsServer.aspx"));
                CustomWmsRasterLayer wmsRasterLayer = new CustomWmsRasterLayer(imageSource);
                wmsRasterLayer.UpperThreshold = double.MaxValue;
                wmsRasterLayer.LowerThreshold = 0;

                wmsRasterLayer.Open();
                foreach (string layerName in wmsRasterLayer.GetServerLayerNames())
                {
                    wmsRasterLayer.ActiveLayerNames.Add(layerName);
                }
                wmsRasterLayer.Close();
                LayerOverlay wms = new LayerOverlay();
                wms.Layers.Add(wmsRasterLayer);

                Map1.CustomOverlays.Add(wms);
            }
        }
    }

    public class CustomWmsRasterLayer : WmsRasterLayer
    {
        public CustomWmsRasterLayer(WmsRasterSource rasterSource)
        {
            this.ImageSource = rasterSource;
        }
    }

    public class CustomWmsRasterSource : WmsRasterSource
    {
        public CustomWmsRasterSource(Uri url)
            : base(url)
        {
        }

        protected override GeoImage GetImageCore(RectangleShape worldExtent, int canvasWidth, int canvasHeight)
        {
            GeoImage image = base.GetImageCore(worldExtent, canvasWidth, canvasHeight);
            Stream stream = image.GetImageStream(new GdiPlusGeoCanvas());

            // todo: please modify the stream of the bitmap here, maybe you need loop the pixel in it and make sure it's transparent.
            // .........your code......

            return new GeoImage(stream);
        }
    }


 
Regards!
Johnny

OK thank you I’m going to try to investigate this stream !

Hello Gautier, 
  
 Please let us know if you still meet problem on this or you need other help. 
  
 Regards, 
  
 Gary