ThinkGeo.com    |     Documentation    |     Premium Support

Displacement of WmsRasterLayer

I have an WmsRasterLayer and place them across an ShapeFileFeatureLayer. Both Layers have the same projection (EPSG:4326). The WmsRasterLayer is displaced other the ShapeFileFeatureLayer. I send you 3 pictures to see the problem.


The same problem I approached in this post : gis.thinkgeo.com/Support/Dis...fault.aspx


Ryan said: "The problem with the WMS layer slipping is a known issue and one that we have resolved for the next release. Basically you need to manually set a style for the map such as Align = Left and this 'slipping' will go away. We will do this automatically for you in the next release."


In the new version BETA 3.0.131 the problem is not dissolved. I tryed out to set the style for the layer to "align: left" respectively "text-align: left":


 


<mps:Map

     ID="map"                            

     Width="700px" 

     Height="500px"

     runat="server" 

     style="text-align: left; padding: 0px; margin: 0px; align: left;" />

 


without resolution...


Here is my code (sorry but I cannot send you the ShapeFile / Wms Layer Url because the license):



ShapeFileFeatureLayer layerBundeslaender = new ShapeFileFeatureLayer(MapPath("~/Shapes/Bundeslaender.shp"));
layerBundeslaender.Name = LayerName.ShpBundeslaender.ToString();
layerBundeslaender.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.County1;
layerBundeslaender.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
this.map.StaticOverlay.Layers.Add(layerBundeslaender.Name, layerBundeslaender);
 
 
// create wms layer
WmsRasterLayer wmsLayer = new WmsRasterLayer(wmsUri);
 
wmsLayer.Name = “WMS Layer”;
 
if (!wmsLayer.IsOpen)
{
wmsLayer.Open();
}
 
// Set Active Layer names
foreach (string name in wmsLayer.GetServerLayerNames())
{
wmsLayer.ActiveLayerNames.Add(name);
}
 
wmsLayer.UpperThreshold = Double.MaxValue;
wmsLayer.LowerThreshold = 0;
wmsLayer.IsTransparent = true;
wmsLayer.Crs = "EPSG:4326";
wmsLayer.TimeoutInSecond = 35;
 
if (wmsLayer.IsOpen)
{
            wmsLayer.Close();
}
 
this.map.StaticOverlay.Layers.Add(wmsLayer.Name, wmsLayer);

 


I hope you can help me,


Anke



Anke, 
  
 I didn’t find your “3 pictures”, can you reattached it? Sorry for the inconvenience. 
  
 Ben

I hope you can see the pictures now...


In picture 3 you can see very good the conture of the shape file layer and the wms layer. There is an big difference.


Anke


picture 1:



picture 2:



picture 3:




Anke,


We couldn't recreate your issue. Here is a sample (I didn't include the data because of the size limit, please get it from \Map Suite Web Evaluation Edition 3.0 (BETA)\Samples\CSharp Samples\SampleData\World\cntry02.shp) and you can see it works fine with our WMS Server. It will be great if we can get your WMS URL for test. If that's not proper, can you try your WMS URL in this sample or add this data to your application to see if that works?



We used to have an issue about the map slipper related to the align style and we have maked that right. I'm curious about your issue and if you want to send me anything sensitive, please send to support@thinkgeo.com and ask to forward to Ben.


Ben.


 



211-Post5003.zip (6.58 KB)

I took your sample and changed the wms layer url to isk.geobasis-bb.de/ows/dnm.php. The BoundingBox I set to:


Map1.CurrentExtent = ExtentHelper.GetDrawingExtent ( new RectangleShape(11.2, 53.5, 14.8, 51.3), (float)this.Map1.Width.Value, (float)this.Map1.Height.Value ); 


Because the wms layer has problems with TileType "MultipleTile", I set them to SingleTyle (with MultipleTile are the same problems):


this.Map1.StaticOverlay.TileType = ThinkGeo.MapSuite.WebEdition.TileType.SingleTile; 


The displacement of the layer is the same like in my sample. With your wms layer i have no problmes, but my wms layer has a displacement if use the pan mode.


Anke





Anke, 



It is a bug. Can you work around with wmsOverlay like what you posted here? Also please have a look at the attached sample for detail. We didn’t include the data file because of the size limits; please get the data from SampleData\World\cntry02.shp in your installation folder. 



Ben. 

 



228-Post5003.zip (12.3 KB)

If I use the WmsOverlay I have no displacement. The problem is, that I can not use the WmsOverlay, because I have to wms layer which are nestes in each other. So I have for example:


Wms Layer 1 - background


Wms Layer 2 - Rivers


Wms Layer 1 - Cities


Wms Layer 2 - Something


I hope you understand the problem? I use the same layer more than once. If I try to use the same Uri in a second WmsOverlay (on the same map) I get the exception "Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt." - This says that a key with the same Uri (I think this is your key?) exists.


   bei System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)

   bei System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)

   bei System.Collections.ObjectModel.KeyedCollection`2.AddKey(TKey key, TItem item)

   bei System.Collections.ObjectModel.KeyedCollection`2.InsertItem(Int32 index, TItem item)

   bei System.Collections.ObjectModel.Collection`1.Add(T item)

   bei Default_.Page_Load(Object sender, EventArgs e) in c:\MyProject\project\Default.aspx.cs:Zeile 68.

   bei System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)

   bei System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)


The second problem which is found, is that I can not set change the projection of WmsOverlay, if the layer is no BaseOverlay (standard is 4326 - I will use 25833). I try 2 codes:


Sample 1: I see the wms layer, but I can not set something in Background, but I will see the world in background...



Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);
Map1.CurrentExtent = new RectangleShape(240000, 5930000, 490000, 5690000);
Map1.MapUnit = GeographyUnit.Meter;

WmsOverlay wmsOverlay1 = new WmsOverlay("WMS", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay1.Parameters.Add("layers", "bg,siedlung,vegetation,gewaesser,transport,strassennamen,ortsnamen,gewaessernamen");
wmsOverlay1.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay1.Parameters.Add("format", "image/png");
wmsOverlay1.Parameters.Add("transparent", "true");
wmsOverlay1.Parameters.Add("SRS", "EPSG:25833");
wmsOverlay1.IsBaseOverlay = true;

Map1.CustomOverlays.Add(wmsOverlay1);

Sample 2: I can not see the wms layer, if I change the projection and the layer is not in base overlay!



Map2.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);
Map2.CurrentExtent = new RectangleShape(240000, 5930000, 490000, 5690000);
Map2.MapUnit = GeographyUnit.Meter;
Map2.MapTools.OverlaySwitcher.Enabled = true;

WmsOverlay wmsOverlay2 = new WmsOverlay("WMS", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay2.Parameters.Add("layers", "bg,siedlung,vegetation,gewaesser,transport,strassennamen,ortsnamen,gewaessernamen");
wmsOverlay2.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay2.Parameters.Add("format", "image/png");
wmsOverlay2.Parameters.Add("transparent", "true");
wmsOverlay2.Parameters.Add("SRS", "EPSG:25833");
wmsOverlay2.IsBaseOverlay = false;

Map2.CustomOverlays.Add(wmsOverlay2);

The strange is, that I see the map from sample 2, if I put 2 maps on the form - sample1 and sample2. If I set the map from sample 1 to visible false, I see nothing in sample 2, if I set it to visible true I see the wms layer. I hope you understand me?


Sample 1 and sample 2 on the same page. Please try to set the map1 to visible = false and look to the result:



Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);
Map1.CurrentExtent = new RectangleShape(240000, 5930000, 490000, 5690000);
Map1.MapUnit = GeographyUnit.Meter;

WmsOverlay wmsOverlay1 = new WmsOverlay("WMS", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay1.Parameters.Add("layers", "bg,siedlung,vegetation,gewaesser,transport,strassennamen,ortsnamen,gewaessernamen");
wmsOverlay1.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay1.Parameters.Add("format", "image/png");
wmsOverlay1.Parameters.Add("transparent", "true");
wmsOverlay1.Parameters.Add("SRS", "EPSG:25833");
wmsOverlay1.IsBaseOverlay = true;

Map1.CustomOverlays.Add(wmsOverlay1);

// ToDo: try to set the map1 to visible = false;
Map1.Visible = false;

Map2.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);
Map2.CurrentExtent = new RectangleShape(240000, 5930000, 490000, 5690000);
Map2.MapUnit = GeographyUnit.Meter;
Map2.MapTools.OverlaySwitcher.Enabled = true;

WmsOverlay wmsOverlay2 = new WmsOverlay("WMS", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay2.Parameters.Add("layers", "bg,siedlung,vegetation,gewaesser,transport,strassennamen,ortsnamen,gewaessernamen");
wmsOverlay2.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay2.Parameters.Add("format", "image/png");
wmsOverlay2.Parameters.Add("transparent", "true");
wmsOverlay2.Parameters.Add("SRS", "EPSG:25833");
wmsOverlay2.IsBaseOverlay = false;

Map2.CustomOverlays.Add(wmsOverlay2);


Anke,


In the web edition, map must have a baseOverlay, dynamicOverlays’ projection are based on the baseOverlay's, if you only add dynamicOverlay on the map, we’ll use DecimalDegree by default.
 
The exception you mentioned in the post is because you named the two WmsOverlays the same name.
 
WmsOverlay wmsOverlay1 = new WmsOverlay("WMS, new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);"
WmsOverlay wmsOverlay2 = new WmsOverlay("WMS, new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);"
We did some improvements on your code and here is a demo for you. please have a look. 
 Ben

233-Post5003.zip (6.17 KB)

Hello Ben,


I tryed your sample and it works fine - thanks.


Why I can not add an ShapeFileFeatureLayer as IsBaseOverlay true (as LayerOverlay in CustomOverlays).




this.map.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4"));
this.map.CurrentExtent = new RectangleShape(240000, 5930000, 490000, 5690000);
this.map.MapUnit = GeographyUnit.Meter;
this.map.MapTools.OverlaySwitcher.Enabled = true;


ShapeFileFeatureLayer worldLayer2 = new ShapeFileFeatureLayer(MapPath("~/Shapes/Bundeslaender.shp"));
worldLayer2.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayer2.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

Proj4Projection proj4 = new Proj4Projection();
proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(25833);
worldLayer2.FeatureSource.Projection = proj4;

LayerOverlay worldLayerOverlay2 = new LayerOverlay("Bundeslaender");
worldLayerOverlay2.Layers.Add(worldLayer2);
worldLayerOverlay2.IsBaseOverlay = true;

this.map.CustomOverlays.Add(worldLayerOverlay2);


WmsOverlay wmsOverlay1 = new WmsOverlay("WMS1", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay1.Parameters.Add("layers", "bg");
wmsOverlay1.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay1.Parameters.Add("format", "image/png");
wmsOverlay1.Parameters.Add("transparent", "true");
wmsOverlay1.Projection = "EPSG:25833";
wmsOverlay1.TileType = TileType.MultipleTile;
wmsOverlay1.IsBaseOverlay = false;
this.map.CustomOverlays.Add(wmsOverlay1);


WmsOverlay wmsOverlay2 = new WmsOverlay("WMS2", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay2.Parameters.Add("layers", "bg,siedlung,vegetation,gewaesser,transport,strassennamen,ortsnamen,gewaessernamen");
wmsOverlay2.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay2.Parameters.Add("format", "image/png");
wmsOverlay2.Parameters.Add("transparent", "true");
wmsOverlay2.Projection = "EPSG:25833";
wmsOverlay2.TileType = TileType.SingleTile;
wmsOverlay2.IsBaseOverlay = false;
this.map.CustomOverlays.Add(wmsOverlay2);

This is the result




If I set the LayerOverlay to IsBaseOverlay false and the wmsOverlay1 to IsBaseOverlay  true, It looks like the following image. But I have one wms layer which is blind by the ShapeFileFeatureLayer. Which is lost time!




this.map.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4"));
this.map.CurrentExtent = new RectangleShape(240000, 5930000, 490000, 5690000);
this.map.MapUnit = GeographyUnit.Meter;
this.map.MapTools.OverlaySwitcher.Enabled = true;


ShapeFileFeatureLayer worldLayer2 = new ShapeFileFeatureLayer(MapPath("~/Shapes/Bundeslaender.shp"));
worldLayer2.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayer2.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

Proj4Projection proj4= new Proj4Projection();
proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(25833);
worldLayer2.FeatureSource.Projection = proj4;

LayerOverlay worldLayerOverlay2 = new LayerOverlay("Bundeslaender");
worldLayerOverlay2.Layers.Add(worldLayer2);
worldLayerOverlay2.IsBaseOverlay = false;

this.map.CustomOverlays.Add(worldLayerOverlay2);


WmsOverlay wmsOverlay1 = new WmsOverlay("WMS1", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay1.Parameters.Add("layers", "bg");
wmsOverlay1.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay1.Parameters.Add("format", "image/png");
wmsOverlay1.Parameters.Add("transparent", "true");
wmsOverlay1.Projection = "EPSG:25833";
wmsOverlay1.TileType = TileType.MultipleTile;
wmsOverlay1.IsBaseOverlay = true;
this.map.CustomOverlays.Add(wmsOverlay1);


WmsOverlay wmsOverlay2 = new WmsOverlay("WMS2", new Uri("isk.geobasis-bb.de/ows/dnm.php"), TileType.SingleTile);
wmsOverlay2.Parameters.Add("layers", "bg,siedlung,vegetation,gewaesser,transport,strassennamen,ortsnamen,gewaessernamen");
wmsOverlay2.Parameters.Add("Exceptions", "application/vnd.ogc.se_xml");
wmsOverlay2.Parameters.Add("format", "image/png");
wmsOverlay2.Parameters.Add("transparent", "true");
wmsOverlay2.Projection = "EPSG:25833";
wmsOverlay2.TileType = TileType.SingleTile;
wmsOverlay2.IsBaseOverlay = false;
this.map.CustomOverlays.Add(wmsOverlay2);

Anke



Anke, 
  
 When a WMS Overlay is added, it will follow the projection of the BaseOverlay. Now if a LayerOverlay is set as BaseOverlay, no matter what projection the WMSOverlay is using, it will always use DecimalDegree, which is LayerOverlay’s default projection (EPSG:4326)  and we cannot change that now. 
  
 It’s a bug that we didn’t have a projection property for a LayerOverlay, we will add it in the next release. Then you can set a LayerOverlay as baseOverlay and the WmsOverlay will follow LayerOverlay’s projection, which can be set whatever you need. Sorry for the inconvenience now. 
  
 Ben