ThinkGeo.com    |     Documentation    |     Premium Support

WPF Different Zoom Level - Custom Point Style

 


 Hello ThinkGeo,


 


I'm trying to load different set of images based on zoom levels, for 1 to 5 Zoom Level one image  and from 6 to 20 trying to load another .png file. While I was inhering custom point style using InMemoryOverLay and LayerOverlay,   I'm getting same image loaded from 1 to 20 zoom levels and there is no change of image.


 Here is the attached code and hightly appreciated .... If someone can point me where the real issue is??


 


Thanks in advance.


 


 


 



Any update on this

 


GS,
I think you don’t need to create a customPointStyle to implement these functionalities, which can be managed using built-in PointStyle. Please check the code below:
 

           Map.CurrentExtent = new RectangleShape(-10000000, 10000000, 10000000, -10000000);
            Map.MapUnit = GeographyUnit.Meter;

            LayerOverlay dynamicOverlay = new LayerOverlay();
            InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();
            inMemoryFeatureLayer.InternalFeatures.Add(new Feature(new PointShape(0,0)));
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(new GeoImage(@"C:\Users\Public\Pictures\Sample Pictures\koala.jpg"));
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level05;
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel06.DefaultPointStyle = new PointStyle(new GeoImage(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"));
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel06.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            dynamicOverlay.Layers.Add(inMemoryFeatureLayer);

            Map.Overlays.Add(dynamicOverlay);
            Map.Refresh();



As I checked the code, the problem is that you set different custom style for different zoom level, but doesn’t do any check when overwrite the ‘’DrawCore” method.
 
Thanks,
Johnny

 Johnny


 


Thanks for this.I understand about that.We have custom style in DrawCore (), so can you point us...what exactly wrong with the code that i send you before??



 


Hi GS,
Maybe there are some misunderstanding here, In Map Suite, here are the steps what we did in the drawing system:
1.       Generate all the features  in specified boundingBox for drawing
2.       Calculate current zoom level
3.       Check all the style applied to the zoom level
4.       Loop all the styles on the zoom level to draw the features.
Just as mentioned above, from step #4, the drawing system doesn’t know what the scale or zoom level of the map control or drawing system is. If we would like to create a new custom PointStyle and specify different Icons based on different Zoom level/scale, we need to calculate the scale/zoom level at first and then do the check which icon will be applied rather than always use the same image. After these changes, the code about overwrite “DrawCore” method should be:
 

      protected override void DrawCore(IEnumerable<Feature> features, GeoCanvas canvas, Collection<SimpleCandidate> labelsInThisLayer, Collection<SimpleCandidate> labelsInAllLayers)
      {

          try
          {
              // given you didn't customize the zoomLevelSet, please create the zoomLevelSet using code followed
              ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
              ZoomLevel currentZoomLevel = zoomLevelSet.GetZoomLevelForDrawing(canvas.CurrentWorldExtent, canvas.Width, canvas.MapUnit, canvas.Dpi);

              // and then check the 'currentZoomLevel' and apply different icons to different zoom level.
              // Todo: after doing this, you don't need to apply different styles for different zoom levels in Page_load
              foreach (Feature feature in features)
              {
                  PointShape pointShape = (PointShape)feature.GetShape();
                  string path = "0";

                  if (currentZoomLevel.scale > zoomLevelSet.ZoomLevel06.scale)
                  {
                      canvas.DrawWorldImageWithoutScaling(_dictImageBigger[path], pointShape.X, pointShape.Y, DrawingLevel.LevelFour, 0, 0, 0);
                  }
                  else if (currentZoomLevel.scale < zoomLevelSet.ZoomLevel06.scale)
                  {
                    // apply othe images
                  }
                  //.............
              }
          }

          catch (Exception ex)
          {

              return;
          }

      }


Hope that makes sense. Thanks,
Johnny
 

GS, 



And by the way in your original code I saw this: 



 
customstop objcustompointstyle = new customstop();
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = objcustompointstyle;
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level05;
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel06.DefaultPointStyle = objcustompointstyle;
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel06.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
 


You were using the same style for zoom level 1-5 and 6-20, that might be a coding mistake. 



Ben



 


 


Thanks Johnny , I will have a try and let you know result about this



cool, any question please let us know.