ThinkGeo.com    |     Documentation    |     Premium Support

Map control crashes if OsmWorldMapKitLayer.GetFeatureLayer layer.ZoomLevelSet is set

Hi,



I’ve found out that my Map Control custom zoom level set is not in sync with the OsmWorldMapKitLayer layers zoom set.

The map control shows layers’ styles based on the default zoom level set, which is different from the custom map control zoom set.



I’ve added a code to the OsmWorldMapKitLayer.GetFeatureLayer function to set my custom zoom set for each layer. After that, the map control crashes with the “Type ‘xRM=.wRs=’ in Assembly ‘MapSuiteCore, Version=9.0.0.0,
Culture=neutral, PublicKeyToken=null’ is not marked as serializable.”
 error. My custom zoom set did not have any problems on the map control before. How can I set layers custom zoom set?



private FeatureLayer
GetFeatureLayer(string tableName)


        {


            FeatureLayer
layer;


            if
(databaseType == OsmWorldMapKitDatabaseType.Sqlite)


            {


                layer = new SqliteFeatureLayer(connectionString,
tableName, featureIdColumnName, geometryColumnName);


                layer.Name = ((SqliteFeatureLayer)layer).TableName;


            }


            else
if (databaseType == OsmWorldMapKitDatabaseType.Postgres)


            {


                layer = new PostgreSqlFeatureLayer(connectionString,
tableName, featureIdColumnName, srid, schemaName, geometryColumnName);


                layer.Name = ((PostgreSqlFeatureLayer)layer).TableName;


            }


            else


            {


                throw
new Exception(“Invalid database type.”);


            }


            layer.ZoomLevelSet
= customZoomLevelSet; //the custom zoom set is already created on 


 


            return
layer;


        }




protected override void OpenCore() 


{


     customZoomLevelSet = GeCustomZoomLevelSet();

     …






Please help,

Thanks,

Gene




Hi Gene, 
  
 I guess the problem is that the method "GetFeatureLayer" is called before "OpenCore", please try checking the code and make sure move the code of initializing customZoomLevelSet before calling "GetFeatureLayer". If I made a mistake, please let me know. 
  
 Thanks, 
 Johnny

Hi Johnny, 
  
 I’ve just debugged my code again and the OpenCore is called before calling “GetFeatureLayer”. I’ve also rechecked  that the customZoomLevelSet is already set when the layer.ZoomLevelSet = customZoomLevelSet code is executed in GetFeatureLayer. 
  
 The ThinkGeo.MapSuite.Core.ZoomLevelSet class has the CustomZoomLevels property, but my code sets the customs scales directly to each ZoomLevelXX.Scale and this works for the Map Control custom zooms. Do you have a sample how to set custom scales for the map control AND layers? 
  
 But the main question is still how to fix the “Type ‘xRM=.wRs=’ in Assembly ‘MapSuiteCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null’ is not marked as serializable” error. 
  
  public static ZoomLevelSet GeCustomZoomLevelSet() 
         { 
             ZoomLevelSet zoomSet = new ZoomLevelSet(); 
  
             Collection<double> zoomScales = GetZoomLevelCollection(); 
  
             zoomSet.ZoomLevel20.Scale = zoomScales[19]; 
             zoomSet.ZoomLevel19.Scale = zoomScales[18]; 
             zoomSet.ZoomLevel18.Scale = zoomScales[17]; 
             zoomSet.ZoomLevel17.Scale = zoomScales[16]; 
             zoomSet.ZoomLevel16.Scale = zoomScales[15]; 
             zoomSet.ZoomLevel15.Scale = zoomScales[14]; 
             zoomSet.ZoomLevel14.Scale = zoomScales[13]; 
             zoomSet.ZoomLevel13.Scale = zoomScales[12]; 
             zoomSet.ZoomLevel12.Scale = zoomScales[11]; 
             zoomSet.ZoomLevel11.Scale = zoomScales[10]; 
             zoomSet.ZoomLevel10.Scale = zoomScales[9]; 
             zoomSet.ZoomLevel09.Scale = zoomScales[8]; 
             zoomSet.ZoomLevel08.Scale = zoomScales[7]; 
             zoomSet.ZoomLevel07.Scale = zoomScales[6]; 
             zoomSet.ZoomLevel06.Scale = zoomScales[5]; 
             zoomSet.ZoomLevel05.Scale = zoomScales[4]; 
             zoomSet.ZoomLevel04.Scale = zoomScales[3]; 
             zoomSet.ZoomLevel03.Scale = zoomScales[2]; 
             zoomSet.ZoomLevel02.Scale = zoomScales[1]; 
             zoomSet.ZoomLevel01.Scale = zoomScales[0]; 
  
             return zoomSet; 
 } 
  
 Please help. 
 Thanks, 
 Gene

Hi, 
  
 I’ve found a way around this error (bug?). Instead of setting a new ZoomLevelSet to layer.ZoomLevelSet, I’ve updated the scale for each layer zoom level (layer.ZoomLevelSet.ZoomLevelXX.Scale = …). 
  
 Gene

Gene, 
  
 Great to hear you figure it out and feel free to let us know if any other questions. 
  
 Thanks, 
 Troy

Hi, 



The way around I’ve found to avoid creating a new ZoomLevelSet works for the default number of zoom levels which is 20. 



Now I need to implement a ZoomLevelSet with only 10 zoom levels. What is the right way to do this? 



Do you have a code sample to set a WPF Map Control custom zoom level set with less than 20 zoom levels?



Thanks, 

Gene

Hi Gene, 
  
 I think you should want to set your custom zoomlevelset like this: 
  
 layer1.ZoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(xxx)); 
  
 And if possible you maybe want to assign that to map also: 
  
 Map1.ZoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(xxx)); 
  
 Regards, 
  
 Don 


Hi,



I’ve been able to implement a set of 10 custom zooms in the WPF map control, but I failed to adjust the PanZoomBar to have 10 levels only. It still has 20 levels, but it stops on the level 10, which is correct with my custom zoom level settings. I could not find any properties which allow to change the PanZoomBar min/max values. Is it possible to do this? I’ve found a ThinkGeo forum post with a simular issue (thinkgeo.com/forums/MapSuite/tabid/143/aft/12317/Default.aspx), but could not find a workable solution for my case.



My code:

                Map1.ZoomLevelSet = GeCustomZoomLevelSet(); //it returns a ZoomLevelSet with 10 CustomZoomLevels)
                Map1.MinimumScale = Map1.ZoomLevelSet.CustomZoomLevels[9].Scale;
                Map1.MaximumScale = Map1.ZoomLevelSet.CustomZoomLevels[0].Scale;


                Map1.MapTools.PanZoomBar.UpdateLayout();


Please help.



Thanks,

Gene

Hi Gene, 
  
 As below is a very simple test sample, which shows the short panzoombar correct, please let me know whether that works for you. 
  
   private void WpfMap_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.Meter;            
            Map1.CurrentExtent = new RectangleShape(2149408.38465815, 246471.365609125, 2204046.63635703, 213231.081162168);
            OpenStreetMapOverlay worldOverlay = new OpenStreetMapOverlay();
            Map1.Overlays.Add("WMK", worldOverlay);


            ZoomLevelSet set = new ZoomLevelSet();
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel01);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel02);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel03);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel04);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel05);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel06);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel07);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel08);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel09);
            Map1.ZoomLevelSet.CustomZoomLevels.Add(set.ZoomLevel10);

            Map1.Refresh();
        }
 
  
 Regards, 
  
 Don

Don, 
  
 My code sets the custom zoom levels the same way. Today I’ve figured out that the PanZoomBar control was not shown properly if I applied the new zooms when the map control is already displayed. It works as expected if you set the custom zooms before drawing the map layout first time. 
  
 Thank you for your help, 
  
 Gene.

Hi Gene, 
  
 Yes I think it should have some process to create the PanZoomBar when map initialization, so put the code before map control created is better. 
  
 Regards, 
  
 Don