ThinkGeo.com    |     Documentation    |     Premium Support

WMS and Bing Maps in the same map, scales not matching

 Hello, I wanto to have two base layers.


1 WMS V1.1.1 and Bing Maps Aereal imagery.


oh and of course also the blank background layer.


 


I'm able to achieve this, my only problem is that the scales between them don't match, so if I'm seeing the Bing Maps at some scale and change to WMS the map scale also changes.


 


I know that is something to do with OpenLayers.Layer resolutions, but I saw that somewhere in you javascripts you are setting the WMS resolutions to map resolutions wich are different from OpenLayersVirtualEarth Layer resolutions.


So... any idea?



Rui, 
  
 Thanks for your post, the reason is that the scales are differents between the Bing Maps and WorldMapKitWmsOverlay, the Bing Maps use the following scales: 
  
 zoomLevel20 = new ZoomLevel(1126.4644432067871); 
 zoomLevel19 = new ZoomLevel(2252.9288864135742); 
 zoomLevel18 = new ZoomLevel(4505.8577728271484); 
 zoomLevel17 = new ZoomLevel(9011.7155456542969); 
 zoomLevel16 = new ZoomLevel(18023.431091308594); 
 zoomLevel15 = new ZoomLevel(36046.862182617188); 
 zoomLevel14 = new ZoomLevel(72093.724365234375); 
 zoomLevel13 = new ZoomLevel(144187.44873046875); 
 zoomLevel12 = new ZoomLevel(288374.8974609375); 
 zoomLevel11 = new ZoomLevel(576749.794921875); 
 zoomLevel10 = new ZoomLevel(1153499.58984375); 
 zoomLevel09 = new ZoomLevel(2306999.1796875); 
 zoomLevel08 = new ZoomLevel(4613998.359375); 
 zoomLevel07 = new ZoomLevel(9227996.71875); 
 zoomLevel06 = new ZoomLevel(18455993.4375); 
 zoomLevel05 = new ZoomLevel(36911986.875); 
 zoomLevel04 = new ZoomLevel(73823973.75); 
 zoomLevel03 = new ZoomLevel(147647947.5); 
 zoomLevel02 = new ZoomLevel(295295895); 
 zoomLevel01 = new ZoomLevel(590591790); 
  
 But the WorldMapKitWmsOverlay use the OpenLayer resolutions, they are not the same, so if you need any helps on that please provide more detailed information, 
  
 Thanks, 
  
 Scott,

Client-side I got the following scales for BingMaps layer: 
 Double[] coll = { 
                                295829515.14942675, 
                                 147914757.57471338, 
                                 73957378.78735669, 
                                 36978689.393678345, 
                                 18489344.696839172, 
                                 9244672.348419586, 
                                 4622336.174209793, 
                                 2311168.0871048965, 
                                 1155584.0435524482, 
                                 577792.0217762241, 
                                 288896.01088811206, 
                                 144448.00544405603, 
                                 72224.00272202801, 
                                 36112.00136101401, 
                                 18056.000680507004, 
                                 9028.000340253502, 
                                 4514.000170126751, 
                                 2257.0000850633755, 
                                 1128.5000425316877  
                             }; 
 this scales using OpenLayers.Util.getScaleFromResolution(this.resolutions[4], this.units) 
  
 is there something wrong? Do you have the right SRS applied to the map? 
 Default is ESPG:4326, but I have EPSG:900913 (Bing maps), I included the Proj4js to handle correctly the coordinate systems. 


Rui, 
  
 Yes, we have the right SRS applied to the map, if it is the WorldMapkit with decimal degree map unit, the ESPG is 4326, if the WorldMapKit with spherical mercator, the SRS is 900913.  
  
 Also the BingMapLayer’s zoomlevel scale is not the same as the BingMapsOverlay, the BingMapsOverlay used the same scale values to OpenLayers, but the BingMapLayer’s zoomlevel scale is not the same as it. For the WorldMapkitWMSOverlay, it also has different zoomlevel scales from the BingMapsOverlay, it has standalone zoomlevel scale system. So in your side, you see the WorldMapKitWMSOverlay dose not match the BingMapOverlay. 
  
 Any more questions please let us know again, 
  
 Thanks, 
  
 Scott,

Hello, 
 why you assume I’m using WorldMapKitWmsOverlay? I am not.  
 I’m using WmsRasterLayer to access a private WMS published with MapServer.  
  
 Although I can see every scale in Quantum Gis for this WMS, with ThinkGeo I can’t match the scales with the BingMaps. 
  
 If I have the map at scale X when a change the base layer from Bing to WMS it should keep the scale, right?!

Rui, 
  
 Sorry for the misunderstandings, I tested it again used the WMS layers and found out it cannot be matched to the BingMaps or GoogleMaps, I just fixed the bug please get the latest DailyBuild of web edition from the development branch, 
  
 Also I checked the 4.5.0.0 public release version, at this point it works fine, I guessed maybe you didn’t use the 4.5.0.0. So you can either get the 4.5.0.0 version or the latest DailyBuild version to try again, 
  
 Thanks, 
  
 Scott,

Hello Scott,  
 you are right, I’m not using 4.5.0. I will give it a try with the new version. I’ll post here the result. 
  
 Thanks

 Scott, some good news but also bad news.


The zoomlevel is not changing, but the scale is...


I've created a sample application for you guys to test.


Also have a video showing the problem, please download it from:


 


ruilima.com/wp-content/uploads/2011/03/video.zip



ThinkGeo_WMS_Bing.zip (293 KB)

Rui,


Please use the WmsOverlay in your sample application, you refer the following code:



   Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);
                Map1.CurrentExtent = new RectangleShape(-131.22, 55.05, -54.03, 16.91);
                Map1.MapUnit = GeographyUnit.DecimalDegree;

                WmsOverlay wms = new WmsOverlay("WMS Overlay");
                wms.Parameters.Add("layers", "Countries02");
                wms.Parameters.Add("STYLE", "SIMPLE");
                wms.ServerUris.Add(new Uri("wmssamples.thinkgeo.com/WmsServer.aspx"));
                wms.TileType = TileType.MultipleTile;
                wms.TileHeight = 256;
                wms.TileWidth = 256;

                Map1.CustomOverlays.Add(wms);
But you should change the wms url to yours and add the CRS parameter to the wms overlay, the sample code above is used the decimal degree unit, also please change it to meter in your application. The reason is that the WMSOverlay is used the same ZoomLevel scales as OpenLayers, so please use it to instead of the WmsRasterLayer and try again.


Any more questions please let me know,


Thanks,


Scott,



Scott, I cannot do that.


I need to use WMSRasterLayer. I need this so I'm able to generate servercache. I also need to render the image server side (this maybe could be achieved with WMSOverlay, but not the cache).


Isn't there another way? This is a bug or not?



Rui,


I see, the reason is that the ZoomLevel's scales of WmsRasterLayer are not the same as the BingMapOverlay, the BingMapOverlay uses the Openlayer's zoomlevel scales and the WmsRasterLayer uses the MapSuite zoomlevel scales. They are the different system you can realize it is not a bug. So there is a solution for you, please check the following code:



  protected void Page_Load(object sender, EventArgs e)
        {
            var wmsOverlay = new LayerOverlay("wms", true, TileType.MultipleTile)
                                 {
                                     ServerCache =
                                         {
                                             CacheDirectory = @"C:\temp\",
                                             CacheId = "wms900913"
                                         },
                                     TileHeight = 1024,
                                     TileWidth = 1024,
                                     WebImageFormat = WebImageFormat.Jpeg
                                 };

            var wmsLayer = new WmsRasterLayer(new Uri("mapserver3.local/mapserv.exe?map=Map1.map&VERSION=1.1.1"));
            wmsLayer.ActiveLayerNames.Add("ORTOS5CM");
            wmsLayer.Parameters.Add("layers", "ORTOS5CM");
            wmsLayer.Parameters.Add("FORMAT", "IMAGE/JPEG");
            wmsLayer.TimeoutInSecond = 60;
            wmsLayer.OutputFormat = "IMAGE/JPEG";
            wmsLayer.Crs = "EPSG:900913";
            wmsLayer.IsTransparent = false;

            wmsOverlay.Layers.Add(wmsLayer);
            wmsOverlay.SetBaseEpsgProjection("EPSG:900913");

            var bing = new BingMapsOverlay("bing", BingMapsStyle.Aerial);

            Map1.ClientZoomLevelScales[0] = 295829515.14942675; 
            Map1.ClientZoomLevelScales[1] = 147914757.57471338; 
            Map1.ClientZoomLevelScales[2] = 73957378.78735669; 
            Map1.ClientZoomLevelScales[3] = 36978689.393678345; 
            Map1.ClientZoomLevelScales[4] = 18489344.696839172; 
            Map1.ClientZoomLevelScales[5] = 9244672.348419586; 
            Map1.ClientZoomLevelScales[6] = 4622336.174209793; 
            Map1.ClientZoomLevelScales[7] = 2311168.0871048965; 
            Map1.ClientZoomLevelScales[8] = 1155584.0435524482; 
            Map1.ClientZoomLevelScales[9] = 577792.0217762241; 
            Map1.ClientZoomLevelScales[10] = 288896.01088811206; 
            Map1.ClientZoomLevelScales[11] = 144448.00544405603; 
            Map1.ClientZoomLevelScales[12] = 72224.00272202801; 
            Map1.ClientZoomLevelScales[13] = 36112.00136101401; 
            Map1.ClientZoomLevelScales[14] = 18056.000680507004; 
            Map1.ClientZoomLevelScales[15] = 9028.000340253502; 
            Map1.ClientZoomLevelScales[16] = 4514.000170126751; 
            Map1.ClientZoomLevelScales[17] = 2257.0000850633755; 
            Map1.ClientZoomLevelScales[18] = 1128.5000425316877;

            Map1.CustomOverlays.Add(wmsOverlay);
            Map1.CustomOverlays.Add(bing);

            Map1.MapTools.OverlaySwitcher.Enabled = true;

            Map1.MapTools.OverlaySwitcher.OnClientBaseOverlayChanged = "BaseLayerChanged";
            Map1.MapTools.ScaleLine.Enabled = true;


            if(!String.IsNullOrEmpty(Request.QueryString["withproj4js"]))
            {
                ClientScript.RegisterClientScriptResource(this.GetType(), "proj4js-combined.js");
            }

        }
You just need to set the ClientZoomLevelScales property for each zoomlevel based on the OpenLayer zoomlevelset scales, your problem can be resolved correctly,


Any more questions please let me know,


Thanks,


Scott,