ThinkGeo.com    |     Documentation    |     Premium Support

Problem => Map1.CurrentScale = NaN

Hello everyone,


 


I've got a problem with the current scale of the map.


For my website, I've got to set a zoom level minimum to be able to see the google background. For that, I look the current scale and if it's smaller than a reference, I call ZoomToScale with the reference scale.


But now, Map1.CurrentScale is equal to "NaN". The only change I've made it's to change the google layer from a CustomOverlay to a BackgroundOverlay.


Does this may come from the layer change? 

If yes, how can I have the current scale?


Thanks.


 


PS: For information =>


Map1

{ThinkGeo.MapSuite.WebEdition.Map}

    base {System.Web.UI.WebControls.Panel}: {ThinkGeo.MapSuite.WebEdition.Map}

    ActiveBaseOverlay: {ThinkGeo.MapSuite.WebEdition.GoogleOverlay}

    BackgroundOverlay: {ThinkGeo.MapSuite.WebEdition.GoogleOverlay}

    ClientID: "Map1"

    ClientZoomLevelScales: Count = 20

    ContextMenu: null

    CurrentExtent: {ThinkGeo.MapSuite.Core.RectangleShape}

    CurrentScale: NaN

    Cursor: Default

    CustomCursorUri: null

    CustomOverlays: Count = 0

    DynamicOverlay: {ThinkGeo.MapSuite.WebEdition.LayerOverlay}

    EditOverlay: {ThinkGeo.MapSuite.WebEdition.EditFeatureOverlay}

    HeightInPixels: 'Map1.HeightInPixels' threw an exception of type 'System.NotSupportedException'

    HighlightOverlay: {ThinkGeo.MapSuite.WebEdition.HighlightFeatureOverlay}

    MapBackground: {ThinkGeo.MapSuite.Core.BackgroundLayer}

    MapTools: {ThinkGeo.MapSuite.WebEdition.MapTools}

    MapUnit: Meter

    MarkerOverlay: {ThinkGeo.MapSuite.WebEdition.InMemoryMarkerOverlay}

    OnClientBaseOverlayChanged: ""

    OnClientClick: ""

    OnClientDoubleClick: ""

    OnClientDrawEnd: ""

    OnClientEditEnd: ""

    OnClientExtentChanged: ""

    Popups: Count = 0

    RestrictedExtent: null

    StaticOverlay: {ThinkGeo.MapSuite.WebEdition.LayerOverlay}

    UniqueID: "Map1"

    WidthInPixels: 'Map1.WidthInPixels' threw an exception of type 'System.NotSupportedException'



Pierre, 
  
 There are 2 properties we can set the viewport of a map ----- CurrentExtent and CurrentScale. They will not be synchronized until a PostBack happened, that means if you don’t set map’s CurrentScale explicitly, it will be nothing until a PostBack. The reason of that is when you set the map’s height to 100%, we cannot get map’s height in pixels in server side without a PostBack, that makes us very difficult to convert an Extent to a scale. 
      So if your map’s height/width is in pixels, you can get the CurrentScale from the CurrentExtent using the following method. If your map’s height is a relative value like 100%, we cannot get the current scale before a post back.  
 
        public const int DotsPerInch = 96;
        public Dictionary<string, double> inchesPerUnits;

        public void InitializeInchedPerUnit()
        {
            inchesPerUnits = new Dictionary<string, double>();
            inchesPerUnits.Add("DecimalDegree", 4374754);
            inchesPerUnits.Add("Feet", 12.0);
            inchesPerUnits.Add("Meter", 39.3701);
        }

        public double GetScaleFromResolution(RectangleShape extent, double screenWidthInPixel, double screenHeightInPixel, GeographyUnit unit)
        {
            double resolution = Math.Max(extent.Width / screenWidthInPixel, extent.Height/screenHeightInPixel);
            double scale = resolution * inchesPerUnits[unit.ToString()] * DotsPerInch;
            return scale;
        }
 
 Hope that makes sense, let me know if you have any issues. 
  
 Thanks, 
  
 Ben 


Thanks Ben,


These methods work.



Great, let us know if we can make your coding easier. 
  
 Ben