ThinkGeo.com    |     Documentation    |     Premium Support

Pass Current Extent To Draw Method

Hi,



    I have written override draw core method to draw new point symbol type. Through code it works fine. When I build exe and run the same application through exe it throws error : The value for the enumeration is not one of the valid values.Parameter name : worldExtentUnit.

Here with this I have attached screenshot of it also. Please explain how to forcefully pass current extent to drawcore method canvas.



Thanks,

Goral

Hi Goral, 
  
 It looks you haven’t upload the screenshot succeed. 
  
 And I want to know how you override your drawcore, have you assign GeographyUnit.Unknown to worldExtentUnit? 
  
 You can get current extent here: canvas.CurrentWorldExtent in DrawCore function.  
  
 Regards, 
  
 Don

Hi,



   Thanks for reply. Please go through the code.


protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers)
      {
          
          //ExtentHelper.GetBoundingBoxOfItems(features);
        //  double currentScale = ExtentHelper.GetScale(ExtentHelper.GetBoundingBoxOfItems(features), canvas.Width, //mapUnit);
         double currentScale = ExtentHelper.GetScale(canvas.CurrentWorldExtent, canvas.Width, mapUnit);
          if (currentScale > maximumScale) { currentScale = maximumScale; }
          if (currentScale < minimumScale) { currentScale = minimumScale; }
 
          int PointSize = (int)(maximumSize - ((currentScale - minimumScale) * (maximumSize - minimumSize)) /
                              (maximumScale - minimumScale));
          int PointSize2 = (int)(PointSize * 0.9);
          int PointSize3 = (int)(PointSize * 0.6);
          GeoPen gp = new GeoPen();
 
          Vertex v1=new Vertex(), v2=new Vertex(), v3 = new Vertex();
          foreach (Feature feature in features)
          {
               
              ScreenPointF screenCenterPoint = ExtentHelper.ToScreenCoordinate(canvas.CurrentWorldExtent, feature, canvas.Width, canvas.Height);
                  
                      v1 = new Vertex(screenCenterPoint.X, screenCenterPoint.Y);
                      v2 = new Vertex(screenCenterPoint.X - 10, screenCenterPoint.Y);
                      v3 = new Vertex(screenCenterPoint.X, screenCenterPoint.Y + 10);
                      gp = new GeoPen(GeoColor.SimpleColors.Black, (float)0.001);
                  }
 
               
 
              PointShape pv1 = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, new ScreenPointF((float)v1.X, (float)v1.Y), canvas.Width, canvas.Height);
              PointShape pv2 = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, new ScreenPointF((float)v2.X, (float)v2.Y), canvas.Width, canvas.Height);
              PointShape pv3 = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, new ScreenPointF((float)v3.X, (float)v3.Y), canvas.Width, canvas.Height);
               
              RingShape RTriangle = new RingShape();
              RTriangle.Vertices.Add(new Vertex(pv1));
              RTriangle.Vertices.Add(new Vertex(pv2));
              RTriangle.Vertices.Add(new Vertex(pv3));
              RTriangle.Vertices.Add(new Vertex(pv1));
 
 
              string s = “Geocolor.SimpleColor.” + feature.ColumnValues[“Color”].ToString();
 
              Color c= Color.FromName(feature.ColumnValues[“Color”].ToString().Split(’-’)[0].ToString());
 
               
              GeoSolidBrush gb = new GeoSolidBrush();
              if (feature.ColumnValues[“Color”].ToString().Split(’-’)[0].ToString() == “Green”)
              {
                  gb = new GeoSolidBrush(GeoColor.FromArgb(255, c.R, c.G, c.B));
              }
              else
              {
                  gb = new GeoSolidBrush(GeoColor.FromArgb(255, c.R, c.G, c.B));
              }
              canvas.DrawArea(new Feature(new PolygonShape(RTriangle)),gp,gb,DrawingLevel.LevelOne);
 
          }

Please go through code and guide to improve it.

One solution to the problem I got is I have passed current extent from passed features boundingbox.



Hi Goral, 
  
 As below is my test code and it works correct, please let me know how to reproduce the exception. 
  
  

public class MyPointStyle : PointStyle
    {
        double maximumScale = double.MaxValue;
        double minimumScale = 0;
        GeographyUnit mapUnit = GeographyUnit.Meter;
        double maximumSize = 20;
        double minimumSize = 1;

        public MyPointStyle()
            : base()
        {
        }

        protected override System.Collections.ObjectModel.Collection<string> GetRequiredColumnNamesCore()
        {
            return base.GetRequiredColumnNamesCore();
        }


        protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers)
        {
            //ExtentHelper.GetBoundingBoxOfItems(features);
            //  double currentScale = ExtentHelper.GetScale(ExtentHelper.GetBoundingBoxOfItems(features), canvas.Width, //mapUnit);
            double currentScale = ExtentHelper.GetScale(canvas.CurrentWorldExtent, canvas.Width, mapUnit);
            if (currentScale > maximumScale) { currentScale = maximumScale; }
            if (currentScale < minimumScale) { currentScale = minimumScale; }

            int PointSize = (int)(maximumSize - ((currentScale - minimumScale) * (maximumSize - minimumSize)) /
                                (maximumScale - minimumScale));
            int PointSize2 = (int)(PointSize * 0.9);
            int PointSize3 = (int)(PointSize * 0.6);
            GeoPen gp = new GeoPen();

            Vertex v1 = new Vertex(), v2 = new Vertex(), v3 = new Vertex();
            foreach (Feature feature in features)
            {

                ScreenPointF screenCenterPoint = ExtentHelper.ToScreenCoordinate(canvas.CurrentWorldExtent, feature, canvas.Width, canvas.Height);

                v1 = new Vertex(screenCenterPoint.X, screenCenterPoint.Y);
                v2 = new Vertex(screenCenterPoint.X - 10, screenCenterPoint.Y);
                v3 = new Vertex(screenCenterPoint.X, screenCenterPoint.Y + 10);
                gp = new GeoPen(GeoColor.SimpleColors.Black, (float)0.001);
            }



            PointShape pv1 = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, new ScreenPointF((float)v1.X, (float)v1.Y), canvas.Width, canvas.Height);
            PointShape pv2 = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, new ScreenPointF((float)v2.X, (float)v2.Y), canvas.Width, canvas.Height);
            PointShape pv3 = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, new ScreenPointF((float)v3.X, (float)v3.Y), canvas.Width, canvas.Height);

            RingShape RTriangle = new RingShape();
            RTriangle.Vertices.Add(new Vertex(pv1));
            RTriangle.Vertices.Add(new Vertex(pv2));
            RTriangle.Vertices.Add(new Vertex(pv3));
            RTriangle.Vertices.Add(new Vertex(pv1));


            //string s = “Geocolor.SimpleColor.” + feature.ColumnValues[“Color”].ToString();

            //Color c = Color.FromName(feature.ColumnValues[“Color”].ToString().Split(’-’)[0].ToString());


            //GeoSolidBrush gb = new GeoSolidBrush();
            //if (feature.ColumnValues[“Color”].ToString().Split(’-’)[0].ToString() == “Green”)
            //{
            //    gb = new GeoSolidBrush(GeoColor.FromArgb(255, c.R, c.G, c.B));
            //}
            //else
            //{
            //    gb = new GeoSolidBrush(GeoColor.FromArgb(255, c.R, c.G, c.B));
            //}

            GeoSolidBrush gb = new GeoSolidBrush(GeoColor.StandardColors.Black);

            canvas.DrawArea(new Feature(new PolygonShape(RTriangle)), gp, gb, DrawingLevel.LevelOne);
        }
    }

private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            InMemoryFeatureLayer layer = new InMemoryFeatureLayer();
            layer.InternalFeatures.Add(new Feature(0, 0));
            layer.InternalFeatures.Add(new Feature(40, 40));
            layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(new MyPointStyle());
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay o = new LayerOverlay();
            o.Layers.Add(layer);

            winformsMap1.Overlays.Add(o);

            winformsMap1.CurrentExtent = new RectangleShape(-50, 50, 50, -50);


            winformsMap1.Refresh();
        }

 
  
 Regards, 
  
 Don

Hi,



   Ya might be through code it will note come. I also came across this problem when I have build exe and run application through exe. That time point style is not able to get wordextent of map. As I told before also one solution I got but I want to know about the approach. 



Thanks & Regards,

Goral

Hi Goral, 
  
 Do you meant this code work when debug, but when run as a standalone exe file the world extent cannot be get? 
  
 But for my test project, it can run correct as standalone exe, so I want to know whether I missed some important information. 
  
 Regards, 
  
 Don

Hi,



  Thanks for reply. While going through your code I found the one thing different is mapunit. In Pointstyle you have defined mapunit as meter while I am passing it as Decimal degree. Second thing is

        protected override System.Collections.ObjectModel.Collection<string> GetRequiredColumnNamesCore()
        {
            return base.GetRequiredColumnNamesCore();
        }

    these lines.



   will these both affect the problem?



Thanks & Regards,

Goral

Hi Goral,



I don’t think the GetRequiredColumnNamesCore method will cause this kind of issue, but I strongly suspect the reason is from the map unit you are passing it. Would you let us know what’s the means on “while I am passing it as Decimal degree”? or If you can attach your whole CustomPointStyle class is better.



The attached sample is used for test and works fine in our end, I guess you can modify it to fit your requirement.
Thanks,
Troy

Post12085.zip (10.8 KB)

Hi,



    Thank you for reply. Here with this I have attached class file. Please go through it.



Thanks & Regards,

Goral

Pointstyleclass.cs (6.48 KB)

Hi Goral, 
  
 Thanks for your code. 
  
 I reproduce your exception with your code, that’s because you haven’t set the MapUnit before use your class so it set the default value GeographyUnit.Unknown, please set MapUnit to DecimalDegree or Meter before use your style: 
  
 TrainglePointStyle style = new TrainglePointStyle(); 
 style.MapUnit = GeographyUnit.DecimalDegree; 
  
 layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(style); 
  
 This change works for me. 
  
 Please let me know whether that works for you. 
  
 Regards, 
  
 Don

Hi,



  Thanks for reply. Ya same thing I have done when I am calling the style. But it didn’t work while running through exe. It works through code. If you find any other problem please let me know. Otherwise I got the solution to read extent from features passed to draw core method.



Thanks & Regards,

Goral

Hi Goral, 
  
 My code can work well while running through exe. 
  
 Have you tested whether your exe throw exception on any other machine? 
  
 Does the exception still be “The value for the enumeration is not one of the valid values.Parameter name : worldExtentUnit.” after you set the MapUnit? 
  
 If the exception is different, could you please just comment the part of feature.ColumnValues[“Color”] and test again, I am not sure whether your data source is the same between debug and release environment and if the new data don’t contains “Color”, the DrawCore will also throw exception. 
  
 Regards, 
  
 Don

Hi,



  Thanks for detailed probability explanation. I found one interesting thing I found is whenever I am calling plot method on form load event. The exception is coming. But now I have shifted the plot method call on radio button click it is not giving the exception. So I think after loading initial map if we call plot it is not able to read extent.  Please go through this.





Thanks & Regards,

Goral

Hi Goral, 
  
 Sorry I am not very clear about the plot part you mentioned. Do you meant add point to map in mouse click event but not when loaded? 
  
 And I have some questions: 
  
 1. Have you tested my code in your machine, whether throw same exception when run as exe file? 
  
 2. Have you succeed reproduced this exception in any other machine? Because I doubt maybe that related with your environment. I want to rule it out. 
  
 3. If possible could you please upload a simplest standalone project which can run well when debug and run its exe will get exception? I think that should be very helpful. 
  
 Regards, 
  
 Don

Hi,





    Thanks for reply. Ok I will do as per instruction and get back to you.



Thanks & Regards,

Goral

Hi Goral, 
  
 Any update please let me know. 
  
 Regards, 
  
 Don

Hi,



    I have  tested  my original code on form load and good thing is error is not coming. It looks like then exception coming because of data. 



Thanks & Regards,

Goral

Okay, good to hear the exception is gone. 
  
 Any other questions, please feel free to let us know. 
 Troy